package Net::Rsh;
use strict;
use IO::Socket;
use Carp;
use Errno;
require Exporter;
use vars qw($VERSION @ISA @EXPORT);
$VERSION=0.02;
@ISA = qw(Exporter);
@EXPORT = qw(&rsh);
sub new {
my $class=shift;
my $self={ };
return bless $self,$class;
}
sub rsh {
my ($self,$host,$local_user,$remote_user,$cmd)=@_;
croak("Usage: \$c->rsh(\$host,\$local_user,\$remote_user,\$cmd)") unless @_ == 5;
my $start_port=512;
my $end_port=1023;
my $try=1;
my $port=$end_port;
my $socket;
while($try) {
if($port<$start_port) {croak "All ports in use";}
$socket = IO::Socket::INET->new(PeerAddr=>$host,
PeerPort=>'514',
LocalPort=>$port,
Proto=>"tcp");
if(!defined $socket) {
if($!{EADDRINUSE}) {
$port-=1;
} else {croak $!;}
} else { $try=0; }
}
print $socket "0\0";
print $socket "$local_user\0";
print $socket "$remote_user\0";
print $socket "$cmd\0";
my @return=<$socket>;
return @return;
}
END { }
1;
__END__
=head1 NAME
Net::Rsh - perl client for Rsh protocol
=head1 SYNOPSIS
use Net::Rsh;
$a=Net::Rsh->new();
$host="cisco.router.com";
$local_user="root";
$remote_user="root";
$cmd="sh ru";
@c=$a->rsh($host,$local_user,$remote_user,$cmd);
print @c;
=head1 DESCRIPTION
Rsh protocol requires that the program be
run as root or that the program be setuid to root
=head1 AUTHOR
Oleg Prokopyev, <riiki@gu.net>
=cut