免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5465 | 回复: 14
打印 上一主题 下一主题

perl写入以及读取文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-06 15:21 |只看该作者 |正序浏览
本帖最后由 liuqiong023 于 2012-11-06 15:45 编辑

各位大侠,我不懂perl语言。想大家帮忙写个小程序

我需要写入文件,每一行都写入IP地址,用户名和密码,比如写入的文件内容如下:
192.168.1.1  root  123456
192.168.1.2  admin 123456


然后再从这个文件读取每一行,并解析出每一行的对应的正确的ip地址, 用户名,和密码

有没有哪位敲敲键盘,提供我一个简单的例子,感谢感谢

写入的格式其实的都无所谓:
192.168.1.1,  root , 123456
192.168.1.2,  admin, 123456

或者
ip=192.168.1.1,  username=root,  password=123456

格式都可以

论坛徽章:
0
15 [报告]
发表于 2012-11-07 16:42 |只看该作者
哈哈,成功了
要用下面这个方法来获取,
(my $host, my $user, my $passwd) = split(/\s+,$line);
空格来分别获取对应的主机名,用户名,密码

论坛徽章:
0
14 [报告]
发表于 2012-11-07 16:02 |只看该作者
错误图片如附件

error.JPG (86.96 KB, 下载次数: 18)

error.JPG

论坛徽章:
0
13 [报告]
发表于 2012-11-07 15:16 |只看该作者
就是写入没有问题了,但是读取,只能正确读取到每一行,但是无法从每一行中,解析获取到对应的的主机,用户名和密码

论坛徽章:
0
12 [报告]
发表于 2012-11-07 15:11 |只看该作者
大家好,我按照Y龙-鬼先生的代码,运行,如果带参数config,能正确的将主机和用户名,密码(有加密)写入config.log文档中.
如果是带参数shutdown,  从config.log我打印出 print $line;读取到的每行都是对的,但是无法打印出主机,用户名和密码,好像用split获取不到。提示use of uninitialized value $_ in spilt,use of uninitialized value $host in print,,,
错误的图片如附件


我的完整脚本如下,
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use warnings;
  4. use VMware::VIRuntime;
  5. use MIME::Base64;

  6. my %opts = (
  7.         level => {
  8.         type => "=s",
  9.         help => "level [shutdown|config]",
  10.         required => 1,
  11.         default => "shutdown",
  12.         },
  13. );

  14. Opts::add_options(%opts);
  15. Opts::parse();
  16. #Opts::validate();

  17. my $level = Opts::get_option('level');
  18. my $log_output_config = "config.log";

  19. if ($level eq "config") {

  20.                 open(FILE,">>$log_output_config");
  21.                 print "Enter your target host ip or hostname:\n";
  22.                 my $inputhost = <STDIN>;
  23.                 chomp($inputhost);
  24.                 exit if($inputhost=~/\bexit\b/);
  25.                 print(FILE "$inputhost\t\t");
  26.   
  27.                 print "Enter your host username:\n";
  28.                 my $inputusername = <STDIN>;           
  29.                 chomp($inputusername);
  30.                 exit if($inputusername=~/\bexit\b/);
  31.                 print(FILE "$inputusername\t\t");
  32.               
  33.                 system "stty -echo";
  34.                 print "Enter your host password:\n";
  35.                 my $inputpasswd = <STDIN>;
  36.                 chomp($inputpasswd);
  37.                 exit if($inputpasswd=~/\bexit\b/);
  38.                 my $encryppasswd = encode_base64($inputpasswd);
  39.                 system "stty echo";
  40.                 print(FILE $encryppasswd);
  41.                 close(FILE);
  42.                 exit;
  43. }
  44. &shutdownHost;


  45. # Shutdown target host
  46. sub shutdownHost {
  47.     my ($log_output_config) =  "config.log";
  48.     my $HANDLE;
  49.     open (HANDLE, $log_output_config) or die("ERROR: Can not locate \$log_output_config\" input file!\n");
  50.     my @lines = <HANDLE>;
  51.     my @errorArray;
  52.     my $line_no = 0;

  53.     close(HANDLE);
  54.     foreach my $line (@lines) {
  55.         $line_no++;
  56.         &trim($line);
  57.         print $line;
  58.         if($line) {
  59.             if($line =~ /^\s*:|:\s*$/){
  60.                 print "Error in Parsing File at line: $line_no\n";
  61.                 print "Continuing to the next line\n";
  62.                 next;
  63.             }
  64.                 (my $host, my $user, my $passwd) = split($line);               
  65.                 my $decryppasswd = decode_base64($passwd);
  66.                 print $host;
  67.                 print $user;
  68.                 print $decryppasswd;
  69.                 my $result_output = `./ghettoShutdown.pl --server $host --username $user --password $decryppasswd`;
  70.             
  71.             

  72.         }
  73.     }
  74. }

  75. sub trim($)
  76. {
  77.     my $string = shift;
  78.     $string =~ s/^\s+|\s+$//g;
  79.     return $string;
  80. }
复制代码

论坛徽章:
0
11 [报告]
发表于 2012-11-06 17:41 |只看该作者
都是好人啊,尤其是Y龙-鬼先生 ,还没有见过这么好的人呀。
感动ing,

