05-13-2018 09:06 PM - edited 03-01-2019 06:35 PM
Hi, I'm a newbie in expect. I need a help to figure out couple things with this script:
#Specify all our commands in a list, that we will issue one by one at a later time.
set commands [list "conf t" "do sh ver | i uptime" "do sh clock" "end"]
#set prompt "#"
set prompt {([#>]) ?$}
foreach device $device_list {
# Set each device's log file to be the name of the device...
set file_name $device
set timeout 30
# we initiate the login connection
spawn ssh $device
match_max [expr 32 * 1024]
expect -re $prompt
send \r
expect -re $prompt
foreach cmd $commands {
send "$cmd\r"
expect -re $prompt
send \r
expect -re $prompt
set output $expect_out(buffer)
set fd [open $file_name.txt a+]
puts $fd $output
close $fd
}
expect -re $prompt
send "exit\r"
exp_close -i $spawn_id
exp_wait
}
My problems are:
1. This script runs the commands but the output get altered, eg:
INPUT
R1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#
R1(config)#do sh ver | i uptime
R1 uptime is 5 days, 5 hours, 56 minutes
R1(config)#
R1(config)#do sh clock
15:27:41.082 NZST Mon May 14 2018
R1(config)#
R1(config)#end
OUTPUT:
conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#
do sh ver | i uptime
R1 uptime is 5 days, 5 hours, 56 minutes
R1(config)#
R1(config)#
R1(config)#
MISSING: do sh clock
2. How to format the output as per below (the device hostname shows only on the first line).
R1#
conf t
do sh ver | i uptime
R1 uptime is 5 days, 5 hours, 56 minutes
do sh clock
15:27:41.082 NZST Mon May 14 2018
end
3. How to save the output into 1 file only, eg:
~$more file_name.txt
R1#
conf t
do sh ver | i uptime
R1 uptime is 5 days, 5 hours, 56 minutes
do sh clock
15:27:41.082 NZST Mon May 14 2018
end
R2#
conf t
do sh ver | i uptime
R2 uptime is 6 days, 5 hours, 56 minutes
do sh clock
18:27:41.082 NZST Mon May 14 2018
end
R3#
conf t
do sh ver | i uptime
R3 uptime is 7 days, 5 hours, 56 minutes
do sh clock
18:27:41.082 NZST Mon May 14 2018
end
Thanks heaps for your time to help me!
05-14-2018 05:21 AM
I'm not sure why you go into config mode to execute show commands. That seems needlessly complicated. This version should be closer to what you want.
#Specify all our commands in a list, that we will issue one by one at a later time.
set commands [list "conf t" "do sh ver | i uptime" "do sh clock" "end"]
#set prompt "#"
set prompt {([#>]) ?$}
set file_name {file_name.txt}
set fd [open $file_name w]
foreach device $device_list {
# Set each device's log file to be the name of the device...
set timeout 30
puts $fd $device
# we initiate the login connection
spawn ssh $device
match_max [expr 32 * 1024]
expect -re $prompt
foreach cmd $commands {
send "$cmd\r"
expect -re $prompt
set output $expect_out(buffer)
puts $fd $output
}
send "exit\r"
exp_close -i $spawn_id
exp_wait
}
close $fd
05-14-2018 03:28 PM - edited 05-14-2018 03:32 PM
Hi Joe,
Thanks for your time to look at my issue. I use sh commands just for testing. I run your script and some devices missing the last command "end'. Here's the input sample (R2):
spawn ssh R1
R1>conf t
en
Password:
R1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#do sh ver | i uptime
R1 uptime is 1 week, 3 days, 59 minutes
R1(config)#do sh clock
10:20:34.239 NZST Tue May 15 2018
R1(config)#end
R1#
spawn ssh R2
R2>conf t
en
Password:
R2#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)#do sh ver | i uptime
R2 uptime is 1 hour, 48 minutes
R2(config)#do sh clock
10:20:40.020 NZST Tue May 15 2018
R2(config)#
spawn ssh R3
.......
Could you also explain to me what the purpose of match_max [expr 32 * 1024] please. Can I expect the buffer is big enough to copy the output of 800+ devices?
Thanks Joe!
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide