如何仅获取远程 git 操作来触发 ssh-agent 的 ssh-add 事件?

Posted

技术标签:

【中文标题】如何仅获取远程 git 操作来触发 ssh-agent 的 ssh-add 事件?【英文标题】:How to get only remote git operations to trigger a ssh-add event for ssh-agent? 【发布时间】:2011-08-12 23:33:46 【问题描述】:

我最近向question on AskUbuntu 询问了关于让 ssh-agent 自动保存我的密码保护密钥以供以后重复使用,而无需在 bash 登录期间重新输入密码(非 GUI/Gnome)。我得到了一个不错的 bash 脚本作为响应,但不幸的是,无论 git 操作如何,都会触发它要求输入密码。我只想在他们的密钥不在 ssh-agent 中并且正在执行远程 git 操作时得到提示。

这是因为我在 bash 提示符中使用了$(__git_ps1 "[%s]") 来显示当前工作目录的 git 分支 (pwd)。因此,当我 ssh 进入机器时,它会立即要求我输入密钥密码,然后才能呈现 bash 提示!

the answer to my question on AskUbuntu 的当前脚本如下所示:

~/.bash_profile:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() 
  if ! ssh-add -l >/dev/null 2>-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"

export -f ssh

# another example: git
git() 
  if ! ssh-add -l >/dev/null 2>-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"

export -f git

如您所见,每次 git 操作都会触发 git 函数。

我原以为 git 会使用ssh 来建立连接,但它似乎没有触发上述脚本中的ssh() 函数。 git 如何执行它的 ssh 操作?是直接访问/usr/bin/ssh而不是依赖bash路径吗?

对于当前脚本,您有更好的方法或解决方法吗?

【问题讨论】:

git 可执行文件 /usr/bin/git 不是用 bash (AFAIK) 编写的,所以它没有理由执行你的 ssh 函数。 @nhed 那是我的假设。我想知道是否可以用 bash ssh 包装脚本替换 /usr/bin/ssh 以便触发它? 听起来很危险,git 手册页提到了一个环境变量 GIT_SSH - 将其指向一个包装器 - 这可能会更干净。试一试 【参考方案1】:

即使您递归地 SSH 到多个主机,您也可以使用代理转发。当 ssh 第一次请求密钥时,您的本地代理会运行 $SSH_ASKPASS 并将解锁的密钥转发给主机。请注意,您必须启用代理转发(请参阅man 5 ssh_config)。

在 ~/.ssh/config 中为您需要的每个单独的主机启用转发:

Host example.org
    ForwardAgent yes

在服务器端代理转发默认启用。

如果您出于某种原因不想使用代理转发,那么我认为覆盖 ssh 命令是您唯一的选择。

【讨论】:

我忘记了AgentForwarding。很好的电话,它非常适合我的特定工作流程。【参考方案2】:

我不建议在您的密钥中使用密码短语。像 gitolite 这样的东西不会很好地配合它。考虑使用没有密码的新密钥。

我的 0.02 美元

【讨论】:

我不使用 gitolite,所以我认为这不是问题。我没有足够的信任在我的磁盘上放置一个不受保护的密钥,除了一个真正锁定的用于自动化流程的帐户外,我永远不会拥有一个。我不明白密码将如何影响 git,因为它都是在 ssh 层而不是在 git 本身处理的。

以上是关于如何仅获取远程 git 操作来触发 ssh-agent 的 ssh-add 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从远程git服务器上拉取一个新建的git项目?

如何从远程git服务器上拉取一个新建的git项目?

仅当特定文件集发生更改时如何触发构建

如何运行 git log 以仅查看特定分支的更改?

如何使用 git log 仅获取带有路径的文件名?

如何仅删除远程存储库中的文件? [复制]