Newsgroup: it.comp.lang.perl
Titolo: server telnet

Salve,
      sto cercando di programmare un piccolo server telnet in perl per 
cercare di eseguire alcuni comandi a distanza, ecco il codice:
#!/usr/bin/perl -w
#
# telnet 0.0.1 18/02/2007 by THEARTOFWEB
package telnet;
use strict;
use warnings;
use vars qw(@ISA);
use Net::Server;
@ISA = qw(Net::Server);
telnet->run(
   port => 9002,
   log_file => "/tmp/telnet_server.log",
   log_level => 4,
   background => 1
   );
 
exit;
## MAIN
sub configure_hook {
   my $self = shift;
   $self->{error_log}     = "/tmp/telnet_error.log";
}
sub post_configure_hook {
   my $self = shift;
   open(STDERR, ">>". $self->{error_log})  || die "Couldn't open STDERR: 
$!";
   select STDERR;
   $| = 1;
}
sub process_request {
   my $self = shift;
   my $cmd;
   $| = 1;
   print STDOUT "Welcome!\n";
   while (my $line = <STDIN>)
   {  
      $cmd = `$line`;
      print STDOUT $cmd;
   }
}
1;
__END__;
Vorrei sapere come fare a intercettare gli errori da STDERR e farli 
uscire in STDOUT.
Poi, ho dei problemi quando eseguo "cd .." e "cd" in quanto non cambia 
la directory di lavoro...
Come potrei fare un minimo di autenticazione?
Grazie mille!

 Come potrei fare un minimo di autenticazione?
per uesto intanto ho risolto cosě:
sub process_request {
 
   my $self = shift;
   my $cmd;
 
   $| = 1;
 
   print STDOUT "pass:> ";
   PASS: while ( my $pass = <STDIN> )
   {  
      local $/ = "\r\n";
      chomp( $pass );
      last PASS if ( $pass eq "wow" );
      print STDOUT "ACCESS DENIEND\n";
      print STDOUT "pass:> ";
   }
 
   print STDOUT "cmd:> ";
 
   CMD: while (my $line = <STDIN>)
   {
      last CMD if $line =~ /exit/;
      $cmd = `$line`;
      print STDOUT $cmd;
      print STDOUT "cmd:> ";
   }
}

 Grazie mille!
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 stesso, quindi non in `cd ..` ma bensi' chdir("..")
ti ringrazio!
Questo č il nuovo codice che ho scritto ed il server ora č quasi 
identico a telnet o almeno fa quello che mi serve...
sub process_request {
 
   my $self = shift;
   my ($cmd, $pwd, $user);
 
   $| = 1;
 
   print STDOUT "pass:> ";
   while (<STDIN>)
   {  
      s/\r?\n$//;
      last if $_ eq "wow";
      print STDOUT "ACCESS DENIEND\n";
      print STDOUT "pass:> ";
   }
 
   chomp( $pwd = `pwd` );
   $user = $ENV{'USER'};
   print STDOUT "Server:$pwd $user\$ ";
 
   while (<STDIN>)
   {
      s/\r?\n$//;
      last if $_ eq "exit";
      if ( m/^\s*cd\s+(.+)/ )
      {
         chdir("$1");
      }
      $cmd = `$_`;
      chomp( $pwd = `pwd` );
      $user = $ENV{'USER'};
      print STDOUT $cmd;
      print STDOUT "Server:$pwd $user\$ ";
   }
 
}

 stesso, quindi non in `cd ..` ma bensi' chdir("..")
In tutta la pappardella ho omesso di dire che non viene neppure eseguito
un sottoprocesso, almeno in Linux/Unix in quandi cd e' un comando interno
alla shell e non in /usr/bin/
per eseguire l' equivalente si dovrebbe eseguire `sh -c "cd .."`, qualcosa
verrebbe eseguito, pur inutile per i motivi detti prima.
E' solo una precisazione.
Ciao
Roberto


 }
Bene! E poi cosa userai per catturare STDERR??


 ma credo che si possa risparimare lo sforzo al sistema.
hai perfettamente ragione...

 wrote:

posso chiederti come scriveresti questa:
      if ( m/^\s*cd\s+(.+)/ )
      {
         chdir("$1");
      } else {
         $cmd = `$_`;
      }
usando il '?' e ':' ?? ovvero la condizione if abbreviata e su una 
riga...
Grazie mille

 Grazie mille
$_ = <>;
($_ =~ m/^\s*cd\s+(.+)/ ) ? (chdir("$1") , print "if ...\n") : ($cmd =
`$_`, print "else ... $cmd\n");
a me questa funziona...
attenzione che il comando cd puo' non essere seguito da uno spazio,
infatti in Unix/Linux/POSIX cd dato senza niente torna alla homedir
di login dell' user, quindi magari potresti prevedere un' hash con
le homedir virtuali per ogni utente anche non reale al sistema che
decidi di autenticare.
