perl脚本,用来自动登录远程服务器并进行操作

2011-01-18  李卓华 

用到Expect模块

#! /usr/bin/perl

use strict;
use Expect;
use LWP::UserAgent;
use Data::Dumper;
use Getopt::Std;

my $exp;
my %server_list2;
my %server_need_setTraffic2;

my %options=();
getopts("rsf:",\%options); 
if (!defined $options{f}){
print "Usage: ./restartServer.pl -f file [-r] [-s] \n";
}

#my $property_file = $ARGV[0];
my $property_file = $options{f};
open PROPERTY, '<', $property_file;
while(my $line = <PROPERTY>){
if( $line =~ /#Restart Server/ ){
while(my $server_line = <PROPERTY> ){
if ($server_line =~ /^$/){
last;
}
my ($host, $usr, $pass) = split('\t', $server_line);
$server_list2{$host} = [$usr, $pass];
}
}

if ($line =~ /#set traffic/ ){
while(my $server_line = <PROPERTY> ){
if ($server_line =~ /^$/){
last;
}
my ($host, $usr, $pass, $op) = split('\t', $server_line);
$server_need_setTraffic2{$host} = [$usr, $pass, $op];
}
}

#print Dumper(%server_need_setTraffic2);

if (defined $options{r}){
for my $key (keys %server_list2){
print "restart server $key\n";
print "************\n";
my $user   = $server_list2{$key}->[0];
my $pwd    = $server_list2{$key}->[1];
my $server = $key;
&restartServer($server, $user, $pwd);
}
}

if (defined $options{s}){
for my $key (keys %server_need_setTraffic2 ){
&setTraffic($key, 
$server_need_setTraffic2{$key}->[2], 
$server_need_setTraffic2{$key}->[0], 
$server_need_setTraffic2{$key}->[1]
);
}
}

sub restartServer(){
my $user   = $_[1];
my $pwd    = $_[2];
my $server = $_[0];
my $done=-1;
until($done > -1){
$exp = Expect->spawn("ssh $user\@$server");
$exp->expect(10, [
'connecting (yes/no)?',
sub{
my $self = shift;
$self->send("yes\n");
  }
],
[
'assword:',
sub{
$done = 1;
my $self = shift;
$self->send("$pwd\n");
}
]
);
}
$exp->expect(10, '~]$');
$exp->send("sudo /etc/init.d/$user restart\n");
$exp->expect(10, '~]$');
$exp->send("exit\n");
$exp->soft_close();
}

sub setTraffic{
my $link = $_[0];
my $op   = ucfirst(lc($_[1]));
my $url = $link.$op;
my $username = $_[2];
my $password = $_[3];

my $ua = new LWP::UserAgent;
my $req = HTTP::Headers->new;
my $req = HTTP::Request->new(GET => $url);
$req->authorization_basic($username, $password);
my $response = $ua->request($req);
$_ = $response->content;
if (/Accept Traffic State is already set to/){
$link =~ /(.*:[0-9]*).*/;
my $str = $1;
print "$str has been set traffic $op\n";
}
}

close PROPERTY;


配置文件格式:
#properties file

#Restart Server
xxx1.com tom8180 tom8180
xxx2.com tom8180 tom8180
xxx2.com tom8280 tom8280
xxx2.com tom8280 tom8280
xxx2.com tom9480 tom9480

543°/5430 人阅读/0 条评论 发表评论

登录 后发表评论