如何通过远程 Host1 在远程 Host2 上运行命令,同时将我的密钥添加到 ssh-agent,以便密码提示不会干扰脚本的后半部分?
我基本上是尝试通过远程 Host1 在远程 Host2 上运行命令,而不会受到密码提示的干扰。 (本地计算机无法直接 ssh 到远程 Host2)。 [SSH 已设置为使用密钥身份验证。]
尽管最终结果最终是通过管道传输文件,但我想更一般的描述仍然相关。
如果我只是像这样嵌套命令:
ssh -t Host1 "ssh Host2 "cat remotefile.mp4""
系统提示我输入 Host1 的密码,因为代理中不存在该密钥。
如果我希望将该命令的输出从 Host2 传送到本地计算机中的另一个进程,则密码短语提示也会按其方式进行传送或重定向。
因此,我考虑执行以下操作,在运行相关命令之前将 Hosts1 的密钥获取到代理中:
ssh -t Host1 "`eval ssh-agent -s`; ssh-add ~/.ssh/host1-id_key; ssh-add -l; ssh Host2 "cat remotefile.mp4""
然而,我在 bash 中使用正确的语法链接/嵌套上述命令时遇到了问题。
我得到:
syntax error near unexpected token `;;'
我相信这与反引号命令替换语法有关,并且我承认我并不完全理解它的含义。
我尝试了以下变体,但结果相同:
ssh -t Host1 "`eval ssh-agent -s` && ssh-add ~/.ssh/host1-id_key && ssh-add -l; ssh Host2 "cat remotefile.mp4""
ssh -t Host1 << HERE
`eval ssh-agent -s`;
ssh-add ~/.ssh/host1-id_key;
ssh-add -l;
ssh Host2 "cat remotefile.mp4"
HERE
如何成功链接/嵌套由远程 shell 执行的多个命令,特别是 eval ssh-agent 命令。
答案1
您可以使用 启用代理转发-A
。这将允许您ssh-agent
从远程主机连接到本地。
ssh -A Host1 ssh Host2 cat remotefile.mp4
如果你总是想要将您的代理转发到Host1
,您可以将以下内容添加到您的~/.ssh/config
,然后就不必指定-A
。
Host Host1
ForwardAgent yes
请注意代理转发的安全隐患。从ssh(1)
手册页:
应谨慎启用代理转发。能够绕过远程主机(对于代理的 UNIX 域套接字)文件权限的用户可以通过转发的连接访问本地代理。攻击者无法从代理获取密钥材料,但是他们可以对密钥执行操作,使他们能够使用加载到代理中的身份进行身份验证。更安全的替代方案可能是使用跳转主机(请参阅 -J)。
正如手册页中所述,另一种方法是使用跳转主机 ( -J
) 选项。这不太灵活,但如果您在第一台主机上所做的只是通过 ssh 连接到第二台主机,则效果很好。要使用它,我们将修改您的示例命令,如下所示:
ssh -J Host1 Host2 cat remotefile.mp4
这里-J Host1
指示通过TCP转发ssh
连接到远程主机( ) 。Host2
Host1
如果您总是想作为跳转主机连接,您可以在您Host2
的:Host1
~/.ssh/config
Host Host2
ProxyJump Host1
然后你只需要运行ssh Host2 cat remotefile.mp4
,并且ssh
会自动通过隧道建立这个连接Host1
。