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 
  • ssh и запустить скрипт на удаленном хосте и ответить ответ автоответ
  • Скрипт для переключения дорожки для ноутбука
  • Как я могу удалить символы <93> <94> в файле? Это эквивалентно ""
  • Сценарий для поиска среды рабочего стола по умолчанию?
  • Удаление разрывов строк, пробелов и вкладок из каждого файла
  • Закладка Shell, открытая через скрипт, зависает после того, как Ctrl + C запускает процесс
  • Как создать новые процессы для новых экземпляров одного и того же сценария оболочки?
  • Извлечение справочного сообщения из самого скрипта
  • Запретить удаление файла даже после того, как rm -f
  • Получение возвратов Nagios из скрипта через NRPE
  • Распространение тысяч файлов по подпапкам
  • Interesting Posts

    Отключить изменение разрешений для каталога

    Странные результаты тройного трубопровода в STDOUT & tee / dev / null> (wc -l> tmp.txt) & piping снова внедряют `cat tmp.txt`

    Как получить подстроку, основанную на индексе другой строки

    Странное поведение fcitx-mozc с ArchLinux

    Выберите ряд файлов после их сортировки

    Невозможно найти libgmp при компиляции GCC 4.5.2

    Почему неупорядоченный шаблон работает удаленно с помощью scp?

    Буферизация каждой строки локально на последовательном терминале

    Выделение целых чисел, заключенных в круглые скобки

    Как подсчитать вхождения каждого слова, принадлежащего файлу, во все количество файлов `n`, переданных в качестве аргументов?

    Как полностью синхронизировать локальный репозиторий с помощью Mercurial (bitbucket)

    Ubuntu загружается после GRUB (пустой экран), но работает после горячей перезагрузки Windows

    Linux-дистрибутив полностью работает на Wayland (нет X11)?

    Как я могу предотвратить зависание systemd от моей системы, когда Flash умирает?

    Как интерполировать $ {: – = cat} в строке с двумя кавычками?

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