我的桌面在办公室。启动时X
,ssh-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
到您的~/.profile
or中,如果尚未在 中启动,~/.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