stdout
あるCentOSサーバーではstdin
、別のCentOSサーバーでパイプする必要があります。これは可能ですか?
更新
ScottPack、MikeyB、およびjofelにはすべて有効な回答があります。私の質問ではセキュリティを要件として指定していませんが、安全であることは常に良いことだからです。ただし、他の2人のフェローの提案も有効です。
stdout
あるCentOSサーバーではstdin
、別のCentOSサーバーでパイプする必要があります。これは可能ですか?
ScottPack、MikeyB、およびjofelにはすべて有効な回答があります。私の質問ではセキュリティを要件として指定していませんが、安全であることは常に良いことだからです。ただし、他の2人のフェローの提案も有効です。
回答:
これは恥知らずのイエスです。
ssh
リモートサーバー上でコマンドを実行するために使用する場合、ある種の豪華な内部入出力リダイレクトを実行します。実際、これはOpenSSHの微妙に優れた機能の1つであると思います。具体的にssh
は、リモートシステムで任意のコマンドを実行するために使用する場合、sshは実行中のコマンドのマップにマップSTDIN
しますSTDOUT
。
例として、バックアップtarballを作成したいが、ローカルに保存したくない、または保存できないと仮定しましょう。この構文を見てみましょう:
$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"
私たちはtarballを作成しSTDOUT
、通常のものに書き込みます。私たちは、リモートコマンドを実行するには、SSHを使用しているので、STDINはにマッピングされますSTDIN
のcat
。次に、ファイルにリダイレクトします。
netcat
両端が優れたシンプルで簡単なコミュニケーションチャネルになります。tar cf - /path/to/dir | nc 1.2.3.4 5000
一方のサーバーnc -l -p 5000 > backupfile.tar
上、他方のサーバー上。
netcat
ネットワーク上のセキュリティを心配する必要がない場合にホスト間でデータをパイプする便利な方法は、接続の両端で使用することです。
これにより、非同期で設定することもできます。
「レシーバー」(実際には、双方向の通信が可能になりますが、次のように考える方が簡単です):
nc -l -p 5000 > /path/to/backupfile.tar
「送信者」で、次を実行します。
tar cf - /path/to/dir | nc 1.2.3.4 5000
単方向および双方向の接続を作成するための非常に強力なツールはsocat
です。可能性については、マンページの例をご覧ください。
これはnetcat
、同様のツールに完全に置き換わり、SSL暗号化接続をサポートしています。初心者にとって、それは十分に単純ではないかもしれませんが、それが存在することを知ることは少なくとも良いです。
要塞サーバーを使用する必要がある場合にのみ、事態は少し複雑になります。
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"
擬似端末に注意してください
ここで重要な点は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.
コマンドを実行しているユーザーのサーバー間でパスワードハンドシェイクを設定しなかった場合、これが最も簡単であることがわかります。
非圧縮
tar cf - . | ssh servername "cd /path-to-dir && tar xf -"
オンザフライ圧縮
tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"
ssh
既に圧縮用に構成されている場合、tarファイルで圧縮を使用することは非常に悪い考えです。
Compression
設定ファイルのいずれかで設定できます。そのための簡単なチェックssh -v localhost exit 2>&1 | fgrep -i compress
は、出力があるかどうかを確認することです(sshが読み込んだときに設定をダンプするオプションはありません)。
tar
とコマンドの-C path
両方で機能するフラグがc
ありx
ます。別のcd
コマンドをそこに入れる必要はありません。(ただし、複数のコマンドを実行できることに注意してください。)
-C
はGNU拡張機能です(現在はbsdtarおよびschily tarでもサポートされています)