Bash 脚本中的 mget 由于超时错误导致文件过大而无法正常工作

mget in Bash script doesn't work due to huge files because of time out error

我正在尝试执行 bash 脚本,其中包含 mget *.* 以下载目录中的所有文件。它正在 File1 中下载几个文件,但可能由于超时错误而跳过 File2 部分。我相信这是由于超时错误,因为

1) 我尝试对其他目录实施相同的操作,效果很好。可能是因为File2里面的文件比较少

2) 当我尝试执行

的命令行模式时
sftp username@hostname 
cd file2
mget *.* 

响应至少需要 40 秒到 1 分钟,但它最终确实下载了所有文件。

所以,我猜想在执行 bash 脚本时,它可能因超时而停止。请建议我解决这个问题。下面是我的 bash 脚本。

#test purpose only
#!/bin/bash
export Src_Dir=/path

File1=/path/*.*
File2=/path/Archive/*.*
DATE=`date +"%Y-%m-%d"`
Pass_Pwd='password'
PORT=22

cd "$Src_Dir" || { echo 'Failed to chdir into $Src_Dir' ; exit 0; }

/usr/bin/expect<<EOD


spawn /usr/bin/sftp -o Port=${PORT} username@host
expect "password:"
send "$Pass_Pwd\r"
expect "sftp>"
send "lcd ${Src_Dir}\r"
expect "sftp>"
send "mget ${File1}\r"
expect "sftp>"
send "mget ${File2}\r"
expect "sftp>"
send "bye\r"
EOD
echo "Download done"

我在 Spawn 命令上面写了 set timeout -1,然后它完美地工作了:)

谢谢你们:)

作为 sftp/expect 的替代方案,假设您无法设置 public/private 密钥,请考虑使用 lftp。更容易编写脚本,无需处理不断变化的提示等

它还可以支持并行传输多个文件,这将加快您的数据传输速度。还要考虑增加数据传输块(大小、并行)以提高效率。

lftp -u username,password -psftp://host:port/