他の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-agentで実行することに注意してください。)ssh-addmpirunこの問題の詳細.)

次のようにゲートウェイにアクセスするときは、2番目の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)

関連情報