English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Фон
В скриптах Linux много сценариев, связанных с удаленными операциями, например, удаленный вход ssh, удаленная копия scp, передача файлов sftp и т.д. В этих командах всегда涉及到 ввод пароля безопасности, при нормальном использовании команд необходимо вручную вводить пароль и проходить проверку безопасности. Чтобы реализовать автоматизированные удаленные операции, мы можем использовать функцию expect.
Expect - это бесплатный языков программирования для программирования, который используется для реализации автоматического и интерактивного взаимодействия с задачами, не требуя вмешательства человека. Expect постоянно развивается, и с течением времени его функции становятся все более мощными, он становится мощным помощником системного администратора. Expect требует поддержки языков программирования Tcl, чтобы запускать expect на системе, сначала необходимо установить Tcl.
Установка expect
Expect был создан на основе Tcl, поэтому перед установкой expect我们应该 сначала установить Tcl.
(1) Установка Tcl
Стартовая страница: http://www.tcl.tk
Адрес для скачивания: http://www.tcl.tk/software/tcltk/downloadnow84.tml
1. Загрузите исходный код
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
2. Разархивируйте исходный код
tar xfvz tcl8.4.11-src.tar.gz
3. Установка и конфигурация
cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
Внимание:
1. После завершения установки перейдите в корневую директорию исходного кода tcl и скопируйте файл tclUnixPort.h из подкаталога unix в подкаталог generic.
2. Временно не удаляйте исходный код tcl, так как процесс установки expect все еще требует его.
(Два) Установка expect (требуется библиотека Tcl)
Стартовая страница: http://expect.nist.gov/
1. Загрузите исходный код
wget http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download
2. Разархивируйте исходный код
tar xzvf expect5.45.tar.gz
3. Установка и конфигурация
cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
expect
Ядро expect - это spawn, expect, send, set
spawn вызывается команда для выполнения
Скрипт expect должен заканчиваться interact или expect eof, чтобы выполнять автоматические задачи, обычно хватает expect eof.
Другие настройки
Синтаксис expect написан
Expect использует синтаксис Tcl
Пример
login.exp предназначен для удаленного входа, быстрый способ использования: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"
#!/usr/bin/expect -f ########################################################## # Вход через SSH и выполнение команд # Параметр: 1.Use_Type [check/execute] # 2.SSHServerIp # 3.SSHUser # 4.SSHPassword # 5.CommandList [разделенные запятой несколько команд] # Возвратное значение: # 0 Успех # 1 Некорректное количество параметров # 2 Сервис SSH сервера не открыт # 3 Некорректный пароль пользователя SSH # 4 Превышение времени ожидания подключения к SSH серверу ########################################################## proc usage {} { regsub ".*/" $::argv0 "" name send_user "Usage:\n" send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n" exit 1 } ## Проверка количества параметров if { [llength $argv] != 5 } { использование } # установить значения переменных установить Use_Type [lindex $argv 0] установить SSHServerIp [lindex $argv 1] установить SSHUser [lindex $argv 2] установить SSHPassword [lindex $argv 3] установить CommandList [lindex $argv 4] #spawn ping ${SSHServerIp} -w 5 #expect { # -nocase -re "100% packet loss" { # отправить ошибку "Ping ${SSHServerIp} недоступен, Пожалуйста, проверьте адрес IP.\n" # вывести 1 # } #} установить время ожидания 360 установить resssh 0 # определить переменную, обозначающую, нужно ли вводить yes для подтверждения подключения ssh установить inputYes 0 установить ok_string УСПЕШНОЕ ВОШЕДШЕНИЕ если {$Use_Type=="check"} { # активировать подключение ssh, если необходимо ввести yes для подтверждения, введите yes, установите inputYes в 1, в противном случае введите пароль ssh запустить ssh ${SSHUser}@${SSHServerIp} "echo $ok_string" } запустить ssh ${SSHUser}@${SSHServerIp} "$CommandList" } expect { -nocase -re "yes/no" { отправить -- "yes\n" установить inputYes 1 } -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } #-nocase -re "Last login: " { # отправить -- "${CommandList}\n" #} $ok_string {} -nocase -re "Connection refused" { ошибка подключения к SSH-службам на ${SSHServerIp} не активно.\n выход 2 } время ожидания { ошибка подключения к SSH-серверу ${SSHUser}@${SSHServerIp} время ожидания истекло (10с).\n exit 4 } } #Если был введен yes для подтверждения, введите пароль ssh if {$inputYes==1} { expect { -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } } } #Если出现try again или提示password:表明输入的用户密码错误,直接退出。 if {$resssh==1} { expect { -nocase -re "try again" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } -nocase -re "assword:" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } eof {} } } send_error -- "$expect_out(buffer)" #-nocase -re "No such user" { # send_error "No such user.\n" # exit 5 # } #exit
Обобщение
Вот и все, что есть в этой статье, мы надеемся, что содержимое статьи будет полезно для вашего обучения или работы, если у вас есть вопросы, пожалуйста, оставляйте комментарии для обсуждения, спасибо за поддержку呐喊 руководства.
Заявление: содержание этой статьи взято из Интернета, авторские права принадлежат их rightful владельцам, материалы предоставлены пользователями Интернета, сайт не имеет права собственности, материалы не были отредактированы вручную, и не нести ответственности за связанные с этим法律责任. Если вы обнаружите подозрительное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении авторских прав,并提供 соответствующие доказательства. При обнаружении факта нарушения авторских прав сайт незамедлительно удалят涉嫌侵权的内容。