Вы также можете сделать это ожидаемым сценарием, а не сценарием оболочки
#!/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'"
и вообще не нужно ожидать.