我想在我可以通过 ssh 访问的机器上运行一个程序,我也可以通过 ssh 访问该网关机器。
当我想在目标计算机上运行 mpi 程序时,我以通常的方式从本地计算机T
访问网关:G
ssh user@Gateway
一旦进入G
机器,我就在目标机器上启动我的程序,如下所示:
ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'
这样一切都可以正常工作(请注意,我需要ssh-agent
和ssh-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)