понедельник, 7 июня 2010 г.

Пример работы с Bash+Expect. Автоматизация роботы

Каждый разработчик в определенные моменты жизни сталкивается с задачами, ктороые требуют постоянно проделывать одну и туже работу каждый день. Если такая задача включает в себя авторизацию и работу на разнообразных удаленных машинах, или передачу файлов на другие сервера, то она явно подлежит автоматизации. Если одна и та же процедура повторяется несколько раз, то ее надо автоматизировать. Если вы при этом работаете в windows, то вам очень поможет Cygwin.

Специально для таких целей используется bash (командная оболчка Unix). Для автоматизации ввода пароля.логина используется другая оболчка - expect.

Приведу пример простого скрипта, кторый с вашей машины логинится на другую, авторизируется там и проводит обновление из SVN какого-то проекта (задача выбрана просто для примера, также для примера она буде запущена из под Cygwin)

Устанавливаем Cygwin, заходим в домашнуюю папку пользователся (например "c:\cygwin\home\Администратор\"). В ней создаем файл:
File: update.sh 

С таким содержимым:


#!/bin/bash
#!/bin/expect
expect -c 'spawn ssh -p 22 user@host;
expect assword ;
send "password\n" ;
send "cd /var/www/project_path\r";
send "sudo svn up\r";
expect assword ;
send "password\n" ;
expect "ssh>"'
echo "Update finished!"


#!/bin/bash - директива которая указывает местоположения непосредственно bash обработчика
#!/bin/expect - указывает местоположение обработчика expect

expect -c '...' - выполняет запуск консольных команд с перехватом ввода - вывода с помощью expect
spawn ssh -p 22 user@host; - конектимся к удаленному хосту с указаным именем пользователя
expect assword; - команда которая перехватывает ввод пароля и ждет когда мы его пошлем из нашего скрипта
send "password\n"; - посылаем запросившему серверу пароль пользователя в удаленной системе
send "cd /var/www/project_path\r"; - переходим в папку с проектом
send "sudo svn up\r"; - выполняем обноление из SVN с правами админа (предпологаем что наш юзер имеет права для віполнения команды sudo)
expect assword ; - перехватываем ввод пароля
send "password\n"; - отправляем пароль пользователя
expect "ssh>" - запрашиваем консоль
echo "Update finished!" - информируем об успешном обновлении

Обработка ошибок, варианты ввода вы уже можете дописать сами. Главная цель - пример реального использования bash+expect

4 комментария:

  1. #!/bin/bash
    #!/bin/expect

    А разве после первого указания транскриптора (баш), он уже не примет второй (экспект) просто как комментарий?

    ОтветитьУдалить
  2. примет, просто так - по хидеру - понятно что expect юзаеться в скрипте

    ОтветитьУдалить
  3. [root@localhost]/home/users/root# ./1.sh
    spawn ssh admin@access
    couldn't read file "assword": no such file or directory
    ./1.sh: line 5: send: command not found
    ./1.sh: line 6: send: command not found
    ./1.sh: line 7: send: command not found
    Test finished!

    Cкрипт:
    #!/bin/bash
    #!/bin/expect
    expect -c 'spawn ssh admin@access';
    expect assword ;
    send "admin123\r" ;
    send "cd /home/users\r";
    send "ls -la\r";
    echo "Test finished!"

    ОтветитьУдалить
  4. expect -c 'spawn ssh admin@access';
    в конце кавычка не нужна,
    закрытие должно быть в последнем предложении к expect:
    send "ls -la\r";
    надо понимать что все что идет после expect -c есть команды expect-a, а не bash

    ОтветитьУдалить