X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=SSH.pm;h=609c83711142b6aaf7cbae10922b4eee10aea336;hb=3d603ad9e608f1105fd6bffea50f54dbba260163;hp=607cdddca8e6dd62a9ff926db4765bcf7f406091;hpb=95ed9cfbdf3bd335f711539ee79287b6734a82f4;p=Net-SSH.git diff --git a/SSH.pm b/SSH.pm index 607cddd..609c837 100644 --- a/SSH.pm +++ b/SSH.pm @@ -1,14 +1,17 @@ package Net::SSH; use strict; -use vars qw($VERSION @ISA @EXPORT_OK $ssh); +use vars qw($VERSION @ISA @EXPORT_OK $ssh $DEBUG); use Exporter; +use IO::File; use IPC::Open2; use IPC::Open3; @ISA = qw(Exporter); -@EXPORT_OK = qw( ssh issh sshopen2 sshopen3 ); -$VERSION = '0.01'; +@EXPORT_OK = qw( ssh issh ssh_cmd sshopen2 sshopen3 ); +$VERSION = '0.04'; + +$DEBUG = 0; $ssh = "ssh"; @@ -24,13 +27,18 @@ Net::SSH - Perl extension for secure shell issh('user@hostname', $command); + ssh_cmd('user@hostname', $command); + sshopen2('user@hostname', $reader, $writer, $command); - sshopen3('user@hostname', $reader, $writer, $error, $command); + sshopen3('user@hostname', $writer, $reader, $error, $command); =head1 DESCRIPTION -Simple wrappers around ssh commands. +Simple wrappers around ssh commands. For an all-perl implementation that does +not require +the system `ssh' command, see Net::SSH::Perl. + =head1 SUBROUTINES @@ -44,7 +52,9 @@ Calls ssh in batch mode. sub ssh { my($host, @command) = @_; - my @cmd = ($ssh, '-o', 'BatchMode yes', $host, @command); + my @cmd = ($ssh, '-o', 'BatchMode=yes', $host, @command); + warn "[Net::SSH::ssh] executing ". join(' ', @cmd). "\n" + if $DEBUG; system(@cmd); } @@ -64,6 +74,34 @@ sub issh { } } +=item ssh_cmd [USER@]HOST, COMMAND [, ARGS ... ] + +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. + +=cut + +sub ssh_cmd { + my($host, @command) = @_; + + my $reader = IO::File->new(); + my $writer = IO::File->new(); + my $error = IO::File->new(); + + sshopen3( $host, $reader, $writer, $error, @command ) or die $!; + + local $/ = undef; + my $output_stream = <$writer>; + my $error_stream = <$error>; + + if ( length $error_stream ) { + die "[Net:SSH::ssh_cmd] STDERR $error_stream"; + } + + return $output_stream; + +} + =item sshopen2 [USER@]HOST, READER, WRITER, COMMAND [, ARGS ... ] Connects the supplied filehandles to the ssh process (in batch mode). @@ -72,7 +110,7 @@ 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); + open2($reader, $writer, $ssh, '-o', 'BatchMode=yes', $host, @command); } =item sshopen3 HOST, WRITER, READER, ERROR, COMMAND [, ARGS ... ] @@ -83,7 +121,7 @@ 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); + open3($writer, $reader, $error, $ssh, '-o', 'BatchMode=yes', $host, @command); } sub _yesno { @@ -94,10 +132,54 @@ sub _yesno { =back -=head1 AUTHOR +=head1 EXAMPLE + + use Net::SSH qw(sshopen2); + use strict; + + my $user = "username"; + my $host = "hostname"; + my $cmd = "command"; + + sshopen2("$user\@$host", *READER, *WRITER, "$cmd") || die "ssh: $!"; + + while () { + chomp(); + print "$_\n"; + } + + close(READER); + close(WRITER); + +=head1 FREQUENTLY ASKED QUESTIONS + +Q: How do you supply a password to connect with ssh within a perl script +using the Net::SSH module? + +A: You don't. Use RSA or DSA keys. See the ssh-keygen(1) manpage. + +Q: My script is "leaking" ssh processes. + +A: See L, L, +L and L. + +=head1 AUTHORS Ivan Kohler +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. + +=head1 COPYRIGHT + +Copyright (c) 2002 Ivan Kohler. +Copyright (c) 2002 Freeside Internet Services, LLC +All rights reserved. +This program is free software; you can redistribute it and/or modify it under +the same terms as Perl itself. + =head1 BUGS Not OO. @@ -106,7 +188,10 @@ Look at IPC::Session (also fsh) =head1 SEE ALSO -ssh(1), L, L +For an all-perl implementation that does not require the system B command, +see L. + +ssh-keygen(1), ssh(1), L, L, L =cut