Скрипт Bash с ожидаемым.Установить параметры для нескольких тестовых плат - PullRequest
0 голосов
/ 11 сентября 2018

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

Цель - быстро настроить все модули, поэтому я решил автоматизировать процесс с помощью скрипта.Для этого требуется ssh, и пока мне приходится каждый раз вводить пароль вручную.Этим утром я установил базовый тест с Expect и sshpass.В любом случае я могу правильно войти в систему, но не дать инструкции удаленной машине.

Я читал, что у sshpass есть проблема с отправкой удаленной инструкции, поправьте меня, если я ошибаюсь.

/usr/bin/expect << EOF
spawn ssh root@<IP>
expect "(yes/no)?" #Are you sure you want to connect nonsense
send "yes\r"
expect "password"
send "$pass\r"

Я попробовал несколько вещей здесь, чтобы заставить устройство получать инструкцию

interact
cat /pathto/config.txt
#or
send "cat /pathto/config.txt
#the real goal is to send this instruction
sqlite3 /database.db "update table set param=X"


EOF

1 Ответ

0 голосов
/ 11 сентября 2018

Вы также можете сделать это ожидаемым сценарием, а не сценарием оболочки

#!/usr/bin/expect -f

и затем передать IP-адрес сценарию в качестве аргумента командной строки

expect myloginscript.exp 128.0.0.1 the_password

В сценарии ожидаемого доступа вы получите этот IP-адрес из списка аргументов

set ip [lindex $argv 0]
set pass [lindex $argv 1]

(Размещение пароля в командной строке не является хорошей практикой безопасности. Вы можете найти более эффективные способы передачи пароля ожидаемому сценарию.)

Чтобы использовать ssh, вас спросят «уверены ли вы» только при первом подключении, поэтому давайте сделаем это условно. Для этого команда expect ожидает несколько шаблонов:

spawn ssh root@$ip
expect {
    "(yes/no)?" {
        send "yes\r"
        # continue to wait for the password prompt
        exp_continue
    }
    "password" {
        send "$pass\r"
    }
}

После того, как это будет отправлено, вы должны ожидать появления вашего приглашения оболочки. Шаблон для этого зависит от вашей собственной конфигурации, но обычно он заканчивается хешем и пробелом.

expect -re {# $}

Теперь вы можете автоматизировать остальные команды:

send "cat /pathto/config.txt\r"
expect -re {# $}

# note the quoting
send "sqlite3 /database.db \"update table set param='X'\"\r"
expect -re {# $}

На этом этапе вам нужно выйти из системы:

send "exit\r"
expect eof

С другой стороны, если вы настроили аутентификацию с помощью закрытого ключа ssh (см. ssh-keygen и ssh-copy-id), вы можете просто сделать это:

ssh root@IP sqlite3 /database.db "update table set param='$X'"

и вообще не нужно ожидать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...