Подтвердить что ты не робот

Python Fabric: Как обрабатывать произвольное приглашение командной строки для ввода?

Это связано с этим question здесь, но с небольшим завихрением: вместо того, чтобы просто передавать "да" или "нет", мне нужна ткань для прохождения произвольная строка для удаленной оболочки.

Например, если удаленная оболочка запрашивает "как ваше имя?" то мне нужно прокормить его "первым, последним".

Уточнение: я знаю, что я произнес произвольный ввод, но я действительно пытался использовать его для подсказки passwd ключа SSH, когда я пытаюсь сделать git тянуть.

Обновление # 1: Получил ответ от Джеффа Форсира @bitprophet

4b9b3361

Ответ 1

Взаимодействие с удаленными серверами наконец поддерживается в Fabric 1.0. Подробнее см. эту страницу.

Ответ 2

Я предложил API для этой функции в тканью в списке рассылки, и в итоге сам что-то написал:

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

Смотрите мой блогпост на ожидающие подсказки в ткани с fexpect

Ответ 3

Возможно, посмотрите pexpect

Ответ 4

Я создал исходный репозиторий git, названный 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

Я выхожу из веб-сайта. Вернитесь на локальную машину.

Я вытаскиваю с сервера через клон и добавляю содержимое моего проекта в мастер-ветку на локальном репо. Stll не использует ткань, просто настраивая вещи, хотя эти шаги также могут быть автоматизированы, и никто из них не нуждается в другой кодовой фразе 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"

Теперь я начинаю использовать ткань. Ниже выдержки из моего файла fabfile для управления тегами 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)

Чтобы использовать приведенные выше fabfile defs, я просто вношу некоторые изменения в свой проект dir, подумайте о соответствующем сообщении о них и выполните:

$fab committag

и у меня есть изменения, отмеченные и обновленные на сервере. Или:

$fab committag brpush

и у меня новая ветвь создана, и сервер обновлен.

Ответ 5

Один из способов пропустить подсказку подтверждения хоста:

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

Кроме того, я использую py-github для установки развертывания клавиши:

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)