使用 ssh 代理

使用 ssh 代理

我的桌面在办公室。启动时Xssh-agent自动启动。我必须SSH key在开始时添加一次,然后我就可以使用ssh而不必每次都输入密码。

但是,当我通过 连接到我的桌面时SSH(例如从家里),ssh-agent无法访问,每次我都必须提供我的密钥。此外,即使我启动 的新实例ssh-agent,我仍然无法连接到它。

ssh-agent有没有办法在远程系统上使用(我通过连接到该系统ssh

答案1

在远程 shell 中,只需运行:

ssh-agent bash

这样您就可以获得一个新的 SSH 代理实例和一个bash设置了必要环境变量的新 shell。当您使用exit或离开 shell 时logout,SSH 代理也会退出。

如果您直接使用的设备中具有相同的密钥,您还可以ssh -A使用当地的新启动的代理可以访问远程外壳。它具有一些安全隐患,但如果您在两台设备上都拥有可用的密钥,则没有什么区别。

当您想要连接到现有代理时,您需要设置相关的环境变量,就像在图形 shell 中设置它们一样。使用 GUI 会话的自动启动工具将变量存储在某处可能会很方便。您可以使用 获取环境变量env

env | grep SSH

要访问代理,您基本上只需要SSH_AUTH_SOCK.用于SSH_AGENT_PID向代理发送信号,其他 SSH 变量用于辅助工具。

您还可以通过 访问其他进程的环境/proc/*/environ。不过,这些项目是以 NUL 结尾的,而不是以 LF 结尾的。我相信在这种情况下文件方法更可取。

答案2

您可以使用代理转发:确保包含ForwardAgent yes在客户端配置中 ( ~/.ssh/config),或使用-A命令行选项。 (可以在服务器端禁用此功能(AllowAgentForwarding在 中sshd_config),但这仅对无法运行任意 shell 命令的受限帐户有用。)这样,本地计算机中的所有密钥都可以在远程会话中使用。请注意,在客户端启用代理转发具有安全隐患:它使远程计算机的管理员可以访问您的密钥(例如,如果您位于 A 并拥有 B 的密钥和 C 的密钥,并启用代理转发在您与 B 的连接中,则这可以让 B 访问您的密钥,从而登录到 C)。

如果您想让办公室计算机上的 X 会话中的代理在家里的 SSH 会话中可用,那么您需要将SSH_AUTH_SOCK环境变量设置为指向与 X 会话中相同的文件。手动完成很容易:

export SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXXXXX/agent.12345

其中XXXXXXXXXXXX是随机字符串,12345是代理进程的 PID。如果有一个正在运行的代理 ( find /tmp -maxdepth 1 -user $USER -name 'ssh-*'),您可以轻松地自动执行此操作,但如果有多个代理,则检测所需的代理会更加复杂。

SSH_AUTH_SOCK您可以从正在运行的进程中提取 的值。例如,在 Linux 上,如果您的窗口管理器是 Metacity(默认的 Gnome 窗口管理器):

env=$(grep -z '^SSH_AUTH_SOCK=' /proc/$(pidof -s metacity)/environ')
if [ -n "$env" ]; then export "$env"; fi

或者,您可以将办公室计算机配置为使用单个 SSH 代理。如果代理在您登录时自动启动,那么在大多数发行版中,如果SSH_AUTH_SOCK环境中已经存在调用的变量,则不会启动代理。因此,将 的定义添加SSH_AUTH_SOCK到您的~/.profileor中,如果尚未在 中启动,~/.pam_environment则手动启动:ssh-agent.profile

export SSH_AUTH_SOCK=~/.ssh/$HOSTNAME.agent
if [ -z "$(pgrep -U "$USER" ssh-agent)" ]; then
  ssh-agent >/dev/null
fi

相关内容