【问题标题】:fabric and svn password织物和svn密码
【发布时间】:2010-04-01 15:20:36
【问题描述】:

假设我不能用 Fabric 运行这样的东西:

run("svn update --password 'password' .")

将远程交互式命令行的密码传递给 Fabric 的正确方法是什么?

问题是 repo 被签出为 svn+ssh 而我没有 http/https/svn 选项

【问题讨论】:

    标签: python svn fabric


    【解决方案1】:

    试试 SSHkey。它允许您在没有密码的情况下连接到服务器。 在这种情况下,您必须在远程服务器和 repo 之间设置一个 sshkey。

    在远程服务器:生成密钥对

     $ ssh-keygen -t dsa
    

    将 passphase 留空! 这将生成 2 个文件

    • ~/.ssh/id_dsa(私钥)
    • ~/.ssh/id_dsa.pub(公钥)

    然后,将 id_dsa.pub 中的内容附加到 repo 服务器的 ~/.ssh/authorized_keys 中。

    您的远程服务器无需任何密码即可更新源代码树。

    【讨论】:

    • 希望有人在看... - 将密码留空不是一个坏主意吗?
    • 是的,一个空的密码通常不好 - 但它并不比将密码放入脚本更糟糕 - 在这种情况下,如果密码不为空,您将需要脚本输入SSH 密码短语而不是远程密码,所以它不会有什么作用。
    【解决方案2】:

    如果你只是想从日志中隐藏你的密码,你可以使用这样的东西:

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

    【讨论】:

      【解决方案3】:

      我们前段时间遇到过类似的问题,实际上为 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,所以恐怕我不确定这是否可能。我希望其他人可以在那里提供帮助!

      【讨论】:

      • 正如我上面所说的 svn update --password 根本不起作用,因为该选项仅适用于 http/https。
      • 我正在寻找的是一种以交互方式传递密码的自动方式。
      • 好吧,将您的命令回显到 SVN 中可能仍然值得一试。您应该能够将密码回显到交互式提示中,但您的里程可能会有所不同。
      【解决方案4】:

      我对自动化交互式命令行的标准答案是“使用 Expect”,但您使用的是 Python,所以我将稍微改进为“使用 Pexpect”。

      将 Pexpect 集成到 Fabric 中可能需要一些思考,或者您可能最终会在这种特殊情况下单独使用 Pexpect。但这绝对是我要走的路。

      【讨论】:

        【解决方案5】:

        您可能还需要为用户提供服务?如果没有,您可能会更幸运地导出您的 repo 并(在本地)制作 tar 以在服务器上上传+部署。如果您在本地运行 svn 命令,系统会提示您输入用户名和/或密码。

        【讨论】:

        • 我也尝试过提供 --username 开关,但没有任何运气。
        【解决方案6】:

        你应该看看Fabric's env documentation。那里说你应该做这样的事情:

        from fabric.api import env
        
        env.user = 'your_user'
        env.password = 'your_password'
        

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 2011-11-22
          • 2015-06-14
          • 1970-01-01
          • 2011-04-28
          • 2011-04-18
          • 1970-01-01
          • 2012-08-09
          • 1970-01-01
          • 2015-01-05
          相关资源
          最近更新 更多