是否有命令列出机器上所有打开的显示?

Naf*_*Kay 98 ssh x-server

当 SSH 本地连接到我的计算机时(不要问,这是一种解决方法),我无法在不运行的情况下启动图形应用程序:

export DISPLAY=:0.0
Run Code Online (Sandbox Code Playgroud)

如果我先运行它然后运行图形应用程序,事情就会解决。如果没有,它不起作用,没有显示器可以连接。

是否有列出机器上所有可用显示(即:所有可能的值)的命令?

Gil*_*il' 95

如果要通过 SSH 转发 X 连接,则需要在服务器端和客户端都启用它。(根据发行版,它可能默认启用或禁用。)在服务器端,请确保您已X11Forwarding yes/etc/sshd_config(或/etc/ssh/sshd_config配置文件所在的任何位置)。在客户端,通过该-X选项的ssh命令,或者把ForwardX11你的~/.ssh/config

如果您运行ssh -X localhost,您应该看到它$DISPLAY是(可能)localhost:10.0。与 相比:0.0,这是未通过 SSH 连接时的值。(该.0部分可以省略;它是一个屏幕编号,但很少使用多个屏幕。)您可能会遇到两种形式的 X 显示:

  • 本地显示,在:.
  • 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)
    
    Run Code Online (Sandbox Code Playgroud)
  • 远程显示对应打开6000以上的TCP端口;通过连接到机器 M 上的 TCP 端口 6000+N 来访问机器 M 上的显示编号 N。从机器 M 本身:

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

    (此要点的其余部分仅具有学术兴趣。)

    在另一台机器上,您可以nmap -p 6000-6099 host_name用来探测通常范围内的开放 TCP 端口。现在很少有 X 服务器侦听 TCP 套接字,尤其是在环回接口之外。

    严格来说,另一个应用程序可能正在使用 X 服务器通常使用的范围内的端口。您可以通过检查哪个程序打开了端口来判断 X 服务器是否正在侦听。

    lsof -i -n | awk '$9 ~ /:60[0-9][0-9]$/ {print}'
    
    Run Code Online (Sandbox Code Playgroud)

    如果这显示出诸如 之类的模棱两可的东西sshd,则无法确定它是 X 服务器还是巧合。


Vit*_* Py 22

显示是 的第一个参数Xorgps然后你可以grepXorg了。

[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
Run Code Online (Sandbox Code Playgroud)

然后,您可以将awk其转换为您需要的任何格式。

  • 这不会检测由 Xorg 以外的服务器创建的显示,例如 [Xvnc](http://www.tigervnc.org/)。 (14认同)
  • `w` 显示所有登录的人和他们的显示。 (7认同)
  • `ps aux |grep X` 对我来说效果更好 (5认同)
  • 请注意,Xorg 的参数(至少现在,在 2016 年)是可选的,并且(至少在 Fedora 上)通常不存在,因此这种方法根本不再起作用。 (4认同)

For*_*rdi 13

# 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
Run Code Online (Sandbox Code Playgroud)

[编辑:我运行了一个 Xnest 实例,看看这是否会捕获它 - 它不会;它只捕获登录 shell(“w”是“who”的缩写)。为我回到绘图板。] [编辑:找到它:

$ ls /tmp/.X11-unix

X0 X2

$ ls /tmp/.X11-unix | tr 'X' ':'
:0
:2
Run Code Online (Sandbox Code Playgroud)

]


len*_*roc 8

ps e | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
Run Code Online (Sandbox Code Playgroud)

将通过列出所有当前显示来完成这项工作。您还可以使用以下命令查看特定用户 ($usr) 的分配显示:

ps e -u $usr | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
Run Code Online (Sandbox Code Playgroud)