UNIX パイプは、UNIX および UNIX 類似のオペレーティング システムの開発における画期的な一歩です。 これにより、ユーザーは基本プログラムの入力と出力をリンクすることで、複雑なコンピューティング タスクを実行できるようになりました。 この記事では、SSH プロトコルを使用してネットワーク経由で Linux で UNIX パイプを使用する方法を説明することで、これを拡張します。
ヒント: 復習が必要な場合は、Linux でパイプとリダイレクトがどのように機能するかを学習してください。
Unix パイプラインを理解する
Unix (さらには Linux) 上のパイプは、プログラムをチェーンして連携させて動作させるために使用されます。 たとえば、次のように使用します。 cat
、ファイルの内容を表示できますが、パイプ (|
)、連鎖させることができます。 cat
に命令する more
ファイルを読みやすくするコマンド。
cat file1 | more
ここでの基本的な考え方は次のとおりです。 program1 fileX | program2
。 ただし、1 つのファイルと 2 つのプログラムに限定されるわけではありません。 パイプ処理は、考えられる限り多くのモディファイアを使用することで、必要なだけ高度なものにすることができます。
ここではパイプを有効に活用する方法をいくつか紹介します (|
) SSH 状況では。
余談ですが: SSH サーバーを保護するための最良のトリックをいくつか学びます。
圧縮されたディレクトリを自動的に転送する
UNIX パイプを使用する最も一般的な方法の 1 つは、プログラムの出力をローカル システム内のファイルに保存することです。 たとえば、ランニング echo "Hello, MakeTechEasier!" | tee Hello
プログラムを実行します echo
「Hello, MakeTechEasier!」という文字列も保存します。 ファイル内「こんにちは。」
つまり、このアイデアを使用して、2 つの Linux ホスト間でディレクトリを転送することができます。 これを行うには、送信するフォルダーを次のコマンドを使用して読み取ります。 tar
、それを SSH デーモンにパイプします。
tar czf - "~/Documents/myfolder" | ssh ramces@remote.host "tar xzf - -C ~/Documents/"
このコマンドは、フォルダーを tar アーカイブにバンドルし、コマンドの標準出力に送信します。 次に、UNIX パイプはそのデータを読み取り、SSH を使用してリモート Linux ホストに送信します。
このコマンドを逆にして、リモート ホストからファイルを取得することもできます。
ssh ramces@remote.host "tar czf - ~/Documents/myfolder" | tar xzf - -C "~/Documents/"
知っておくとよいこと: rclone を使用して暗号化されたクラウド バックアップを作成する方法を学びます。
リモートホストからのファイルのプッシュと取得
パイプと SSH を使用して、ネットワーク経由で個々のファイルを送信することもできます。 これは次を使用して機能します cat
ファイルの内容をロードし、SSH 経由で送信する方法として:
cat < my.local.file | ssh ramces@remote.host "cat > my.remote.file"
リモート ホストはローカルの cat プロセスから出力ストリームを受け取り、ファイルをそのまま再構築します。
リモート ホストからファイルを取得するには、コマンドの順序を逆にして、リモート ファイルのパスを指定する必要があります。
ssh ramces@remote.host "cat < my.remote.file" | cat > my.local.file
ドライブのリモートバックアップと復元
ファイルやディレクトリの送信と同様に、UNIX パイプと SSH を使用して Linux のドライブ全体をリモートでバックアップすることができます。 これは、オフサイトのバックアップを迅速に作成したいが、現在予備の物理ドライブがない場合に役立ちます。
ドライブ全体をバックアップするには、次のコマンドを実行します。 dd
「if=」変数をバックアップするドライブに設定し、それを SSH デーモンにパイプします。
sudo dd if=/dev/sda | ssh ramces@remote.host "dd of=sda.img"
このコマンドを逆に実行すると、ディスク イメージをリモート マシンから物理ディスクに復元することもできます。
ssh ramces@remote.host "dd if=sda.img" | sudo dd of=/dev/sda
さらに、この SSH パイプ構文は個別のディスク パーティションでも機能します。 たとえば、システムの「/dev/sda4」に /home パーティションがある場合、次のコマンドを実行してそのバックアップを作成できます。
sudo dd if=/dev/sda4 | ssh ramces@remote.host "dd of=home.img"
ご参考までに: 歴史について詳しく知ると、dd コマンドを使用してディスク イメージを作成できます。
オーディオ入力をリモート マシンにリダイレクトする
SSH パイプの利点の 1 つは、リモート マシンをローカル リソースであるかのように操作できることです。 これには、システムのオーディオ入力などのデバイス ファイルを利用する機能が含まれます。
これを行うには、SSH を使用してリモート ALSA サブシェルを実行し、その出力をローカル ALSA デーモンに送信します。
ssh ramces@remote.host "arecord -f cd" | aplay
これにより、リモート マシン上のデフォルトのオーディオ入力デバイスがリッスンされ、システム上で聞こえているものが再生されます。 ただし、コマンドを反転すると、ローカル マシンのオーディオ入力がリモート ホストのオーディオ出力に送信されます。
arecord -f cd | ssh ramces@remote.host "aplay"
ALSA SSH パイプは、他のオーディオ再生ツールと組み合わせた場合にも機能します。 たとえば、record 出力を SSH パイプから ffmpeg に送信できます。
ssh ramces@remote.host "arecord -f cd" | ffplay -nodisp -
リモート Web カメラからライブ ビデオをストリーミングする
Linux における SSH パイプのもう 1 つの優れた用途は、ライブ ビデオ Web カメラ フィードのストリーミングです。 オーディオと同様に、これによりリモート ホストのデバイスを利用し、その出力をローカル マシン上でレンダリングできるようになります。
リモート ホストの Web カメラからストリーミングするには、ffmpeg サブシェルで SSH を実行し、それをローカル マシン上のビデオ再生クライアントにパイプします。
ssh ramces@remote.host "ffmpeg -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -" | mpv --demuxer=mkv /dev/stdin
このコマンドは、リモート マシン上の最初の Web カメラから生のビデオ出力をストリーミングします。
リモート Web カメラの映像を別のファイルに記録することもできます。 これを行うには、データをビデオ プレーヤーにリダイレクトする前に、SSH パイプから tee にデータを送信します。
ssh ramces@remote.host "ffmpeg -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -" | tee my_recording.mkv | mpv --demuxer=mkv /dev/stdin
リモートコンソールでのテキストの印刷
オーディオとビデオの他に、SSH パイプを使用してリモート マシンの TTY に生のテキストを送信することもできます。 これは、GUI のないシステムにステータス メッセージを送信する場合に役立ちます。
まず、ローカル マシン上に FIFO パイプを作成します。
mkfifo my-fifo
リスニングを実行する tail
コマンドを FIFO で実行し、その出力を SSH デーモンに送信します。
tail -f my-fifo | ssh root@remote.host "cat > /dev/tty0"
echo コマンドを使用してテキスト データを送信し、新しい FIFO パイプがネットワーク上で動作しているかどうかをテストします。
echo "Hello, MakeTechEasier!" > my-fifo
注記: マシンの TTY へのテキストの送信は、そのマシンの root アカウントとしてログインしている場合にのみ機能します。
リモート データをローカル クリップボードにパイプする
システム クリップボードの最大の欠点は、ローカル マシンでのみ機能することです。 これは、複数のコンピュータで作業していて、一時ファイルを作成せずにデータを転送したい場合に問題になります。
これを修正する 1 つの方法は、リモート ファイルを読み取ってローカル システムのクリップボードに直接送信できる SSH パイプを作成することです。
ssh ramces@remote.host "cat < ~/ramces.txt" | xclip -sel clipboard
このコマンドはリモート マシンに接続し、cat ユーティリティを実行して、「ramces.txt」ファイルの読み取りを開始します。 完了すると、リモート データがローカル マシンに送り返され、システムのクリップボードにリダイレクトされます。
次のコマンドを使用して、システムの現在のクリップボードをファイルとしてリモート マシンにプッシュすることもできます。
xclip -sel clipboard -o | ssh ramces@remote.host "cat > ~/clip.txt"
UNIX パイプと SSH を使用してネットワーク経由でデータを送信する方法を学ぶことは、コンピューター ネットワークがどのように機能するかを理解するための最初のステップにすぎません。 Traceroute を使用してパケットの宛先を追跡することで、ネットワークの詳細を調べます。
画像クレジット: ミハイル・フェセンコ(Unsplash経由)。 すべての変更とスクリーンショットは Ramces Red によるものです。