perl ping检测脚本

我的第一个用于生产环境的perl脚本,虽然不是很优秀,但也迈出了扎实的一步 :)
领导有任务,给一批IP列表,ping每一台机器,如果没有响应就发邮件通知,通知的邮件需要分开,不能通知一个列表,得一封一封的通知.
用到email::send模块,因为需要用到Gmail

  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Email::Send;
  5. use Email::Send::Gmail;
  6. use Email::Simple::Creator;
  7. my @list = qw/
  8. 1.1.1.1
  9. 2.2.2.2
  10. 3.3.3.3
  11. /;
  12. foreach my $re (@list){
  13.         my $p = `ping $re -c 3`;
  14.         if($p=~/100% packet loss/){
  15.                 my $email = Email::Simple->create(
  16.                 header => [
  17.                 From    => 'monitor@a.com',
  18.                 To      => 'monitor@b.com',
  19.                 Subject => "$re 100% packet loss",
  20. ],
  21. body => "$re the server is down!\n",
  22.  );
  23.                 my $sender = Email::Send->new(
  24.                 { mailer => 'Gmail',
  25.                 mailer_args => [
  26.                 username => 'monitor@a.com',
  27.                 password => 'xxx',
  28.                 ]
  29.                 }
  30. );
  31.         eval { $sender->send($email) };
  32.         die "Error sending email: $@" if $@;
  33.         }
  34. }

perl模块_List::Util

1加2加3加4 … 加到100,试了一下还是perl最快
需要用到perl的List::Util模块.

  1. [root@centos perl]# more plus.pl
  2. #!/usr/bin/perl -w
  3. use strict;
  4. use List::Util qw[sum];
  5. my $t = sum(1..100);
  6. print "$t\n";
  7. [root@centos perl]# perl plus.pl
  8. 5050

shell取巧的方法也很简单,利用seq与sed和bc
seq生成数字,sed将空格替换为加号,通过管道传递给bc进行加法运算.

  1. [root@centos perl]# seq -s " " 100|sed 's/ /+/g'|bc
  2. 5050

perl_reverse_sort_scalar

学习perl的reverse,sort,scalar,记录一下。

  1. [root@OTRS perl]# more reverse_sort_scalar.pl      
  2. #!/usr/bin/perl -w
  3. use strict;
  4. #reverse
  5. my @array_reverse = 1..3;
  6. my @array_ed = reverse(@array_reverse);
  7. print "数组的值为1 2 3,reverse反转数组的值为: ","@array_ed\n";
  8. #sort
  9. my @array_sort = qw/c b a/;
  10. my @sorted = sort@array_sort;
  11. print "数组的值为c b a,sort排序后为: ","@sorted\n";
  12. #scalar强制指定标量上下文。
  13. my @array_scalar = qw/a b c/;
  14. print "数组的值为abc,scalar指出数组的个数为:",scalar@array_scalar,"\n";
  15. [root@OTRS perl]# perl reverse_sort_scalar.pl
  16. 数组的值为1 2 3,reverse反转数组的值为: 3 2 1
  17. 数组的值为c b a,sort排序后为: a b c
  18. 数组的值为abc,scalar指出数组的个数为:3

perl_pop_push_shift_unshift

perl的pop跟push操作数组的最右边,shift跟unshift操作数组的最左边
学习记录一下

  1. #!/usr/bin/perl -w
  2. use strict;
  3. print '@a @b @c @d 的值都为1 2 3',"\n";
  4. my @a = (1..3);
  5. pop(@a);
  6. print "\@a的值为@a,pop拿掉数组最右边的值\n";
  7. my @b = (1..3);
  8. push(@b,'4');
  9. print "\@b的值为@b,push添加一个值到数组的最右边。\n";
  10. my @c = (1..3);
  11. shift@c;
  12. print "\@c的值为@c,shift拿掉数组最左边的一个值。\n";
  13. my @d = (1..3);
  14. unshift(@d,0);
  15. print "\@d的值为@d,unshift添加一个值到数组的最左边。\n";
  16.  
  17.  
  18. [root@OTRS perl]# perl pop_push_shift_unshift.pl
  19. @a @b @c @d 的值都为1 2 3
  20. @a的值为1 2,pop拿掉数组最右边的值
  21. @b的值为1 2 3 4,push添加一个值到数组的最右边。
  22. @c的值为2 3,shift拿掉数组最左边的一个值。
  23. @d的值为0 1 2 3,unshift添加一个值到数组的最左边。

perl脚本计算IP

由于工作上的需要,要将IP段计算成IP,perl的Net::IP刚好用上.

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Net::IP;
  4. my $ip = new Net::IP ('192.168.0.0/24') or die;
  5. do {
  6.    print $ip -> ip(),"\n";
  7. } while(++$ip);

将文本文件的ip段计算成ip地址

  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Net::IP;
  4. open (A, "<wait.txt");
  5. while (<A>) {
  6.    my($a) = $_;
  7.    my $ip = new Net::IP ("$_") or die $!;
  8.    do {
  9.       print $ip -> ip(), "\n";
  10.    }
  11.    while (++$ip);
  12.          }
3 123»