Domanda

Sto scrivendo uno script Expect e sto avendo problemi ad affrontare il prompt della shell (su Linux). Il mio Aspettatevi lo script genera rlogin e il sistema remoto sta usando ksh. La richiesta sul sistema remoto contiene la directory corrente seguito da " > " (spazio maggiore di spazio). Un frammento di script potrebbe essere:

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, ciò che ksh pensa è la larghezza del terminale). In tal caso, ksh fa alcune scorrimento orizzontale strana della linea di comando interattivo, che sembra riscrivere il prompt e bastone un extra ">" nell'output. Naturalmente questo fa sì che il Aspettatevi script per ottenere confuso e fuori sincrono quando sembra che ci sia più di una pronta nell'output dopo l'esecuzione di un comando (il mio script contiene più coppie send / expect).

Ho provato a cambiare PS1 sul sistema remoto a qualcosa di più caratteristico del tipo "prompt>", ma un problema simile si pone il che indica a me che non è il modo giusto per risolvere questo problema.

Quello che sto pensando potrebbe aiutare è la possibilità per lo script di dire aspettarsi che "so che sto sincronizzata correttamente con il sistema remoto a questo punto, in modo da svuotare il buffer di ingresso ora." L'istruzione expect ha la bandiera -notransfer che non scartare il buffer di ingresso, anche se il modello corrisponde, quindi penso di aver bisogno l'opposto di questo.

Ci sono altre tecniche utili che posso utilizzare per rendere la shell remota si comportano più prevedibile? Capisco che si aspettano passa attraverso un sacco di lavoro per assicurarsi che appare la sessione generato per essere interattivo al sistema remoto, ma preferirei che alcune delle caratteristiche interattive più fastidioso (come ad esempio il scorrimento orizzontale di ksh) essere spento.

È stato utile?

Soluzione

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

expect -re $

Questo è un match regexp su $ che significa la fine del buffer di ingresso, quindi semplicemente eviterà tutto ricevuti finora. Maggiori dettagli al Aspettatevi pagina man .

Altri suggerimenti

Si potrebbe provare a "set multilinea -o" o colonne = 1000000 (o qualche altro valore opportunamente grande).

ho avuto difficoltà con ksh e aspettarsi in passato. La mia soluzione era quella di utilizzare qualcosa di diverso ksh per una shell di login.

Se è possibile modificare il login remoto su un valore diverso ksh (utilizzando il comando chsh o la modifica / etc / passwd) allora si potrebbe provare questo con / bin / sh come shell.

Un'altra alternativa è quella di dire KSH che il terminale è un terminale stupido - non consentire che dal fare qualsiasi trattamento speciale.

$ export TERM=""

potrebbe fare il trucco.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top