Условный статус внутри ожидаемой команды, вызываемой из сценария bash

StackOverflow https://stackoverflow.com/questions/1638369

  •  08-07-2019
  •  | 
  •  

Вопрос

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

Я думаю, что это необходимо для обнаружения ошибок в два этапа, сначала сразу после "отправить"$ pass \ r"", чтобы получить ошибки входа в систему (сообщения об отказе в доступе) и в "ожидать":завершите строку \"', чтобы быть уверенным, что выданные команды смогли извлечь конфигурацию из устройства.

Я видел несколько способов сделать это, если вы работаете над сценарием expect, но я хочу использовать скрипт bash, чтобы иметь возможность предоставлять список устройств из текстового файла.

#!/bin/bash

data=$(date +%d-%m-%Y)
dataOntem=$(date +%d-%m-%Y -d "-1 day")
hora=$(date +%d-%m-%Y-%H:%M:%S)
log=/firewall/log/bkpCisco.$data.log
user=MYUSER
pass=MYPASS

for firewall in `cat /firewall/script/firewall.cisco`
do

VAR=$(expect -c "
spawn ssh $user@$firewall
expect \"assword:\"
send \"$pass\r\"
expect \">\"
send \"ena\r\"
expect \"assword:\"
send \"$pass\r\"
expect \"#\"
send \"conf t\r\"
expect \"conf\"
send \"no pager\r\"
send \"sh run\r\"
log_file -noappend /firewall/backup/$firewall.$data.cfg.tmp
expect \": end\"
log_file
send \"pager 24\r\"
send \"exit\r\"
send \"exit\r\"
")

echo "$VAR"
done
Это было полезно?

Решение

Вам нужны альтернативные шаблоны в операторах expect, где вы хотите перехватывать ошибки.Если вы ищете конкретное сообщение об ошибке, вы можете указать это, в качестве альтернативы просто укажите обработчик тайм-аута, который в конечном итоге сработает, когда обычный вывод не появится.

Например.после send \"$pass\r\" вместо того, чтобы expect \">\" попробуй:

expect \">\" {} timeout {puts stderr {Could not log in}; exit}

т.е.если ожидаемый результат поступает до истечения тайм-аута (по умолчанию 10 секунд), ничего не делайте и продолжайте, в противном случае подайте жалобу и выйдите из expect.Вам также может понадобиться шаблон eof, соответствующий случаю, когда заканчивается ваш ssh-сеанс.Обратите внимание, что поскольку вы не выполняете никакой замены переменных в expect, вам не нужно \"\" вокруг ваших строк, вы можете использовать {} или даже nothing, когда это одно слово, например. expect conf и send {no pager}.

Кстати, я согласен с bstpierre в том, что это было бы чище, если бы вы отбросили bash и сделали все это в expect, но если bash выполняет свою работу, все в порядке.

Другие советы

Если вы не используете одинарные кавычки ( Ожидайте -c '...' ), тогда все переменные $ будут заменены на bash, а не на ожидаемую. Может быть проще поместить ожидаемый код в отдельный файл или, возможно, в heredoc.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top