2014-11-05 30 views
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 "[email protected]$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 
+0

在每个'send'命令后添加'expect'语句,如果绝对必要的话使用'sleep'。说,它有所有输出,你的意思是记录从ssh登录本身的开始开始? – Dinesh 2014-11-05 14:16:04

回答

1

您可以通过将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" 

这样可以避免发送多次的开销。此外,在你的情况下,空间将很快发送到交换机,因为没有什么可期待的。如果你仍然有兴趣做才不至于“一词LEN 0”,那么至少你可以把代码在一个循环中,像下面这样

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

但是,这样做的方式是不可取的,因为是需要发送超过10个空间的可能性,那么这将失败。

+0

不幸的是,看起来您的建议是在命令之前创建日志文件,因此它开始记录日志并不起作用。相反,剧本似乎直接从蝙蝠记录下来,记录下所有内容。也许这是全部存储,然后倾倒一分钟我说日志文件的名称? – Hugh 2014-11-05 11:01:35

+0

想知道为什么。你可以在你的问题中粘贴当前代码并删除旧代码? – Dinesh 2014-11-05 11:09:37

+0

嗨Dinesh。我将在接下来的20分钟内这样做。 – Hugh 2014-11-05 12:23:33

0

我大概晚了这里,但如果要求是你期望的脚本只有特定的部分记录到日志文件,然后使用

log_file <log file name> 

开始之后

<expect script statements here> 

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

log_file 

此后可能会出现更多期望语句秒。