期望脚本 - 从某个点开始记录,并在某个点停止

时间:2014-11-05 10:13:10

标签: expect cisco-ios

希望你一切顺利!

我最近开始为一些网络工程师使用一个小工具。它的功能是检索电路信息,然后以良好的格式解析和输出。当然,其中一部分涉及到所需盒子的SSH连接,并运行命令以生成所需的输出。

这是我目前获得的剧本。它运行正常,运行所需的命令,发送一些空格以提示系统显示更多电路,然后通过退出完成。所有这些都被记录到一个名称与该框的主机名相同的文件中。大。

然而,当我阅读所生成的文件并看到它包含大量数据时,我的问题很明显,包括我运行的命令和连接时提供的不必要的统计数据。我只是在发出命令时才查找要开始的日志记录,以及之后要切断的日志。由于我不熟悉期望,我非常感谢任何指导。

PS。如果我做了任何愚蠢的事,我会道歉;我对这门语言本身很陌生,而那里的支持并不是很好。

感谢。

set ip [lindex $argv 0]
set hostname [lindex $argv 1]
set timeout 10
set user ""
set password ""

# Spawning the ssh session
spawn ssh $ip -l $user

# Awaiting prompt for password
expect "$user@$ip's password:"
sleep 1;
# Awaiting prompt
send "$password\n"
sleep 2
log_file -noappend $hostname;
send "terminal length 0\n"
sleep 1
send "show int desc\n"
sleep 5
send "exit\n"
interact
exit

2 个答案:

答案 0 :(得分:2)

您可以通过将log_file放置在所需位置来控制输出。

如果要开始记录,可以添加行(您已在代码中使用)

log_file my_log_file.log

在将这些命令执行到名为my_log_file.log的文件后,将记录在控制台中打印的内容。默认情况下,如果该文件已存在于该位置,则将附加该文件。如果添加标志-noappend,则会覆盖现有文件。

log_file -noappend fresh.log

如果要停止日志记录,则只需提供log_file,而不使用任何参数

log_file

从这一点来看,生成的任何输出都不会被保存。

例如,您正在登录某个交换机并提供一些凭据并执行某些命令可能如下所示,

spawn ssh some_ip
expect some_thing
#Login code here
log_file output.log; # Start logging
#some actions here
log_file; # stopping logging here.
# some more actions
# end

您要多次发送空格。相反,您可以将终端长度设置为0,如下所示,

send "term len 0"
expect "prompt"

这将避免多次发送的开销。此外,在您的情况下,空间将非常快速地发送到交换机,因为没有什么可期待的。如果你仍然有兴趣不使用'term len 0',那么至少你可以把代码放在一个循环中,如下所示,

for { set i 0 } { $i < 10 } { incr i } { 
  send " "
  expect "something"
}

但是,这种做法是不可取的,因为有可能需要发送超过10个空格,那么这将失败。

答案 1 :(得分:0)

我可能会迟到,但如果要求只将期望脚本的特定部分记录到日志文件中,请使用

DELETE
FROM `wp_options`
WHERE (`option_name` LIKE '_transient_wc_var_prices_%'
    OR `option_name` LIKE '_transient_timeout_wc_var_prices_%')

开始记录后跟

log_file <log file name>

并停止在此处记录,只需写下:

<expect script statements here>

这可能会有更多的期望陈述。