1

我正在使用钥匙串,它可以完美地使用 ssh-agent 管理我的钥匙。

我想检查每个 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 代理转发,远程命令也只返回代理的本地状态。其他远程命令有效,无论是否加载密钥..

## 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.
4

1 回答 1

0

您似乎误解了keychain/如何ssh-agent工作。当您登录系统(我们将其称为“家”)时,它会启动一个程序。作为启动该程序的一部分,它公开了一个ssh-add可以连接的文件。当此文件的名称存储在SSH_AUTH_SOCK变量中时,在适当设置此环境变量ssh的情况下运行时可以访问它。ssh-add

当您 ssh 到远程系统时,如果ForwardAgent在您的配置中将该属性设置为 true,则会建立一个通道,允许此关键信息从您的“家庭”系统传递到您已通过 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 上启动了代理,那么它会提供您正在与之通信的自己的私有套接字。

可能出错的地方:

您已在主机 1 -> 主机 2 的连接上启用代理转发;但是,在 host2 上登录时运行的脚本会忽略此套接字的存在,并在 host2 上启动它自己的私有代理。因此,当您使用 请求注册密钥列表时ssh-add -l,它会与运行在 host2 上的代理提供的套接字对话。此代理无权访问来自 host1 的密钥,因为它忽略了套接字。

代理转发可以通过 sshd_config 禁用,这意味着服务器管理员已将系统配置为阻止人们将其代理信息转发到此系统(如果 sshd_config 中有 AllowAgentForwarding no 行,那么就是这种情况)。

第一种情况是当有一个写得不好的登录脚本忽略了变量的存在 - 即它没有正确检测到连接是远程的并且有一个套接字被转发的事实 - 这种情况很少见,但可能会发生. 如果是这样,则需要重写脚本以检测这种情况。

如果远程系统的管理员禁用了代理转发,那么您需要请求启用它。

于 2014-10-23T08:27:39.577 回答