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:

#!/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;