使用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
似乎不起作用......
提前致谢
答案 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的所有文本,这意味着只输出我的命令。剩下的就是解析它。