В предыдущей статье я уже рассказал как с помощью несложного 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