Условное описание внутри ожидаемой команды, вызываемой из bash-скрипта - PullRequest
0 голосов
/ 28 октября 2009

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

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

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

#!/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

Ответы [ 2 ]

1 голос
/ 30 октября 2009

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

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

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

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

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

0 голосов
/ 29 октября 2009

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

...