Каждый разработчик в определенные моменты жизни сталкивается с задачами, ктороые требуют постоянно проделывать одну и туже работу каждый день. Если такая задача включает в себя авторизацию и работу на разнообразных удаленных машинах, или передачу файлов на другие сервера, то она явно подлежит автоматизации. Если одна и та же процедура повторяется несколько раз, то ее надо автоматизировать. Если вы при этом работаете в 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
#!/bin/bash
ОтветитьУдалить#!/bin/expect
А разве после первого указания транскриптора (баш), он уже не примет второй (экспект) просто как комментарий?
примет, просто так - по хидеру - понятно что expect юзаеться в скрипте
ОтветитьУдалить[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!"
expect -c 'spawn ssh admin@access';
ОтветитьУдалитьв конце кавычка не нужна,
закрытие должно быть в последнем предложении к expect:
send "ls -la\r";
надо понимать что все что идет после expect -c есть команды expect-a, а не bash