将 ssh 作为另一个 ssh 命令的命令运行

将 ssh 作为另一个 ssh 命令的命令运行

我想在我可以通过 ssh 访问的机器上运行一个程序,我也可以通过 ssh 访问该网关机器。

当我想在目标计算机上运行 mpi 程序时,我以通常的方式从本地计算机T访问网关:G

ssh user@Gateway

一旦进入G机器,我就在目标机器上启动我的程序,如下所示:

ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'

这样一切都可以正常工作(请注意,我需要ssh-agentssh-add之前运行mpirun,请参阅这个问题的详细信息.)

我想在访问网关时将第二个 ssh 命令直接传递给本地计算机上的 ssh 命令,如下所示

ssh user@Gateway "ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"

但这是行不通的,因为"我认为。

PS:我无法使用 ssh-agent-forwarding。

答案1

您的命令$(ssh-agent -s)在本地机器上执行,因为它位于双引号之间。您需要将要在网关上运行的整个命令放在单引号之间。由于该命令本身包含单引号(以保护应该在目标上运行的代码),您需要将这些单引号转义为'\''

ssh user@Gateway 'ssh Target '\''eval $(ssh-agent -s); ssh-add my_key; mpirun --hostfile .hosts program'\'

您可以通过配置本地 ssh 客户端来自动化网关步骤。将其放入您的~/.ssh/config

Host Target
User user
ProxyCommand ssh Gateway nc %h %p

nc网猫。然后运行

ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'

直接从本地机器。

答案2

你已经逃脱了$。否则$(ssh-agent -s)将在您的本地计算机而不是网关计算机上进行评估。

ssh user@Gateway "ssh Target 'eval \$(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'"

可以使用echo来验证转义的结果

$ echo "foo $(echo bar)"
foo bar
$ echo "foo \$(echo bar)"
foo $(echo bar)

相关内容