c++ - 如何在 Linux 上从 C++ 中使用 libexpect 创建的 FILE* 读取标准输出?

标签 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 并在字符缓冲区中获取它打印的所有内容。 我该怎么做?

fgets 似乎不起作用...

提前致谢

最佳答案

假设您的计算机和“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() 将无法完成。当我第一次尝试时,它陷入了密码问题 - 但当我将其更改为无需密码即可登录的机器时,它工作得很好。

关于c++ - 如何在 Linux 上从 C++ 中使用 libexpect 创建的 FILE* 读取标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14056481/

相关文章:

c++ - 轻松修复 - 根据多个值对双端队列进行排序

linux - Linux 上有可用的图像库来获取原始图像中剪切的小图像的位置吗?

java - 如何通过java程序在ubuntu中cd并执行可执行文件

python - 在python中打开单独驱动器上的文件

ruby - 在 Ruby 中实际写入磁盘的用户是什么?写入错误

c++ - 在 clang 中循环展开

c++ - 程序过早结束,可能已经崩溃。退出代码 0xc0000005

c++ - 间隔树 - 主要功能障碍的功能

linux - malloc_trim() 可以从堆中间释放内存吗?

javascript - 在 Chrome 扩展中使用 HTML 文件作为字符串