我希望能够设置一个远程进入多个交换机的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,我的预期脚本如下:
设置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行)
答案 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"
如果您想要输出多个命令,请将它们保存在文件中并逐个发送。