Ssh

將 ssh 作為另一個 ssh 命令的命令執行

  • June 30, 2011

我想在一台機器上執行一個程序,我可以從一台網關機器上通過 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。

你有逃脫的$。否則$(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

ncnetcat。然後執行

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

直接從本地機器。

引用自:https://unix.stackexchange.com/questions/15887