Expect linux примеры ssh

Автовход с паролем и управление по ssh «в гостях» при помощи expect

В очередной раз используя этот скрипт в одном из учебных классов, я поискал материалы и обнаружил, что здесь давно не вспоминали об expect. Это замечательный альтернативный интерпретатор для командной строки Linux, который может общаться с ней вместо живого человека, и я добавлю сюда лишь ещё один пример его применения.

Картинок на эту тему особо нет, а в статье и вообще не будет, поэтому привлечём ваше внимание обложкой замечательной книги

Немного истории и оффтопика

В начале 2013го я вернулся в дополнительное образование детей, получил 24 часа еженедельной нагрузки для четырёх групп «юных программистов» и «юных системных администраторов», и приступил к набору учеников на двух площадках: моём собственном кабинете и кабинете информатики находящейся неподалёку гимназии. Силами групп «юных системных администраторов» мы привели свой кабинет в порядок, развернув AltLinux 6 и парочку альтернативных дистрибутивов. А в гимназии очень опытный «инженер компьютерного класса» давно вёл эксперименты с source-based, закончившиеся приходом Calculate Linux на все машины учителей и учебных классов. Респект ему)

Задача

Через пару месяцев занятий я увидел проблему. Дети отказывались уходить с занятий, любым способом стараясь задержаться подольше. Т.к. педагогические технологии — это не моё, а кружок у нас всё-таки технический, я убивал сторонние процессы и выключал машины по ssh. Это повысило интерес учеников к изучению возможностей командной строки. Однако скоро они нашли баг: выключение «руками» занимает слишком много времени, и даже в небольшом кабинете они успеют перезапустить половину машин до того, как я завершу карательный процесс, и это затянет дело. Чтобы продемонстрировать кто здесь главный лучшие возможности программирования для командной строки, я задумался об автоматизации.

Варианты решения

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

Первой же мыслью было настроить доступ через ssh по отпечатку. Это сократило бы задачу до одного цикла, но для применения «на коленке» этот способ оказался не совсем пригоден (хотя почему нет? ЕМНИП, отпечаток для пользователя также можно создать без рута). Но при доступной авторизации по паролю (кстати, большой ущерб безопасности для учебных классов, где логин-пароли одинаковы) меня заинтересовал вариант с автоматической авторизацией по паролю. Уделив час поиску, я нашёл несколько примеров для expect.

Решение через expect

Перед началом

Но, во первых, он должен быть установлен. В моём классе мы без труда сделали это, а вот в классе гимназии ВНЕЗАПНО оказалось, что и expect, и nmap, и некоторые другие интересные системные утилиты не только установлены, но и доступны ученику. Это очень помогло нам, когда в очередной раз «упал» прикрученный по NFS сетевой диск, и мы нашли способ распространения заданий через быстро найденный бухгалтерский компьютер с расшаренными дисками.

Во вторых, кроме самого expect, нам понадобится использовать 2 типа цикла: с предусловием и с параметром. Первый необходим для «зацикливания» процесса, чтобы можно было повесить выполнение скрипта фоном на всё занятие. Второй же необходим для перебора необходимых адресов, на которые мы будем заходить по ssh при помощи собственно expect.

Также необходимо помнить, что стандартно скрипт выпадает при возникновении первой же ошибки, например неответе компьютера клиента, и наверное стоит поискать способ обработки таких исключений.

Скрипт

Сообщаем, что для выполнения нам необходимо использовать нестандартный интерпретатор

Задаём паузу для ожидания ответа с клиента, имя пользователя и пароль (это скорее по инерции из имеющихся в сети примеров):

Это был простой скрипт автоубивания ненужных процессов для гимназии. В своём же кабинете я модифицировал скрипт и для автовыключения машин:

Заключение

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

Источник

Expect linux примеры ssh

В предыдущей статье я уже рассказал как с помощью несложного bash скрипта автоматизировать процесс telnet подключения к группе хостов c последующим запуском команд. Однако нашлось оборудование на котором разрешено подключение только по ssh. Давайте попробуем переделать наш скрипт под ssh и поможет нам в этом expect.

Expect — программная оболочка дающая возможность запрограммировать диалог с утилитами, которые в процессе использования запрашивают ввод информации у пользователя. В нашем случае такой утилитой будет выступать ssh клиент.

Bash script ssh с использованием expect

Краткая постановка задачи:

Есть три маршрутизатора cisco c ip-адресами 192.168.10.10, .11 и .12. Нужно подключить к ним по ssh и выполнить команду «show ver | include IOS».

