Python Fabric: ¿Cómo manejar un indicador de shell remoto arbitrario para la entrada?

Esto está relacionado con esta pregunta aquí, pero con un ligero giro: en lugar de simplemente pasar ‘sí’ o ‘no’, necesito que Fabric pase una cadena arbitraria al shell remoto.

Por ejemplo, si el shell remoto solicita “¿cuál es tu nombre?” entonces necesito alimentarlo ‘primero, último’.

Aclaración: Sé que dije una entrada arbitraria, pero realmente estaba tratando de usarla para la clave SSH passwd cuando bash hacer un tirón de git .

Actualización # 1: Tengo una respuesta de Jeff Forcier @bitprophet

La interacción con servidores remotos finalmente es compatible con Fabric 1.0. Vea esta página para más detalles.

He propuesto una API para esta función en la lista de correo y terminé escribiendo algo por mi cuenta:

from 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') 

Ver mi blogpost en esperar indicaciones en la tela con fexpect

Tal vez mirar en pexpect

He configurado un repository de origen git llamado project_name / .git.

  ssh to the server, (entering ssh passwords or passphrases as I go) mkdir project_name cd project_name git init touch fabfile.py git add fabfile.py git commit -a -m "almost empty" git checkout -b web 

Dejo la twig web comprobada. De vuelta a la máquina local.

Extraigo del servidor a través de la clonación y agregué los contenidos del directorio de mi proyecto en Branch Master en el repository local. Stll no usa la tela, solo configura las cosas, aunque estos pasos también podrían automatizarse, supongo, y ninguno de ellos necesita otra frase de contraseña ssh.

  cd /path/to/project_name/.. git clone ssh://joe@some_server.com/var/web/project_name/.git cd project_name gvim fabfile.py git add fabfile.py git commit -a -m "fabfile edits" 

Ahora empiezo a usar telas. A continuación se muestra un extracto de mi archivo fab para la gestión de tags y sucursales de git:

  #Usage: fab committag brpush | fab committag push | fab push | fab tag def committag(): """commit chgs, tag new commit, push tags to server.""" prompt('commit descr: ', 'COM_MSG', default='new stuff') prompt('commit name: ', 'COM_NAME', default='0.0.1') local('git commit -a -m "%(COM_MSG)s"' % env) local('sleep 1') local('git tag -u "John Griessen" -m "%(COM_MSG)s" %(COM_NAME)s' % env) local('sleep 1') local('git push origin --tags') #pushes local tags def brpush(): """create a new branch, default COM_NAME, then push to server.""" prompt('new branch name: ', 'BR_NAME', default= '%(COM_NAME)s' % env) local('git checkout -b %(BR_NAME)s' % env) local('sleep 2') local('git checkout master') local('git push origin --tags') #pushes local tags local('git push --all origin') #pushes local master and branches def push(): """Push existing tags and changes to server.""" local('git push origin --tags') #pushes local tags local('git push --all origin') #pushes local master and branches def tag(): #Call this from committag() """create a gpg signed tag on the local git repo tag from prompted name .""" prompt('tag descr: ', 'TAG_MSG', default='0.0.1') prompt('tag name: ', 'TAG_NAME', default='0.0.1') local('git tag -u "John Griessen" -m "%(TAG_MSG)s" %(TAG_NAME)s' % env) 

Para usar las definiciones de archivo anteriores, solo hago algunos cambios en el directorio de mi proyecto, pienso en un mensaje apropiado para ellos y hago lo siguiente:

 $fab committag 

y tengo cambios etiquetados y actualizados en el servidor. O:

 $fab committag brpush 

y tengo una nueva twig creada y el servidor actualizado.

Una forma de omitir el indicador de verificación del host es:

 run('ssh-keyscan github.com > ~/.ssh/known_hosts') 

Además, estoy usando py-github para instalar las claves de implementación:

 run('ssh-keygen -q -t rsa -f /home/%(user)s/.ssh/id_rsa -N ""' % env) key = run('cat /home/%(user)s/.ssh/id_rsa.pub' % env) gh.repos.addDeployKey(repo, env.host, key)