在期望脚本中显示ip interface brief

时间:2015-05-27 09:46:25

标签: telnet remote-access expect cisco

我希望能够设置一个远程进入多个交换机的expect脚本文件。

您知道如何为telnet编写专家脚本到200个交换机并运行命令示例:show ip interface brief然后列出Linux上的所有交换机状态吗?

#!/usr/bin/expect -f
spawn telnet 192.168.0.1
expect "Username:"
send "MyUsername\r"
expect "assword:"
send "MyPassword\r"
send "show ip int br\r"
interact timeout 5
expect {
    "MORE --, next page" {send -- " "; exp_continue}
    "*?2626#*" {send -- "exit \r"}
}

感谢Dinesh,我的预期脚本如下:

!/ usr / bin / expect -f

填充输入文件

设置fp [open“input.txt”r]
set file_data [read $ fp]
关闭$ fp
设置提示“>”
log_file -noappend switch_port_status.txt
foreach ip [split $ file_data“\ n”] {
    将“Switch $ ip Interface Status”设为“     产生telnet $ ip
    期待“用户名:”
    发送“MyUsername \ r”
    期待“assword:”
    发送“MyPassword \ r”
    期待$ prompt
    #避免在巨大的配置上发送'Enter'键     发送“show ip int br \ r”
    期待$ prompt
    期待{
    -ex“--More--”{send - “”; exp_continue}
    “*>” 中{send“exit \ r”}
    }
    设置超时1; #恢复默认超时
    #在全局级提示下发送'exit'将关闭连接
期待eof
}

这是可行的。但以下是我得到的错误信息,我该如何解决这个问题?感谢

switch-hostname>切换接口状态
产生telnet
用法:telnet [-l user] [-a] host-name [port]
发送:spawn id exp9未打开
    执行时 “发送”MyUsername \ r“”
    (“foreach”体线5)
    从内部调用 “foreach ip [split $ file_data”\ n“] {
    将“Switch $ ip Interface Status”设为“     产生telnet $ ip
    期待“用户名:”
    发送“MyUsername \ r”
    EXPEC ......“
    (档案“./autotelnet.sh”第8行)

1 个答案:

答案 0 :(得分:1)

您可以使用以逐行方式输入交换机IP信息的文件。使用terminal length 0可以节省我们的工作和时间最后log_file派上用场来保存输出。

#!/usr/bin/expect -f
#Slurp up the input file
set fp [open "input.txt" r]
# To avoid empty lines, 'nonewline' flag is used
set file_data [read -nonewline $fp]
close $fp 
set prompt "#"
log_file -noappend switch_port_status.txt
foreach ip [split $file_data "\n"] {
    puts "Switch $ip Interface Status"
    spawn telnet $ip
    expect "Username:"
    send "MyUsername\r"
    expect "assword:"
    send "MyPassword\r"
    expect $prompt
    # To avoid sending 'Enter' key on huge configurations
    send "terminal length 0\r"
    expect $prompt
    set timeout 120;# Increasing timeout to 2mins, as it may take more time to get the prompt
    send "show ip int br\r"
    expect $prompt
    set timeout 10; # Reverting to default timeout
    # Sending 'exit' at global level prompt will close the connection
    send "exit\r"
    expect eof
}

注意:仅在发送exit命令的基础上处理连接关闭。因此,请确保exit命令始终在全局级别的提示下发送。我们也可以使用关闭telnet连接的典型方式,而不是依赖exit,即' Ctrl +]'关键组合。

#This will send 'Ctrl+]' to close the telnet connection gracefully
send "\x1d"
expect "telnet>"
send "quit\r"
expect "Connection"

如果您想要输出多个命令,请将它们保存在文件中并逐个发送。