Первым делом на надо установить expect.

Читайте также:  Mac os mbr раздел

Для ОС RedHat, CentOS, Fedora и т.п.

Для ОС Debian, Ubuntu, Mint и т.п.

Ну а теперь приведу текст самого скрипта.

Описание ssh скрипта

Полное описание скрипта делать не буду, так как уже описывал в предыдущей статье «Bash скрипт для автоматического telnet соединения и ввода команд», ну и плюс краткое описание я оставил в комментариях текста скрипта. Отличие этого скрипта — это использование expect. Вот его работу и разберем подробнее.

1. spawn — запуск утилиты (программы). В нашем случае мы запускаем ssh клиент, но можно также запускать к примеру ftp, telnet, scp и т.п.

2. expect — ожидание выводимых программой информации (данных). При первом подключение по протоколу ssh всегда запрашивается приглашение вида.

Данное приглашение просит ввести «yes» для продолжения соединения. Однако при повторной попытке подключения, данное сообщение выводиться уже не будет. Поэтому и получаем в скрипте конструкцию вида:

Таким образом, если есть в выводе утилиты ssh текст «(yes/no)» то отправляем согласие в виде «yes». Если нет, то переходим по таймауту дальше.

Время таймаута также задано в скрипте строкой «set timeout 1».

send — как вы уже поняли, это отправка входных данных программе. С помощью нее мы и отправляем пароль и запрос на вывод версии IOS «show ver | include IOS».

При отладки скрипта можно раскомментировать следующие строки:

При запуске скрипта, будет создан файл «debug.log» содержащий в себе отладочную информацию по работе expect-а.

Создать файл можно, используя команду touch имя_файла.

Дать максимум привилегий можно используя chmod 777 имя_файла.

Запустить bash-скрипт можно используя перед именем файла «./»

Скрипт отработает и создаст файл с названием ssh_conn.log, в котором и будет храниться вывод выполняемых на железяках команд.

Пример содержания файла ssh_conn.log

На этом все. Нам удалось создать bash-скрипта с применением в нем программной оболочки expect, который автоматизирует процесс подключения к нескольким удаленным хостам по протоколу ssh, выполняет ввод заданных нами команд и собирает результат их выполнения в файл. Комментируем, подписываемся ну и всем пока:)

1″ :pagination=»pagination» :callback=»loadData» :options=»paginationOptions»>

Источник

Использование expect в bash скриптах

Expect — это оболочка предоставляющая возможность програмировать диалог с интерактивными програмами. Под интерактивными програмами подразумеваются приложения, которые требуют ввода дополнительной информации в ходе работы.

Тяжело объяснить без примера. О примерах использвания expect дальше и пойдет речь. Планируется сборная статья, которая будет пополнятся разнообразными примерами использования expect.

Есть два варианта, по аналогии с perl/python :

    Создать скрипт-файл и запустить его следующим образом:

«\r» в конце строки означает отправку команды (нажатие клавиши Enter).

Основная структура скрипта:

Если Вы хотите передать в скрипт какие-то параметры и использовать их в работе воспользуйтесь директивой set :

Используйте interact в конце, если по завершению выполнения всех send’ов сесия должна оставаться активной. Удобно для автоматизации при работе с ssh.

Пример 1: SSH

Стандартному линуксовому ссш клиенту можно стравить имя пользователя и ipадрес сервера как аргуметы, но пароль ему нельзя передать. Следующие скрипт принимает в качестве аргументов имя пользователя и пароль, дальше подключается с ними к серверу 192.168.1.10 и выполняет там cat /etc/issue

Выполнить его можно так:

Второй вариант — запустить все прямо в bash:

Согласитесь, если у Вас есть список серверов, с паролями и логинами, то можно сгенерировать батч и автоматизировать выполнение определенной команды на всех серверах.

Весь вывод можно записать в лог использовав следующую конструкцию в начале файла:

Немаловажным является время выполнения. Я не помню значение по умолчанию, но хорошей практивой является установка таймаута на выполнение:

Пример 2: FTP

Допустим нужно загрузить содержимое 10-ти ftp серверов в один каталог на сервере. Представьте использование 10-ти комбинаций логинов, паролей и адрдресов в lftp. Представили? Страшно?

