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

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

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

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

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

  • это похоже на бородавку # 1 прямо сейчас 🙁 Требуется либо туннелирование для отправки внешнего агента, либо удаленного запроса.

  • Я имел в виду добавить поддержку этих вещей в Fabric, это то, что нам нужно сделать, чтобы работать с сетью git ops

  • Добавление простого способа запуска туннеля, удобного для агента OOB ssh, будет проще или быстрее, скорее всего. Скоро возможно

5 Solutions collect form web for “Python Fabric: Как обрабатывать произвольное приглашение командной строки для ввода?”

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

Я предложил 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

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

Я создал репозиторий происхождения 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://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" 

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

 $fab committag 

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

 $fab committag brpush 

и я создал новый филиал, и сервер обновился.

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

 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) 
  • Нужна пошаговая клавиатура, которая хорошо взаимодействует с пастой и escape-последовательностями ANSI
  • В чем разница между константами AF_INET и PF_INET?
  • Enthought Python, Sage или другие (в Unix-кластерах)
  • Как найти точку монтирования файла?
  • пытается установить lxml на max osx leopard
  • Как читать / dev / random в python
  • эквивалентно команде find coreutil в python 3 для рекурсивного возвращения всех файлов и папок в структуру каталогов?
  • Как добавить расширения файлов на основе типа файла в Linux / Unix?
  • Python - лучший язык программирования в мире.