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_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.          }

perl进度条

收藏个perl的进度条

  1. #!/usr/bin/perl -w
  2. $n = 27;
  3. for($i=1;$i<=$n;$i++){
  4. proc_bar($i,$n);
  5. select(undef, undef, undef, 0.2);
  6. }
  7. print "\n";
  8.  
  9. sub proc_bar{
  10. local $| = 1;
  11. my $i = $_[0] || return 0;
  12. my $n = $_[1] || return 0;
  13. print "\r\033[36m[\033[33m".("|" x int(($i/$n)*50)).
  14. (" " x (50 - int(($i/$n)*50)))."\033[36m]";
  15. printf("%2.1f%%\033[0m",$i/$n*100);
  16. local $| = 0;
  17. }
3 123»