A photograph of a man working in front of his computer.

UNIXパイプは、UNIXおよびUNIXライクなオペレーティング・システムの発展における記念碑的な一歩である。これによって、ユーザーは基本的なプログラムの入力と出力をリンクすることで、複雑なコンピューティング・タスクを実行できるようになった。この記事では、SSHプロトコルを使ってネットワーク越しにLinuxでUNIXパイプを使う方法を紹介します。

ヒント:もし復習が必要なら、Linuxでパイプとリダイレクトがどのように機能するかを学んでください。

Unixパイプラインを理解する

Unix(ひいてはLinux)のパイプは、プログラムをつなげて連動させるために使われます。例えば、catを使ってファイルの中身を表示することができますが、パイプ(|)を使えば、catコマンドをmoreコマンドにつないで、ファイルを読みやすくすることができます。

catfile1| more

ここでの基本的な考え方はこうだ:program1 fileX | program2。しかし、これは1つのファイルと2つのプログラムに限ったことではない。パイピングは、思いつく限りの修飾子を使って、必要なだけ高度なことができる。

ここでは、SSHの場面でパイプ(|)をうまく使う方法をいくつか紹介します。

余談ですがSSHサーバーをセキュアにするための最高のトリックを学びましょう。

圧縮されたディレクトリを自動的に転送する

UNIXパイプの最も一般的な使い方の一つは、プログラムの出力をローカルシステムのどこかのファイルに保存することです。たとえば、echo "Hello, MakeTechEasier!"を実行すると、次のようになります。例えば、echo "Hello, MakeTechEasier!"| tee Helloを実行すると、echoプログラムが実行され、同時に "Hello, MakeTechEasier!" という文字列が "Hello" というファイルに保存されます。

A terminal showing a basic UNIX pipe redirection in a local machine.

とはいえ、このアイデアを使って、2つのLinuxホスト間でディレクトリを転送することもできる。そのためには、tarを使って送りたいフォルダを読み込み、それをSSHデーモンにパイプする:

tarczf -"~/Documents/myfolder" | ssh [email protected] "tar xzf - -C ~/Documents/"

このコマンドは、あなたのフォルダをtarアーカイブに束ね、コマンドの標準出力に送ります。その後、UNIXパイプがそのデータを読み込み、SSHを使ってリモートのLinuxホストに送信します。

このコマンドを逆にして、リモートホストからファイルを取り出すこともできる:

ssh [email protected] "tar czf - ~/Documents/myfolder" | tarxzf --C "~/Documents/"

知っておくといいこと: rcloneを使って暗号化されたクラウドバックアップを作成する方法を学びましょう。

リモートホストからのファイルのプッシュと取得

パイプとSSHを使って、ネットワーク経由で個々のファイルを送信することもできます。これは、catを使ってファイルの中身をロードし、それをSSH経由で送信することで動作します:

cat <my.local.file| ssh [email protected] "cat > my.remote.file"

リモートホストは、ローカルのcatプロセスからの出力ストリームを受け取り、ファイルをそのまま再構築する。

リモートホストからファイルを取得するには、コマンドの順序を逆にし、リモートファイルのパスを指定する必要があります:

ssh [email protected] "cat < my.remote.file" | cat >my.local.file
A terminal showing individual file transfer using an SSH pipe in Linux.

リモートでのドライブのバックアップと復元

ファイルやディレクトリの送信と同様に、UNIXパイプとSSHを使って、Linuxのドライブ全体をリモートでバックアップすることができます。これは、オフサイト・バックアップを素早く作成したいときに、予備の物理ドライブがない場合に便利です。

ドライブ全体をバックアップするには、"if="変数にバックアップしたいドライブを設定してddを実行し、それをSSHデーモンにパイプする:

sudo dd  if=/dev/sda | ssh [email protected] "dd of=sda.img"

このコマンドを逆にすると、リモートマシンからディスクイメージを物理ディスクにリストアすることもできる:

ssh [email protected] "dd if=sda.img" | sudo dd  of=/dev/sda

さらに、このSSHパイプ構文は、ディスク・パーティションでも使えます。例えば、システムにある/homeパーティションが"/dev/sda4 "にある場合、以下のコマンドを実行してバックアップを作成できます:

sudo dd  if=/dev/sda4 | ssh [email protected] "dd of=home.img"

参考:歴史についてもっと知りたい方は、ddコマンドを使ってディスクイメージを作成することができます。

音声入力をリモートマシンにリダイレクトする

SSHパイプの利点の一つは、リモートマシンをローカルリソースのように扱えることです。これには、システムのオーディオ入力のようなデバイスファイルにアクセスする機能も含まれます。

