BashスクリプトでSSHネストされたリモートコールを使用できますか? [コピー]

BashスクリプトでSSHネストされたリモートコールを使用できますか? [コピー]

奇妙な問題があります。Computer AわかりますComputer BComputer Bわかりますが、Computer CわかりComputer Aます。いいえ望むよりComputer C

A私はそれに対して任意のコマンドを呼び出すことができるbashスクリプトを作成したいのですが、C二重引用符が機能しないようです。アイデアは次のとおりです。

AMB_CMD='source eniron.dat; cd path/to/code/; make clean all'
ssh -t username@ComputerB "ssh -t username@ComputerC "$AMB_CMD""

B何を実行するかを解決すると、次の問題が解決されると思います。

AMB_CMD='source eniron.dat; cd path/to/code/; make clean all'
B_CMD=ssh -t username@ComputerC "$AMB_CMD"
ssh -t username@ComputerB "$B_CMD"

しかし、まだ問題があります。

ベストアンサー1

私が知っている限り、実際のコマンドを引用する必要はありません。

ssh username@ComputerB ssh username@ComputerC make clean all

または、

ssh -J username@ComputerB username@ComputerC make clean all

ComputerBこれは、接続するジャンプホストとして使用されますComputerC

OpenSSH 7.3+では、設定オプションを使用して次のProxyJump場所でジャンプホストを設定できます~/.ssh/config

Host ComputerC
    User username
    ProxyJump username@ComputerB

...それで、コマンドは次のように減ります。

ssh ComputerC make clean all

make問題の実際の構成によっては(質問にエラーメッセージが記載されていない)、間違ったディレクトリで実行することに関連する可能性があります。cd実行する前に正しいディレクトリに入るには、ユーティリティmake-Cオプションを使用してください。

ssh username@ComputerC make -C path/to/build/dir clean all

また、実際のコマンドを変数に保存するには、単一の文字列ではなくbash配列を使用します。

cmd=( make -C "path/to/build/dir" clean all )

ssh ... "${cmd[@]}"

おすすめ記事