diff --git a/README.md b/README.md index 846f9d4..3c6767c 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,4 @@ - [01. Linux](stream/01_linux_zhirov/) - [02. Интерпретаторы терминала](stream/02_shells_zhirov/) +- [05. Интерпретаторы терминала](stream/05_expect/) diff --git a/stream/05_expect/README.md b/stream/05_expect/README.md new file mode 100644 index 0000000..1e3dfb3 --- /dev/null +++ b/stream/05_expect/README.md @@ -0,0 +1,5 @@ +# Работа с интерактивной оболочкой expect + +[Expect](https://core.tcl-lang.org/expect/index) - инструмент для автоматизации интерактивных приложений таких, как telnet, ftp, passwd, fsck, rlogin, tip, настройка и использование SSH и других. Expect поддерживает механизм регулярных выражений и основные возможности программирования, позволяющие простым скриптам эффективно управлять такими программами, не обладающими встроенным скрипт-языком, макросами, или другими механизмами программирования. Эффективен при работе с сетевым оборудованием - массовое обновление конфигураций управляемого (активного) сетевого оборудования с дифференцированным выполнением команд. + +Expect выступает в качестве клея для склеивания существующих утилит. Главная идея состоит в том, чтобы использовать уже имеющиеся инструменты, а не решать проблему внутри Expect. diff --git a/stream/05_expect/tcl.pdf b/stream/05_expect/tcl.pdf new file mode 100644 index 0000000..eddcfd8 Binary files /dev/null and b/stream/05_expect/tcl.pdf differ diff --git a/stream/05_expect/test.sh b/stream/05_expect/test.sh new file mode 100755 index 0000000..60ba4e0 --- /dev/null +++ b/stream/05_expect/test.sh @@ -0,0 +1,85 @@ +#!/bin/bash + +# set -x + +check_ssh() { + SSH_USER="${1}" + SSH_HOST="${2}" + SSH_PORT="${3}" + SSH_PASSWORD="${4}" + + SSH_RESULT=$(expect -c " + spawn ssh -p ${SSH_PORT} ${SSH_USER}@${SSH_HOST} + expect { + -re \".*Are you sure you want to continue connecting.*\" { + send \"yes\n\" + exp_continue + } + -re \".*password.*\" { + send \"${SSH_PASSWORD}\n\" + exp_continue + } + -re \".*@.*\" { + send \"exit\n\" + expect eof + } + } + ") + + ANSWER_SUCCESS="Connection to ${SSH_HOST} closed." + ANSWER_ERRORS=( + "Permission denied" + "connect to host ${SSH_HOST} port ${SSH_PORT}: No route to host" + "connect to host ${SSH_HOST} port ${SSH_PORT}: Connection refused" + ) + + [[ $(echo "${SSH_RESULT}" | grep "${ANSWER_SUCCESS}" ) ]] && echo "Успешно подключились" && exit 0 + + for ANSWER in "${ANSWER_ERRORS[@]}" + do + [[ $(echo "${SSH_RESULT}" | grep "${ANSWER}" ) ]] && echo "${ANSWER}" && exit 1 + done + + echo "${SSH_RESULT}" + + echo "Произошла неизвестная ошибка" + exit 1 +} + +main() { + while [[ $# -gt 0 ]] + do + KEY="${1}" + VALUE="${2}" + case "${KEY}" in + -u) + SSH_USER="${VALUE}" + shift + ;; + -p) + SSH_PORT="${VALUE}" + shift + ;; + -h) + SSH_HOST="${VALUE}" + shift + ;; + -P) + SSH_PASSWORD="${VALUE}" + shift + ;; + esac + shift + done + + [ -z "${SSH_USER}" ] && echo "Не был установлен пользователь" && exit 1 + [ -z "${SSH_PORT}" ] && echo "Не был установлен порт" && exit 1 + [ -z "${SSH_HOST}" ] && echo "Не был установлен хост" && exit 1 + [ -z "${SSH_PASSWORD}" ] && echo "Не был установлен пароль" && exit 1 + + check_ssh "${SSH_USER}" "${SSH_HOST}" "${SSH_PORT}" "${SSH_PASSWORD}" + + exit 0 +} + +main "${@}"