0

C++ を使用して、libexpect を使用して FILE* を作成しました。

FILE* fd = exp_popen("ssh root@sunblaze");

次を使用してコマンドラインにアクセスしました。

exp_fexpectl(fp , exp_exact , "password: " , 1 , exp_end);

現在、他のファイルは bash シェルにあり、そこにあるファイルの内容を取得したいので、コマンドを実行して、cat /port1/port すべての出力を char バッファーに取得する必要があります。それ、どうやったら出来るの?

fgetsうまくいかないようです...

前もって感謝します

4

2 に答える 2

0

あなたのマシンと「sunblaze」がファイアウォールで保護された、適度に安全な環境にあると仮定すると、「ssh-keygen」と「ssh-copy-id root@sunblaze」を使用して、ユーザー ID がパスワードなしで sunblaze にログインできるようにします。 . そうすれば、誰かが見ることができるコードにパスワードがありません。

はい、わかっています、これはあなたが求めていたものではありませんでした...

理由は実際にはわかりませんfgets(str, size, fd);-少し遊んでみてください...

これは間違いなく機能します:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tcl8.5/expect.h>
#include <errno.h>

int main()
{
    char str[512];
    FILE *f = exp_popen("ssh user@mybox ls -lR");
    if (f==NULL)
    {
        printf("Failed (%s)\n", strerror(errno));
        return 1;
    }
    while(fgets(str, sizeof(str)-1, f))
    {
        printf("%s", str);
    }
    return 0;
}

ただし、ssh からの出力に改行がない場合、明らかに fgets() は完了しません。最初に試したときは、パスワードの質問で行き詰まりましたが、パスワードなしでログインできるマシンに変更したところ、問題なく動作しました。

于 2012-12-27T15:56:52.060 に答える
0

私が行った方法で接続を作成した後、方法を見つけました。シェルは次のとおりです。

[root@sanblaze ~]#

たとえば、次のコマンドを使用してコマンドを書き込みます。

fputs("echo LinkReset > /port4/port\r" , fp);
exp_fexpectl(fp, exp_exact , "]# " , 1 , exp_end);

grep を使用してファイルの内容を読み取る:

fputs("cat /port4/port | grep -w Mode\r" , fp);
exp_fexpectl(fp, exp_exact , "]# " , 1 , exp_end);

上記を行った後、「exp_buffer」ウィッチはグローバル変数であり、最後に「exp_fexpectl」を実行したときにリモートシェルから取得したすべてのテキストを保持します。ウィッチはコマンドの出力のみを意味します。あとは解析するだけです。

于 2012-12-30T15:37:33.583 に答える