Я вышел из ситуации следующим образом:

  1. Создал файл со следующим содержанием:
  1. Дальше катнул, эхнул, седнул и авкушнул оригинальный файл и получил новый файл в котором первая колонка — пользователь@ip_сервера, вторая — пароль.
  1. В bash запустил следующу команду:

С помощью rsync загружаем выбраные папки с сервера

На сервере с Plesk файлы сайтов лежат в папках /var/www/vhosts/имя_сайта/httpdocs . У нас есть список сайтов:

  • web-сайт1.com
  • web-сайт2.com
  • web-сайт3.com
  • web-сайт4.com
  • web-сайт5.com
  • web-сайт6.com
  • web-сайт7.com
  • web-сайт8.com
  • web-сайт9.com

Нужно стянуть папки этих сайтов на новый сервер.

В подобных случаях я инициализирую в bash список с названием list:

Подсказка: Набираете сначала list=» , потом делаете вставку из буфера обмена, потом закрываете список двойными кавычками «

Дальше цыклом for перебираю эллементы списка:

Источник

Expect примеры Linux

Expect — инструмент для автоматизации интерактивных приложений таких, как telnet, ftp, passwd, fsck, rlogin, tip, Настройка и использование SSH и других. Expect поддерживает механизм регулярных выражений и основные возможности программирования, позволяющие простым скриптам эффективно управлять такими программами, не обладающими встроенным скрипт-языком, макросами, или другими механизмами программирования. Эффективен при работе с сетевым оборудованием — массовое обновление конфигураций управляемого (активного) сетевого оборудования с дифференцированным выполнением команд.

Одним из главных применений Expect являются коммерческие приложения. Многие из этих приложений предоставляют интерфейс командной строки, но, как правило, его недостаточно для написания скриптов. Они созданы для обеспечения пользователя средствами администрирования, но производители зачастую не тратят денег на создание полноценного скриптового языка.

Expect унаследовал синтаксис Tcl, который не похож на другие скриптовые языки, такие как bash, C shell (csh), и Perl в командной строке — примеры использования.

Expect портирован в языки Python и Perl в виде различных дополнительных модулей. Подмножество команд Expect-а портировано в Java и доступно в SwitchTermJ (java-based Terminal Emulator). Реализация процедур в этих модулях это в основном интерпретация оригинальной версии с эквивалентной функциональностью.

Читайте также:  Как изменить домен linux

expect_autoexpect

Скрипт expect_autoexpect позволяет создать скрипт с командами из текущей сессии. Например, создадим скрипт, который применяет изменения настройки для Softswitch VoIP платформа MVTS (Мера) Pro.

Жмем Ctrl-D для завершения работы скрипта expect_autoexpect

Источник

Bash-скрипты, часть 11: expect и автоматизация интерактивных утилит

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

Сегодняшняя тема, заключительная в этой серии материалов, посвящена автоматизации работы с интерактивными утилитами, например, со скриптами, которые, в процессе выполнения, взаимодействуют с пользователем. В этом деле нам поможет expect — инструмент, основанный на языке Tcl.

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

Основы expect

Если expect в вашей системе не установлен, исправить это, например, в Ubuntu, можно так:

В чём-то вроде CentOs установка выполняется такой командой:

Expect предоставляет набор команд, позволяющих взаимодействовать с утилитами командной строки. Вот его основные команды:

    spawn — запуск процесса или программы. Например, это может быть командная оболочка, FTP, Telnet, ssh, scp и так далее.

expect — ожидание данных, выводимых программой. При написании скрипта можно указать, какого именно вывода он ждёт и как на него нужно реагировать.

