xtermが/dev/ptmxファイルを開くことができないのはなぜですか?

xtermが/dev/ptmxファイルを開くことができないのはなぜですか?

gnome-terminal/dev/ptmxファイルを開きます。

ここに画像の説明を入力してください。

しかし、xterm開けません。

ここに画像の説明を入力してください。

すべての端末エミュレータがこのファイルを開く必要があると思いますが、/dev/ptmxなぜxtermはこのファイルを開くのですか?


編集する:これはls -ld "$(command -v xterm)"(に応じて スティーブン・チャジェラス):

ここに画像の説明を入力してください。

答え1

Xtermはすでに/dev/ptmx開いていますが、これは見ることができません。理由は次のとおりです。

実行xterm権限にはS_ISGID(set-group-ID)ビットが設定されており、グループが所有していますutmp

この方法は、エントリを(および正確なパスはシステムによって異なる場合があります)xtermに追加することによってセッションがまたはの出力に表示されるように設定されます。/var/run/utmp/var/log/wtmpwholast

これらの権限を使用すると、実行xterm時に実行するプロセスでその権限を表示できます。効果的なutmpグループIDはグループのIDに変更されます(読むグループIDは変更されず、そのまま残ります。これにより、utmp書き込みモードでレコードを開いてログインする権限が付与されます。wtmp

Linuxでは、セキュリティ対策として、root実効ユーザーIDが実際のユーザーIDと異なる場合、または実効グループIDが実際のグループIDと異なるプロセス用に開かれたファイルのみをリストできます。 (これらのプロセスには他のプロセスと比較して権限があることがわかります/proc/<pid>fd。)dr-x------ root rootdr-x------ you your-group

そのため、lsof通常のユーザーとして実行すると、xtermプロセスの開いたファイルを一覧表示できません。lsofとして実行する必要がありますroot

動作する理由については、gnome-terminalsいくつかの可能性があります。

  • gnome-terminalログイン履歴にエントリを追加しません(私のシステムの場合)。
  • gnome-terminal使用utempter 助ける人(この場合はsgid utmp)ログイン履歴を追加します。これが私がシステムでxtermやりたいことですkonsole
  • gnome-terminalutmpログイン履歴を更新した後(xterm実行されていない)、有効なユーザーIDを実際のユーザーIDにリセットします(特別なアクセス権を一時的に放棄します)。

答え2

これは擬似端末マスター装置です。Linux。ただし、xterm は POSIX 機能を使用して擬似端末を開き、デバイスのオープンに関する詳細を隠します。

擬似端末は構成が異なりますが、システムでは以下を使用できます。この作品:

#elif defined(HAVE_POSIX_OPENPT) && defined(HAVE_PTSNAME) && defined(HAVE_GRANTPT_PTY_ISATTY)
    if ((*pty = posix_openpt(O_RDWR)) >= 0) {
    char *name = ptsname(*pty);
    if (name != 0) {
        strcpy(ttydev, name);
        result = 0;
    }
}

VTE(実際の端末エミュレータ: "gnome-terminal"はフロント)次のようなものを使って(参照src/pty.cc)。

実際には続ける必要はありません。使用基本デバイスのファイル記述子です。 xtermは2つのプロセスで実行されます使用このファイル記述子は「親」プロセスにあります。プライマリデバイスのファイル記述子を削除します。「子」プロセス(ソースを参照)

xtermを実行すると、サブプロセスたとえば、次のように実行すると、シェルが会話することがあります。ttyどの端末を使用しているかを確認してください(例:奴隷擬似端末の片側所有者各プロセスは擬似端末の片側のみを使用する必要があるため、側は閉じています。

これ親プロセス(開く/dev/ptmx)Xウィンドウ表示を管理します。

lsofこれらすべてを念頭に置いて、show xtermが開かれるのを見たいです/dev/ptmx。とは別に:

  • スクリーンショットのメッセージは、現在実行中ではないことを意味します。、すべてのプロセスを表示できない権限の問題がある場合、lsofこれは情報の損失の原因となる可能性があります。
  • xtermは実際に実行されているシステムでは実行されていません。たとえば、そのシステムにsshでアクセスした場合(そして偶然に別のセッションで実行されているのをlsof見た場合)gnome-terminal

関連情報