【发布时间】:2010-04-01 15:20:36
【问题描述】:
假设我不能用 Fabric 运行这样的东西:
run("svn update --password 'password' .")
将远程交互式命令行的密码传递给 Fabric 的正确方法是什么?
问题是 repo 被签出为 svn+ssh 而我没有 http/https/svn 选项
【问题讨论】:
假设我不能用 Fabric 运行这样的东西:
run("svn update --password 'password' .")
将远程交互式命令行的密码传递给 Fabric 的正确方法是什么?
问题是 repo 被签出为 svn+ssh 而我没有 http/https/svn 选项
【问题讨论】:
试试 SSHkey。它允许您在没有密码的情况下连接到服务器。 在这种情况下,您必须在远程服务器和 repo 之间设置一个 sshkey。
在远程服务器:生成密钥对
$ ssh-keygen -t dsa
将 passphase 留空! 这将生成 2 个文件
然后,将 id_dsa.pub 中的内容附加到 repo 服务器的 ~/.ssh/authorized_keys 中。
您的远程服务器无需任何密码即可更新源代码树。
【讨论】:
如果你只是想从日志中隐藏你的密码,你可以使用这样的东西:
from fabric.state import output
def xrun(command, hidden='', *args, **kwargs):
old_state = output.running
output.running = False
print '[%s] run: %s' % (env.host_string, command)
run(command + hidden, *args, **kwargs)
output.running = command
xrun('svn update', '--password "your password"')
【讨论】:
我们前段时间遇到过类似的问题,实际上为 Fabric 提出了一项新功能,但我们与之交谈的开发人员却提出了这个建议。
import getpass
password = getpass.getpass('Enter SVN Password: ')
run("svn update --password '%s'" % password)
这将在 Fabric 运行此命令时提示您输入密码。
我相信这会在结构日志中显示您的密码,因此更好的选择是让 SVN 提示您输入密码并将密码回显到其中。
run('echo %s | svn update --password' % password)
虽然我不使用 SVN,所以恐怕我不确定这是否可能。我希望其他人可以在那里提供帮助!
【讨论】:
我对自动化交互式命令行的标准答案是“使用 Expect”,但您使用的是 Python,所以我将稍微改进为“使用 Pexpect”。
将 Pexpect 集成到 Fabric 中可能需要一些思考,或者您可能最终会在这种特殊情况下单独使用 Pexpect。但这绝对是我要走的路。
【讨论】:
您可能还需要为用户提供服务?如果没有,您可能会更幸运地导出您的 repo 并(在本地)制作 tar 以在服务器上上传+部署。如果您在本地运行 svn 命令,系统会提示您输入用户名和/或密码。
【讨论】:
你应该看看Fabric's env documentation。那里说你应该做这样的事情:
from fabric.api import env
env.user = 'your_user'
env.password = 'your_password'
希望对你有帮助!
【讨论】: