1

希望你们一切都好!

我最近开始为我们的一些网络工程师使用一个小实用程序。它的功能是检索电路信息,然后将其解析并以良好的格式输出。当然,其中一部分涉及到所需框的 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
4

1 回答 1

5

您可以通过将 放置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 个空格,那么这将失败。

于 2014-11-05T10:38:19.767 回答