ssh登录使用expect直接使用c登录

时间:2017-11-13 13:16:21

标签: c ssh expect

我使用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;
}
}

我能够登录到服务器,但在此之后它立即进入我的终端,我想要登录到服务器并需要与该终端进行交互。现在,它显示我的终端之后,有人对此有任何想法吗?我需要留在已登录的服务器终端

1 个答案:

答案 0 :(得分:0)

我的程序中没有任何循环。您只需要从子进程(ssh)获得一些输出,相应地回复,最后终止。终止时,您的子进程也会终止。您必须无限期地在stdin / stdout和子流程之间转发I / O,以实现您想要的目标。

尽管如此,这整个想法都存在缺陷。您只想启动ssh并自动完成登录,但是以交互方式使用shell?没有必要为此编写代码,请查看ssh-agent以及如何创建ssh密钥。