Вы можете запустить половину скрипта в bash, а другую половину - в - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь создать скрипт для автоматизации входа в систему через ssh и загрузки файла для нескольких ip-адресов, которые хранятся в файле, я использую for i in $(cat /dir/file), проблема в том, что функция cat работает ожидаемо, поэтому я не могу ее использоватьпо сценарию, который интерпретируется с ожидаемым.Я хотел знать, возможно ли сделать так, чтобы половина скрипта интерпретировалась bash, а другая половина - ожидаемым образом

#!/bin/bash
code........
#!/usr/bin/expect
code........

мой код теперь выглядит так

#!/bin/bash
expect <<-EOF
    spawn sftp user@server
    expect "*password:" { send "password\r" }
    expect "*" { send "get /home/file\r" } 
    expect "*" { send "bye\r" }
EOF

я получаю этот ответ сейчас

spawn sftp user@server
user@server´s password: user@hostname: /home/user

в основном он возвращается в нормальное состояние терминала

1 Ответ

3 голосов
/ 17 мая 2019

Heredoc может быть решением для вас. Я не использовал expect раньше, поэтому он может показаться немного ошибочным, но работает следующий скрипт:

#!/bin/bash

USER=user
SERVER=server
read -sp "password: " PASSWORD

expect <<-EOF
        spawn ssh ${USER}@${SERVER}
        expect "*: "
        send "${PASSWORD}\r"
        expect "*$ "
        send "ls\r"
        expect "*$ "
        send "exit\r"
EOF
exit $?

Ключевые слова здесь <<-EOF и EOF. Код между ними выполняется expect.

EDIT: Обратите внимание, что sftp работает только тогда, когда вы ожидаете *>. Строка * слишком широка, что заставляет expect реагировать на преждевременный текст (например, motd, «Подключен к серверу» и т. Д.).

#!/bin/bash

USER=user
SERVER=server
read -sp "password: " PASSWORD

expect <<-EOF
        spawn sftp ${USER}@${SERVER}
        expect "* " { send "${PASSWORD}\r" }
        expect "*> " { send "get derp\r" }
        expect "*> " { send "bye\r" }
EOF
exit $?
...