在机器中使用 Fabric 运行 ssh-add

发布于 2024-12-10 06:48:03 字数 375 浏览 0 评论 0原文

我正在使用 Fabric 运行一些部署任务,需要将 Mercurial 存储库签出/更新到计算机,然后执行适当的复制/配置。

每次我启动一台新机器(我们目前正在使用 EC2 作为基础设施)或者当我在机器中运行 hg pull 时,它都会询问我的 ssh 密钥密码,这有点烦人我们需要一次初始化十几台机器。

当新的 EC2 实例初始化时,我尝试在 Fabric 中运行 ssh-add 但似乎 ssh-agent 没有为该 shell 运行,我得到来自 Fabric 输出的 无法打开与身份验证代理的连接。 消息。

当通过 Fabric 脚本连接到实例时,如何使 ssh-add 工作?

I'm running some deployment tasks with Fabric that needs to checkout/update a Mercurial repository to the machine and then execute the appropriate copying/configuration.

Every time that I instatiate a new machine (we're currently using EC2 for our infrastructure) or when I run hg pull in the machine it'll ask for my ssh key passphrase, that's a bit annoying when we need to initialize a dozen machines at a time.

I've tried to run ssh-add in Fabric when the new EC2 instance is initialized but it seems like that ssh-agent isn't running for that shell and I get a Could not open a connection to your authentication agent. message from the output of Fabric.

How would I make ssh-add work when connected to the instance by the Fabric script?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浅暮の光 2024-12-17 06:48:03

Fabric 问题跟踪器上的评论为我解决了这个问题。它是 的修改版本林肯循环解决方案。使用此“运行”而不是 Fabric 的“运行”将通过本地 ssh 传输您的命令,从而允许您的本地 ssh 代理提供密钥。

from fabric.api import env, roles, local, output
from fabric.operations import _shell_escape

def run(command, shell=True, pty=True):
    """
    Helper function.
    Runs a command with SSH agent forwarding enabled.

    Note:: Fabric (and paramiko) can't forward your SSH agent. 
    This helper uses your system's ssh to do so.
    """
    real_command = command
    if shell:
        cwd = env.get('cwd', '')
        if cwd:
            cwd = 'cd %s && ' % _shell_escape(cwd)
        real_command = '%s "%s"' % (env.shell,
            _shell_escape(cwd + real_command))
    if output.debug:
        print("[%s] run: %s" % (env.host_string, real_command))
    elif output.running:
        print("[%s] run: %s" % (env.host_string, command))
    local("ssh -A %s '%s'" % (env.host_string, real_command))

请注意,我正在运行 Fabric 1.3.2,并且不再需要此修复。

A comment on fabric's issue tracker solved this for me. It's a modified version of the lincolnloop solution. Using this "run" instead of fabric's will pipe your commands through ssh locally, allowing your local ssh-agent to provide the keys.

from fabric.api import env, roles, local, output
from fabric.operations import _shell_escape

def run(command, shell=True, pty=True):
    """
    Helper function.
    Runs a command with SSH agent forwarding enabled.

    Note:: Fabric (and paramiko) can't forward your SSH agent. 
    This helper uses your system's ssh to do so.
    """
    real_command = command
    if shell:
        cwd = env.get('cwd', '')
        if cwd:
            cwd = 'cd %s && ' % _shell_escape(cwd)
        real_command = '%s "%s"' % (env.shell,
            _shell_escape(cwd + real_command))
    if output.debug:
        print("[%s] run: %s" % (env.host_string, real_command))
    elif output.running:
        print("[%s] run: %s" % (env.host_string, command))
    local("ssh -A %s '%s'" % (env.host_string, real_command))

Please note that I'm running Fabric 1.3.2, and this fix won't be needed much longer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文