【发布时间】:2009-10-28 16:25:28
【问题描述】:
我一直在尝试在我的 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
【问题讨论】:
-
除非您真的想使用 bash,否则我建议您在 expect 中编写整个脚本。将您现有的期望命令放入一个函数中,该函数将您需要的变量作为参数。在文件顶部定义全局变量。打开文件。在一个循环中,将每一行读入 $firewall。调用你的函数。如果您需要帮助,tcl 的手册页非常好。 (例如 man 3tcl open 或 man 3n open 取决于您的系统。)Expect 是 tcl 的超集。 Tcl 是一种完整的编程语言。你不需要 bash。