mget в сценарии Bash не работает из-за огромных файлов из-за ошибки тайм-аута
Я пытаюсь выполнить сценарий 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"
2 ответа
Я написал set timeout -1
над Spawn
команда, то сработало отлично:)
Спасибо вам, ребята:)
В качестве альтернативы sftp/expect и при условии, что вы не можете настроить открытый / закрытый ключ, рассмотрите возможность использования lftp
. Намного проще написать сценарий, и не нужно иметь дело с изменением подсказок и т. Д.
Он также может поддерживать параллельную передачу нескольких файлов, что ускоряет передачу данных. Посмотрите также на увеличение блоков передачи данных (размер, параллельность), чтобы сделать вещи более эффективными.
lftp -u username,password -psftp://host:port/