0

我正在尝试执行具有 mget*.*以下载目录中所有文件的 bash 脚本。它正在下载 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"
4

2 回答 2

0

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

谢谢你们 :)

于 2019-12-05T01:28:47.393 回答
0

作为 sftp/expect 的替代方案,并假设您无法设置公钥/私钥,请考虑使用lftp. 编写脚本要容易得多,并且无需处理不断变化的提示等。

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

lftp -u username,password -psftp://host:port/
于 2019-12-05T02:01:41.150 回答