Користування expect (автоматизація дій в терміналі)
Не буду тут описувати історію яка саме і спонукала на пошук можливості автоматизації дій в терміналі, ну реалізація на довго не забарилась:)
-
Встановлюємо програму:
sudo apt install expect -y
-
Створюємо файл в якому будуть зберігатись команди. Наприклад:
vim test_expect.sh
-
В файлі записуємо свої дії, потім яка має бути відповідь, і знову дії, наприклад:
#!/usr/bin/expect -f
set timeout 20
set current_date [exec date +%Y-%m-%d]
spawn telnet 192.n.n.n
expect "Password:"
send "my_password\r"
send "en\r"
expect ">"
send "enable\r"
expect "#"
send "copy running-config tftp 192.n.n.n filename_$current_date\r"
expect "%"
send "exit\r"
interact
spawn ssh [email protected]
expect "password:"
send "my_password\r"
sleep 3
send -- [binary format c 25]
send "\r"
expect "3526T#"
send "copy running-config tftp address 192.n.n.n filename my_namefile_$current_date\r"
expect "3526T#"
send "logout\r"
interact
Невеликі пояснення:
Вписує теперішній час в назві файлу--> set current_date [exec date +%Y-%m-%d]
Перша команда--> spawn ssh [email protected]
Очікування певної відповіді після вооду команди, якщо буде те значення, яке в лапках, то програма продовжить виконання--> expect "очікування_відповіді"
Ввід команди--> send "my_command\r"
PS: після команди ставиться "\r" це по суті імітація натискання Enter
Завершення виконання автоматизації --> interact
Затримка виконання наступного пункту (іноді потрібно щоб не було дуже швидко) --> sleep 3
Це мені знадобилось для імітування натискання комбінації Ctrl+Y -- > send -- [binary format c 25]
Для роботи через crontab бажано зробити скрипт-прокладку через який буде запускатись основний expect,також у ньму між виконуємими пунктами видалити interact, а залишити лише в кінці скрипту. До того ж як зазвичай з crontab, вказувати абсолютні шляхи