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" というファイルに保存されます。
とはいえ、このアイデアを使って、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
リモートでのドライブのバックアップと復元
ファイルやディレクトリの送信と同様に、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
これはリモートマシンのデフォルトのオーディオ入力デバイスを聞き、あなたのシステムで聞いているものを再生します。つまり、コマンドを反転させると、ローカルマシンのオーディオ入力をリモートホストのオーディオ出力に送ることができる:
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
このコマンドは、リモートマシンの最初のウェブカメラから出力された生のビデオをストリーミングします。
リモートのウェブカメラからの映像を別のファイルに録画することも可能です。この場合、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
echo "Hello MakeTechEasier!" > my-fifo注意:マシンの TTY にテキストを送るのは、そのマシンの root アカウントでログインしている場合のみ有効です。
リモートデータをローカルクリップボードに送る
システムクリップボードの最大の欠点は、ローカルマシンでしか使えないことです。これは、複数のコンピューターで作業していて、一時ファイルを作成せずにデータを転送したい場合に問題となります。
これを解決する1つの方法は、リモートのファイルを読み込んでローカルのシステムクリップボードに直接送信できるSSHパイプを作成することです:ssh [email protected] "cat < ~/ramces.txt" |xclip-selクリップボード
このコマンドはリモート・マシンに接続し、catユーティリティを実行し、"ramces.txt "ファイルの読み込みを開始する。それが終わると、リモート・データをローカル・マシンに送り返し、それをシステムのクリップボードにリダイレクトする。
また、以下のコマンドを使って、システムの現在のクリップボードをファイルとしてリモート・マシンにプッシュすることもできる:
xclip-selclipboard-o | ssh [email protected] "cat > ~/clip.txt"
UNIXのパイプとSSHを使ってネットワーク越しにデータを送信する方法を学ぶことは、コンピュータネットワークがどのように機能するかを理解するための第一歩に過ぎません。Tracerouteを使ってパケットの行き先を追跡することで、ネットワークについてもっと知ることができる。
画像クレジット:Mikhail Fesenko via Unsplash.すべての改変とスクリーンショットはRamces Redによるものです。