这与此question有关,但稍有不同:我不需要传递'yes'或'no',而是需要Fabric将任意字符串传递给远程shell。
例如,如果远程shell提示“你叫什么名字?”然后我需要'先,最后'喂它。
澄清:我知道我说任意输入,但我真的是trying to use it for the SSH key passwd prompt when I try to do a git pull。
更新#1:得到Jeff Forcier @bitprophet的回复
答案 0 :(得分:5)
我已在邮件列表的Fabric中为此功能提出了一个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')
上的博文
答案 1 :(得分:4)
Fabric 1.0最终支持与远程服务器的交互。有关详细信息,请参阅this page。
答案 2 :(得分:2)
也许请查看pexpect
答案 3 :(得分:1)
我已经设置了一个名为project_name / .git的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
我将分支网络检出。回到本地机器。
我通过克隆从服务器拉出来,并在本地仓库的分支主机中添加了我的项目目录内容。虽然这些步骤也可以自动完成,但我认为这些步骤不会使用结构,而且也不需要另外的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"
现在我开始使用面料了。以下是我用于管理git标签的fabfile的摘录 和分支机构:
#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
我创建了一个新分支并更新了服务器。
答案 4 :(得分:1)
跳过主机验证提示的一种方法是:
run('ssh-keyscan github.com > ~/.ssh/known_hosts')
另外,我正在使用py-github来安装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)