変数に保存された複数行の ssh コマンドを実行する方法

変数に保存された複数行の ssh コマンドを実行する方法

コンテキスト: 直接アクセスできないリモート マシンで一連のコマンドを実行しようとしています。まずゲートウェイ マシンに ssh で接続し、そこから ssh で接続してコマンドを実行する必要があります。

基本的に私が求めているのは、任意の数のレベルの ssh を通過できるコマンドのセットをパッケージ化する方法なのです。これは実行できますか? 最善の答えは、scp を使用してスクリプトをコピーし、それを実行することだと思います。これはオプションの 1 つです。

何が起こっているかを示すために hostname コマンドを使用していることに注意してください。これは私が本当にやりたいことではありません。

単一の ssh を実行するコマンドから開始し、そこで複数行のコマンド セットを実行します。

ssh gateway.my.company "
  hostname;
  hostname;
"

これは正常に動作します。出力は次のようになります。

target_machine
target_machine

次に、コマンドのセットを変数に保存し、それを渡しました。

command="
  hostname;
  hostname;
"
ssh gateway.my.company $command

の出力はまったく同じです。両方のhostnameコマンドがターゲット上で実行されます。

次に、追加の ssh ホップ (プライベート マシンへ) を追加します。

ssh gateway.my.company ssh target_machine_ip $command

今回は 2 つのhostnameコマンドを異なるマシンで実行します。

target_machine
gateway_machine

このステップは、cmdをエスケープされた引用符(つまり\"$command\")で囲むことで解決できるようですが、そうすると直接の場合は別の方法で囲む必要があり、ssh gateway.my.company \"$command\"機能しなくなります。

注: コマンドは変数ではなく関数に保存する必要があることは理解していますが、ssh を使用しているため、次のサーバーに ssh で接続すると、宣言した関数は存在しなくなります。

編集: 元の質問では 2 番目のホップが省略されていました。申し訳ありません。

答え1

引用文がいくつか欠けているだけです:

ssh gateway.my.company "$command"

関連情報