发新话题
打印

[转载]使用perl实现路由器的自动备份

[转载]使用perl实现路由器的自动备份

  文章作者:savage

  对于城域网的设备。定期备份配置是十分重要的。而当设备比较多的时候,人为的备份就显得十分繁琐。下面介绍使用perl在*nix下实现路由器配置文件的自动备份。

注:虽然这个方法与软件打交道较多。但还是觉得发到这里来更加贴切。由于保密原因,给出的例子中涉及到ip地址等资料均做了处理。请大家参考修改成合适自己的配置。

1。unix服务器一台,开设tftp服务,安装perl。
2。安装需要的模块
a)运行perl -MCPAN -e shell
若是第一次运行,之后会进入设置。
这里唯一需要注意的是在制定perl mirror镜像时选择一个速度较快的站点
推荐下面两个站点,公网连接速度较快
cpan.linuxforum.net
mirrors.dayouit.com
b)需要的模块
net::telnet 最基本的telnet模块
Net::Telnet::Cisco 这个对cisco设备支持很好
expect 这个模块加上telnet基本上可以登陆所有的设备
c)安装方法
在出现
cpan shell -- CPAN exploration and modules installation (v1.76)
ReadLine support enabled

cpan>
后输入
get /模块名称/
install /模块名称/

get /Net::Telnet::Cisco/
install /Net::Telnet::Cisco/
基本上就能搞定。如果提示缺少什么模块,一把安装上就可以了.

3.关键脚本(以cisco设备为例)
文件名backupcisco.pl,注意使用时要将此文件属性设置成可执行的.

#!/usr/local/bin/perl
use Net::Telnet::Cisco;

my $tftp='10.1.1.1';
#用的时候将上面改成自己的tftp服务器地址
open(CISCO,'./ciscosite');
print "open hostfile succeed!!\n";
#打开文件,我们所有设备的地址均写在这个文件中

while (<CISCO>) {
chomp;
my @fields = split(/\|/, $_);
my $host = $fields[0];
print "host: $host\t";
#设备的ip地址
my $login = $fields[1];
print "login: $login\t";
#设备的登陆用户名
my $telnet = $fields[2];
#print "telnet: $telnet\t";
#一层密码
my $enable = $fields[3];
#print "enable: $enable\t";
#enable密码
my $hostname = $fields[4];
print "hostname: $hostname\n";
#设备的hostname
$r = Net::Telnet::Cisco->new( Errmode => \&fail,
Host => $host,
);
$r->login("$login","$telnet") or die "Could not login: $!";
dir($r->errmsg) unless($r->enable("$enable"));
#print "login succeed!!!\n";
#登陆设备
$r->cmd("copy run tftp\n"."$tftp\n"."$hostname.run\n\n");
print "back running cfg of $hostname succeed!\n";
#备份设备配置
$r->close();
}
关键文件ciscosite
文件格式如下
10.1.0.1|username|passwd|enablepasswd|hostname
一行就是一个设备,包含有用户名,密码,二层密码以及主机名.

写一行到ciscosite文件中,运行backupcisco.pl.在tftp服务器上观察是否备份成功。

4 实现定期备份
*nix下做这个最合适的就是ctontab了.
运行crontab -e
添加
30 23 * * 5 /local/admin/backupcisco.pl > /dev/null 2>&1
意思是在每周五的23点30分来备份配置文件.

需要说明的以上perl脚本只对cisco设备有效,因为我们这里使用的是Net::Telnet::Cisco模块。而实际工作中,我们接触的设备远不止cisco一家厂家。这时候我们可以使用刚才提到的Expect模块。
下面是一个简单的huawei 5200e/f设备配置的备份脚本

#!/usr/local/bin/perl -w
use Expect;
my $exp = new Expect;
my $tftp=&#39;10.1.1.1&#39;;
open(SITES,&#39;./sitesof5200ef&#39;);
print "open hostfile succeed!!\n";

while (<SITES>) {
chomp;
my @fields = split(/\|/, $_);

my $host = $fields[0];
print "host: $host\t";
my $login = "username";
#登陆的用户名
#my $login = $fields[1];
print "login: $login\t";
my $telnet = "telnetpasswd";
#登陆的密码
#my $telnet = $fields[2];
#print "telnet: $telnet\t";
my $banner = $fields[3];
#print "enable: $banner\t";
#设备的sysname,不是banner.
my $hostname = $fields[4];
print "hostname: $hostname\n";
#tftp服务器上的备份的文件名

my $command = "telnet $host";
my $exp=Expect->spawn($command) or die "Cannot spawn $command: $!\n";

my $patidx = $exp->expect(30, &#39;Username:&#39;);
$exp->send("$login\n");

$patidx = $exp->expect(30, &#39;Password:&#39;);
$exp->send("$telnet\n");
$patidx = $exp->expect(30, "<$banner>");
$exp->send("tftp put vrpcfg.zip //$tftp/$hostname.zip\n");
$patidx = $exp->expect(30, &#39; Put file successful&#39;);
$exp->send("q\n");
$exp->soft_close();
}
设备的清单文件和上文cisco设备的大同小异。这里不再列出。

最后,需要说明的是理论上perl+expect模块就已经能够实现路由器配置的备份。
当然,实现备份的方法也是对种多样的,比如用SecureCRT配合vbscript也可以实现。
希望达人也能够交流交流这方面的经验.

初衷就是一个字----“懒”。设备太多,备份起来太麻烦,手动得半个小时多。这下全部让机器搞定,有时候只要留意一下文件的时间就能知道是否备份成功了.
我们这里有网管,不过用的比较少,维护起来还是主要是telnet上去看,估计全国都这样,当然骨干除外。
在得到的同时害怕燃烧,在不需要回忆的时光里什么才是我最想要的,在这个年代最想要的东西永远不要去等太久

TOP

发新话题