teeとttyの組み合わせ[閉じる]

teeとttyの組み合わせ[閉じる]

私は本から読んでからコマンドを試しました。

sudo ls | tee /dev/tty3a

このコマンドは、を使用しても拒否された権限を付与しますsudo
ここで、ttyは私がすでに知っているテレタイプです。しかし、3aとttyはどういう意味ですか?

答え1

/devデバイスファイル名はUnixバリアントによって異なります。/dev/tty現在、ターミナルなど各所で見られるものがあります。これは、/dev/tty3aSolarisおよびSCO OpenServerを含む一部のUnixバリアントの4番目のシリアルポート名のようです。 Linuxに対応するものは、/dev/ttyS3.sols|tee /dev/tty3a出力がls4番目のシリアルポートにコピーされます。

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

デバイスノードがあるがアクセス権がない場合は、「アクセス拒否」エラーが表示されます。ルートとして実行されている場合、またはハードウェア端末がシリアルポートに接続されていて端末にログインしていない場合、デバイスにアクセスできません。

デバイスが存在すると仮定してrootとしてアクセスするには、rootとしてteeコマンドを実行する必要があります。たとえば、次のようになります。

ls | sudo tee /dev/tty3a

これは root としてのみ実行できるsudo ls | tee /dev/tty3aため動作しません。lsコマンドは元のユーザーの引数ではなく、tee元のユーザーとして実行されます。sudoこのコマンドでは、パイプは元のシェルによって生成され、呼び出しはsudoパイプの左側を形成します。ルートlsとして実行するにはtee作成する必要がありますsudo ls | sudo tee /dev/tty3a(パイプの作成はまだ元のシェルにあります)。これら2つのコマンドをrootとして実行し、パイプ設定をrootとして実行するには、rootとしてシェルを呼び出してパイプを設定する必要があります。sudo sh -c 'ls | tee /dev/tty3a'

1シリアルポート番号は0から始まります。

答え2

本で見つけた例は、自分の画面と他の端末画面に同時に書き込むことができることを示しています。同じサーバーにログインして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つのコンソールですべて更新したい場合に便利です。

関連情報