1. ホーム
  2. bash

[解決済み] Bashでsshして複数のコマンドを実行する最もクリーンな方法は何ですか?

2022-03-23 13:53:44

質問

すでにsshエージェントを設定しており、Bashスクリプトで外部サーバーにコマンドを実行することができるのですが、以下のようなことができます。

ssh blah_server "ls; pwd;"

さて、私が本当にやりたいことは、外部のサーバーで長いコマンドをたくさん実行することです。これらすべてを引用符で囲むと非常に醜くなりますし、これを避けるために何度もsshをするのは避けたいところです。

そこで、括弧などで囲んで一気にできる方法はないでしょうか?というようなものを探しています。

ssh blah_server (
   ls some_folder;
   ./someaction.sh;
   pwd;
)

基本的には、クリーンであれば、どんなソリューションでもいいと思います。

編集

はっきり言って、これはより大きなbashスクリプトの一部であることを話しています。他の人がこのスクリプトを扱う必要があるかもしれないので、きれいな状態にしておきたいと思います。私は、次のような1行のbashスクリプトを持ちたくはないのです。

ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"

というのも、非常に醜く、読みにくいからです。

解決方法は?

Bashはいかがでしょうか? こちらのドキュメント :

ssh otherhost << EOF
  ls some_folder; 
  ./someaction.sh 'some params'
  pwd
  ./some_other_action 'other params'
EOF

コメントで@Globalzが言及した問題を回避するために、(リモートサイトで何をしているかによりますが)最初の行を次のように置き換えることができるかもしれません。

ssh otherhost /bin/bash << EOF

なお、Here文書では変数の置換が可能ですが、クオートの問題に対処しなければならない場合があります。例えば、"limit string" を引用した場合 (つまり、. EOF の場合)、変数の代入ができなくなります。しかし、制限文字列をクォートしなければ、変数は代入されます。たとえば、次のように定義した場合 $NAME 上記のシェルスクリプトで、次のようにします。

ssh otherhost /bin/bash << EOF
touch "/tmp/${NAME}"
EOF

というファイルを作成します。 otherhost に割り当てた名前になります。 $NAME . シェルスクリプトの引用に関する他のルールも適用されますが、ここでは複雑すぎるため割愛します。