El siguiente código proporciona un comando pssh que es una versión
Perl del comando ssh
. Al estar todo el código escrito
en Perl nos proporciona un cliente bastante independiente
del sistema operativo:
pp2@nereida:/tmp/Net-SSH-Perl-1.30/eg$ cat -n pssh 1 #!/usr/bin/perl -w 2 # $Id: pssh,v 1.16 2001/04/28 05:28:40 btrott Exp $ 3 4 use strict; 5 6 use Net::SSH::Perl; 7 use Getopt::Long; 8 9 my %opts; 10 Getopt::Long::Configure('no_ignore_case'); 11 GetOptions(\%opts, "c=s", "l=s", "p=i", "i=s@", "v", "t", "C", "o=s@", "V", "2", "1"); 12 13 if ($opts{V}) { 14 print Net::SSH::Perl->version_string, "\n"; 15 exit; 16 } 17 18 my($host, $cmd) = @ARGV; 19 20 die "usage: pssh [options] hostname [command]" 21 unless $host; 22 23 my %cipher_map = ( 24 idea => 'IDEA', 25 des => 'DES', 26 '3des' => 'DES3', 27 blowfish => 'Blowfish', 28 ); 29 30 my %args; 31 $args{compression} = 1 if $opts{C}; 32 $args{cipher} = $cipher_map{ $opts{c} } || $opts{c} if $opts{c}; 33 $args{port} = $opts{p} if $opts{p}; 34 $args{debug} = 1 if $opts{v}; 35 $args{identity_files} = $opts{i} if $opts{i}; 36 $args{use_pty} = 1 if $opts{t}; 37 $args{options} = $opts{o} if $opts{o}; 38 $args{protocol} = 2 if $opts{2}; 39 $args{protocol} = 1 if $opts{1}; 40 41 my $ssh = Net::SSH::Perl->new($host, %args); 42 $ssh->config->set('interactive', 1) 43 unless defined $ssh->config->get('interactive'); 44 $ssh->login($opts{l}); 45 46 if ($cmd) { 47 my($out, $err, $exit) = $ssh->cmd($cmd); 48 print $out if $out; 49 print $err if $err; 50 } 51 else { 52 eval "use Term::ReadKey;"; 53 ReadMode('raw'); 54 eval "END { ReadMode('restore') };"; 55 $ssh->shell; 56 print "Connection to $host closed.\n"; 57 }
Véase un ejemplo de ejecución:
pp2@local:/tmp$ pssh -l casiano remote.pcg.ull.es Last login: Wed Jul 2 10:06:57 2008 from local casiano@remote:~$
Casiano Rodríguez León