为什么ssh-agent无法保存我的未加密密钥供以后使用?


12

每次我从无头的Ubuntu服务器SSH到另一台服务器时,都会要求我输入密钥文件的密码。即使我以前已经连接到服务器。

您知道为什么会这样吗?它可能像ssh-agent当前没有运行一样简单。

我的Ubuntu Gnome桌面上的相同键工作正常。服务器和桌面都运行Ubuntu 10.10。

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent

1
首先,如您所说,检查是否ssh-agent正在运行:ps -ef | grep '[s]sh-agent'
Scott Severance

@mssever是的,似乎是。查看更新的问题。
Treffynnon 2011年

Answers:


10

即使代理已启动,如果未设置某些环境变量,也不会引用代理。此外,即使代理,变量和变量都没问题,身份也不会自动发送给代理:这是的任务ssh-askpass,仅在X会话中有效。

如果您正在使用bash,请创建~/.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

根据~/.ssh/id_dsa需要修改文件名,并将此行添加到~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

最后一点:这不会干扰gnome会话,因为在这种情况下,它仅~/.profile是来源,并且您可以从ssh-askpass要求输入密码并将其发送到的图形界面中受益ssh-agent


感谢@enzotib,它非常适合ssh与其他机器配合使用。但是,当git用于推送或拉入公共存储库时却没有。您有什么想法我也可以解决吗?
Treffynnon 2011年

添加与相同的函数ssh(),调用它git()并将最后一行从更改/usr/bin/ssh/usr/bin/git。另外,用添加最后一行export -f git
enzotib 2011年

@enzotib我尝试过,但是现在当我ssh进入带有在bash_profile安装程序中创建的文件的计算机时,它会要求我输入密钥的密码。由于某种原因,我每次ssh都询问甚至在我执行ssh或执行之前git。请参阅gist.github.com/942082,以获取登录到有问题的计算机时返回的提示。
Treffynnon 2011年

@Treffynnon:我不知道确切如何git与进行交互ssh,也没有使用,git所以我无法尝试。我修改了,~/.bash_profile使其包含git()上面提到的功能,以确保我之前的解释很清楚。同样,从输出中可以看出,您似乎修改了服务器计算机,但是我所有的建议仅针对客户端计算机。
enzotib 2011年

@enzotib是的。当我从服务器git推送到中央伪造/存储库时,我登录的服务器成为我的客户端,因此文件位于正确的位置。我想您刚刚给了我提示/慢跑了我的想法。我有一个特殊的bash提示,显示的git分支pwd。我敢打赌这是在bash登录时触发密码请求的原因,因为它在呈现bash提示之前尝试git stat!
Treffynnon 2011年

2

我最近开始使用ssh-ident:

https://github.com/ccontavalli/ssh-ident

您要做的就是添加类似以下内容:

alias ssh="/path/to/ssh-ident"

在你的.bashrc。或者,你可以ln -s /path/to/ssh-ident ~/bin/ssh或者在你的PATH其他目录之前/bin/usr/bin


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.