0

使用 C++,我使用 libexpect 创建了一个 FILE*:

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

我使用以下命令进入命令行:

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

现在 bash shell 中的其他成员,我想在那里获取文件的内容,所以我必须运行命令cat /port1/port 并将它的所有内容打印到 char 缓冲区中。我怎么做?

fgets似乎不起作用...

提前致谢

4

2 回答 2

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”运行时来自远程 shell 的所有文本,女巫仅表示我的命令的输出。剩下的就是解析它。

于 2012-12-30T15:37:33.583 回答
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 回答