我想自动化ssh登录。经过一些研究,似乎tcl / expect是走的路。
然而,我的问题是,当交互接管我的终端时,东西不能按预期工作(双关语无意)。
例如,如果我调整终端的大小,它就不会“占用”。此外,有时互动没有响应,有时它只是无缘无故地挂起。我在下面提供了我的代码。我对代码的问题是,我错过了什么吗?
另外,有没有更好的方法来实现这一点(使用其他脚本语言?)我需要终端具有很强的响应能力,与我在控制台上手动输入ssh没什么不同。
proc Login {username server password} {
set prompt "(%|>|\#|\\\$) $"
spawn /usr/bin/ssh $username@$server
expect {
-re "Are you sure you want to continue connecting (yes/no)?" {
exp_send "yes\r"
exp_continue
#continue to match statements within this expect {}
}
-nocase "password: " {
exp_send "$password\r"
interact
}
}
}
答案 0 :(得分:4)
您提出的关于“互动”的问题没有注意到窗口的大小已经改变,因为默认情况下,交互只会监视字符流。调整窗口大小时,会引发WINCH信号。默认情况下,Expect具有默认操作,即忽略它。您应该使用Expect的trap命令来捕获SIGWINCH。然后你可以做你想做的事情 - 例如,将新尺寸传播到另一边或采取其他一些本地行动。
您可以在Expect的示例脚本中找到执行此操作的示例。 Expect一书中有关于如何处理SIGWINCH的解释和示例。
答案 1 :(得分:0)
正如W. Craig Trader在评论中提到的,“正确”的方法是使用ssh-keygen生成用于身份验证的密钥。
您可以通过设置-o StrictHostKeyChecking=no
。
答案 2 :(得分:0)
spawn ssh my-server.example.net
trap {
set rows [stty rows]
set cols [stty columns]
stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
expect {
"assword: " {send "Let-Me-In-Please\r"}
"Last login"
}
interact