我的要求是这样的:
我需要登录远程设备(比如Router / switch)并执行以下命令。
telnet xx.xx.xx.xx
//give password here
sys
interface g x/x/x
shut
desc free-port
exit
有数以百计的设备,我不能浪费时间在该死的东西上做100次。我需要编写一个自动化脚本来完成它。所以我的问题如下:
答案 0 :(得分:1)
例如,这是最简单的结构
if_admin/
|--config.yml
|--run.rb
例如,您可以使用如下的yaml文件:
xx.xx.xx.xx:
password: s3cret
router-shelf: x
slot: x
port: x
yy.yy.yy.yy:
...
require 'yaml'
require 'net/telnet'
config = YAML.load_file('./config.yml')
config.each do |host, conf|
telnet = Net::Telnet.new('Host' => host)
telnet.login(conf['password'])
telnet.puts <<-CMD
sys
interface g #{conf['router-shelf']}/#{conf['slot']}/#{conf['port']}
shut
desc free-port
CMD
telnet.close
end
答案 1 :(得分:0)
如果你可以使用expect
脚本,那么你很幸运。
#!/usr/bin/expect
set timeout 60
set cmds [list "ssh host1 ..." "ssh host2 ..." "ssh host3 ..."]
foreach cmd $cmds {
spawn -noecho bash -c $cmd
expect {
-re "password" {
exp_send "$env(PASS_WORD)\"
exp_continue
}
eof { wait } ; # at this time the last spawn'ed process has exited
}
}
以上是上述脚本的粗略概念: -
set cmds [list....
将用作列表来存储命令集。
foreach
会迭代这些命令
spawn
将为每个命令生成进程。您可以在bash中使用单个telnet编写多个命令,只需使用\
(反斜杠)分解命令,因此它易于阅读和扩展。
expect
块就会传递密码。
eof
将等到spawn
进程中的所有命令都完成。
set timeout -1
将保持循环运行。我认为expect
脚本的默认时间是 10secs 。
您可以为主机列表再创建一个foreach
循环。
我认为这足以让您开始自动化过程。
答案 2 :(得分:0)
关于&#34;什么是最好使用的脚本语言&#34;的问题,我会说选择一个能够满足你所需要的和一个你习惯使用的语言。
如果你想使用Perl,你可以使用的一个模块是Net::Telnet。当然,你自己需要Perl。我建议使用Strawberry Perl,它应该已经安装了Net :: Telnet。
另一种可能的途径是使用putty,这是一个SSH和telnet客户端。您可以将其与TTY Plus结合使用,{{3}}提供了一个使用不同putty会话选项卡的界面。它允许您向多个putty会话发出命令。这是一种不会涉及大量代码编写的可能性。