2009-12-09 22 views
5

Sto scrivendo uno script Expect e sto avendo problemi a gestire il prompt della shell (su Linux). Lo script My Expect spawn rlogin e il sistema remoto utilizza ksh. Il prompt sul sistema remoto contiene la directory corrente seguita da " > " (spazio maggiore di spazio). Un frammento di script potrebbe essere:Come posso svuotare il buffer di input in uno script previsto?

send "some command here\r" 
expect " > " 

Questo funziona per i comandi semplici, ma le cose cominciano ad andare male quando il comando sto inviando supera la larghezza del terminale (o più precisamente, che cosa pensa ksh è la larghezza di il terminale). In tal caso, lo ksh esegue uno strano scorrimento orizzontale della riga di comando interattiva, che sembra riscrivere il prompt e inserire un ulteriore ">" nell'output. Naturalmente questo fa sì che lo script Expect venga confuso e fuori sincrono quando sembra che ci sia più di un prompt nell'output dopo l'esecuzione di un comando (il mio script contiene diverse coppie send/expect).

Ho provato a cambiare PS1 sul sistema remoto a qualcosa di più distintivo come "prompt>" ma sorge un problema simile che mi indica che non è il modo giusto per risolvere questo problema.

Quello che sto pensando potrebbe essere la possibilità per lo script di dire a Expect che "so che sono sincronizzato correttamente con il sistema remoto a questo punto, quindi svuota il buffer di input ora." L'istruzione expect ha il flag -notransfer che non invia scartando il buffer di input anche se il pattern corrisponde, quindi penso di aver bisogno del contrario.

Esistono altre tecniche utili che è possibile utilizzare per rendere il comportamento della shell remota più prevedibile? Comprendo che Expect passa attraverso un sacco di lavoro per assicurarsi che la sessione generata compaia per essere interattiva al sistema remoto, ma preferirei che alcune delle più interessanti funzionalità interattive (come lo scorrimento orizzontale di ksh) essere spento.

risposta

7

Se volete buttare via tutto l'output Aspettatevi ha visto fino ad ora, provare

expect -re $ 

Questo è un match espressione regolare su $, che significa la fine del buffer di ingresso, quindi sarà solo saltare tutto quello che riceve in modo lontano. Maggiori dettagli allo Expect man page.

+0

Eccellente, sembra essere proprio quello di cui avevo bisogno. –

1

Si potrebbe provare "set -o multiline" o COLUMNS = 1000000 (o qualche altro valore sufficientemente grande).

+0

Il 'ksh' su questo sistema non sembra avere l'opzione' multiline', ma ho scoperto che se ho impostato + o emacs' (disattivando l'opzione di modifica della linea emacs, che sembra essere il predefinito qui), quindi anche lo scorrimento orizzontale è disabilitato. –

0

Ho avuto difficoltà con ksh e Expect in passato. La mia soluzione era usare qualcosa di diverso da ksh per una shell di login.

Se è possibile modificare l'accesso remoto ad altro che ksh (utilizzando il comando chsh o modificando/etc/passwd), provare con/bin/sh come shell.

Un'altra alternativa è dire a KSH che il terminale è un terminale stupido - non consentire di eseguire alcuna elaborazione speciale.

$ export TERM="" 

potrebbe fare il trucco.

+0

Sfortunatamente, in questa situazione molte altre cose dipendono dal fatto che la shell sia ksh. Cercherò di disabilitare 'TERM', è una buona idea. –

Problemi correlati