あるサーバーの標準出力を別のサーバーの標準入力にパイプできますか?


74

stdoutあるCentOSサーバーではstdin、別のCentOSサーバーでパイプする必要があります。これは可能ですか?

更新

ScottPack、MikeyB、およびjofelにはすべて有効な回答があります。私の質問ではセキュリティを要件として指定していませんが、安全であることは常に良いことだからです。ただし、他の2人のフェローの提案も有効です。


1
非SSHアプローチの(唯一の)主な利点はスループット速度であることに注意してください。高速ネットワークでセキュリティが不要な場合は、2つのコマンドを2つのウィンドウに入力するのは非常に不便です。
Random832

回答:


94

これは恥知らずのイエスです。

sshリモートサーバー上でコマンドを実行するために使用する場合、ある種の豪華な内部入出力リダイレクトを実行します。実際、これはOpenSSHの微妙に優れた機能の1つであると思います。具体的にsshは、リモートシステムで任意のコマンドを実行するために使用する場合、sshは実行中のコマンドのマップにマップSTDINしますSTDOUT

例として、バックアップtarballを作成したいが、ローカルに保存したくない、または保存できないと仮定しましょう。この構文を見てみましょう:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

私たちはtarballを作成しSTDOUT、通常のものに書き込みます。私たちは、リモートコマンドを実行するには、SSHを使用しているので、STDINはにマッピングされますSTDINcat。次に、ファイルにリダイレクトします。


11
それは「派手な内部入出力リダイレクト」のようなものではありません-単なる、退屈な普通のものです。sshは、他のツールと同様にSTDINから読み取り、リモートプロセスに渡します。:)
ダニエルピットマン

7
@DanielPittman:しかし、それを「ファンシーな内部」ゴミと呼ぶのはとても楽しいです。
スコットパック

7
同様に、netcat両端が優れたシンプルで簡単なコミュニケーションチャネルになります。tar cf - /path/to/dir | nc 1.2.3.4 5000一方のサーバーnc -l -p 5000 > backupfile.tar上、他方のサーバー上。
MikeyB

1
@MikeyB:良い点。Netcatはクリアテキストプロトコルなので、機密データには注意してください。ローカルネットワークやポートスキャンを介したネットワークドライブの取得(ala dd)など、より具体的な目的でnetcatを使用する傾向があります。
スコットパック

2
@MikeyB:あなたの飛行とズボンの座席は何ですか!
スコットパック

28

netcatネットワーク上のセキュリティを心配する必要がない場合にホスト間でデータをパイプする便利な方法は、接続の両端で使用することです。

これにより、非同期で設定することもできます。

「レシーバー」(実際には、双方向の通信が可能になりますが、次のように考える方が簡単です):

nc -l -p 5000 > /path/to/backupfile.tar

「送信者」で、次を実行します。

tar cf - /path/to/dir | nc 1.2.3.4 5000

知っておくといい。これは、おそらくバックアップネットワークのように物理接続が信頼されている場合、または接続が既にトンネル化されている場合に適しています。
ウェズリー

または、データがとにかく公開されているものである場合。
サミュエルエドウィン区

1
+1 netcatは、特にsshサーバーを実行していない場合に非常に貴重なツールです。
-kwarrick

21

単方向および双方向の接続を作成するための非常に強力なツールはsocatです。可能性については、マンページの例をご覧ください

これはnetcat、同様のツールに完全に置き換わり、SSL暗号化接続をサポートしています。初心者にとって、それは十分に単純ではないかもしれませんが、それが存在することを知ることは少なくとも良いです。


1
@WesleyDavid:「更新」に:完全を期すために、socatはSSLをサポートしているので、暗号化もsocatで可能だと答えに追加しました。ただし、ほとんどの場合、sshの方がより優れた簡単なソリューションなので、ScottPackの答えも選択します。
ジョフェル

5

TL; DR

要塞サーバーを使用する必要がある場合にのみ、事態は少し複雑になります。

  1. ssh次のsshようにコマンドとして渡すことができます。

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. 擬似端末に注意してください


ここで重要な点はssh、ほとんどのツールと同様に、デフォルトで処理stdoutおよびstdin修正するだけであることに注意してください。

ただし、次のようなオプションを表示するために起動したときDisable pseudo-terminal allocation.Force pseudo-terminal allocation.、あなたは少し試行錯誤を行う必要があります。ただし、一般的なルールとして、ttyターミナルエミュレータ(人間が入力するもの)で文字化け/バイナリジャンクを修正しようとしない限り、動作を変更したくないでしょう。

たとえば-At、ワークステーションのssh-agentが転送され、tmuxをリモートで実行してもバイナリがbarfされないように使用する傾向がありますssh -At bastion.internal tmux -L bruno attach。そして、Dockerの場合も(そうですsudo docker exec -it jenkins bash)。

ただし、これらの2つの-tフラグにより​​、次のようなことをしようとすると、データの破損を追跡するのが難しくなります。

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

1つのコマンドでssh公開鍵を別のホストに配置してみてください

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

コマンドを実行しているユーザーのサーバー間でパスワードハンドシェイクを設定しなかった場合、これが最も簡単であることがわかります。

非圧縮

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

オンザフライ圧縮

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

ssh既に圧縮用に構成されている場合、tarファイルで圧縮を使用することは非常に悪い考えです。
アントン14

@Anthonなぜそんなに悪いのか、ssh圧縮が既に有効になっているかどうかをどのように確認するのでしょうか?
トム・ヘイル

1
@TomHaleシステムの速度によっては、2番目の圧縮に時間がかかるため、全体の動作が遅くなる場合がありますが、追加のバイトを削る可能性は低いです。Compression設定ファイルのいずれかで設定できます。そのための簡単なチェックssh -v localhost exit 2>&1 | fgrep -i compressは、出力があるかどうかを確認することです(sshが読み込んだときに設定をダンプするオプションはありません)。
アントン

tarとコマンドの-C path両方で機能するフラグがcありxます。別のcdコマンドをそこに入れる必要はありません。(ただし、複数のコマンドを実行できることに注意してください。)
ブルーノブロノスキー

@Bruno -CはGNU拡張機能です(現在はbsdtarおよびschily tarでもサポートされています)
16:34にステファンシャ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.