Учебное пособие по ожиданию сценария SSH
Expect script — отличная утилита для Linux/Unix. В повседневной жизни мне приходится иметь дело со многими unix-серверами, будь то на работе или на моем хостинг-сервере. Поэтому мне нужно запомнить множество пользователей SSH, их пароли, а затем пользователей и пароли SU. Это немного беспорядочно, когда количество серверов огромно. Поэтому я подумал о написании скрипта, который будет автоматически регистрировать меня на сервере. Когда я впервые начал работать над этим, я застрял на том, как вводить пароль SSH, потому что обычные оболочки Unix не имеют возможности отправить пароль, когда ему будет предложено войти в систему. Затем я узнаю о expect script
, который позволяет автоматизировать взаимодействие с программами, открывающими терминал для ввода.
Ожидайте сценарий
Пример сценария SSH ожидания
Вот сценарий, который я создал для автоматического входа на сервер SSH, а затем для входа в систему с правами суперпользователя, а затем выполните простую команду. sshsudologin.expect
#!/usr/bin/expect
#Usage sshsudologin.expect <host> <ssh user> <ssh password> <su user> <su password>
set timeout 60
spawn ssh [lindex $argv 1]@[lindex $argv 0]
expect "yes/no" {
send "yes\r"
expect "*?assword" { send "[lindex $argv 2]\r" }
} "*?assword" { send "[lindex $argv 2]\r" }
expect "# " { send "su - [lindex $argv 3]\r" }
expect ": " { send "[lindex $argv 4]\r" }
expect "# " { send "ls -ltr\r" }
interact
Важные моменты об ожидающем скрипте
- Обратите внимание на первую строку, указывающую, что сценарий ожидания будет использоваться в качестве интерпретатора.
- Тайм-аут сценария по умолчанию составляет 10 секунд, поэтому я установил тайм-аут на 60 секунд, чтобы избежать проблем с тайм-аутом, если для появления запроса на вход требуется время.
- Обратите внимание на команду
expect
, за которой следует регулярное выражение, а затем то, что должно быть отправлено в качестве ответа. Первый вариант выбора Да/Нет добавлен, чтобы убедиться, что он не сработает, если ключ удаленного сервера еще не импортирован. - Другие ожидаемые регулярные выражения различаются на разных серверах, для моего сервера они заканчиваются на \#, но для некоторых других серверов они могут заканчиваться на \$, поэтому вам может потребоваться отредактировать их соответствующим образом. Единственное, что нужно проверить, это соответствие регулярного выражения ожидаемой команды, чтобы была отправлена соответствующая команда или пароль.
- Последняя команда ожидания просто показывает, что мы можем отправлять команды также после входа на сервер.
Вот результат, когда я запускаю приведенный выше сценарий ожидания с правильными параметрами.
pankaj@Pankajs-MacBook-Pro:~$/Users/pankaj/scripts/sshloginsudo.expect 'journaldev.com' 'pankaj' 'ssh_pwd' 'su_user' 'su_pwd'
spawn ssh pankaj@journaldev.com
pankaj@journaldev.com's password:
Last login: Sun Jun 9 19:54:17 2013 from c-67-161-57-160.hsd1.ca.comcast.net
pankaj@journal [~]# su - su_user
Password:
su_user@journal [~]# ls -ltr
total 708
...
Дополнительные советы по сценарию ожидания
- Сценарий ожидания можно использовать повторно, поскольку вся информация передается в виде аргументов, поэтому лучше всего создать псевдоним для каждого из них для быстрого входа в систему и сэкономить время при вводе всех параметров. Например,
alias journal=/Users/pankaj/scripts/sshloginsudo.expect journaldev.com pankaj ssh_pwd su_user su_pwd
- Для передачи аргументов всегда лучше использовать одинарные кавычки, поскольку в большинстве случаев пароли содержат специальные символы, которые могут привести к забавным результатам, если они не заключены в кавычки.
ПРИМЕЧАНИЕ. Приведенный выше сценарий протестирован в системах Mac OS и Linux. Ссылка: Страница SourceForge