send — отправка ответа. Expect-скрипт с помощью этой команды может отправлять входные данные автоматизируемой программе. Она похожа на знакомую вам команду echo в обычных bash-скриптах.

  • interact — позволяет переключиться на «ручной» режим управления программой.
  • Автоматизация bash-скрипта

    Напишем скрипт, который взаимодействует с пользователем и автоматизируем его с помощью expect. Вот код bash-скрипта questions :

    Теперь напишем expect-скрипт, который запустит скрипт questions и будет отвечать на его вопросы:

    Сохраним скрипт, дав ему имя answerbot .

    В начале скрипта находится строка идентификации, которая, в данном случае, содержит путь к expect, так как интерпретировать скрипт будет именно expect.
    Во второй строке мы отключаем тайм-аут, устанавливая переменную expect timeout в значение -1. Остальной код — это и есть автоматизация работы с bash-скриптом.

    Сначала, с помощью команды spawn , мы запускаем bash-скрипт. Естественно, тут может быть вызвана любая другая утилита командной строки. Далее задана последовательность вопросов, поступающих от bash-скрипта, и ответов, которые даёт на них expect. Получив вопрос от подпроцесса, expect выдаёт ему заданный ответ и ожидает следующего вопроса.

    В последней команде expect ожидает признака конца файла, скрипт, дойдя до этой команды, завершается.

    Теперь пришло время всё это опробовать. Сделаем answerbot исполняемым файлом:

    Expect-скрипт отвечает на вопросы bash-скрипта

    Как видно, expect-скрипт верно ответил на вопросы bash-скрипта. Если на данном этапе вы столкнулись с ошибкой, вызванной тем, что неправильно указано расположение expect, выяснить его адрес можно так:

    Обратите внимание на то, что после запуска скрипта answerbot всё происходит в полностью автоматическом режиме. То же самое можно проделать для любой утилиты командной строки. Тут надо отметить, что наш bash-скрипт устроен очень просто, мы точно знаем, какие именно данные он выводит, поэтому написать expect-скрипт для взаимодействия с ним несложно. Задача усложняется при работе с программами, которые написаны другими разработчиками. Однако, здесь на помощь приходит средство для автоматизированного создания expect-скриптов.

    Autoexpect — автоматизированное создание expect-скриптов

    Autoexpect позволяет запускать программы, которые надо автоматизировать, после чего записывает то, что они выводят, и то, что пользователь вводит, отвечая на их вопросы. Вызовем autoexpect, передав этой утилите имя нашего скрипта:

    В этом режиме взаимодействие с bash-скриптом ничем не отличается от обычного: мы сами вводим ответы на его вопросы.

    Запуск bash-скрипта с помощью autoexpect

    После завершения работы с bash-скриптом, autoexpect сообщит о том, что собранные данные записаны в файл script.exp . Взглянем на этот файл.

    В целом, за исключением некоторых деталей, перед нами такой же скрипт, который мы писали самостоятельно. Если запустить этот скрипт, результат будет тем же.

    Запуск expect-скрипта, созданного автоматически

    При записи сеансов взаимодействия с некоторыми программами, вроде FTP-клиентов, вы можете столкнуться с тем, что они используют в выводимых данных сведения о времени проведения операции, или выводят данные, отражающие процесс выполнения неких продолжительных действий. В целом, речь идёт о том, что вывод программы при каждом её запуске, правильно воспринимаемый человеком и вызывающий ввод одних и тех же ответов, будет, в тех же условиях, выглядеть по-новому для expect.

    Если в expect-скрипте строки, ожидаемые от такой программы, будут жёстко зафиксированы, такой скрипт не сможет нормально работать. Справиться с этим можно, либо удалив из expect-скрипта данные, которые выглядят по-новому при каждом запуске программы, либо использовав шаблоны, пользуясь которыми, expect сможет правильно понять то, что хочет от него программа.

    Как видите, autoexpect — это весьма полезный инструмент, но и он не лишён недостатков, исправить которые можно только вручную. Поэтому продолжим осваивать язык expect-скриптов.

    Работа с переменными и параметрами командной строки

    Для объявления переменных в expect-скриптах используется команда set . Например, для того, чтобы присвоить значение 5 переменной VAR1 , используется следующая конструкция:

    Читайте также:  Epub reader windows phone

    Для доступа к значению переменной перед её именем надо добавить знак доллара — $ . В нашем случае это будет выглядеть как $VAR1 .

    Для того, чтобы получить доступ к аргументам командной строки, с которыми вызван expect-скрипт, можно поступить так:

    Тут мы объявляем переменную VAR и записываем в неё указатель на первый аргумент командной строки, $argv 0 .

    Для целей обновлённого expect-скрипта мы собираемся записать значение первого аргумента, представляющее собой имя пользователя, которое будет использовано в программе, в переменную my_name . Второй аргумент, символизирующий то, что пользователю нравится, попадёт в переменную my_favorite . В результате объявление переменных будет выглядеть так:

    Отредактируем скрипт answerbot , приведя его к такому виду:

    Запустим его, передав в качестве первого параметра SomeName , в качестве второго — Programming :

    Expect-скрипт, использующий переменные и параметры командной строки

    Как видите, всё работает так, как ожидалось. Теперь expect-скрипт отвечает на вопросы bash-скрипта, пользуясь переданными ему параметрами командной строки.

    Ответы на разные вопросы, которые могут появиться в одном и том же месте

    Если автоматизируемая программа может, в одной ситуации, выдать одну строку, а в другой, в том же самом месте — другую, в expect можно использовать блоки, заключённые в фигурные скобки и содержащие варианты реакции скрипта на разные данные, полученные от программы. Выглядит это так:

    Здесь, если expect-скрипт увидит строку «something», он отправит ответ «send this». Если же это будет некая строка, оканчивающаяся на «another», он отправит ответ «send another».

    Напишем новый скрипт, записав его в файл questions , случайным образом задающий в одном и том же месте разные вопросы:

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

    Для автоматизации такого скрипта нам и пригодится вышеописанная конструкция:

    Ответы на разные вопросы, появляющиеся в одном и том же месте

    Как видно, когда автоматизированный скрипт выводит строку, оканчивающуюся на «topic?», expect-скрипт передаёт ему строку «Programming». Получив в том же месте, при другом запуске программы, вопрос, оканчивающийся на «movie?», expect-скрипт отвечает: «Star wars». Это очень полезная техника.

    Условный оператор

    Expect поддерживает условный оператор if-else и другие управляющие конструкции. Вот пример использования условного оператора:

    Условный оператор в expect

    Тут мы присваиваем переменной TOTAL некое число, после чего проверяем его и выводим текст, зависящий от результата проверки.

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

    Цикл while

    Циклы while в expect очень похожи на те, что используются в обычных bash-скриптах, но, опять же, тут применяются фигурные скобки:

    Цикл while в expect

    Цикл for

    Цикл for в expect устроен по-особому. В начале цикла, в самостоятельных парах фигурных скобок, надо указать переменную-счётчик, условие прекращения цикла и правило модификации счётчика. Затем, опять же в фигурных скобках, идёт тело цикла:

    Цикл for в expect

    Объявление и использование функций

    Expect позволяет программисту объявлять функции, используя ключевое слово proc :

    Вот как выглядит expect-скрипт, в котором используется объявленная в нём же функция:

    Функции в expect

    Команда interact

    Случается так, что автоматизируемые с помощью expect программы требуют ввода конфиденциальных данных, вроде паролей, которые вам не хотелось бы хранить в виде обычного текста в коде скрипта. В подобной ситуации можно воспользоваться командой interact , которая позволит вам, автоматизировав некую часть взаимодействия с программой, самостоятельно ввести, скажем, пароль, а потом опять передать управление expect.

    Когда выполняется эта команда, expect-скрипт переключается на чтение ответа на вопрос программы с клавиатуры, вместо того, чтобы передавать ей ранее записанные в нём данные.

    Вот bash-скрипт, в общем-то, точно такой же, как мы рассматривали ранее, но теперь ожидающий ввод пароля в ответ на один из своих вопросов:

    Напишем expect-скрипт, который, когда ему предлагают предоставить пароль, передаёт управление нам:

    Команда interact в expect-скрипте

    Встретив команду interact , expect-скрипт остановится, предоставив нам возможность ввести пароль. После ввода пароля надо ввести «++» и expect-скрипт продолжит работу, снова получив управление.

    Итоги

    Возможностями expect можно пользоваться в программах, написанных на разных языках программирования благодаря соответствующим библиотекам. Среди этих языков — C#, Java, Perl, Python, Ruby, и другие. То, что expect доступен для разных сред разработки — далеко не случайность. Всё дело в том, что это действительно важный и полезный инструмент, который используют для решения множества задач. Здесь и проверка качества ПО, и выполнение различных работ по сетевому администрированию, автоматизация передачи файлов, автоматическая установка обновлений и многое другое.

    Освоив этот материал, вы ознакомились с основными концепциями expect и научились пользоваться инструментом autoexpect для автоматического формирования скриптов. Теперь вы вполне можете продолжить изучение expect, воспользовавшись дополнительными источниками. Вот — сборник учебных и справочных материалов. Вот — достойная внимания серия из трёх статей (1, 2, 3). А вот — официальная страница expect, на которой можно найти ссылки на исходный код программы и список публикаций.

    На этом мы завершаем серию материалов о bash-скриптах. Надеемся, её одиннадцать частей, а также бессчётное число комментариев к ним, помогли в достижении цели тем, кто хотел научиться писать сценарии командной строки.

    Уважаемые читатели! Благодарим всех, кто был с нами. Желаем удачной автоматизации работы в Linux! И, если у вас есть опыт работы с expect — ждём ваших рассказов.

    Источник

    Оцените статью