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


76

私のコンピューターにローカルでSSHを実行した場合(回避策です)、実行せずにグラフィカルアプリケーションを起動できません。

export DISPLAY=:0.0

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

マシン上で利用可能なすべてのディスプレイ(すなわち、すべての可能な値)をリストするコマンドはありますか?


ターミナルからアプリケーションを起動するよりクリーンな方法は( DISPLAY=:0 yourapp & )です。
-nobar

3
コマンドラインスクリプトからそのディスプレイ番号を取得するには、を試してくださいw。詳細:既存のX表示名をリストしますか?
aexl

回答:


80

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

実行するとssh -X localhost、それ$DISPLAYが(おそらく)表示されるはずlocalhost:10.0です。対比:0.0あなたはSSHを介して接続していない値です。(この.0部分は省略される場合があります。画面番号ですが、複数の画面はほとんど使用されません。)Xディスプレイには2つの形式があります。

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

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

Xサーバーにアクセスするには、Cookieと呼ばれ、通常はファイルの裏で保存されているフォームが必要です~/.Xauthority。sshを使用して別のユーザーアカウントにアクセスしている場合、またはディストリビューションが別のファイルにcookieを配置している場合DISPLAY=:0、SSHセッション内で機能しないことがあります(ただしssh -X、サーバーで有効になっている場合、XAUTHORITY行うときに混乱する必要がありますssh -X)。問題がある場合はXAUTHORITY環境変数設定する、他のユーザーのCookieを取得する必要があります。

実際の質問に答えるには:

  • ローカルディスプレイは、のソケットに対応しています/tmp/.X11-unix

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • リモート表示は、6000以上の開いているTCPポートに対応しています。マシンMのディスプレイ番号Nにアクセスするには、マシンMのTCPポート6000 + Nに接続します。マシン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サーバーか偶然かを確実に知る方法はありません。


15

ディスプレイはへの最初の引数Xorgです。psその後、grep Xorgout できます。

[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、このどこ形式にあなたがする必要があります。


10
これは、Xorg以外のサーバー(Xvncなど)によって作成されたディスプレイを検出しません。
cjm

5
ps aux |grep X私にとってはうまくいきました
-nobar

6
wログインしている全員とそのディスプレイを表示します。
プレナスフランクリー

2
Xorgへの引数は(少なくとも2016年には)オプションであり、(少なくともFedoraでは)通常存在しないため、このメソッドはまったく機能しないことに注意してください。
BRPocock

何らかの理由で環境変数を設定するだけではうまくいかない場合は...コマンドの前に追加するDISPLAY=:0 netsurf "https://medium.com/"export DISPLAY=:0、シェルだけでなくプロセスと変数を共有してみてください
Ray Foss

7
# 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

]


1
それは...奇妙な...どんな説明があるのだろうか。
フォルディ

(ディスプレイ1024で実行されているGDMについては)もう一度複製できませんでした。当時、私はxrdp、ウィンドウ化されたX11転送、およびいくつかのVNCクライアントを試していました。通常のインストールでは、ロック画面で「別のユーザーとしてログイン」ボタンを押すと、GDMはX0 ...またはX1で実行されるようです。あなたの第二の方法では、Fedora 23の上に私のために働いた
レイフォス

あなたのコマンドを使用してディスプレイ1024で何かを見つけましたが、そこでは何も実行されていません... ps xeww | grep DISPLAY=:1024今ではそれは奇妙です ディスプレイ20でもchrome-remote-desktopを実行しています。
レイ・フォス

wxサーバーでアプリケーションが実行されていない場合(ウィンドウマネージャーやデスクトップがない場合)は機能しません。しかし、ls /tmp/.X11-unix動作します。
12431234123412341234123

4
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

その2つ目は意図されたものps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -uですか?
アレックスロシュ

0

では/tmpフォルダもあるから可能.X??-lockで、ファイル??のセッション番号を示します。

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

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


それらは展示セッションですか?
phk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.