Обновление: исправлена проблема с паролем и сообщение об истечении времени ожидания соединения также было исправлено.
Добавление \
перед $!
работал. Пример: *password\$!
set passwds { *password\$! @tempP@ss %Test4%}
Для тайм-аута подключения добавлен следующий код после строки "s password:"
timeout { puts stdout "$server_address : connection timed out"}
Этот сценарий не сообщает, если время ожидания соединения истекло. Он просто переходит к следующему IP. Если он сообщил, что соединение истекло, я мог бы легко найти все IP-адреса и что-то сделать.
Я хочу, чтобы эта часть кода сообщала, если соединение не удалось
ssh -t root@$server_address "$*"
Также этот сценарий не может отправлять пароли, заканчивающиеся на $ !. Пароль * пароль $! но он отправляет его как * пароль
Ожидайте отладки с exp_internal 1
:
expect: set expect_out(0,string) "\r\nPermission denied, please try again.\r\r\nroot@10.10.10.10's password: "
expect: set expect_out(spawn_id) "exp4"
expect: set expect_out(buffer) "\r\nPermission denied, please try again.\r\r\nroot@10.10.10.10's password: "
send: sending "*password\r" to { exp4 }
expect: continuing expect
Вот код:
#!/bin/bash
(( $# != 1 )) && { echo >&2 "Usage: $0 \"[COMMAND]\""; exit 1; }
servers_addresses=(10.10.10.10)
for server_address in ${servers_addresses[@]}; do
expect <<EOF
set passwds { *password$! @tempP@ss %Test4%}
set i 0
spawn ssh -t root@$server_address "$*"
expect {
"Are you sure you want to continue connecting (yes/no)?" { send "yes\r"; exp_continue }
"s password:" { send "[lindex \$passwords_ssh \$x]\r"; incr x; exp_continue }
eof
}
EOF
done
Переменные расширяются при использовании в double ""
кавычки, а Bash обрабатывает все, начиная с $
как переменная.
Используйте одинарные кавычки ''
вместо.
ssh
завершится кодом выхода <> 0, если произошла ошибка. Это хранится в $?