リモートホストでローカルスクリプトを実行しようとすると、リモートサーバーのホスト名をローカル出力ファイルにインポートできません。
たとえば、以下のスクリプトを実行しています。
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でよく使用されます(「EOT
End 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'
最初のバージョンはすぐ後ろ、awk
2番目のバージョンはすぐ後ろです。
しかし、実際にやろうとしているのは、既存のツールの非常に基本的なバージョンを再作成するようです。並列分散シェル(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
。
pdsh
pdcp
リモートホストにファイルをコピーするためのユーティリティが含まれています。たとえば、./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