web-dev-qa-db-ja.com

マシンで開いているすべてのディスプレイを一覧表示するコマンドはありますか?

SSHを自分のコンピューターにローカル接続すると(質問しないでください。回避策です)、次のコマンドを実行しないとグラフィカルアプリケーションを起動できません。

export DISPLAY=:0.0

これを最初に実行してからグラフィカルアプリケーションを実行すると、問題が解決します。そうでない場合、それは機能しません。接続するディスプレイがありません。

マシンで利用可能なすべてのディスプレイ(つまり、すべての可能な値)を一覧表示するコマンドはありますか?

78
Naftuli Kay

SSH経由でX接続を転送する場合は、サーバー側とクライアント側の両方でX接続を有効にする必要があります。 (ディストリビューションによっては、デフォルトで有効または無効になっている場合があります。)サーバー側で、X11Forwarding yes/etc/sshd_config (または/etc/ssh/sshd_configまたは構成ファイルがある場所)にあることを確認してください。クライアント側で、-Xオプションを sshコマンド に渡すか、ForwardX11~/.ssh/config に入れます。

ssh -X localhostを実行すると、$DISPLAYが(おそらく)localhost:10.0であることがわかります。 SSH経由で接続していないときの値である:0.0とは対照的です。 (.0の部分は省略される場合があります。これは画面番号ですが、複数の画面が使用されることはほとんどありません。)遭遇する可能性が高いXディスプレイには2つの形式があります。

  • :の前に何もないローカルディスプレイ。
  • TCPが表示され、:の前にホスト名が表示されます。

ssh -X localhostを使用すると、両方のディスプレイからXサーバーにアクセスできますが、アプリケーションは別の方法を使用します。:NUMBERはローカルソケットと共有メモリを介してサーバーにアクセスしますが、HOSTNAME:NUMBERはTCP経由でサーバーにアクセスしますが、低速で一部の拡張機能が無効になります。

Xサーバーにアクセスするには、Cookieと呼ばれる形式の承認が必要であり、通常はバックグラウンドで~/.Xauthorityファイルに格納されています。 sshを使用して別のユーザーアカウントにアクセスしている場合、またはディストリビューションがCookieを別のファイルに配置している場合、SSHセッション内でDISPLAY=:0が機能しないことがあります(ただし、サーバーで有効になっている場合、ssh -Xは機能します。 ssh -Xを実行するときに、XAUTHORITYをいじる必要はありません。それが問題である場合は、 XAUTHORITY環境変数を設定 または 他のユーザーのCookieを取得 する必要があります。

あなたの実際の質問に答えるには:

  • ローカル表示は、/tmp/.X11-unixのソケットに対応しています。

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • リモートディスプレイは開いているTCP 6000を超えるポートに対応します。マシンMのディスプレイ番号Nへのアクセスは、TCPポート6000 + NマシンMに接続することで行われます。マシンM自体:

    netstat -lnt | awk '
      sub(/.*:/,"",$4) && $4 >= 6000 && $4 < 6100 {
        print ($1 == "tcp6" ? "ip6-localhost:" : "localhost:") ($4 - 6000)
      }'
    

    (この箇条書きの残りの部分は、学術的にのみ興味があります。)

    別のマシンから、nmap -p 6000-6099 Host_nameを使用して、オープンTCPポートを通常の範囲でプローブすることができます。最近では、XサーバーがTCPソケットでリッスンすることはまれですループバックインターフェイスの外側。

    厳密に言うと、別のアプリケーションが、Xサーバーが通常使用する範囲のポートを使用している可能性があります。 Xサーバーがリッスンしているかどうかは、どのプログラムがポートを開いているかを確認することで確認できます。

    lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
    

    それがsshdのような曖昧なものを示している場合、それがXサーバーであるか、偶然であるかを確実に知る方法はありません。

表示はXorgの最初の引数です。 psしてからgrep Xorgを実行できます。

[braga@coleman teste_geom]$ ps aux | grep Xorg
root      1584  5.3  1.0 156628 41708 tty1     Rs+  Jul22  22:56 /usr/bin/Xorg :0 -background none -verbose -auth /var/run/gdm/auth-for-gdm-a3kSKB/database -nolisten tcp vt1
braga     9110  0.0  0.0 109104   804 pts/1    S+   00:26   0:00 grep --color=auto Xorg

次に、これをawkで、必要な場所にフォーマットできます。

16
Vitor Py
# Show all active login shells, with displays
$ w -oush

trunc-us tty1                      23:02  -bash
trunc-us tty7     :0                4days /sbin/upstart --user
trunc-us pts/4    :0                      w -oush

# Capture the Display part
$ w -oush | grep -Eo ' :[0-9]+'

 :0
 :0

# only unique lines
$ w -oush | grep -Eo ' :[0-9]+' | uniq

 :0

# trim off the leading space
$ w -oush | grep -Eo ' :[0-9]+' | uniq | cut -d \  -f 2

[編集:Xnestインスタンスを実行して、これがキャッチされるかどうかを確認しました-キャッチされません。ログインシェルのみをキャプチャします(「w」は「who」の略)。私のための描画ボードに戻ります。] [編集:見つけた:

$ ls /tmp/.X11-unix

X0 X2

$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2

]

7
Fordi
ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u

現在のすべてのDISPLAYをリストすることにより、ジョブを実行します。また、特定のユーザー($ usr)に割り当てられたディスプレイを次のように表示できます。

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
4
lenroc

/tmpフォルダーには、.X??-lockファイルもあり、??はセッション番号を示します。

セッション番号を再利用する場合は、これらを削除する必要があります。

通常、ls -aで始まるファイルは非表示であるため、.を使用してそれらを表示できます。

0
user177936