これを行うには、リモートの ALSA サブシェルを SSH を使って実行し、その出力をローカルの ALSA デーモンに送ります:

ssh [email protected] "arecord -f cd"|aplay

これはリモートマシンのデフォルトのオーディオ入力デバイスを聞き、あなたのシステムで聞いているものを再生します。つまり、コマンドを反転させると、ローカルマシンのオーディオ入力をリモートホストのオーディオ出力に送ることができる:

A terminal showing an active audio stream using SSH pipes.
arecord -f cd | ssh [email protected] "aplay"

ALSA SSHパイプは他のオーディオ再生ツールと組み合わせても使えます。たとえば、arecordの出力をSSHパイプからffmpegに送ることができます:

ssh [email protected] "arecord -f cd"| ffplay-nodisp

遠隔地のウェブカメラからライブビデオをストリーミングする

LinuxでのSSHパイプのもう一つの素晴らしい使い方は、ライブビデオウェブカメラフィードをストリーミングすることです。オーディオと同じように、リモートホストのデバイスを利用して、その出力をローカルマシンにレンダリングすることができます。

リモートホストのウェブカメラからストリーミングするには、ffmpegサブシェルでSSHを実行し、それをローカルマシンのビデオ再生クライアントにパイプする:

ssh [email protected] "ffmpeg -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -"| mpv--demuxer=mkv/dev/stdin

このコマンドは、リモートマシンの最初のウェブカメラから出力された生のビデオをストリーミングします。

A screenshot showing an active webcam video feed going through an SSH pipe in Linux.

リモートのウェブカメラからの映像を別のファイルに録画することも可能です。この場合、SSHパイプからteeにデータを送信してから、ビデオプレーヤーにリダイレクトします:

ssh [email protected] "ffmpeg -r 14 -s 640x480 -f video4linux2 -i /dev/video0 -f matroska -" | teemy_recording.mkv|mpv--demuxer=mkv/dev/stdin

オーディオやビデオの他に、SSHパイプを使ってリモートマシンのTTYに生のテキストを送ることもできます。これは、GUIのないシステムにステータスメッセージを送りたい場合に便利です。

手始めに、ローカルマシンにFIFOパイプを作成する:

mkfifomy-fifo

FIFOでリスニングしているtailコマンドを実行し、その出力をSSHデーモンに送る:

tail -fmy-fifo| ssh [email protected] "cat > /dev/tty0"

echoコマンドを使ってテキストデータを送信し、新しいFIFOパイプがネットワーク上で機能しているかどうかをテストする:

echo "Hello, MakeTechEasier!" >my-fifo
A terminal showing arbitrary text in a machine's TTY console.

echo "Hello MakeTechEasier!" > my-fifo注意:マシンの TTY にテキストを送るのは、そのマシンの root アカウントでログインしている場合のみ有効です。

リモートデータをローカルクリップボードに送る

システムクリップボードの最大の欠点は、ローカルマシンでしか使えないことです。これは、複数のコンピューターで作業していて、一時ファイルを作成せずにデータを転送したい場合に問題となります。

これを解決する1つの方法は、リモートのファイルを読み込んでローカルのシステムクリップボードに直接送信できるSSHパイプを作成することです:

ssh [email protected] "cat < ~/ramces.txt" |xclip-selクリップボード

このコマンドはリモート・マシンに接続し、catユーティリティを実行し、"ramces.txt "ファイルの読み込みを開始する。それが終わると、リモート・データをローカル・マシンに送り返し、それをシステムのクリップボードにリダイレクトする。

A terminal showing the clipboard of the local machine after an SSH pipe.

また、以下のコマンドを使って、システムの現在のクリップボードをファイルとしてリモート・マシンにプッシュすることもできる:

xclip-selclipboard-o | ssh [email protected] "cat > ~/clip.txt"

UNIXのパイプとSSHを使ってネットワーク越しにデータを送信する方法を学ぶことは、コンピュータネットワークがどのように機能するかを理解するための第一歩に過ぎません。Tracerouteを使ってパケットの行き先を追跡することで、ネットワークについてもっと知ることができる。

画像クレジット:Mikhail Fesenko via Unsplash.すべての改変とスクリーンショットはRamces Redによるものです。

Akira
Akiraは情熱的なゲーマーであり、製品レビュアーです。ゲームをしていないときは、最新のゲーミングアクセサリーを試したり、製品のレビューをしていることが多い。彼の分かりやすいスタイルは、ゲーマーが自分のニーズに最も適した製品を簡単に判断できるようにするものです。また、技術的な問題にも精通しており、その解決方法も知っている。