如何从Linux上的C ++中使用libexpect创建的FILE *中读取stdout?

时间:2012-12-27 14:44:43

标签: c++ linux file-io expect

使用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似乎不起作用......

提前致谢

2 个答案:

答案 0 :(得分: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()将无法完成。当我第一次尝试时,它遇到了密码问题 - 但是当我将其更改为一台我可以在没有密码的情况下登录的机器时,它运行正常。

答案 1 :(得分: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的所有文本,这意味着只输出我的命令。剩下的就是解析它。