c sshfs使用libexpect

时间:2018-03-04 01:14:52

标签: c ssh expect

我想使用ssh的密码自动在我的C程序(仅适用于linux)中安装sshfs连接。 (我不想使用公钥/私钥。)

似乎我可以用libexpect做到这一点。基于this thread,似乎可以使用libexpect在需要时提供密码。例如,我做了一个成功的测试程序,用sudo mkdir test创建一个目录,然后用libexpect提供用户密码。所以管道似乎真的是双向的。你使用下面的sshfs和我的简单函数,它不起作用:我确实有一个由它生成的sshfs挂载,但它不起作用,我无法看到这些文件。

enum{ASKCONTINUE,ASKPWD};

int sshfs_connect (char data[10][200], char ip[]) {

    char commandline[300];
    sprintf(commandline,"sshfs %s@%s:%s %s -p %s -o ServerAliveInterval=15",
            data[4],ip,data[6],data[5],data[7]);

    bool shouldBreak = false;

    FILE* fp = exp_popen(commandline);

    while(shouldBreak == false)
    {
        switch(exp_fexpectl(fp,
              //if asked for continuing (authenticity can't be established)
              exp_glob, "ontinue connecting (yes/no)?", ASKCONTINUE, 
              //if asked for pwd 
              exp_glob, "s password:", ASKPWD,  
              exp_end))  //
        {
            case ASKCONTINUE:
                printf("asked continue? !\n");
                fprintf(fp,"%s\n","yes");
                break;

            case ASKPWD:
                printf("asked pwd ! sending pwd: %s\n",data[8]);
                fprintf(fp,"%s\n",data[8]);
                shouldBreak = true;
                break;

            case EXP_TIMEOUT:
                shouldBreak = true;
                break;

            case EXP_EOF:
                shouldBreak = true;
                break;
        }
    }

    fclose(fp);
    return 0;

}

1 个答案:

答案 0 :(得分:1)

似乎expect(甚至是tcl version)不能与sshfs一起使用,可能是因为生成的进程没有控制tty,所以命令试图获取密码来自用户的其他方式,例如使用gui弹出窗口。

添加选项-o password_stdin以让sshfs从stdin读取密码是有效的。它在没有写提示的情况下执行此操作,因此libexpect有点重量级,但是这应该对您有用:发送密码并等待eof(可能在10秒的默认超时内)。

ssh = exp_popen("sshfs -o password_stdin user@host:/dir /mntpoint");
if(ssh==NULL)fatal("fail to spawn");
fprintf(ssh, "%s\n", password);
switch(exp_fexpectl(ssh,exp_end)) {
case EXP_EOF:
    break;  // ok
case EXP_TIMEOUT:
    break;  // fail
default:
    break;  // fail
}