在我们的环境中,我们不能使用SSH密钥,所以我想使用expect。 使用我的expect文件,我想复制两个文件,在远程服务器上运行命令,如果需要,还要更新本地服务器的know_hosts文件。
#!/usr/bin/expect
set username root
set pass root123
set host xxx.xxx.xxx.xxx
spawn scp <file1> ${username}@${host}:/root/
expect -re "Are you sure you want to continue connecting (yes/no)"
send "yes\r"
expect -re "Password:"
send "${pass}\r"
expect -re "$"
spawn scp <file2> ${username}@${host}:/root/
expect -re "Password:"
send "${pass}\r"
expect -re "$"
spawn ssh ${username}@${host} <command>
expect -re "Password:"
send "${pass}\r"
expect -re "$"
interact
使用上面的文件,我收到此错误: ssh:连接到主机xxx.xxx.xxx.xxx端口22:连接超时 失去联系
检查远程服务器,我可以看到每隔一次,在获得超时之前复制一个文件。
答案 0 :(得分:0)
如果我没弄错,你只能在远程主机上看到一个文件,因为你每次连接到远程主机时都会继续查找字符串"Are you sure you want to continue connecting (yes/no)"
,即使这只是需要第一次连接到远程主机或远程主机更改其指纹时(这可能是欺骗攻击的迹象,但在大多数安全网络中只是更新的结果)。
如果您在远程服务器上找到的文件是<file2>
而且不再是<file1>
的更新副本,那么这就证实了我的想法。然后,您应该从期望脚本中删除该行(及其后续行)。
或者,您可以修改您的expect脚本以查找“first connect”字符串(如果存在)或跳过密码检查。
但是,你有第二个问题,与第一个问题无关:ssh到远程主机时的连接超时。这可能是因为远程主机没有发回确切的字符串Password
,可能是password
。您应该首先在交互式会话中进行检查。
答案 1 :(得分:0)
我会做这样的事情:
proc send_file {file username host password} {
spawn scp $file ${username}@${host}:/root/
expect {
"Are you sure you want to continue connecting (yes/no)" {
send "yes\r"
exp_continue
}
"Password:"
send "${pass}\r"
exp_continue
}
eof
}
}
send_file "file1" $username $host $pass
send_file "file2" $username $host $pass
spawn ssh ${username}@${host} <command>
expect -re "Password:"
send "${pass}\r"
expect -re "$"
interact