我先试试看。。

@mcshell ,我在做 vmware esxi host的关机测试,需要用户输入每一台需要关闭的主机用户名和密码,并保存起来,然后软件根据特定的关机条件,每次去解析用户名和密码,实现关机功能

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
10 [报告]
发表于 2012-11-06 17:32 |只看该作者
LZ  你是要做ssh登陆吗:wink:

论坛徽章:
0
9 [报告]
发表于 2012-11-06 17:28 |只看该作者
楼主你提问的能力真的很强大。
这是写文件的代码:
  1. my $log_output = "config.log";
  2. unlink $log_output;

  3. open(FILE,">$log_output");
  4. while (1) {
  5.               print "Enter your host ip:\n";
  6.               $inputip = <STDIN>;           
  7.               chomp($inputip);
  8.               exit if($inputip=~/\bexit\b/);
  9.               print(FILE "$inputip\t\t");

  10.               print "Enter your host username:\n";
  11.               $inputusername = <STDIN>;           
  12.               chomp($inputusername);
  13.               exit if($inputusername=~/\bexit\b/);
  14.               print(FILE "$inputusername\t\t");
  15.               
  16.               system "stty -echo";
  17.               print "Enter your host password:\n";
  18.               $inputpasswd = <STDIN>;
  19.               chomp($inputpasswd);
  20.               exit if($inputpasswd=~/\bexit\b/);
  21.               $encryppasswd = encode_base64($inputpasswd);
  22.               system "stty echo";
  23.               print(FILE $encryppasswd);
  24. }
  25. close(FILE);
复制代码
这是读文件的代码:
  1. my ($hostlist) =  @ARGV;
  2.   my $HANDLE;
  3.   print $hostlist;
  4.   open (HANDLE, $hostlist) or die("ERROR: Can not locate \"$hostlist\" input file!\n");
  5.   my @lines = <HANDLE>;
  6.   my @errorArray;
  7.   my $line_no = 0;

  8.   close(HANDLE);
  9.   foreach my $line (@lines) {
  10.           $line_no++;
  11.           &TrimSpaces($line);

  12.           if($line) {
  13.                   if($line =~ /^\s*:\s*$/){
  14.                           print "Error in Parsing File at line: $line_no\n";
  15.                           print "Continuing to the next line\n";
  16.                           next;
  17.                   }
  18.                   (my $host, my $user, my $passwd) = split($line);
  19.                   &TrimSpaces($host);
  20.                   push @hostlist,$host;
  21.                   push @userlist,$host;
  22.                   push @passwdlist,$host;
  23.           }
  24.   }
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-11-06 16:16 |只看该作者
读取的代码,应该是另外一段。
我要从刚才写好的文档中, 分别读取每一行的对应的ip, 用户名和密码

比如下面这段代码,是读取每行的ip(这个例子是每行只有一个ip,没有用户名和密码)
我想知道,如果这一行,包含了主机名和密码,如何可以分别获取到对应的ip, 主机名,和密码呢
      my ($hostlist) =  @_;
        my $HANDLE;
        open (HANDLE, $hostlist) or die("ERROR: Can not locate \"$hostlist\" input file!\n";
        my @lines = <HANDLE>;
        my @errorArray;
        my $line_no = 0;

        close(HANDLE);
        foreach my $line (@lines) {
                $line_no++;
                &TrimSpaces($line);

                if($line) {
                        if($line =~ /^\s*:\s*$/){
                                print "Error in Parsing File at line: $line_no\n";
                                print "Continuing to the next line\n";
                                next;
                        }
                        my $host = $line;
                        &TrimSpaces($host);
                        push @hostlist,$host;
                }
        }
然后分别获取每一行的对应的ip, hostname,

论坛徽章:
0
7 [报告]
发表于 2012-11-06 16:10 |只看该作者
我需要的是两段代码哦。

先说下写文件的代码:
这个是我摘取的一段代码,但是这段代码,是分别写入三个文档,分别写入host.log,user.log和passwd.log,而且后面再写会覆盖前面的
我想要的是将host, username, password 写到一个文档中, 并写到一行。
然后后面再写,不会覆盖前面的
my $log_output_host = "host.log";
my $log_output_username = "user.log";
my $log_output_password = "passwd.log";
if ($level eq "config") {
              print "Enter your host ip:\n";
              $inputip = <STDIN>;           
              chomp($inputip);
              open(FILE,">$log_output_host");
              syswrite(FILE,$inputusername);
              close(FILE);

              print "Enter your host username:\n";
              $inputusername = <STDIN>;           
              chomp($inputusername);
              open(FILE,">$log_output_username");
              syswrite(FILE,$inputusername);
              close(FILE);
              
              system "stty -echo";
              print "Enter your host password:\n";
              $inputpasswd = <STDIN>;
              chomp($inputpasswd);
              $encryppasswd = encode_base64($inputpasswd);
              system "stty echo";
              open(FILE,">$log_output_password");
              syswrite(FILE,$encryppasswd);
              close(FILE);
              exit;
                        
}
  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP