【问题标题】:How to read stdout from a FILE* created with libexpect in C++ on linux?如何从 Linux 上的 C++ 中使用 libexpect 创建的 FILE* 读取标准输出?
【发布时间】:2012-12-27 14:44:42
【问题描述】:

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

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

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

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

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

fgets 似乎不起作用...

提前致谢

【问题讨论】:

  • 你应该使用 std::fstream 而不是 C IO 库。
  • 什么是 /port1/port ?简单文件或一些设备端口,例如 /dev/ttyS0 ?
  • /port1/port 一个proc文件的软链接,它返回硬件参数
  • 我如何从 FILE* 中获取 std::fstream?

标签: c++ linux file-io expect


【解决方案1】:

假设您的机器和“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() 不会完成。当我第一次尝试时,它卡在了密码问题上 - 但是当我将它更改为无需密码即可登录的机器时,它运行良好。

【讨论】:

  • 我刚刚发布了一些读取“user@mybox”主目录中所有文件的内容。它可以工作[根据ssh-copy-id使用无密码输入
  • 如果您只想运行一个命令,您的解决方案就可以工作,我想让连接保持打开状态,并在需要时从那里获取数据。我尝试使用“fgets”获取 1 x 1 的字符,并在我到达提示时停止,但这没有用。我需要的是在我的程序中随时读取和写入文件。
  • 那么你需要一个比 exp_popen() 更复杂的解决方案,我相信,因为这只给你一个文件 - 一个读取文件。您无法读取和写入单个管道 - 您需要一个用于输入,一个用于输出。
  • 必须有一种方法,我认为它可以以 0 时间运行 exp,这样它就会更新 exp_buffer 并从那里读取它,但是当应该有一个简单的方法时,它看起来像是一种解决方法
  • 哦,我确定有一种方法——只是不使用 exp_popen,因为正如我所说,管道只是单向的。
【解决方案2】:

找到了一种方法,按照我的方式创建连接后,shell是:

[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的所有文本,女巫仅表示我的命令的输出。剩下的就是解析它。

【讨论】:

    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2019-09-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多