Bash Scripting: автоматизировать команду в консоли

Я подключаюсь к VPN через простой сценарий bash, который я бы хотел запустить при запуске компьютера, поэтому мне нужно, чтобы он был полностью автоматизирован. Тем не менее, скрипт будет запускать «openconnect –jupiper» и затем запрашивать мои учетные данные (примерно через 3-4 секунды, когда он приобретает соединение).

Id хотел бы, чтобы он выдавал мои учетные данные после того, как какой-то текст найден (самый быстрый и более точный способ) или после установленной задержки (немой и менее точный способ).

Есть ли способ вывода команд после заданной задержки или после возврата некоторого текста (например, для соответствия регулярному выражению)?

2 Solutions collect form web for “Bash Scripting: автоматизировать команду в консоли”

Чтобы автоматизировать команды, я использовал в течение многих лет. Очень хорошо симулировать интерактивный сеанс, либо при работе с упрямыми командами, которые требуют интерактивности, либо для взаимодействия с активными устройствами или другими серверами в вашей сети. Я все еще использую его для входа в активное оборудование, получения статистики и автоматического резервного копирования.

Ожидание – это программа, которая «разговаривает» с другими интерактивными программами в соответствии со сценарием. Следуя сценарию, Expect знает, чего можно ожидать от программы и какой должен быть правильный ответ. Интерпретируемый язык предоставляет ветвящиеся и высокоуровневые структуры управления для направления диалога. Кроме того, пользователь может взять управление и напрямую взаимодействовать по желанию, а затем вернуть управление сценарию.

Использование сценариев Expect для автоматизации задач

В качестве примера, сценарий ожидания, который я написал для тестирования службы POP:

#!/bin/sh # \ exec expect "$0" ${1+"$@"} set force_conservative 0 ;# set to 1 to force conservative mode even if ;# script wasn't run conservatively originally if {$force_conservative} { set send_slow {1 .1} proc send {ignore arg} { sleep .1 exp_send -s -- $arg } } set timeout -1 spawn telnet 127.0.0.1 110 match_max 100000 expect { "Hello" { send -- "USER user@domain.pt\r"; exp_continue } "assword" { send -- "PASS password\r" ; exp_continue } "logged" { send -- "LIST 1\r" ; exp_continue } -re "failed|denied" { exit } "OK 1" { send -- "QUIT\r"; } } 

Согласно моей беседе с @cas, я также хотел бы указать, что простое регулярное выражение ожидает, что языковое подмножество полезно для коротких сценариев автоматизации / [очень] грубых прототипов вместе с bash.

Если есть необходимость в более сложной обработке вывода, интерактивная обработка может / лучше выполняться с помощью другого языка программирования.

Например, в python, pexpect или даже в C, используя libexpect или miniexpect .

В последнее время с движением детонов у вас также есть целый ряд новых [и старых] фреймворков для автоматизации системных задач, таких как Ansible , Puppet, Salt.

Они требуют, однако, кривой обучения и дополнительных ресурсов. Я лично одобряю Ansible.

Ansible Tip: запуск интерактивных скриптов с помощью Ansible

На самом деле я не мог заставить «openconnect» корректно работать со всеми аргументами командной строки, поэтому в итоге я создал для него сценарий Expect.

Ответ Rui F Ribeiro был именно на деньги, однако мне нужно было немного больше исследований, чтобы все работало, мелочи, переменные и тому подобное.

В интересах того, кто когда-либо рассматривает этот вопрос здесь, я публикую сценарий, который разрешает мой вариант использования для исходного вопроса, а не потому, что он является альтернативой, а потому, что он является «расширением» для доли знаний Rui F Ribeiro.

 #!/usr/bin/expect -f set vpn_url "vpn.domain.com" set vpn_username "theuser" set vpn_password "thepassword" set ubuntu_username "theubuntuloginuser" set ubuntu_password "theubuntuloginpass" set force_conservative 0 ;# set to 1 to force conservative mode even if ;# script wasn't run conservatively originally if {$force_conservative} { set send_slow {1 .1} proc send {ignore arg} { sleep .1 exp_send -s -- $arg } } set timeout -1 spawn $env(SHELL) match_max 100000 send -- "sudo LD_LIBRARY_PATH=\"/usr/local/lib\" openconnect --juniper --no-cert-check $vpn_url -u $vpn_username\r" expect { "password for $ubuntu_username:" { send -- "$ubuntu_password\r" } } expect -exact "password:" send -- "$vpn_password\r" expect eof 
  • Как пропустить первый аргумент в скрипте
  • Отправить копию вывода скрипта в файл
  • Сценарий оболочки для проверки наличия одного или нескольких файлов с определенным расширением?
  • Сортировка STDIN по длине и количеству небилетов в скрипте Bash
  • Как использовать kdialog progressbar из сценария Bash, когда панель была инициализирована в другом скрипте?
  • Как я могу запустить этот скрипт python во всех html-файлах под каталогом?
  • Использование rename для удаления '.orig' из файла и добавления '_1' в basename
  • BASH: группировка файлов по имени
  • Как выполнить базовые вычисления в сценарии оболочки?
  • Можно ли запустить команду из bash и отправить ей нажатие клавиши
  • Запуск скрипта после загрузки tty1
  • Interesting Posts

    после добавления еще одного физического объема и увеличения логического тома grub не удается

    Временное отключение / удаление grub в настройке с двойной загрузкой, а затем восстановление grub до состояния, которое было в начале

    linux / xfce4: Как избавиться от «выбрать имя сеанса»?

    FreeNAS: моментальные снимки на реплицированных наборах данных исчезают

    libvirtd не приостанавливает гостей

    Как временно извлечь флешку или жесткий диск в Linux?

    Ошибка при компиляции Subversion с пользовательским скомпилированным Apache на общем сервере

    Почему fstrim обрезает все свободное пространство на моем зеркале mdraid после перезагрузки?

    (pdflatex) не разрешены

    Я использовал g ++, использовал его, установил make, и теперь g ++ невозможно установить

    Пользовательская раскладка клавиатуры сбрасывается до значения по умолчанию после ожидания или перезагрузки

    udev правила вождения меня орехи

    Как остановить ssh-сервер на arch linux

    Лучшая схема разделения дисков для Linux-разработчика

    Как мы называем `#! / Bin / perl` shebang ', что мы называем` – * – perl – * – `?

    Linux и Unix - лучшая ОС в мире.