避免单独向 shell 会话添加 ssh 密钥(带密码)

Gre*_*bet 12 tmux ssh-agent

注意:在.<name of shell>rcssh 中添加几行并不能解决这里的问题,因为这个特定的 ssh 密钥有一个密码,并且不会消除继续输入它的需要。

所以我真的不明白ssh-agent引擎盖下是如何工作的。我只是使用ssh-agentssh-add ~/.ssh/id_rsa每次我需要添加一个密钥来访问一些远程资源。我已经添加了一次密钥,我不需要为同一个“shell 会话”再次添加它(“shell 会话”可能不是合适的行话)。

不幸的是,我一直在创建新的 shell 会话。我在 OS X 上的 tmux 下运行 zsh 并且有一个创造性地命名为id_rsa. 该 ssh 密钥具有与之关联的密码。

每次我启动一个新的 shell 时,我都必须执行以下操作

$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
<type password>
Run Code Online (Sandbox Code Playgroud)

这真的很烦人。

我注意到在输出ssh-agentSSH_AGENT_PID环境变量每次都是不同的。我的预感是这个环境变量SSH_AUTH_SOCK是不需要在单个 shell 会话中重新添加密钥的原因。当我调用该ssh程序时,它将使用这些环境变量与 进行通信ssh-agent并且身份验证将成功。

我想知道是否有一种ssh-agent在会话之间共享s的方法。也许正确的做法是在开始前就加我的SSH密钥tmux和配置tmux以保护SSH_AUTH_SOCKSSH_AGENT_PID环境变量。我真的不确定。解决这个问题的标准方法是什么?

Gil*_*il' 9

ssh-agent 的工作方式是每个会话有一个代理。代理以会话开始和结束。

会话在您登录时启动,而不是在您打开终端或启动 shell 时启动。ssh-agent作为 shell 启动脚本的一部分系统地运行绝对是错误的。

我不是 OSX 用户,所以我可能会遗漏一些东西,但据我所知,在非古代 OSX 版本(自 10.5 起)上,SSH 与 OSX 钥匙串集成。所以你根本不应该跑ssh-agent。该SSH_AUTH_SOCK变量应该指向一个 launchd 套接字(launchd 提供一个 ssh-agent 服务)。请参阅如何将 Mac OS X 钥匙串与 SSH 密钥一起使用?以及如何防止 ssh 将我的密钥添加到 Snow Leopard 上的 ssh-agent?

如果您ssh-agent出于某种原因想坚持使用,并且希望为所有会话使用一个代理(这也很有意义),您可以为 SSH 套接字使用固定路径。(我已经在 Windows 上这样做了。)在您的.profile, 设置SSH_AUTH_SOCK为固定路径,ssh-agent如果它尚未运行,则启动。

export SSH_AUTH_SOCK=~/.ssh/auth_sock
if ! fuser "$SSH_AUTH_SOCK" >/dev/null 2>/dev/null; then
  # Nothing has the socket open, it means the agent isn't running
  ssh-agent -a "$SSH_AUTH_SOCK" -s >~/.ssh/agent-info
fi
Run Code Online (Sandbox Code Playgroud)

请注意,我的代码不会试图杀死代理。如果您想在注销时终止代理,请在注销脚本中添加终止指令。当然,如果您终止以用户身份运行的所有进程,则包括代理。


ilk*_*chu 2

基本上,ssh-agent它的作用是在后台启动自身,并打印一堆环境变量,ssh客户端实用程序使用这些变量来了解如何到达代理(主要是 中的套接字路径SSH_AUTH_SOCK)。如果您再次启动代理,您会运行多个副本,但您通常只能从一个 shell 访问一个副本...(检查类似的内容ps uax | grep agent以查看您正在运行多少个副本。)ssh-add运行时,它会联系代理,并要求它读取内存的密钥。之后,ssh连接到同一ssh-agent实例的任何客户端都可以利用保存的密钥。


有几种选择只运行一个ssh-agent

ssh-agent1)在开始tmux会话之前(或screen就此而言)开始。此时设置的环境变量应该继承到您在tmux或下运行的所有 shell screen。(我不知道是否tmux需要特殊配置来不清理环境变量。)

我一直(错误的)懒惰,所以我只是在每次启动会话之前手动完成此操作,但是创建一个脚本来启动代理然后启动/会话screen会很容易。screentmux

如果您考虑图形桌面环境之类的环境,则应在 DE 启动时启动代理(如果可能),以便环境变量可用于您启动的任何终端。

2) 当您登录时,您的系统可能已经启动ssh-agent。在这种情况下,您应该能够只ssh-add键入它的密钥,而无需启动代理的新副本。特别是 OS X 在登录时启动代理,并修改了 SSH 工具,通过 GUI 请求密钥密码,并自动将命令中使用的密钥保存ssh到代理。您也可以ssh-add照常使用。

3) 如果您想在完全独立的 shell 中使用单个代理(因此无法继承环境变量),请检查该代理是否正在从 shell 的启动脚本运行,如果没有则启动它。将代理的套接字地址保存到文件中,或使用套接字的固定路径。


无论如何,问题在于将环境变量指向相同的ssh-agent. 您添加到代理的一个实例中的任何密钥都应该对同一代理的所有用户可见,无论您ssh-add使用的是什么 shell。

顺便说一句,ssh-add可以使用一个参数来定义密钥应保存多长时间:运行ssh-add -t 3600 my-key-file将告诉代理在一小时后忘记密钥。这可能有助于减少密钥在内存中未加密的时间。