从bash脚本调用的expect命令中的条件语句

时间:2009-10-28 16:25:28

标签: bash shell expect cisco

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

我认为有必要在两个步骤中捕获错误,首先是在'send \“$ pass \ r \”'之后获取登录错误(访问被拒绝的消息)和'expect \“:end \” 'line,以确保发出的命令能够从设备中提取配置。

如果您使用expect脚本,我已经看到了一些方法,但我想使用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 个答案:

答案 0 :(得分:1)

您希望捕获错误的expect语句中需要替代模式。如果您正在查找特定的错误消息,则可以指定该消息,或者只指定一个超时处理程序,该处理程序最终会在正常输出无法显示时触发。

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

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

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

顺便说一句,我同意bstpierre的意见,如果你放弃bash并完成预期的事情会更干净,但如果bash做的工作没问题。

答案 1 :(得分:0)

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