Expect自动输入密码实现sshfs远程目录挂载失效问题排查求助
解决Expect自动挂载sshfs无内容的问题
我来帮你排查这个问题,你的脚本思路没问题,但几个细节没处理到位,导致挂载没成功却没抛出报错。下面是具体的原因分析和修复方案:
1. 移除多余的interact命令
你的脚本最后用了interact,这个命令是把终端控制权交还给用户,但sshfs是一次性执行的挂载命令,成功挂载后就会退出,完全不需要交互。interact会让脚本卡在那里,既没法正常结束,也可能导致挂载进程异常中断。
修改后的基础脚本:
#!/usr/bin/expect set timeout 10 spawn bash -c "sshfs XXX@remote_computer:/raidc/users/XXX LocalDirectory/" expect { "XXX@remote_computer's password: " { send "mypasswd\r" exp_continue } eof }
这里用expect块处理密码提示,然后等待命令执行完成(捕获eof),确保挂载流程走完。
2. 处理首次连接的主机密钥验证
如果是第一次连接目标远程机器,sshfs会弹出主机密钥确认提示(比如The authenticity of host 'remote_computer (x.x.x.x)' can't be established...),你的脚本没处理这个场景,会直接卡在那里,既不报错也不继续执行。
可以在脚本里加入对这个提示的处理:
#!/usr/bin/expect set timeout 10 spawn bash -c "sshfs XXX@remote_computer:/raidc/users/XXX LocalDirectory/" expect { "Are you sure you want to continue connecting (yes/no)? " { send "yes\r" exp_continue } "XXX@remote_computer's password: " { send "mypasswd\r" exp_continue } eof }
这样就能自动处理首次连接的密钥确认,避免脚本卡住。
3. 检查挂载权限与目录存在性
- 先确保本地的
LocalDirectory/已经创建,并且当前用户有读写权限:mkdir -p LocalDirectory chmod 755 LocalDirectory - 确认远程目录
/raidc/users/XXX确实存在,并且你的远程用户XXX有访问该目录的权限(比如读权限)。
4. 添加挂载验证步骤
可以在脚本末尾加一段检查,确认挂载是否真的成功:
#!/usr/bin/expect set timeout 10 spawn bash -c "sshfs XXX@remote_computer:/raidc/users/XXX LocalDirectory/" expect { "Are you sure you want to continue connecting (yes/no)? " { send "yes\r" exp_continue } "XXX@remote_computer's password: " { send "mypasswd\r" exp_continue } eof } # 验证挂载是否成功 spawn bash -c "mount | grep sshfs" expect eof
执行脚本后,看看输出里有没有对应sshfs的挂载条目,就能明确挂载是否真的完成。
5. 改用SSH密钥认证(更推荐)
其实用Expect自动输密码不是最安全可靠的方式,推荐你配置SSH密钥认证,这样完全不需要密码就能挂载:
- 生成本地密钥对(一路回车默认设置即可):
ssh-keygen -t ed25519 - 将公钥复制到远程机器:
ssh-copy-id XXX@remote_computer
之后直接执行sshfs XXX@remote_computer:/raidc/users/XXX LocalDirectory/就能自动挂载,不需要Expect脚本,更稳定也更安全。
内容的提问来源于stack exchange,提问作者DannyLouis
相关产品推荐
相关产品推荐

