Net-SSH-0.09/0000755000175000017500000000000011012631376011277 5ustar ivanivanNet-SSH-0.09/Makefile.PL0000655000175000017500000000034607170371101013253 0ustar ivanivanuse ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. WriteMakefile( 'NAME' => 'Net::SSH', 'VERSION_FROM' => 'SSH.pm', # finds $VERSION ); Net-SSH-0.09/SSH.pm0000655000175000017500000002014411012631274012272 0ustar ivanivanpackage Net::SSH; use strict; use vars qw($VERSION @ISA @EXPORT_OK $ssh $equalspace $DEBUG @ssh_options); use Exporter; use POSIX ":sys_wait_h"; use IO::File; use IO::Select; use IPC::Open2; use IPC::Open3; @ISA = qw(Exporter); @EXPORT_OK = qw( ssh issh ssh_cmd sshopen2 sshopen3 ); $VERSION = '0.09'; $DEBUG = 0; $ssh = "ssh"; =head1 NAME Net::SSH - Perl extension for secure shell =head1 SYNOPSIS use Net::SSH qw(ssh issh sshopen2 sshopen3); ssh('user@hostname', $command); 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); sshopen3('user@hostname', $writer, $reader, $error, $command); =head1 DESCRIPTION Simple wrappers around ssh commands. For an all-perl implementation that does not require the system B command, see L instead. =head1 SUBROUTINES =over 4 =item ssh [USER@]HOST, COMMAND [, ARGS ... ] Calls ssh in batch mode. =cut sub ssh { my($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); } =item issh [USER@]HOST, COMMAND [, ARGS ... ] Prints the ssh command to be executed, waits for the user to confirm, and (optionally) executes the command. =cut sub issh { my($host, @command) = @_; my @cmd = ($ssh, $host, @command); print join(' ', @cmd), "\n"; if ( &_yesno ) { system(@cmd); } } =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, $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(); my $pid = sshopen3( $host, $writer, $reader, $error, @command ) or die $!; print $writer $stdin_string if defined $stdin_string; close $writer; my $select = new IO::Select; foreach ( $reader, $error ) { $select->add($_); } my($output_stream, $error_stream) = ('', ''); while ( $select->count ) { my @handles = $select->can_read; foreach my $handle ( @handles ) { my $buffer = ''; my $bytes = sysread($handle, $buffer, 4096); if ( !defined($bytes) ) { waitpid($pid, WNOHANG); die "[Net::SSH::ssh_cmd] $!" }; $select->remove($handle) if !$bytes; if ( $handle eq $reader ) { $output_stream .= $buffer; } elsif ( $handle eq $error ) { $error_stream .= $buffer; } } } waitpid($pid, WNOHANG); die "$error_stream" if length($error_stream); return $output_stream; } =item sshopen2 [USER@]HOST, READER, WRITER, COMMAND [, ARGS ... ] Connects the supplied filehandles to the ssh process (in batch mode). =cut sub sshopen2 { my($host, $reader, $writer, @command) = @_; @ssh_options = &_ssh_options unless @ssh_options; open2($reader, $writer, $ssh, @ssh_options, $host, @command); } =item sshopen3 HOST, WRITER, READER, ERROR, COMMAND [, ARGS ... ] Connects the supplied filehandles to the ssh process (in batch mode). =cut sub sshopen3 { my($host, $writer, $reader, $error, @command) = @_; @ssh_options = &_ssh_options unless @ssh_options; open3($writer, $reader, $error, $ssh, @ssh_options, $host, @command); } sub _yesno { print "Proceed [y/N]:"; my $x = scalar(); $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 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 (at least not with this module). Use RSA or DSA keys. See the quick help in the next section and the ssh-keygen(1) manpage. A #2: See L instead. Q: My script is "leaking" ssh processes. A: See L, L, L and L. =head1 GENERATING AND USING SSH KEYS =over 4 =item 1 Generate keys Type: ssh-keygen -t rsa And do not enter a passphrase unless you wanted to be prompted for one during file copying. Here is what you will see: $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/User/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/User/.ssh/id_rsa. Your public key has been saved in /home/User/.ssh/id_rsa.pub. The key fingerprint is: 5a:cd:2b:0a:cd:d9:15:85:26:79:40:0c:55:2a:f4:23 User@JEFF-CPU =item 2 Copy public to machines you want to upload to C is your public key. Copy it to C<~/.ssh> on target machine. Put a copy of the public key file on each machine you want to log into. Name the copy C (some implementations name this file C) Then type: chmod 600 authorized_keys Then make sure your home dir on the remote machine is not group or world writeable. =back =head1 AUTHORS Ivan Kohler Assistance wanted - this module could really use a maintainer with enough time to at least review and apply more patches. Or the module should just be deprecated in favor of Net::SSH::Expect or made into an ::Any style compatibility wrapper that uses whatver implementation is avaialble (Net::SSH2, Net::SSH::Perl or shelling out like the module does now). Please email Ivan if you are interested in helping. 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. Thanks to terrence brannon for the documentation in the GENERATING AND USING SSH KEYS section. =head1 COPYRIGHT Copyright (c) 2004 Ivan Kohler. Copyright (c) 2007-2008 Freeside Internet Services, Inc. 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. Look at IPC::Session (also fsh, well now the native SSH "master mode" stuff) =head1 SEE ALSO For a perl implementation that does not require the system B command, see L instead. For a wrapper version that allows you to use passwords, see L instead. For another non-forking version that uses the libssh2 library, see L. For a way to execute remote Perl code over an ssh connection see L. ssh-keygen(1), ssh(1), L, L, L =cut 1; Net-SSH-0.09/Changes0000655000175000017500000000215111012631274012570 0ustar ivanivanRevision history for Perl extension Net::SSH. 0.09 Wed May 14 11:42:46 PDT 2008 - Add links to the more current stuff on CPAN. - Documentation patch about ssh-keygen from terrence brannon 0.08 Thu Feb 12 16:44:36 2004 - replace ssh_cmd blocking read of STDOUT then STDERR with IO::Select 0.07 Mon Aug 26 02:53:26 2002 - turn on -T to quiet pseudo-terminal warnings on OpenSSH v2 or later 0.06 Wed Jul 3 07:52:15 2002 - patch from Anthony Awtrey to use s/=/ / in -o options again if OpenSSH v1 is detected - fix patch to detect at runtime, not compiletime - update ssh_cmd to accept named params & stdin_string 0.05 Fri Feb 15 15:46:00 2002 - brainfart mis-credit 0.04 Fri Feb 15 14:05:06 2002 - added ssh_cmd from Martin Langhoff with updates by Jeff Finucane 0.03 Wec Oct 24 03:49:06 2001 - current OpenSSH wants s/ /=/ in -o options - more documentation updates 0.02 Sat Nov 25 22:44:21 2000 - documentation updates 0.01 Thu Aug 17 17:44:21 2000 - original version; created by h2xs 1.19 Net-SSH-0.09/test.pl0000655000175000017500000000121507170371101012611 0ustar ivanivan# Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl test.pl' ######################### We start with some black magic to print on failure. # Change 1..1 below to 1..last_test_to_print . # (It may become useful if the test is moved to ./t subdirectory.) BEGIN { $| = 1; print "1..1\n"; } END {print "not ok 1\n" unless $loaded;} use Net::SSH; $loaded = 1; print "ok 1\n"; ######################### End of black magic. # Insert your test code below (better if it prints "ok 13" # (correspondingly "not ok 13") depending on the success of chunk 13 # of the test code): Net-SSH-0.09/README0000655000175000017500000000313410734050110012151 0ustar ivanivanNet::SSH Copyright (c) 2002 Ivan Kohler Copyright (c) 2007 Freeside Internet Services, Inc. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. This module implements a Perl interface to ssh. It is a simple wrapper around the system `ssh' command. For a perl implementation that does not require the system B command, see L instead. For a wrapper version that allows you to use passwords, see L instead. For another non-forking version that uses the libssh2 library, see L. For a way to execute remote Perl code over an ssh connection see L. To install: perl Makefile.PL make make test # nothing substantial yet make install Documentation will then be available via `man Net:SSH' or `perldoc Net::SSH' Anonymous CVS access is available: $ export CVSROOT=":pserver:anonymous@cleanwhisker.420.am:/home/cvs/cvsroot" $ cvs login (Logging in to anonymous@pouncequick.cleanwhisker.420.am) CVS password: anonymous $ cvs checkout Net-SSH as well as . Assitance wanted - this module could really use a maintainer with enough time to at least review and apply more patches. Or the module should just be deprecated in favor of Net::SSH::Expect or made into an ::Any style compatibility wrapper that uses whatver implementation is avaialble (Net::SSH2, Net::SSH::Perl or shelling out like the modules does now). Please email if you are interested in helping. Ivan Kohler Net-SSH-0.09/MANIFEST.SKIP0000655000175000017500000000000507170371101013167 0ustar ivanivanCVS/ Net-SSH-0.09/MANIFEST0000655000175000017500000000010107170371101012417 0ustar ivanivanChanges MANIFEST MANIFEST.SKIP Makefile.PL SSH.pm test.pl README