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/
Другие вопросы по тегам