• 热门专题

perl的expect模块实现自动输入密码登录

作者:chenwenming  发布日期:2012-12-10 08:50:41
Tag标签:expect模块  
  • 1.安装Expect模块

    cpan>install Expect
     
    2.脚本如下:

    #!/usr/bin/perl -w
    use strict;
    use Expect;
    
    #passwd.txt格式如下:
    #host port user        pass
    
    if(@ARGV != 2) {
                                                                    print "Usage:\n";
                                                                    print "perl ssh_expect.pl        passwd.txt        host\n";
                                                                    exit 1;
    }
    my $passwd = $ARGV[0];
    my $ip = $ARGV[1];
    open(FILE,$passwd)||die"can not open the file: $passwd";
            
    
    while (defined (my $line =<FILE>)) {
                                     chomp $line;
            if ($line =~ /$ip/) {
            my @array = split(/\s+/,$line);
            &ssh_expect($array[0],$array[1],$array[2],$array[3]);
                                            }
        }
    
    
    sub ssh_expect() {
        my $host=$_[0];
        my $port=$_[1];
        my $user=$_[2];
        my $pass=$_[3];
        my $exp = new Expect;
        $exp=Expect->spawn( "ssh -p$port $user\@$host" );
        $exp->expect(10,[ qr/\(yes\/no\)\?\s*$/ => sub { $exp->send("yes\n"); exp_continue; } ],);
        $exp->expect(10, "assword:" );
        $exp->send( "$pass\n" );
        $exp->interact();
    }
    
    close FILE;
    


     

    使用expect做自动login,一直有个麻烦的问题.就是当本地的终端窗口大小发生改变时,因为使用了expect,没法传送改变窗口的信号到远程机器上面,所以看起来很奇怪,严重影响工作的效率. 以前在perl上解决过,perl上对这个问题的详解如下 I set the terminal size as explained above, but if I resize the window, the application does not notice this. You have to catch the signal WINCH ("window size changed"), change the terminal size and propagate the signal to the spawned application:  www.it165.net

    #!/usr/bin/perl -w
    use strict;
    use Expect;
    
    #passwd.txt格式如下:
    #host port user  pass
    
    if(@ARGV != 2) {
                    print "Usage:\n";
                    print "perl ssh_expect.pl  passwd.txt  host\n";
                    exit 1;
    }
    my $passwd = $ARGV[0];
    my $ip = $ARGV[1];
    open(FILE,$passwd)||die"can not open the file: $passwd";
     
    
    while (defined (my $line =<FILE>)) {
             chomp $line;
         if ($line =~ /$ip/) {
            my @array = split(/\s+/,$line);
            &ssh_expect($array[0],$array[1],$array[2],$array[3]);
                 }
        }
    
    
    sub ssh_expect() {
        my $host=$_[0];
        my $port=$_[1];
        my $user=$_[2];
        my $pass=$_[3];
        my $exp = new Expect;
        $exp=Expect->spawn( "ssh -p$port $user\@$host" );
        $exp->slave->clone_winsize_from(\*STDIN);
        $SIG{WINCH} = \&winch;
        $exp->expect(10,[ qr/\(yes\/no\)\?\s*$/ => sub { $exp->send("yes\n"); exp_continue; } ],);
        $exp->expect(10, "assword:" );
        $exp->send( "$pass\n" );
    
        $exp->interact();
    }
    
    
    sub winch {
          my $exp->slave->clone_winsize_from(\*STDIN);
          kill WINCH => $exp->pid if $exp->pid;
         $SIG{WINCH} = \&winch;
    }
    
    
    close FILE;
    

     

延伸阅读:

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规