English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Подробное объяснение метода автоматизации交互а с использованием команды expect

Фон

В скриптах 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 ожидает的出现 сообщения командной строки, то есть захватывает запрос пользователя:
  • send отправляет значение для交互а, заменяя ввод пользователя вручную
  • set устанавливает значение переменной
  • interact поддерживает состояние交互а после выполнения, передает управление на консоль, в этот момент можно вручную управлять. Без этой строки после входа в систему вы выйдете, а не останетесь в удаленном терминале.
  • Обязательно добавьте expect eof, это соответствует spawn и означает завершение захвата информации из终端а, аналогично if...endif

Скрипт expect должен заканчиваться interact или expect eof, чтобы выполнять автоматические задачи, обычно хватает expect eof.

Другие настройки

  • Установите ожидание без ограничений по времени. Установите timeout -1
  • Установите ожидание с таймером 300 секунд, если за 300 секунд не появится ожидаемое содержимое expect, выйдите из системы. Установите timeout 300

Синтаксис expect написан

Expect использует синтаксис Tcl

  • Команда Tcl состоит из слов, разделенных пробелами. Первый символ - имя команды,其余 - параметры команды
    cmd arg arg arg
  • Символ "$"代表着 значение переменной. В данном примере, имя переменной - foo.
    $foo
  • Скобки выполняют вложенную команду. Например, если вы хотите передать результат одной команды в качестве параметра другой команды, используйте этот символ
    [cmd arg]
  • Двойные кавычки маркируют фразу как параметр команды. Символ "$" и скобки внутри двойных кавычек интерпретируются
    "some stuff"
  • Скобки также маркируют фразу как параметр команды. Но другие символы внутри скобок не интерпретируются
    {some stuff}
  • Обратная косая черта используется для указания на специальные символы. Например: n означает перевод строки. Обратная косая черта также используется для отмены специального значения "$", кавычек, скобок и фигурных скобок

Пример

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 (во время отправки письма замените # на @) для сообщения о нарушении авторских прав,并提供 соответствующие доказательства. При обнаружении факта нарушения авторских прав сайт незамедлительно удалят涉嫌侵权的内容。

Рекомендуем также