use strict; use warnings; use Net::SSH::Perl; my $HOST='MYHOST'; my $ID='MYLOGIN'; my $PW='MYPW'; my $DEBUG=0; # 1 - provides ssh debug output my $perlcmd = join('', ); my $cmd = "/bin/perl - -heartbeat "; # Login to host... my $myssh = Net::SSH::Perl->new( $HOST, protocol=>2, debug=>$DEBUG ); $myssh->login($ID, $PW) or die "Failed to login: $!\n"; listchannels($myssh); # Alarm Handler... $SIG{ALRM} = sub { print STDERR "\nALARM\n"; listchannels($myssh); # Close latest channel (pretend we received an EOF)... my $chanp = getchannels($myssh); $chanp->[-1]->rcvd_ieof; }; # Startup a new command channel on HOST every 5 seconds... while(1) { print STDERR "============================\n"; alarm 5; remcount($myssh); # Add new channel print STDERR "NEXT...\n"; } sub listchannels { my $ssh = shift || die "Missing ssh object"; my $x=0; foreach my $c (@{getchannels($ssh)}) { if($c) { print STDERR "CHAN $x($c->{id}) :$c\n" } else { print STDERR "CHAN $x(X) --CLOSED--\n" }; $x++; } } sub getchannels { my $ssh = shift || die "Missing ssh object"; return($myssh->channel_mgr->{channels}); } sub remcount { my $ssh = shift || die "Missing ssh object"; # STDOUT handler (protocol 2 only)... $ssh->register_handler('stdout', sub { my ($channel, $buffer) = @_; print STDERR "CHAN $channel->{id}: ", $buffer->bytes, "\n"; }); print STDERR "REMOTE: $cmd\n"; my ($stdout, $stderr, $exit) = $ssh->cmd($cmd, $perlcmd); print STDERR "DONE WITH COMMAND!!!\n"; } __DATA__ use strict; use warnings; $|++; my $c='a'; while(1) { print $c++; sleep 1; }