我正在使用'expect'来自动化ssh密码验证。当我在SunOS中运行脚本时,我发现下面的脚本完成后,生成的ssh进程会被终止。在Linux中不是这种情况。我们如何避免它?我们应该以某种方式忽略SIGCHLD信号吗? 无论如何,通过这个脚本确定生成的进程是否成功并报告错误(如果有的话)?
#!/usr/local/bin/expect -f
set password blah-blah
spawn ssh -NfL 8002:<test domain>:22 test@testdomain.com
expect "* password:*"
send -- "$password\r"
send -- "\r"
expect EOF
-Karthik
答案 0 :(得分:1)
如果使用ssh-key,则无需在shell脚本中对密码进行编码。
您甚至可以使用密码来加密密钥,并使用ssh-agent
为您管理密钥 - 您在早上解锁密钥,启动隧道,然后在前往午餐时忘记密钥,在下午解锁你的钥匙,晚上回家时又忘记了。没有到远程机器的磁盘魔术网关。
答案 1 :(得分:1)
您可以将expect脚本放入后台,而不是将ssh命令放在后台:
#!/usr/local/bin/expect -f
if {[fork] != 0} exit
disconnect
set password blah-blah
spawn ssh -NL 8002:localhost:22 test@testdomain.com
expect {
EOF {exit 1}
"assword:" {}
}
send -- "$password\n"
send -- "\n"
expect EOF
wait
在Linux上为我工作。至少在设置阶段,停止它更加困难。我不得不kill -9
停止期望脚本。这可能也需要杀死ssh进程。