Користування 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, вказувати абсолютні шляхи