Newsgroup: it.comp.lang.perl
Titolo: leggere caratteri da finestra windows di PuTTY

per inviarli trovo l'handle della finestra dove devo inviarli e quello
della finestra Dos dalla quale eseguo i comandi per eventuali modifiche 
manuali dei dati inviati:
use Win32::GuiTest qw( :ALL );
use Term::ReadKey;
my @whnds = FindWindowLike( undef, "PuTTY" );
my @hndcmd = FindWindowLike( undef, "CMD.EXE" );
my $key = '';
my $invio = "\n";
if( !@whnds ){
     die "non trovo la finstra con PuTTY\n";
}else{
     printf( "Window handle di PuTTY: %x\n", $whnds[ 0 ] );
}
if( !@hndcmd ){
     die "non trovo la finestra con CMD.EXE\n";
}else{
     printf( "Window handle di CMD.EXE: %x\n", $hndcmd[ 0
] );
}
# invio i miei dati alla finestra di PuTTY
SetForegroundWindow( $whnds[ 0 ] );
SendKeys( "miei_dati" );
SendKeys( $invio );
.....
# interrompo l'invio di dati per leggere i messaggi e decido se
# continuare
SetForegroundWindow( $hndcmd[ 0 ] );
ReadMode('cbreak');
$key = uc(ReadKey(0));
ReadMode('normal');
if ($key eq "S") {
    SetForegroundWindow( $whnds[ 0 ] );
     .....
}elsif{
     SetForegroundWindow( $whnds[ 0 ] );
     .....
}
invece di interrompere il processo e rispondere manualmente vorrei
leggere direttamente dalla finestra di PuTTY se ci sono dei messaggi di
errore (i caratteri che riceve dal server) e di conseguenza scegliere in 
automatico la risposta.
Qualche suggerimento?
Grazie a tutti.
Beppe

Non sarebbe più semplice con plink, la versione da linea di comando di 
putty? 

 
mi servirebbe un esempio di utilizzo...
il vantaggio di utilizzare putty e' il poter seguire il comportamento 
dello script a video intanto che lo metto a punto.
ciao
Beppe

Sembrava molto più facile del previsto, ma tra il dire ed il fare...
Anni fa scoprii una cosa che si chiama expect.
Buon strumento, imposti i caratteri da passare in base ai caratteri a video.
Guardo e... che bello c'è il modulo perl.
Stavo per scriverti il messaggio... non esiste per windows.
Motivo: differenze architetturali (gestione pty).
Quindi in perl non se po fa.
Fingiamo per un attimo di non essere in un newsgroup perl
e se installi: ActiveTcl (sono il primo a odiare quelle soluzioni che 
obbligano ad installare),
lanci il programma: tclsh8.5
e digiti: teacup install Expect
puoi scriverti piccoli scriptini tipo:
_____________________________
package require Expect
set pwd [lindex $argv 0]
set srv [lindex $argv 1]
set cm1 [lindex $argv 2]
set cm2 [lindex $argv 3]
spawn plink -l root -pw $pwd $srv
expect -re ".*~]# " {
  exp_send "unalias -a\r"
}
expect -re "]# " {
    exp_send "$cm1\r"
}
expect -re "]# " {
    exp_send "$cm2\r"
}
expect -re "]# " {
    exp_send "logout\r"
}
expect eof
_____________________________
chiamati da perl tipo:
_____________________________
open(MYDESC, 'tclsh85 script.tcl [omissis] [omissis] "ls -la" uptime|' );
$a=0;
while(<MYDESC>)
{
  chomp;
  print "linea" . $a++ . ": $_\n";
  #eccetera eccetera...
}
close(MYDESC);
_____________________________
Lo so non'è il massimo.
Soprattutto per l'inesistente gestione terminale di plink. (con openssh per 
windows ti va mooolto meglio).
Informazioni su expect le trovi in: 
http://docs.activestate.com/activetcl/8.4/expect4win/

ScriptJus ha scritto:

Grazie, adesso vedo di destreggiarmi con i comandi.
Il problema di usare plink era che prima dovevo eliminare tutti i 
caratteri di formattazione di un terminale VT220 per poter estrarre i 
dati che mi interessava controllare.
ciao
Beppe