如何仅获取远程 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 那是我的假设。我想知道是否可以用 bashssh
包装脚本替换 /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 事件?的主要内容,如果未能解决你的问题,请参考以下文章