Ожидать сценарий для SFTP не работает в bash - PullRequest
0 голосов
/ 20 марта 2020

Я создал сценарий оболочки, содержащий ожидаемый сценарий для получения файла из удаленного местоположения. Все работает хорошо, пока какая-то команда не отправлена. Будь то «ls», «pwd» или любая другая команда, ожидаемый сценарий завершается внезапно. Не могли бы вы, парень, помочь мне с этим.

ПРИМЕЧАНИЕ. Безопасность не имеет значения, поэтому не используются ключи Publi c.

#!/bin/ksh

FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV


/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 username@test.server.com
expect {
        default { exit 1}
        -re "failed|invalid password|Permission denied" {exit 2}
        "Connection closed" {exit 1}
        timeout {exit 1}
}

expect "Password:"
send "password\r"

expect {
        default {exit 1}
        -re "password|Enter password for " {puts "Incorrect Password"; exit 2}
        "sftp>" {send "cd $FTPREMOTEPATH \r"}
}

expect "sftp>"
send "pwd\r"

send "get $FTPREMOTEFILENAME \r";

EOFEXPECT1

В приведенном выше сценарии сценарии внезапно завершаются после отправки cd $ FTPREMOTEPATH.

Ниже вывод:

$ ./test.sh
spawn sftp -oPort=1002 username@test.server.com
Enter password for username
Password:
sftp> cd /Inbox
sftp> $

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Представьте, что вы звоните в местный ресторан, говорите "принесите мне немного еды", а затем просто вешайте трубку. Что должен делать ресторан?

Когда вы ждете приглашения sftp, вы ожидаете доставки еды.

Я бы порекомендовал 2 вещи:

  1. до send "get ... измените значение тайм-аута на -1 - это поможет, если получение файла займет более 60 секунд.
  2. после отправки "пока", expect eof - это позволяет элегантно закрыть соединение sftp.
0 голосов
/ 20 марта 2020

Хорошо, по-видимому, я пропустил ожидаем "sftp>" {send "bye \ n"} , до EOF (EOFEXPECT1).

Однако мне все равно было бы интересно узнать значение пока в сценарии ожидаемого.

Вот обновленный и рабочий код:

#!/bin/ksh

FTPREMOTEPATH=/Inbox
FTPREMOTEFILENAME=test.CSV


/usr/bin/expect -f - <<EOFEXPECT1
set timeout 60
spawn sftp -oPort=1002 username@test.server.com
expect {
        default { exit 1}
        -re "failed|invalid password|Permission denied" {exit 2}
        "Connection closed" {exit 1}
        timeout {exit 1}
}

expect "Password:"
send "password\r"

expect {
        default {exit 1}
        -re "password|Enter password for " {puts "Incorrect Password"; exit 2}
        "sftp>" {send "cd $FTPREMOTEPATH \r"}
}

expect "sftp>"
send "pwd\r"

send "get $FTPREMOTEFILENAME \r";

expect "sftp>" {send "bye\n"}

EOFEXPECT1
...