我正在开发代码。从服务器,将使用 spawn 与服务器 B 建立 ssh 会话,然后从服务器 B sftp 文件传输到服务器 C。服务器 A 和 B 可以是无密码的,也可能会要求输入密码,具体取决于早期的用户配置。请找到下面的代码:
#!/bin/bash
/usr/bin/expect <<EOD
lassign $argv 1 2 3 4 file1 file2
spawn ssh -oStrictHostKeyChecking=no root@$1
sleep 2
expect {
"#" {
send_user "successfully logged in!\r"
}
"Password:" {
send "$2\r"
}
}
EOD
sleep 3
pinging=$( ping $3 -w1 | head -n 2 | grep -i time )
if [[ $pinging == *"time"* ]];
then
echo "ping successfull to:" $3
else
echo "ping not successfull:"$3 "Contact IT Support"
exit
fi
问题是 if-else 循环未正确执行密码提示或登录到 ssh 远程会话后没有密码提示。即使登录成功,它仍会询问密码。此外,Ping 到服务器 C 是从服务器 B 而不是从服务器进行的A. 我对 TCL 命令还很陌生
答案1
你不能像这样混合expect 和shell。发送密码后,expect 脚本结束,expect 进程退出,并且 ssh 连接消失。如果你想从B ping C,你需要将该部分放入expect代码中。