2010-04-16 6 views
13

Ceci est lié à ce question ici, mais avec une légère torsion: au lieu de simplement passer 'oui' ou 'non', j'ai besoin de tissu pour transmettre une chaîne arbitraire au shell distant. Par exemple, si le shell distant demande "quel est votre nom?" alors j'ai besoin de le nourrir 'd'abord, dernier'.Python Fabric: Comment gérer l'invite de shell à distance arbitraire pour l'entrée?

Clarification: Je sais que j'ai dit une entrée arbitraire, mais j'étais vraiment trying to use it for the SSH key passwd prompt when I try to do a git pull.

Mise à jour # 1: Vous avez une réponse de Jeff Forcier @bitprophet

+0

double possible de [Comment répondre aux invites automatiquement avec le tissu python?] (Http://stackoverflow.com/questions/10479078/how-to-answer-to-prompts-automatically- avec-python-fabric) – Breedly

Répondre

4

L'interaction avec les serveurs distants est enfin prise en charge dans Fabric 1.0. Voir this page pour plus de détails.

2

peut-être regarder dans pexpect

+0

Hmm, très intéressant et on dirait que ça pourrait marcher. Je vais essayer. Merci pour le conseil! :) – Jay

1

J'ai mis en place un référentiel d'origine git appelé nom_projet/.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 

Je laisse la ligne de dérivation vérifiée. Retour à la machine locale.

Je tire du serveur par l'intermédiaire de clone et a ajouté mon contenu de dir de projet dans le maître de branche sur le repo local. Je n'utilise pas de tissu, mais je suppose que ces étapes peuvent être automatisées, et aucune d'entre elles n'a besoin d'une autre phrase secrète 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" 

Maintenant, je commence à utiliser le tissu. Ci-dessous est un extrait de mon fabfile pour la gestion des balises git et branches:

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

Pour utiliser les defs fabfile ci-dessus, je viens de faire quelques changements à mon projet dir, pense d'un message apporpriate à leur sujet, et à faire:

$fab committag 

et j'ai des modifications marquées et mises à jour sur le serveur. Ou:

$fab committag brpush 

et une nouvelle branche a été créée et le serveur a été mis à jour.

1

Une façon de sauter l'invite de vérification hôte est:

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

Aussi, j'utilise py-github pour installer le 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

je propose une API pour cette fonction en tissu la mailinglist, et a fini par écrire quelque chose moi-même:

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

Voir mon blogpost sur expecting prompts in fabric with fexpect

+0

Le lien du blog ne fonctionne plus, "ilogue.com est à vendre" ... Ce blog est-il disponible ailleurs? Ou devrions-nous nous contenter d'une page archivée? http://web.archive.org/web/20140624141333/http://ilogue.com/jasper/blog/fexpect--dealing-with-prompts-in-fabric-with-pexpect/ – FooF