SSHを自分のコンピューターにローカル接続すると(質問しないでください。回避策です)、次のコマンドを実行しないとグラフィカルアプリケーションを起動できません。
export DISPLAY=:0.0
これを最初に実行してからグラフィカルアプリケーションを実行すると、問題が解決します。そうでない場合、それは機能しません。接続するディスプレイがありません。
マシンで利用可能なすべてのディスプレイ(つまり、すべての可能な値)を一覧表示するコマンドはありますか?
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つの形式があります。
:
の前に何もないローカルディスプレイ。:
の前にホスト名が表示されます。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
で、必要な場所にフォーマットできます。
# 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
]
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
/tmp
フォルダーには、.X??-lock
ファイルもあり、??
はセッション番号を示します。
セッション番号を再利用する場合は、これらを削除する必要があります。
通常、ls -a
で始まるファイルは非表示であるため、.
を使用してそれらを表示できます。