2011-11-28 16 views
19

Cercare di ottenere Fabric in modo automatico (invece che interattivo dall'utente) interagire con i comandi della shell (e non solo le richieste di password, ma anche richiedere l'input dell'utente quando non è disponibile "stdin/override interattivo" come apt-get install -y).Come far interagire automaticamente Fabric (anziché interagire con l'utente) con i comandi della shell? Combinare con pexpect?

This question insieme a questi Fabric docs suggeriscono che Fabric può solo "spingere l'interattività" indietro all'utente umano che esegue il programma Fabric. Cerco invece di automatizzare completamente senza alcuna presenza umana. Non hai ancora un problema "reale", da risolvere, solo preparando per un possibile ostacolo futuro.

Forse utile combinare con pexpect (o un meccanismo alternativo simile) se Fabric non può gestire esclusivamente tutti gli stdin/prompt automaticamente? Sperando che non sia necessario essere un "either/or" kind of thing. Perché non sfruttare entrambi (pexpect e Fabric) laddove appropriato, se applicabile, nello stesso programma/automazione?

risposta

18

Come direbbe Glenn, usare pexpect; in aggiunta,

un'occhiata a questo wrapper ho scritto script il comportamento pexpect da tessuto:

from ilogue.fexpect import expect, expecting, run 

prompts = [] 
prompts += expect('What is your name?','John') 
prompts += expect('Where do you live?','New York') 

with expecting(prompts): 
    run('command') 

Vedi anche la mia blogpost su fexpect or how to handle prompts in fabric with pexpect

+0

Eccellente, molto apprezzato Jasper. –

15

Non è né/né. Hai solo bisogno di eseguire il comando fab attraverso pexpect:

child = pexpect.spawn('fab <task>') 
child.expect('prompt:') 
child.send('reponse to prompt') 
... etc 

Il comando fab è proprio come qualsiasi altro comando, in modo che possa essere script attraverso pexpect.

+0

Ah, illuminante. Prima pensavo di eseguire pexpect all'interno del materiale fabric.py, ha senso (almeno) funzionare viceversa. –

+0

Quindi non si è in alcun modo a conoscenza di usarlo al contrario, in cui la gestione del terminale di pexpect può essere sottoposta a script all'interno di un'attività fabric? – Shabbyrobe

+0

Non riesco a pensare in nessun modo dato che fabric 'run' restituisce una stringa quando ha finito, quindi non ci sono stream per il quale pexpect si aspetta. – Glenn

2

Per gli utenti di Windows, utilizzare winpexpect. Assicurati di utilizzare questa versione che ho collegato in quanto questa versione corregge alcuni bug nelle versioni precedenti.

import sys, winpexpect 
child = winpexpect.winspawn('ftp', ['<ftp host>']) 
child.logfile = sys.stdout 
child.expect('User.*:') 
child.sendline('username') 
child.expect('Password:') 
child.direct_sendline('password') 
child .sendline('ls') 
print('Now enter the FTP interactive mode') 
child.interact()