2010-04-16 22 views
13

Jest to związane z tym question tutaj, ale z lekkim obróceniem: zamiast po prostu przekazać "tak" lub "nie", potrzebuję Fabric, aby przekazać dowolny ciąg do odległej powłoki.Python Fabric: Jak obsłużyć dowolne polecenie zdalnego wprowadzania danych wejściowych?

Na przykład, jeśli zdalna powłoka pyta "jak masz na imię?" to muszę go nakarmić "pierwszy, ostatni".

Wyjaśnienie: Wiem, że powiedziałem arbitralne dane wejściowe, ale naprawdę byłem trying to use it for the SSH key passwd prompt when I try to do a git pull.

Aktualizacja # 1: Dostaliśmy odpowiedź z Jeffem Forcier @bitprophet

+0

Możliwy duplikat [Jak odpowiedzieć automatycznie podpowiada tkaniny z Pythona?] (Http://stackoverflow.com/questions/10479078/how-to-answer-to-prompts-automatically- z pytonem-tkaniną) – Breedly

Odpowiedz

4

Współdziałanie ze zdalnymi serwerami jest ostatecznie obsługiwane w Fabric 1.0. Aby uzyskać szczegółowe informacje, patrz this page.

2

Może zajrzeć do pexpect

+0

Hmm, bardzo interesujące i wygląda na to, że może działać. Poświęcę to. Dzięki za wskazówkę! :) – Jay

1

Skonfigurowałem repozytorium pochodzenia git o nazwie 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 

Zostawiam sieć oddziałów wyrejestrowany. Powrót do komputera lokalnego.

Wyciągam z serwera za pomocą programu klonującego i dodajemy zawartość katalogu projektu do wzorca głównego w lokalnym repozytorium. Stll nie używa tkaniny, po prostu konfiguruje, chociaż te kroki mogą być zautomatyzowane, jak przypuszczam, i żaden z nich nie potrzebuje kolejnego hasł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" 

Teraz zacznę używać tkaniny. Poniżej jest fragmentem mojej fabfile zarządzania tagów git i oddziały:

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

Aby skorzystać z powyższych DEFS fabfile, po prostu wprowadzić pewne zmiany do mojego projektu dir myśleć o wiadomości apporpriate o nich, a nie:

$fab committag 

i mam zmiany oznaczone i zaktualizowane na serwerze. Lub:

$fab committag brpush 

i mam nowy oddział utworzony i serwer zaktualizowany.

1

Jednym ze sposobów na ominięcie monit weryfikacji gospodarz jest:

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

Również używam py-github zainstalować 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

zaproponowałem API dla tej funkcji w tkaninie na listę mailingową, i napisałem coś sam:

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

Zobacz moją blogpost na expecting prompts in fabric with fexpect

+0

Link do postu na blogu już nie działa, "ilogue.com jest na sprzedaż" ... Czy ten blog jest dostępny gdzieś indziej? A może powinniśmy zadowolić się zarchiwizowaną stroną? http://web.archive.org/web/20140624141333/http://ilogue.com/jasper/blog/fexpect-dealing-with-prompts-in-fabric-with-pexpect/ – FooF

Powiązane problemy