我使用expect创建了一个c程序,使用ssh登录服务器,以下是程序
#include <sys/wait.h>
#include <tcl8.6/expect.h>
int main()
{
exp_is_debugging = 0;
exp_timeout = 60;
FILE *expect = exp_popen((char *) "ssh user@ip");
if (expect == 0) {
return 1;
}
enum { denied, invalid, command_not_found,
command_failed, prompt };
switch (exp_fexpectl(expect,
exp_glob, "password: ", prompt,
exp_end)) {
case prompt:
// continue
break;
case EXP_TIMEOUT:
return 1;
}
fprintf(expect, "%s\r","password");
switch (exp_fexpectl(expect,
exp_glob, "denied", denied, // 1 case
exp_glob, "invalid password", invalid, // another case
exp_glob, "#", prompt, // third case
exp_end)) {
case denied:
printf("denied %d",exp_glob);
break;
case invalid:
break;
case EXP_TIMEOUT:
printf("EXP_TIMEOUT");
break;
case prompt:
printf("loggedin");
break;
default:
//return 0;
break;
}
}
我能够登录到服务器,但在此之后它立即进入我的终端,我想要登录到服务器并需要与该终端进行交互。现在,它显示我的终端之后,有人对此有任何想法吗?我需要留在已登录的服务器终端
答案 0 :(得分:0)
我的程序中没有任何循环。您只需要从子进程(ssh)获得一些输出,相应地回复,最后终止。终止时,您的子进程也会终止。您必须无限期地在stdin
/ stdout
和子流程之间转发I / O,以实现您想要的目标。
尽管如此,这整个想法都存在缺陷。您只想启动ssh
并自动完成登录,但是以交互方式使用shell?没有必要为此编写代码,请查看ssh-agent
以及如何创建ssh密钥。