c sshfs使用libexpect通过bash自动连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c sshfs使用libexpect通过bash自动连接相关的知识,希望对你有一定的参考价值。

我想使用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? !
");
                fprintf(fp,"%s
","yes");
                break;

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

            case EXP_TIMEOUT:
                shouldBreak = true;
                break;

            case EXP_EOF:
                shouldBreak = true;
                break;
        }
    }

    fclose(fp);
    return 0;

}
答案

似乎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
", password);
switch(exp_fexpectl(ssh,exp_end)) {
case EXP_EOF:
    break;  // ok
case EXP_TIMEOUT:
    break;  // fail
default:
    break;  // fail
}

以上是关于c sshfs使用libexpect通过bash自动连接的主要内容,如果未能解决你的问题,请参考以下文章

sshfs通过ssh挂载远程目录到本地

通过sshfs 方便mac 进行utm 虚拟机的文件共享

win8.1通过sshfs挂载linux目录

Centos sshfs的安装和使用

centos安装fuse-sshfs通过挂载目录实现数据双向同步

SSHFS