リモートサーバーでローカルスクリプトを実行するときのホスト名とデータのキャプチャ

リモートサーバーでローカルスクリプトを実行するときのホスト名とデータのキャプチャ

リモートホストでローカルスクリプトを実行しようとすると、リモートサーバーのホスト名をローカル出力ファイルにインポートできません。

たとえば、以下のスクリプトを実行しています。

ssh remotehost sh -s < sudo su - ; ./localscript --include Yes > output

上記はうまくいきます。以下はサンプル出力です。

script executed data from the remote machine

しかし、このようなホスト名+データが必要です。

remotehost: script executed data from the remote machine

awkを使ってみましたが失敗したので、誰かがこれをチェックして助けることができますか?

ssh remotehost sh -s < sudo su - ; ./localscript --include Yes | awk -vhostname=$(hostname) '{print hostname, $0}' > output

これは私にlocalhostのホスト名を与えます。間違っていたら訂正してください。
また、説明が間違っている場合は、コメントを残してください。

私はこれを試してみましたが、「grep」/「awk」の出力はできません

ssh remotehost sh -s < `./localscript --include Yes` 

ssh remotehost sh -s < `./localscript --include Yes | awk -vhostname=$(hostname) '{print hostname, $0}' > output`

ベストアンサー1

出力を「output」というファイルに保存したい場合地元のマスター:

scp -p ./localscript remotehost:
ssh -q remotehost <<'EOF' > output
./localscript --include Yes |
   awk -vhostname=$(hostname) '{print hostname, $0}'
EOF

ssh オプションは、-q「stdin が端末ではないため、疑似端末は割り当てられません」という警告メッセージを抑制するために使用されます。 - 標準入力がheredocからリダイレクトされるため、これは必須です。

これは「Here Document」または「heredoc」というものを使用しますssh。この単語EOFはランダムな単語に過ぎず、それ自体には特別な意味はありません。ただし、「End of File」を意味するため、heredocsでよく使用されます(「EOTEnd of File」としても使用されます)。テキスト" ")。リダイレクトしたいテキストでは、独自の行にない単語を使用できます。

単語(EOF)の後の次の行から次の単語の発生(1行自体)までのすべての内容は、コマンドへの入力と見なされ、sshリモートホストで実行されます。

単語の周りの引用符は、単一引用符でEOF囲まれた文字列内で区切り文書全体を効果的にします。ソースman bash(「こちらの記事」を検索):

ここにファイル

このタイプのリダイレクトは、区切り文字のみを含む行(末尾の空白なし)が表示されるまで、現在のソースから入力を読み取るようにシェルに指示します。この時点までに読み取られたすべての行は、コマンドの標準入力(またはnが指定されている場合はファイル記述子n)として使用されます。

この文書の形式は次のとおりです。

[n]<<[-]word
        here-document
delimiter

パラメータと変数の拡張、コマンドの置換、算術拡張、パス名の拡張は単語に対して行われません。

単語の一部が引用されている場合、区切り文字は単語から引用符を削除した結果であり、文書の行はここでは拡張されません。

単語が引用されていない場合、文書のすべての行はパラメータ拡張、コマンド置換、および算術拡張を受け、文字シーケンス<newlineは無視され、$と `文字は\を使用して引用符で囲む必要があります。

出力を名前付きファイルに保存する場合離れてマスター:

scp -p ./localscript remotehost:
ssh -q remotehost <<'EOF'
./localscript --include Yes |
   awk -vhostname=$(hostname) '{print hostname, $0}' > output
EOF

> output両方のバージョンでリダイレクトの場所を確認してください。<<'EOF'最初のバージョンはすぐ後ろ、awk2番目のバージョンはすぐ後ろです。


しかし、実際にやろうとしているのは、既存のツールの非常に基本的なバージョンを再作成するようです。並列分散シェル(pdsh)

私はpdshそれを再発明するのではなく、このプログラム(またはいくつかの同様のプログラムの1つ)を使用することを強くお勧めします。ほとんどのディストリビューション(確かにDebian、Ubuntuなど)で動作します。

たとえば、私のホームネットワークには、4つのコンピュータ(ganesh、indra、kali、およびhex - 最後のコンピュータの命名体系が疲れ、ヒンズー教の神の代わりにDiscworldを選択しました)があります。これらのホストが「all」グループに属していることがわかるようにpdshを設定したので、次のことを実行できます。

$ pdsh -g all 'uptime; uname -a'
hex:  18:35:00 up 45 days, 21:07,  1 user,  load average: 0.33, 0.41, 0.43
hex: Linux hex 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux
kali:  18:35:00 up 20:40,  2 users,  load average: 1.46, 0.92, 0.68
kali: Linux kali 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux
ganesh:  18:35:00 up 45 days, 21:23, 22 users,  load average: 1.34, 1.67, 1.85
ganesh: Linux ganesh 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux
indra:  18:35:00 up 5 days, 19:51,  2 users,  load average: 0.00, 0.03, 0.02
indra: Linux indra 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux

awkそのコマンドで実行したい操作はすでに行われています。リモートシステムのホスト名プレフィックスを出力に追加します。

また、注:出力順序がこのようにうまくグループ化されるという保証はありません。 pdsh複数のSSH接続を並列に実行すると、リモートコンピュータが応答するのに時間がかかります。もちろん出力をsort -k1,1

pdshpdcpリモートホストにファイルをコピーするためのユーティリティが含まれています。たとえば、./localscriptすべてのコンピューターにコピーして実行するには、次のようにします。

pdcp -p -g all ./localscript '~/'
pdsh -g all ./localscript

ちなみに、出力を再フォーマットして元のホストごとにグループ化できるpdsh便利なユーティリティも付属しています。dshbak

$ pdsh -g all 'uptime; uname -a' | dshbak 
----------------
kali
----------------
 18:35:12 up 20:41,  2 users,  load average: 1.51, 0.96, 0.70
Linux kali 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux
----------------
indra
----------------
 18:35:12 up 5 days, 19:51,  2 users,  load average: 0.00, 0.03, 0.02
Linux indra 5.10.0-6-amd64 #1 SMP Debian 5.10.28-1 (2021-04-09) x86_64 GNU/Linux
----------------
ganesh
----------------
 18:35:12 up 45 days, 21:23, 22 users,  load average: 1.52, 1.70, 1.86
Linux ganesh 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux
----------------
hex
----------------
 18:35:12 up 45 days, 21:07,  1 user,  load average: 0.26, 0.39, 0.42
Linux hex 5.10.0-4-amd64 #1 SMP Debian 5.10.19-1 (2021-03-02) x86_64 GNU/Linux

おすすめ記事