Bash で SSH して複数のコマンドを実行する最もクリーンな方法は何ですか? 質問する

Bash で SSH して複数のコマンドを実行する最もクリーンな方法は何ですか? 質問する

すでに 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';"

非常に醜くて読みにくいからです。

ベストアンサー1

バッシュはどうですかヒアドキュメント:

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

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

ssh otherhost /bin/bash << EOF

ヒアドキュメント内で変数置換を行うことはできますが、引用符の問題に対処する必要があることに注意してください。たとえば、"limit string" (つまりEOF上記) を引用符で囲むと、変数置換を行うことはできません。ただし、limit string を引用符で囲まなければ、変数は置換されます。たとえば、$NAMEシェルスクリプトで上記を定義した場合、次のようにすることができます。

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

otherhostそして、割り当てた名前で宛先にファイルが作成されます$NAME。シェル スクリプトの引用に関するその他のルールも適用されますが、ここでは詳しく説明するには複雑すぎます。

おすすめ記事