web-dev-qa-db-ja.com

teeとttyの組み合わせ

以下のコマンドを試してみました、本から読みました

Sudo ls | tee /dev/tty3a

このコマンドは、Sudoを使用しても、アクセスが拒否されました。
ここにttyはテレタイプライターです、私はこれをすでに知っています。しかし、ttyで3aとはどういう意味ですか?

1
SuperKrish

/dev内のデバイスファイルの名前は、Unixの亜種によって異なります。現在の端末を意味する/dev/ttyなど、どこにでもあるものがいくつかあります。 /dev/tty3aは、SolarisやSCO OpenServerなどの一部のUnixバリアントの4番目のシリアルポート¹の名前のようです。Linuxに相当するものは/dev/ttyS3です。したがってls|tee /dev/tty3alsの出力を4番目のシリアルポートに複製します。

シリアルポートにデバイスが接続されていない場合は、エラー(「入力/出力エラー」)が発生します。シリアルポート用のドライバがない場合は、別のエラーが発生します(「そのようなデバイスはありません」)。デバイスノードが存在しない場合は、もちろん「そのようなファイルやディレクトリはありません」というメッセージが表示されます。

デバイスノードは存在するが、それにアクセスする権限がない場合、「アクセスが拒否されました」というエラーが表示されます。 rootとして実行している場合、またはそのシリアルポートに接続されているハードウェア端末があり、その端末にログインしている場合を除き、そのデバイスにアクセスする権限がない可能性があります。

デバイスが存在すると仮定して、rootとしてアクセスする場合は、コマンドteeをrootとして実行する必要があります。

ls | Sudo tee /dev/tty3a

Sudo ls | tee /dev/tty3aはrootとしてのみlsを実行するため、機能しないことに注意してください。コマンドteeSudoの引数ではなく、元のユーザーとして実行されます。このコマンドでは、パイプは元のシェルによって作成され、Sudoの呼び出しはパイプの左側を構成します。 lsteeの両方をルートとして実行する場合は、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つのコンソールから更新する場合に役立ちます。

1
hschou