我正在使用 keychain,它通过 ssh-agent 完美地管理我的 key 。
我想检查每个 linux 主机上 ssh-agent 的状态。我试过:
ssh-add -l
1024 f7:51:28:ea:98:45:XX:XX:XX:XX:XX:XX /root/.ssh/id_rsa (RSA)
在本地,此命令有效且连贯。
但是使用远程 SSH 命令,我不知道为什么结果不一样..:
## host1, locally
ssh-add -l
1024 f7:51:28:ea:98:45:XX:XX:XX:XX:XX:XX /root/.ssh/id_rsa (RSA)
## host 2, command to host1 :
ssh host1 "ssh-add -l"
Could not open a connection to your authentication agent.
也许有人可以解释一下?这并不令人不安,因为我会监视 ssh-agent 状态..
谢谢。
编辑:即使启用了 SSH 代理转发,远程命令也只返回代理的本地状态。其他远程命令在加载或不加载 key 的情况下都有效。
## Host1, locally
ssh-add -l
1024 f7:51:28:ea:98:45:XX:XX:XX:XX:XX:XX /root/.ssh/id_rsa (RSA)
## From Host2, locally and distant :
ssh-add -l
The agent has no identities.
ssh -A host1 "ssh-add -l"
The agent has no identities.
最佳答案
您似乎误解了keychain
/ssh-agent
的工作原理。当您登录到一个系统(我们称之为“家”)时,它会启动一个程序。作为启动该程序的一部分,它公开了一个 ssh-add
可以连接到的文件。当此文件的名称存储在 SSH_AUTH_SOCK
变量中时,当使用此环境变量运行时,它可以通过 ssh
和 ssh-add
访问适当设置。
当您通过 ssh 连接到远程系统时,如果您的配置中的 ForwardAgent
属性设置为 true,则会建立一个 channel ,允许此关键信息从您的“主”系统传递到您所在的系统你已经ssh了。为了公开此关键信息,在此远程系统上设置了另一个 SSH_AUTH_SOCK
变量。所以现在我们有:
# home system (host1)
host1$ ssh-add -l
1024 BLAH....
host1$ echo $SSH_AUTH_SOCK
/tmp/ssh-YJNLu2LFMKbO/agent.1472
home$ ssh -A host2
host2$ ssh-add -l
1024 BLAH
host2$ echo $SSH_AUTH_SOCK
/tmp/ssh-vqdu733feY/agent.23877
host2$ ssh -A host1
host1$ ssh-add -l
1024 BLAH
host1$ echo $SSH_AUTH_SOCK
/tmp/ssh-fuKgOaaQ7b/agent.23951
因此,对于每个连接,都会在远程系统上创建一个套接字,以通过链将关键数据传送到原始“家庭”系统。所以在这个例子中:
ssh-agent(on host1) makes a SOCKET -> ssh(host2) [provides a SOCKET connecting back to the SOCKET on host1] -> ssh(host1) [provides a SOCKET connecting back to the socket on host2]
所以 ssh,一旦您连接到远程系统,就会提供一个套接字,该套接字会连接回来自它的系统的套接字。
如果你直接登录到一个系统(例如在控制台登录到 host2),那么绝对没有连接回 host1。如果代理在 host2 上启动,那么它会提供自己的专用套接字,您正在与之通信。
哪里可能出错:
您已经在 host1 -> host2 的连接上启用了代理转发;然而,在 host2 上登录时运行的脚本会忽略此套接字的存在,并在 host2 上启动它自己的私有(private)代理。因此,当您使用 ssh-add -l
请求注册 key 列表时,它会与在 host2 上运行的代理提供的套接字对话。此代理无权访问来自 host1 的 key ,因为它忽略了套接字。
可以通过 sshd_config 禁用代理转发,这意味着服务器管理员已将系统配置为防止人们将他们的代理信息转发到该系统(如果 sshd_config 中没有 AllowAgentForwarding 行,那么就是这种情况)。
第一种情况是当登录脚本写得不好时会忽略变量的存在——即它没有正确检测到远程连接和正在转发套接字这一事实——这种情况很少见,但可能发生。如果是,则需要重写脚本以检测这种情况。
如果远程系统的管理员禁用了代理转发,那么您需要请求启用它。
关于linux - keychain ssh-agent 信息不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26516426/