为什么不能使用 expect 将文件传输到远程 vps?

Why can't tranfer file into the remote vps with expect?

expect已安装,it_a_test为vps密码

scp  /home/wpdatabase_backup.sql   root@vps_ip:/tmp

该命令可以将文件 /home/wpdatabase_backup.sql 传输到我的 vps_ip:/tmp.

现在我将流程重写为以下代码:

#!/usr/bin/expect -f
spawn scp  /home/wpdatabase_backup.sql   root@vps_ip:/tmp
expect "password:"
send it_is_a_test\r

为什么不能使用 expect 将我的文件传输到远程 vps_ip?

基本上,expect 将使用两个可行的命令,例如 sendexpect。在这种情况下,如果使用 send,则之后必须有 expect(在大多数情况下)。 (反之亦然不是强制性的)

这是因为如果没有它,我们将错过派生过程中发生的事情,因为 expect 将假设您只需要发送一个字符串值,而不期望来自会话,使脚本退出并导致失败。

所以,你只需要添加一个expect来等待scp命令的关闭,这可以通过等待eof(文件结束)来执行。

#!/usr/bin/expect -f
spawn scp  /home/wpdatabase_backup.sql   root@vps_ip:/tmp
expect "password:"
send "it_is_a_test\r"
expect eof; # Will wait till the 'scp' completes.

注:

expect 中的默认超时为 10 秒。因此,如果 scp 在 10 秒内完成,则没有问题。假设,如果操作花费的时间超过此,则expect 将超时并退出,从而使scp 传输失败。因此,您可以根据需要设置增加超时时间,可以将其修改为

set timeout 60; # Timeout is 1 min