我想尝试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 添加..并且仍然询问密码。
答案1
如果您ssh-agent
在终端窗口中手动启动,则代理功能将在该窗口中可用,并且仅从该窗口启动进程。要使代理在 GUI 会话的所有终端窗口中可用,您需要将代理作为 GUI 会话设置的一部分启动。
您的发行版可能已经或可能没有一些允许此操作的工具:可选的 PAM 模块可以执行此操作,或者 Debian 和相关发行版可以通过(请参阅 参考资料获取更多信息)pam_ssh.so
为 X11 会话启用 SSH 代理。其他发行版可能有其他解决方案。/etc/X11/Xsession.options
man 5 Xsession.options
从技术上讲,当 SSH 代理启动时,它会创建一个 Unix 套接字,允许 SSH 客户端与代理进行通信,并且环境变量SSH_AUTH_SOCK
用于标识其位置。当您使用代理转发时,sshd
远程主机将为转发的代理连接创建类似的套接字和环境变量。
如果您在一个本地终端窗口中启动代理,然后将此环境变量复制到也运行本地 shell 的另一个终端,那么您应该能够在两个终端中使用手动启动的代理。但通常最好找到一个解决方案来启动代理作为 GUI 会话设置的一部分,这样SSH_AUTH_SOCK
环境变量就已经设置好了,并且会被该会话中启动的所有终端自动继承。
请注意,如果远程主机的管理员认为有必要,他们可以禁止 SSH 代理转发。
答案2
找到解决方案。
在我认为(错误)ssh-agent“缓存”密码之前,
a) 你启动代理
b) 进入远程主机
c) 密码进入神秘的“缓存”
d) 您可以再次输入远程主机,并且不会询问密码,因为密码已被缓存!完全错误的。
使用ssh有两种免密码进入方式
使用 kerberos 或 AD(使用 kerberos)的单点登录
公钥
ssh-agent 只能“转发”私钥,例如:
我启动 ssh-agent
eval `ssh-agent`
Agent pid 26541
我添加了密钥(我使用默认密钥,但您可以指定使用 ssh-keygen 命令创建的另一个密钥,带或不带密码)。
ssh-add
为了把事情说得最清楚
local = my local machine
server1 = first remote server
server2 = second remote server
我在 server1 上远程登录,现在因为 ssh-agent 已“转发”,即使 server1 没有 pubkey(位于本地),我也可以在 server2 上无需输入密码即可从 server1 登录。在 server2 上,我在 .ssh/authorized_keys 上拥有密钥(公共)
ssh -A server1 #ask password
ssh server2 #don't ask password, from server1
如果 ssh-agent 未启用
ssh -A server1 #ask password
ssh server2 #ask password.
gif 解释得更好,用户“pino”从远程主机“fedora”到远程主机“debian”无需密码输入(要无密码输入,您必须将 slack64 的 pubkey 复制到主机 debian 上的 $HOME/.ssh/authorized_keys 文件中在这个例子中),但是当它杀死ssh-agent并重试输入失败时(如果你提醒密码你当然可以输入)。