scp в скрипте Expect работает для нескольких файлов, но не для многих файлов

Я написал код bash для отправки файлов на сервер с моего удаленного ноутбука. Я использовал команду «scp» и написал ее в сценарии bash, чтобы не вводить пароль каждый раз, когда я запускал ее.

expect <<EOF
spawn scp -P 1111 -o StrictHostKeyChecking=no -r /Users/Desktop/sync_mac [email protected]:/home/folder
expect "password:"
        send "11111\r"
expect eof
EOF

Однако проблема в том, что когда я запустил скрипт bash на терминале, он вроде работал хорошо, но вдруг не удалось отправить файлы без каких-либо предупреждений (особенно в случае отправки большого количества файлов или файлов большого размера, это было нормально для случая небольшого количества и небольшого размера)

Спасибо за вашу помощь


person Design the future    schedule 20.04.2020    source источник
comment
Можете ли вы запустить scp -vv, чтобы посмотреть, есть ли что-то в журналах?   -  person Robert Navado    schedule 20.04.2020
comment
Я следил за вашим комментарием, но запись в журнале слишком длинная, чтобы писать здесь.   -  person Design the future    schedule 20.04.2020
comment
‹‹‹‹Последнее предложение записи журнала находится здесь›››› debug2: канал 0: rcvd ext data 36 Sink: C0644 0 result_analysis.txt debug2: канал 0: записано 36 в efd 6 result_analysis.txt 100% 0 0.0KB /s 00:00 Режимы отправки файла: C0644 0 result_analysis2.txt   -  person Design the future    schedule 20.04.2020
comment
Вы говорите, что scp не печатает никаких ошибок. Откуда вы знаете, что он терпит неудачу?   -  person Kenster    schedule 20.04.2020
comment
Если вы используете ключи ssh, вам вообще не нужно ожидать. ssh-keygen и ssh-copy-id   -  person glenn jackman    schedule 20.04.2020
comment
вы видите комментарий ниже, дело в тайм-ауте по умолчанию   -  person Design the future    schedule 20.04.2020


Ответы (2)


Тайм-аут по умолчанию для expect составляет 10 секунд, поэтому expect eof будет ждать не более 10 секунд, чего может быть недостаточно для многих файлов, как вы упомянули.

Чтобы исправить, вы можете set timeout -1 до expect eof или только expect -timeout -1 eof.

person pynexj    schedule 20.04.2020

Мне пришлось сделать это некоторое время назад, но для нескольких серверов, список которых менялся от ночи к ночи. Я обнаружил, что иногда scp просил сначала добавить хост в ваш список известных хостов или другие сообщения, для которых мне приходилось кодировать обработку. Это может быть похоронено в вашем сценарии.

Это выдержка из того, что в конечном итоге сработало, если это поможет:

        expect -c "
                spawn ssh-copy-id -i /x/home/$USER/.ssh/id_rsa.pub  $USER@$HOST
                expect {
                        \"password:\" {
                                send \"$PASS\n\"
                                expect {
                                        \"expecting.\" { }
                                        timeout {exit 1}
                                        \"again.\" {exit 1}
                                }
                        }
                        \"yes/no)?\" { 
                                send \"yes\n\" 
                                expect \"password:\" {
                                        send \"$PASS\n\"
                                        expect {
                                                \"expecting.\" { }
                                                timeout {exit 1}
                                                \"again.\" {exit 1}
                                        }
                                }
                        }                
                }
person Community    schedule 20.04.2020
comment
Столько обратных слэшей. Придерживайтесь heredoc, как в вопросе. - person glenn jackman; 20.04.2020