我想尝试 ssh-agent 免密码登录(我已经知道 gssapi 和 pubkey 方法,但我想学习这个)。在客户端和服务器上,我在 ssh_config(客户端)和 sshd_config(服务器)上启用了 AgentForward
在客户端,我启动 ssh-agent
eval `ssh-agent`
我添加我的 rsa 密钥
ssh-add
ssh-add -l 确认有效
ssh-add -l
4096 SHA256:******** mysuser@mylocalhost (RSA)
然后我登录并询问密码
ssh remotehost
远程主机上的 ssh-add -l 确认它有效
ssh-add -l
4096 SHA256:******** mysuser@mylocalhost (RSA)
现在我打开另一个 shell,ssh 到远程主机并..再次询问密码。如果我现在注销并登录..再次询问密码。怎么了?
我还尝试创建一个新的 rsa 密钥,添加密码,使用 ssh-add 添加 .. 仍然询问密码。
如果您在终端窗口中手动启动
ssh-agent
,则代理功能将在该窗口中可用,并且只能从该窗口启动进程。要使代理在 GUI 会话的所有终端窗口中可用,您需要将代理作为 GUI 会话设置的一部分启动。您的发行版可能已经或可能没有一些设施来允许这样做:一个可选的 PAM 模块
pam_ssh.so
可以做到这一点,或者 Debian 和相关发行版可以通过/etc/X11/Xsession.options
(man 5 Xsession.options
有关更多信息,请参阅 )为 X11 会话启用 SSH 代理。其他发行版可能有其他解决方案。从技术上讲,当 SSH 代理启动时,它会创建一个 Unix 套接字,允许 SSH 客户端与代理通信,环境变量
SSH_AUTH_SOCK
用于识别其位置。当您使用代理转发时,sshd
远程主机的 将为转发的代理连接创建一个类似的套接字和环境变量。如果您在一个本地终端窗口中启动代理,然后将此环境变量复制到另一个也运行本地 shell 的终端,那么您应该能够在两个终端中使用手动启动的代理。但通常最好找到一个将代理作为 GUI 会话设置的一部分启动的解决方案,这样环境
SSH_AUTH_SOCK
变量就已经设置好,并且会被该会话中启动的所有终端自动继承。请注意,如果远程主机的管理员认为有必要,他们可以禁止 SSH 代理转发。
找到解决方案。
在我认为(错误的)ssh-agent“缓存”密码之前
a)你启动代理
b) 进入远程主机
c)密码进入神秘的“缓存”
d) 您可以再次进入远程主机,并且不会询问密码,因为已缓存!完全错了。
使用ssh有两种免密码进入方式
使用 kerberos 或 AD(使用 kerberos)的单点登录
公钥
ssh-agent 只能“转发”私钥,例如:
我启动 ssh-agent
我添加密钥(我使用默认密钥,但您可以指定使用 ssh-keygen 命令创建的另一个密钥,有或没有密码)。
为了让事情最清楚
我在 server1 上远程登录,现在因为 ssh-agent 被“转发”,即使 server1 没有 pubkey(在本地),我也可以在 server2 上不输入密码就从 server1 登录。在 server2 上,我在 .ssh/authorized_keys 上有密钥(公共)
如果未启用 ssh-agent
gif 解释得更好,用户“pino”在没有密码的情况下从远程主机“fedora”进入远程主机“debian”(要在没有密码的情况下进入,您必须将 slack64 的公钥复制到主机 debian 上的 $HOME/.ssh/authorized_keys 文件中在此示例中),但是当它终止 ssh-agent 并重试输入失败时(如果您提醒密码,您当然可以输入)。