2010-04-16 17 views
13

Esto está relacionado con este question aquí, pero con un ligero giro: en lugar de simplemente pasar 'sí' o 'no', necesito que Fabric pase una cadena arbitraria al shell remoto.Tejido de Python: ¿Cómo se maneja el comando de shell remoto arbitrario para la entrada?

Por ejemplo, si el shell remoto solicita '¿cómo se llama?' entonces necesito alimentarlo 'primero, último'.

Aclaración: Sé que dije entrada arbitraria, pero realmente era trying to use it for the SSH key passwd prompt when I try to do a git pull.

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

+0

duplicado posible de [Cómo responder a las solicitudes de forma automática con la tela de pitón?] (Http://stackoverflow.com/questions/10479078/how-to-answer-to-prompts-automatically- with-python-fabric) – Breedly

Respuesta

4

La interacción con servidores remotos finalmente es compatible con Fabric 1.0. Vea this page para más detalles.

2

Tal vez mirar hacia pexpect

+0

Hmm, muy interesante y parece que podría funcionar. Voy a intentarlo. ¡Gracias por el consejo! :) – Jay

1

He creado un repositorio de origen git llamado nombre_proyecto/.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 branch web checked out. De vuelta a la máquina local.

Extraigo del servidor mediante clonación y agregué los contenidos de mi directorio de proyecto en la rama principal en el repositorio local. No utilizaré el tejido, solo configuraré las cosas, aunque supongo que también podría automatizar estos pasos, y ninguno de ellos necesita otra frase de contraseña ssh.

cd /path/to/project_name/.. 
    git clone ssh://[email protected]_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 tela. A continuación es un extracto de mi fabfile para la gestión de etiquetas git y ramas:

#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 utilizar las defs fabfile anteriores, acabo de hacer algunos cambios en mi proyecto dir, pensar en un mensaje de apporpriate sobre ellos, y hacer:

$fab committag 

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

$fab committag brpush 

y tengo una nueva rama creada y el servidor actualizado.

1

Una forma de saltarse el símbolo de verificación anfitrión es:

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

Además, estoy usando py-github para instalar el deploy keys:

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) 
5

he propuesto una API para esta función en el tejido la lista de correo, y terminé escribiendo algo yo mismo:

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 entrada de blog en expecting prompts in fabric with fexpect

+0

El enlace a la publicación del blog ya no funciona, "ilogue.com está a la venta" ... ¿Este blog está disponible en otro lado? ¿O deberíamos estar contentos con la página archivada? http://web.archive.org/web/20140624141333/http://ilogue.com/jasper/blog/fexpect--dealing-with-prompts-in-fabric-with-pexpect/ – FooF

Cuestiones relacionadas