到目前为止,在 Windows 10 上,我主要使用 PuTTy 捆绑包(PuTTygen、Pageant 和 PuTTy 等)通过 SSH 访问远程 Linux 计算机。
我使用选美作为私钥持有者只要电脑不重新启动,就将私钥(以及可能的密码)保留在内存中。
我想更频繁地使用 WSL OpenSSH 作为客户端,就像使用以下命令一样:
ssh USER@IP -vvv -L 22:localhost:22 # Or [email protected];
然而我在 WSL OpenSSH 上没有找到类似选美的行为:
将所有可能的 WSL shell(甚至在 shell 终止时)的 SSH 密钥保存在内存中,直到计算机本身因任何原因重新启动
我如何在 WSL OpenSSH 中实现类似选美的行为?
答案1
你需要ssh-agent
,并且ssh-add
。
ssh-agent
当您登录时,可能已经启动了(在 Debian 上)。要测试它,请运行ssh-add -l
.如果代理正在工作,您应该看不到任何密钥。如果它没有运行,那么您应该会收到一条错误消息,提示诸如无法连接到代理之类的内容。
添加密钥。如果是默认名称,则您只需执行ssh-add
,否则执行ssh-add «path/to/your/key/key-name»
,系统会提示您输入密码。
答案2
在 U*nix 上ssh-agent
理想情况下,应该在会话登录时尽早运行。这通常是在 GUI(X11 等)登录上完成的操作。除了去恶魔化之外,该命令还可以方便地作为输出外壳命令需要哪些导出变量来联系新生成的守护进程,为 shell 评估做好准备:
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-TO9z33k5zo6t/agent.25671; export SSH_AUTH_SOCK;
SSH_AGENT_PID=25673; export SSH_AGENT_PID;
echo Agent pid 25673;
按预期从 posix sh shell 再次运行:
$ eval $(ssh-agent)
Agent pid 25965
$ printenv SSH_AUTH_SOCK SSH_AGENT_PID
/tmp/ssh-XgTqsra2Pok2/agent.25964
25965
如果这是在登录设置期间由共同祖先进程运行的,则所有后续进程将继承这些变量,从而使运行ssh-agent
可在会话中的任何位置使用。
ssh
另请注意,这些变量(部分)可以使用代理转发选项 ( )通过远程继承-A
,而不需要本地ssh-agent
.
现在,对于同一用户想要重用 的情况ssh-agent
,但来自其他不相关的访问(其他终端、会话,无论是远程还是本地等),该访问没有继承之前的两个导出变量,因为没有适当的机制。该用户可以从需要的任何地方检索它们的值:运行已导出它们的外壳的另一个终端,由脚本创建的固定位置的一些文件,该脚本旨在保存这些变量(或者在评估之前更好地使用上面的命令)用于此特定目的等)并再次导出它们:
SSH_AUTH_SOCK=/tmp/ssh-XgTqsra2Pok2/agent.25964; export SSH_AUTH_SOCK;
SSH_AGENT_PID=25965; export SSH_AGENT_PID;
因此,如果在某个终端上运行而不是eval $(ssh-agent)
这样的:
$ mkdir -m 700 -p ~/.ssh-agent-info
$ ssh-agent > ~/.ssh-agent-info/variables
$ . ~/.ssh-agent-info/variables
Agent pid 25965
然后开始添加一些键:
$ ssh-add /tmp/demokey
Enter passphrase for /tmp/demokey:
Identity added: /tmp/demokey
$ ssh-add -l
256 SHA256:Ayd3PCiSkVVV09IqwEXz2Fn3nuXF70FDPMlNtZiuTtY user@host (ED25519)
并且同一系统上其他终端上的用户再次获取相同的变量,应该得到预期的结果:
$ . ~/.ssh-agent-info/variables
Agent pid 25965
$ ssh-add -l
256 SHA256:Ayd3PCiSkVVV09IqwEXz2Fn3nuXF70FDPMlNtZiuTtY user@host (ED25519)
这意味着无需再提供密码,直到ssh-agent
被杀死或被要求忘记其密钥。
这在任何具有端口的平台上都应该工作得差不多打开ssh和ssh-agent
,所以我相信 WSL 上也应该同样有效。
理想情况下,您应该将这些命令放入 shell 启动脚本中(例如.profile
),以这样的方式制作:ssh-agent
在尝试生成新脚本之前,它会首先检测(正确的)是否已经在运行,否则您将泄漏进程并且必须再次输入密码。