0

我一直在尝试在我的 cisco 设备上自动执行一些配置备份,我已经设法完成了完成任务的脚本,但我也在尝试改进它以处理错误。

我认为有必要在两个步骤中捕获错误,首先是在 'send \"$pass\r\"' 之后获取登录错误(访问被拒绝消息)和在 'expect \": 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
4

2 回答 2

1

您需要在要捕获错误的期望语句中使用替代模式。如果您正在寻找特定的错误消息,您可以指定它,或者只指定一个超时处理程序,该处理程序最终将在正常输出未能出现时触发。

例如。之后send \"$pass\r\"而不是expect \">\"尝试:

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

IE。如果预期输出在超时(默认 10 秒)之前到达,则什么也不做并继续,否则抱怨并退出预期。您可能还需要一个 eof 模式来匹配 ssh 会话结束的情况。请注意,由于您没有在期望中进行任何变量替换,因此您不需要在字符串周围使用 \"\" ,您可以使用 {} ,或者当它是一个单词时甚至什么都不使用,例如。expect confsend {no pager}

顺便说一句,我同意 bstpierre 的观点,如果你放弃 bash 并按预期完成所有事情,这会更干净,但如果 bash 完成了这项工作,那就没问题了。

于 2009-10-30T09:15:38.783 回答
0

如果你不使用单引号 ( expect -c '...'),那么所有的 $variables 都会被 bash not expect 代替。将期望代码放在单独的文件中可能更容易,或者可能是heredoc。

于 2009-10-28T21:44:14.013 回答