我使用钥匙串,它完美地管理我的密钥与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.
答案 0 :(得分:0)
您似乎误解了keychain
/ ssh-agent
的工作原理。当您登录系统(我们将其称为“主页”)时,它会启动一个程序。作为启动此程序的一部分,它会公开ssh-add
可以连接的文件。当此文件的名称存储在SSH_AUTH_SOCK
变量中时,ssh
和ssh-add
可以在适当设置此环境变量的情况下访问该文件。
当您ssh到远程系统时,如果您的配置中ForwardAgent
属性设置为true,则会建立一个通道,允许此密钥信息从您的“主页”系统传递到您所在的系统ssh'd。为了公开此密钥信息,在此远程系统上设置了另一个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启用了代理转发功能 - >主机2;但是,在host2上登录时运行的脚本会忽略此套接字的存在,并在host2上启动它自己的私有代理。因此,当您使用ssh-add -l
请求已注册密钥的列表时,它会与在host2上运行的代理提供的套接字进行通信。此代理无法访问来自host1的密钥,因为它忽略了套接字。
可以通过sshd_config禁用代理转发,这意味着服务器管理员已配置系统以防止人们将其代理信息转发到此系统(如果sshd_config中的AllowAgentForwarding没有行,那么就是这种情况)。
第一种情况是当一个写得不好的登录脚本忽略变量的存在时 - 即它没有正确检测到连接是远程的并且有一个套接字被转发的事实 - 这很少见,但可能会发生。如果确实如此,则需要重写脚本以检测此情况。
如果远程系统的管理员已禁用代理转发,则需要请求启用它。