我的公司为我提供了一台服务器来完成我的代码工作。我每次登录服务器时都必须输入密码。
~$ ssh -o StrictHostKeyChecking=no -p 22 [email protected]
Enter passphrase for key '/home/me/.ssh/id_rsa':
输入密码后,我就可以登录了。
现在我正在尝试制作一个 bash 脚本以避免每次都输入密码。这是我的脚本:
#!/usr/bin/expect -f
set ip x.x.x.x
set password mypwd
spawn ssh -o StrictHostKeyChecking=no -p 22 me@$ip
expect {
#"*yes/no" { send "yes\r"; exp_continue}
"*passphrase*" { send "$password\r" }
}
interact
但是,当我执行脚本时,它似乎没有按预期工作,我得到如下输出,并且每次仍然需要输入密码:
spawn ssh -o StrictHostKeyChecking=no -p 22 [email protected]
Enter passphrase for key '/home/me/.ssh/id_rsa':
我做错什么了吗?
顺便说一句,x.x.x.x
只是 IP4。
答案1
*
请注意,将全局模式放在 的开头和结尾是没有意义的"*passphrase*"
,因为这只是"passphrase"
匹配。
问题可能在于,正如man expect
所说:有时提示和响应之间需要延迟。这可能是由于应用程序关闭了回显,然后刷新了当时的输入。您至少应该尝试匹配提示的最后一个字符,在本例中是冒号(可能后面有空格?),因此模式"passphrase*:"
可能有效。
如果仍然没有,请尝试添加短暂的等待:
{ sleep 0.5; send "$password\r" }
您还可以运行调试expect -d
来进行调查。