В предыдущей статье я уже рассказал как с помощью несложного bash скрипта автоматизировать процесс telnet подключения к группе хостов c последующим запуском команд. Однако нашлось оборудование на котором разрешено подключение только по ssh. Давайте попробуем переделать наш скрипт под ssh и поможет нам в этом expect.
Expect - программная оболочка дающая возможность запрограммировать диалог с утилитами, которые в процессе использования запрашивают ввод информации у пользователя. В нашем случае такой утилитой будет выступать ssh клиент.
Bash script ssh с использованием expect
Краткая постановка задачи:
Есть три маршрутизатора cisco c ip-адресами 192.168.10.10, .11 и .12. Нужно подключить к ним по ssh и выполнить команду "show ver | include IOS".
Первым делом на надо установить expect.
Для ОС RedHat, CentOS, Fedora и т.п.
sudo yum install expect
Для ОС Debian, Ubuntu, Mint и т.п.
sudo apt-get install expect
Ну а теперь приведу текст самого скрипта.
#!/bin/bash #Включение отладки bash: set -x #Учетные данные: USER="admin" PASSWD="123456" #Файл логов: LOG="ssh_conn.log" #Список хостов: HOSTS=" 192.168.10.10 192.168.10.11 192.168.10.12 " #Цикл переборки хостов: for H in $HOSTS do #Вывод даты старта скрипта: echo START SCRIPT: >> $LOG date +%x-%R >> $LOG #Команды для expect: COMM=" #Включение и вывод отладки expect: #log_file debug.log #exp_internal 1 #Время ожидание expect set timeout 1 #Соедиение ssh: spawn ssh $USER@$H expect \"*(yes/no)?*\" {send \"yes\r\"} expect \"Password:\" send \"$PASSWD\r\" #Выполняемые команды: expect \"*>\" send \"show ver | include IOS\r\" expect \"*>\" send \"exit\r\" #Завершение выполнения expect: expect eof " #Запуск expect с набором команд: expect -c "$COMM" >> $LOG #Вывод разделителя: echo ========================================================================= >> $LOG done
Описание ssh скрипта
Полное описание скрипта делать не буду, так как уже описывал в предыдущей статье "Bash скрипт для автоматического telnet соединения и ввода команд", ну и плюс краткое описание я оставил в комментариях текста скрипта. Отличие этого скрипта - это использование expect. Вот его работу и разберем подробнее.
1. spawn — запуск утилиты (программы). В нашем случае мы запускаем ssh клиент, но можно также запускать к примеру ftp, telnet, scp и т.п.
2. expect — ожидание выводимых программой информации (данных). При первом подключение по протоколу ssh всегда запрашивается приглашение вида.
RSA key fingerprint is b6:66:c7:b2:9e:18:1e:9e:69:af:9e:3c:06:59:e8:8d. Are you sure you want to continue connecting (yes/no)?
Данное приглашение просит ввести "yes" для продолжения соединения. Однако при повторной попытке подключения, данное сообщение выводиться уже не будет. Поэтому и получаем в скрипте конструкцию вида:
expect \"*(yes/no)?*\" {send \"yes\r\"}
Таким образом, если есть в выводе утилиты ssh текст "(yes/no)" то отправляем согласие в виде "yes". Если нет, то переходим по таймауту дальше.
Время таймаута также задано в скрипте строкой "set timeout 1".
send — как вы уже поняли, это отправка входных данных программе. С помощью нее мы и отправляем пароль и запрос на вывод версии IOS "show ver | include IOS".
При отладки скрипта можно раскомментировать следующие строки:
log_file debug.log exp_internal 1
При запуске скрипта, будет создан файл "debug.log" содержащий в себе отладочную информацию по работе expect-а.
Примечание:
Создать файл можно, используя команду touch имя_файла.
touch ssh_conn.sh
Дать максимум привилегий можно используя chmod 777 имя_файла.
chmod 777 ssh_conn.sh
Запустить bash-скрипт можно используя перед именем файла "./"
./ssh_conn.sh
Скрипт отработает и создаст файл с названием ssh_conn.log, в котором и будет храниться вывод выполняемых на железяках команд.
Пример содержания файла ssh_conn.log
START SCRIPT:
06.11.2017-12:22
spawn ssh Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.
Password:
R1>show ver | include IOS
Cisco IOS Software, 7200 Software (C7200-ADVIPSERVICESK9-M), Version 15.2(4)S5, RELEASE SOFTWARE (fc1)
R1>exit
Connection to 192.168.10.10 closed by remote host.
Connection to 192.168.10.10 closed.
=========================================================================
START SCRIPT:
06.11.2017-12:22
...
На этом все. Нам удалось создать bash-скрипта с применением в нем программной оболочки expect, который автоматизирует процесс подключения к нескольким удаленным хостам по протоколу ssh, выполняет ввод заданных нами команд и собирает результат их выполнения в файл. Комментируем, подписываемся ну и всем пока:)
Компонент комментариев CComment