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-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。
你有逃脫的
$
。否則$(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)
$(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
是netcat。然後執行ssh Target 'eval $(ssh-agent -s);ssh-add my_key;mpirun --hostfile .hosts program'
直接從本地機器。