X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=SSH.pm;h=639bf2b1fc38216e8bc4311ef23ff295dea92ac2;hb=0b21b6e389571f9a7a87d0b6cbcba9b8c4f8f176;hp=8e55a8aabfe30273c9804b8042319c27b1a7cef9;hpb=d48dda6a0766181e27194cf70a199b450f1effd5;p=Net-SSH.git diff --git a/SSH.pm b/SSH.pm index 8e55a8a..639bf2b 100644 --- a/SSH.pm +++ b/SSH.pm @@ -1,7 +1,7 @@ package Net::SSH; use strict; -use vars qw($VERSION @ISA @EXPORT_OK $ssh $DEBUG); +use vars qw($VERSION @ISA @EXPORT_OK $ssh $equalspace $DEBUG @ssh_options); use Exporter; use IO::File; use IPC::Open2; @@ -9,7 +9,7 @@ use IPC::Open3; @ISA = qw(Exporter); @EXPORT_OK = qw( ssh issh ssh_cmd sshopen2 sshopen3 ); -$VERSION = '0.05'; +$VERSION = '0.07'; $DEBUG = 0; @@ -28,6 +28,13 @@ Net::SSH - Perl extension for secure shell issh('user@hostname', $command); ssh_cmd('user@hostname', $command); + ssh_cmd( { + user => 'user', + host => 'host.name', + command => 'command', + args => [ '-arg1', '-arg2' ], + stdin_string => "string\n", + } ); sshopen2('user@hostname', $reader, $writer, $command); @@ -52,7 +59,8 @@ Calls ssh in batch mode. sub ssh { my($host, @command) = @_; - my @cmd = ($ssh, '-o', 'BatchMode=yes', $host, @command); + @ssh_options = &_ssh_options unless @ssh_options; + my @cmd = ($ssh, @ssh_options, $host, @command); warn "[Net::SSH::ssh] executing ". join(' ', @cmd). "\n" if $DEBUG; system(@cmd); @@ -76,22 +84,46 @@ sub issh { =item ssh_cmd [USER@]HOST, COMMAND [, ARGS ... ] +=item ssh_cmd OPTIONS_HASHREF + Calls ssh in batch mode. Throws a fatal error if data occurs on the command's STDERR. Returns any data from the command's STDOUT. +If using the hashref-style of passing arguments, possible keys are: + + user (optional) + host (requried) + command (required) + args (optional, arrayref) + stdin_string (optional) - written to the command's STDIN + =cut sub ssh_cmd { - my($host, @command) = @_; + my($host, $stdin_string, @command); + if ( ref($_[0]) ) { + my $opt = shift; + $host = $opt->{host}; + $host = $opt->{user}. '@'. $host if exists $opt->{user}; + @command = ( $opt->{command} ); + push @command, @{ $opt->{args} } if exists $opt->{args}; + $stdin_string = $opt->{stdin_string}; + } else { + ($host, @command) = @_; + undef $stdin_string; + } my $reader = IO::File->new(); my $writer = IO::File->new(); my $error = IO::File->new(); - sshopen3( $host, $reader, $writer, $error, @command ) or die $!; + sshopen3( $host, $writer, $reader, $error, @command ) or die $!; + + print $writer $stdin_string if defined $stdin_string; + close $writer; local $/ = undef; - my $output_stream = <$writer>; + my $output_stream = <$reader>; my $error_stream = <$error>; if ( length $error_stream ) { @@ -110,7 +142,8 @@ Connects the supplied filehandles to the ssh process (in batch mode). sub sshopen2 { my($host, $reader, $writer, @command) = @_; - open2($reader, $writer, $ssh, '-o', 'BatchMode=yes', $host, @command); + @ssh_options = &_ssh_options unless @ssh_options; + open2($reader, $writer, $ssh, @ssh_options, $host, @command); } =item sshopen3 HOST, WRITER, READER, ERROR, COMMAND [, ARGS ... ] @@ -121,7 +154,8 @@ Connects the supplied filehandles to the ssh process (in batch mode). sub sshopen3 { my($host, $writer, $reader, $error, @command) = @_; - open3($writer, $reader, $error, $ssh, '-o', 'BatchMode=yes', $host, @command); + @ssh_options = &_ssh_options unless @ssh_options; + open3($writer, $reader, $error, $ssh, @ssh_options, $host, @command); } sub _yesno { @@ -130,6 +164,25 @@ sub _yesno { $x =~ /^y/i; } +sub _ssh_options { + my $reader = IO::File->new(); + my $writer = IO::File->new(); + my $error = IO::File->new(); + open3($writer, $reader, $error, $ssh, '-V'); + my $ssh_version = <$error>; + chomp($ssh_version); + if ( $ssh_version =~ /.*OpenSSH[-|_](\w+)\./ && $1 == 1 ) { + $equalspace = " "; + } else { + $equalspace = "="; + } + my @options = ( '-o', 'BatchMode'.$equalspace.'yes' ) + if ( $ssh_version =~ /.*OpenSSH[-|_](\w+)\./ && $1 > 1 ) { + unshift @options, '-T'; + } + @options; +} + =back =head1 EXAMPLE @@ -172,6 +225,9 @@ John Harrison contributed an example for the documentation. Martin Langhoff contributed the ssh_cmd command, and Jeff Finucane updated it and took care of the 0.04 release. +Anthony Awtrey contributed a fix for those still using +OpenSSH v1. + =head1 COPYRIGHT Copyright (c) 2002 Ivan Kohler.