在将密钥添加到代理时运行远程命令,以避免密码提示干扰脚本

在将密钥添加到代理时运行远程命令,以避免密码提示干扰脚本

如何通过远程 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连接到远程主机( ) 。Host2Host1

如果您总是想作为跳转主机连接,您可以在您Host2的:Host1~/.ssh/config

Host Host2
    ProxyJump Host1

然后你只需要运行ssh Host2 cat remotefile.mp4,并且ssh会自动通过隧道建立这个连接Host1

相关内容