scp в сценарии Expect работает для нескольких файлов, но не для многих файлов - PullRequest
0 голосов
/ 20 апреля 2020

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

expect <<EOF
spawn scp -P 1111 -o StrictHostKeyChecking=no -r /Users/Desktop/sync_mac user@192.111.111.101:/home/folder
expect "password:"
        send "11111\r"
expect eof
EOF

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

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

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

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

0 голосов
/ 20 апреля 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}
                                        }
                                }
                        }                
                }
...