【问题标题】:How to get only remote git operations to trigger a ssh-add event for ssh-agent?如何仅获取远程 git 操作来触发 ssh-agent 的 ssh-add 事件?
【发布时间】: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 - 将其指向一个包装器 - 这可能会更干净。试一试

标签: git bash ubuntu ssh-keys ssh-agent


【解决方案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 本身处理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2022-12-16
  • 2013-12-06
相关资源
最近更新 更多