SFTP 手动命令成功但脚本在 1% 或 2% 处失败
SFTP Manual command succeed but script is failing at 1 or 2%
我写了一个脚本来将文件夹从 VPS 传输到 Synology NAS Server。该脚本在传输 1% 或 2% 时失败,没有任何指示原因。当我手动 运行 命令时,它可以正常工作,没有任何问题,并且可以完美地传输文件夹。我不确定是什么原因造成的,如果我能得到一些关于在哪里查看的指导,我将不胜感激。
脚本:
#!/usr/bin/expect
set dir [timestamp -format "%Y-%m-%d"]
spawn sftp user@host.mybackup.me
expect "Password:"
send "passw0rd\n"
expect "sftp>"
send "cd /directory/\n"
expect "sftp>"
send "put -r /home/backup/$dir\n"
expect "sftp>"
send "bye\n"
结果:
root@host [/scripts]# ./sftp.sh
spawn sftp user@host.synology.me
user@host.mybackup.me's password:
Connected to host.mybackup.me
sftp> cd /directory/for/backup
sftp> put -r /home/backup/2017-12-26
Uploading /home/backup/2017-12-26/ to /backup/2017-12-26
Entering /home/backup/2017-12-26/
Entering /home/backup/2017-12-26/accounts
/home/backup/2017-12-26/file1.tar.gz 2% 26MB 1.8MB/s 08:41 ETAroot@host [/scripts]#
root@host [/scripts]#
手动命令:
root@host [/scripts]# sftp user@host.synology.me
backup@host.mybackup.me's password:
Connected to host.mybackup.me.
sftp> cd directory
sftp> put -r /home/backup/2017-12-26
Uploading /home/backup/2017-12-26/ to /backups/2017-12-26
Entering /home/backup/2017-12-26/
Entering /home/backup/2017-12-26/accounts
/home/backup/2017-12-26/file.tar.gz 100% 959MB 820.2KB/s 19:57
/home/backup/2017-12-26/file2.tar.gz 100% 147MB 1.4MB/s 01:45
sftp> bye
root@host [/Scripts]#
我想,在您的情况下,Expect
发生了超时,因为文件传输比默认超时(10 秒)花费了一些额外的时间。您可以将 timeout
设置为 -1,也可以将其增加到某个更高的值,它们以秒为单位。
set timeout -1; # Infinite amount of waiting time
或
set timeout 300; # 5 minutes of waiting time
您可以在代码中保留上述语句。
send "put -r /home/backup/$dir\n"
expect {
timeout {puts "timeout happened"}
"sftp>"
}
send "bye\r"
expect eof
始终使用 \r
字符发送 'Enter' 键而不是 \n
。最后一条语句 expect eof
将等待 sftp
程序正常关闭。
我写了一个脚本来将文件夹从 VPS 传输到 Synology NAS Server。该脚本在传输 1% 或 2% 时失败,没有任何指示原因。当我手动 运行 命令时,它可以正常工作,没有任何问题,并且可以完美地传输文件夹。我不确定是什么原因造成的,如果我能得到一些关于在哪里查看的指导,我将不胜感激。
脚本:
#!/usr/bin/expect
set dir [timestamp -format "%Y-%m-%d"]
spawn sftp user@host.mybackup.me
expect "Password:"
send "passw0rd\n"
expect "sftp>"
send "cd /directory/\n"
expect "sftp>"
send "put -r /home/backup/$dir\n"
expect "sftp>"
send "bye\n"
结果:
root@host [/scripts]# ./sftp.sh
spawn sftp user@host.synology.me
user@host.mybackup.me's password:
Connected to host.mybackup.me
sftp> cd /directory/for/backup
sftp> put -r /home/backup/2017-12-26
Uploading /home/backup/2017-12-26/ to /backup/2017-12-26
Entering /home/backup/2017-12-26/
Entering /home/backup/2017-12-26/accounts
/home/backup/2017-12-26/file1.tar.gz 2% 26MB 1.8MB/s 08:41 ETAroot@host [/scripts]#
root@host [/scripts]#
手动命令:
root@host [/scripts]# sftp user@host.synology.me
backup@host.mybackup.me's password:
Connected to host.mybackup.me.
sftp> cd directory
sftp> put -r /home/backup/2017-12-26
Uploading /home/backup/2017-12-26/ to /backups/2017-12-26
Entering /home/backup/2017-12-26/
Entering /home/backup/2017-12-26/accounts
/home/backup/2017-12-26/file.tar.gz 100% 959MB 820.2KB/s 19:57
/home/backup/2017-12-26/file2.tar.gz 100% 147MB 1.4MB/s 01:45
sftp> bye
root@host [/Scripts]#
我想,在您的情况下,Expect
发生了超时,因为文件传输比默认超时(10 秒)花费了一些额外的时间。您可以将 timeout
设置为 -1,也可以将其增加到某个更高的值,它们以秒为单位。
set timeout -1; # Infinite amount of waiting time
或
set timeout 300; # 5 minutes of waiting time
您可以在代码中保留上述语句。
send "put -r /home/backup/$dir\n"
expect {
timeout {puts "timeout happened"}
"sftp>"
}
send "bye\r"
expect eof
始终使用 \r
字符发送 'Enter' 键而不是 \n
。最后一条语句 expect eof
将等待 sftp
程序正常关闭。