【问题标题】:Conditional statament inside expect command called from a bash script从 bash 脚本调用的期望命令中的条件语句
【发布时间】: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。

标签: bash shell expect cisco


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 工作正常,现在我将看看如何将消息发送到 $log 文件。我也会尝试让整个事情都在预期中,在我最后一次尝试中,由于需要读取文件并在读取的每一行上循环命令,我失败了。
【解决方案2】:

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

【讨论】:

  • 变量是在 bash 中设置的,所以看起来他希望在 expect 看到脚本之前将它们替换为 bash。
猜你喜欢
  • 2023-01-13
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 2017-06-11
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多