Empty, sshpass
Актуально, если сейчас 2014 год, либо эксплуатируемое оборудование - дрова. Для скриптов нужен список хостов, поэтому в текущем каналоге файл LIST, где будут построчно перечислены адреса/имена устройств:
1.2.3.4
5.6.7.8
sshpass
Простой скрипт для копирования конфигураций с оборудования cisco, где предварительно включен scp server.
#!/bin/bash
read -p "Username: " username
echo -n 'Password:'
read -s SSHPASS
export SSHPASS
mkdir -p cfg
cat LIST | while read line ; do
if ping -q -c 2 $line > /dev/null 2>&1; then
sshpass -e scp -q $username@${line}:startup-config cfg/${line}.cfg
rc=$?; echo "instance: $line, code: $rc"
fi
done
unset SSHPASS
echo $SSHPASS
empty-expect
В ubuntu установить пакет empty-expect
apt install empty-expect
Если список команд для выполнения на устройстве постоянно меняется и нужен более универсальный скрипт, то такие команды писал в отдельный файл CMD. Первые строки - это всегда отключение пейжера и прочие команды, снимающие ограничения по выводу текста. Можно делать так, как удобнее.
Juniper Junos
set cli terminal xterm
set cli screen-length 0
set cli screen-width 0
show system alarm
show chassis alarms
show chassis hardware | no-more
Cisco IOS
terminal length 0
show int status
Eltex
terminal datadump
show startup
Цикл для последовательного выполнения команд из файла CMD. sleep
добавить, если нужно.
cat ./CMD | while read line ; do
CmdStr=$(echo $line | tr -d "\r\n")
empty -w -i fifoputacl/out.$Host -o fifoputacl/inc.$Host "#" "${CmdStr}\n"
done
Учетные записи для подключения можно вводить при запуске скрипта, можно указывать в скрипте, либо брать из файла. Два варианта на выбор
empty -w -i fifostatus/out.$Host -o fifostatus/inc.$Host "assword:" "${Password}\n"
empty -s -i fifostatus/out.$Host -o fifostatus/inc.$Host < ./mypass
Ниже скрипт. Сначала описываются функции.
#!/bin/bash
# проверка доступности хоста. вернуть 1, если не пингуется.
function PingIt {
Host=$1
if ! ping -q -c 2 $Host > /dev/null 2>&1 ; then
echo "$Host down"
return 1
fi
}
# telnet на каждый хост из списка.
# функции передается хост, имя пользователя и пароль
function ReadStatus {
Host=$1
Username=$2
Password=$3
#удаление данных от предыдущего запуска empty
rm -f logstatus/$Host
rm -f fifostatus/inc.$Host
rm -f fifostatus/out.$Host
#login
empty -f -i fifostatus/inc.$Host -o fifostatus/out.$Host -p pidstatus/$Host -L logstatus/$Host telnet $Host
sleep 2
empty -w -i fifostatus/out.$Host -o fifostatus/inc.$Host "name" "${Username}\n"
sleep 2
empty -w -i fifostatus/out.$Host -o fifostatus/inc.$Host "assword:" "${Password}\n"
sleep 2
empty -w -i fifostatus/out.$Host -o fifostatus/inc.$Host "#" "\n"
# если после ввода пароля не получен символ #, то выйти
if [ $? -eq 255 ] ; then
empty -k `cat pidstatus/$Host`
echo "$Host Incorrect password or priv lvl"
return
fi
echo ''
echo "Connected to $Host"
#последовательный ввод команд. Тут можно сделать while для файла CMD
empty -w -i fifostatus/out.$Host -o fifostatus/inc.$Host "#" "terminal length 0\n"
empty -w -i fifostatus/out.$Host -o fifostatus/inc.$Host "#" "show int status\n"
empty -w -i fifostatus/out.$Host -o fifostatus/inc.$Host "#" "exit\n"
sleep 2
#отключение от коммутатора, empty отработал и теперь удалить из логов все, кроме необходимого
echo "got iface name logstatus/$Host"
#del all but ports
sed -i '/\(^Fa\|^Gi\|^Te\)/!d; ' logstatus/$Host
}
#каталоги для empty
mkdir -p logstatus
mkdir -p fifostatus
mkdir -p pidstatus
#ввод учетки
echo -n Username:
read Username
echo -n Password:
read -s Password
#запуск в цикле функции PingIt для всех хостов. Если успех, то запуск ReadStatus с &.
for Host in `cat LIST` ; do
echo "$Host start"
PingIt "$Host" && ReadStatus "$Host" "$Username" "$Password" &
done