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自动连接的主要内容,如果未能解决你的问题,请参考以下文章