不会复制文件并使用expect接收超时

时间:2014-06-29 10:20:26

标签: expect

在我们的环境中,我们不能使用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:连接超时 失去联系

检查远程服务器,我可以看到每隔一次,在获得超时之前复制一个文件。

2 个答案:

答案 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