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