我是新手,期待和编写脚本。我正在尝试制作一些脚本,以便在拉动网络设备配置时让我的生活更轻松一些。我设法创建一个基本的期望脚本来SSH到设备并保存配置。
我想对此进行扩展,并允许脚本连接到多个IP地址,而不是像我现在所拥有的那样。我有一个名为list.txt
的文件,其中包含几个不同的IP地址,每个IP在一个单独的行上。
我需要做什么才能让expect脚本连接到每个IP地址并执行脚本中的其余任务?
这是我到目前为止的Expect脚本:
#!/usr/bin/expect -f
#Tells interpreter where the expect program is located. This may need adjusting according to
#your specific environment. Type ' which expect ' (without quotes) at a command prompt
#to find where it is located on your system and adjust the following line accordingly.
#
#
#Use the built in telnet program to connect to an IP and port number
spawn ssh 192.168.1.4 -l admin
#
#The first thing we should see is a User Name prompt
#expect "login as:"
#
#Send a valid username to the device
#send "admin"
#
#The next thing we should see is a Password prompt
expect "Password:"
#
#Send a vaild password to the device
send "password\n"
#
#If the device automatically assigns us to a priviledged level after successful logon,
#then we should be at an enable prompt
expect "Last login:"
#
#Tell the device to turn off paging
#
#After each command issued at the enable prompt, we expect the enable prompt again to tell us the
#command has executed and is ready for another command
expect "admin@"
#
#Turn off the paging
send "set cli pager off\n"
#
#Show us the running configuration on the screen
send "show config running\n"
#
# Set the date.
set date [timestamp -format %C%y%m%d]
#
#Test output sent to file with a timestamp on end
#-noappend will create a new file if one already exists
log_file -noappend /home/test.cfg$date
#
expect "admin@"
#
#Exit out of the network device
send "exit\n"
#
#The interact command is part of the expect script, which tells the script to hand off control to the user.
#This will allow you to continue to stay in the device for issuing future commands, instead of just closing
#the session after finishing running all the commands.`enter code here`
interact
我是否需要将其与Bash脚本集成?如果是这样,是否可以读取list.txt
文件的一行,将其用作IP /主机变量,然后读取下一行并重复?
答案 0 :(得分:3)
我会这样做(未经测试):
#!/usr/bin/expect -f
set logfile "/home/text.cfg[clock format [clock seconds] -format %Y%m%d]"
close [open $logfile w] ;# truncate the logfile if it exists
set ip_file "list.txt"
set fid [open $ip_file r]
while {[gets $fid ip] != -1} {
spawn ssh $ip -l admin
expect "Password:"
send "password\r"
expect "admin@"
send "set cli pager off\r"
log_file $logfile
send "show config running\r"
expect "admin@"
log_file
send "exit\r"
expect eof
}
close $fid
注意:
\r
模拟在send
命令时点击输入。expect eof
答案 1 :(得分:2)
这是此问题的Perl版本:
安装说明:cpan Expect
此脚本完全符合我的需要。
Param 1:connexion string(例如:admin@10.34.123.10) 参数2:明文密码 参数3:执行命令
#!/usr/bin/perl
use strict;
use Expect;
my $timeout=1;
my $command="ssh ".$ARGV[0]." ".$ARGV[2];
#print " => $command\n";
my $exp = Expect->spawn($command) or die "Cannot spawn $command: $!\n";
$exp->raw_pty(1);
LOGIN:
$exp->expect($timeout,
[ 'ogin: $' => sub {
$exp->send("luser\n");
exp_continue; }
],
[ 'yes\/no\)\?\s*$' => sub {
$exp->send("yes\n");
goto LOGIN;
}
],
[ 'assword:\s*$' => sub {
$exp->send($ARGV[1]."\n");
#print "password send : ", $ARGV[1];
exp_continue; }
],
'-re', qr'[#>:] $'
);
$exp->soft_close();
答案 2 :(得分:1)
可能是将IP地址作为期望脚本中的参数传递:
set host_ip [lindex $argv 0]
然后创建一个shell脚本,在while循环中调用expect脚本:
ips_file="list.txt"
while read line
do
your_expect_script line
done < $ips_file
答案 3 :(得分:0)
或使用set ip [gets stdin]从用户输入的IP地址。
例如 -
put&#34;输入您的IP地址\ n&#34; 设置ip [get stdin]
在spawn中使用它,我们可以使用loop对多个ip地址执行相同的操作 spawn ssh $ ip -l admin