以下のコマンドを試してみました、本から読みました
Sudo ls | tee /dev/tty3a
このコマンドは、Sudo
を使用しても、アクセスが拒否されました。
ここにttyはテレタイプライターです、私はこれをすでに知っています。しかし、ttyで3aとはどういう意味ですか?
/dev
内のデバイスファイルの名前は、Unixの亜種によって異なります。現在の端末を意味する/dev/tty
など、どこにでもあるものがいくつかあります。 /dev/tty3a
は、SolarisやSCO OpenServerなどの一部のUnixバリアントの4番目のシリアルポート¹の名前のようです。Linuxに相当するものは/dev/ttyS3
です。したがってls|tee /dev/tty3a
ls
の出力を4番目のシリアルポートに複製します。
シリアルポートにデバイスが接続されていない場合は、エラー(「入力/出力エラー」)が発生します。シリアルポート用のドライバがない場合は、別のエラーが発生します(「そのようなデバイスはありません」)。デバイスノードが存在しない場合は、もちろん「そのようなファイルやディレクトリはありません」というメッセージが表示されます。
デバイスノードは存在するが、それにアクセスする権限がない場合、「アクセスが拒否されました」というエラーが表示されます。 rootとして実行している場合、またはそのシリアルポートに接続されているハードウェア端末があり、その端末にログインしている場合を除き、そのデバイスにアクセスする権限がない可能性があります。
デバイスが存在すると仮定して、rootとしてアクセスする場合は、コマンドtee
をrootとして実行する必要があります。
ls | Sudo tee /dev/tty3a
Sudo ls | tee /dev/tty3a
はrootとしてのみls
を実行するため、機能しないことに注意してください。コマンドtee
はSudo
の引数ではなく、元のユーザーとして実行されます。このコマンドでは、パイプは元のシェルによって作成され、Sudo
の呼び出しはパイプの左側を構成します。 ls
とtee
の両方をルートとして実行する場合は、Sudo ls | Sudo tee /dev/tty3a
を記述する必要があります(パイプの作成は元のシェルのままです)。両方のコマンドをrootとして実行し、パイプのセットアップをrootとして実行する場合は、シェルをrootとして呼び出して、パイプをセットアップする必要があります。Sudo sh -c 'ls | tee /dev/tty3a'
¹ シリアルポートには0から番号が付けられています。
あなたが本で見つけた例は、あなたがあなた自身と他の端末画面で同時に書くことができることを示しています。同じサーバーに2回ログインし、w
を実行すると、次のようになります。
$ w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
joe pts/1 :0 21:53 0.00s 0.04s 0.00s w
joe pts/2 :0 22:38 3.00s 0.01s 0.01s /bin/bash
最初のコンソールで次のように記述します。
$ seq 3 | tee /dev/pts/1
そして、あなたは二重の出力を得る。
次に、同じコンソールで試してください
$ seq 3 | tee /dev/pts/2
両方の画面で同じ出力が得られます。
これは、ログインしているモニター/コンソールが多数あり、それらを1つのコンソールから更新する場合に役立ちます。