2

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

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

我在 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 路径?

您是否有更好的方法来执行此操作或当前脚本的一个很好的解决方法?

4

2 回答 2

3

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

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

Host example.org
    ForwardAgent yes

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

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

于 2011-04-26T16:19:51.563 回答
-2

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

我的 0.02 美元

于 2011-04-26T14:47:35.037 回答