it-swarm.cn

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

当SSH在本地进入我的计算机时(不要问,这是一种解决方法),如果不运行,我将无法启动图形应用程序:

export DISPLAY=:0.0

如果我先运行此程序,然后运行图形应用程序,那么一切都会顺利进行。如果不行,那就行不通了,没有显示器要附加。

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

78
Naftuli Kay

如果希望X连接通过SSH转发,则需要在服务器端和客户端都启用它。 (取决于分发,默认情况下可能会启用或禁用它。)在服务器端,请确保 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在服务器中启用了;您不必在进行ssh -X时就弄出XAUTHORITY)。如果存在问题,则需要 设置XAUTHORITY环境变量获取其他用户的cookie

要回答您的实际问题:

  • 本地显示对应于/tmp/.X11-unix中的套接字。

    (cd /tmp/.X11-unix && for x in X*; do echo ":${x#X}"; done)
    
  • 远程显示对应于打开的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)
      }'
    

    (本文的其余部分仅具有学术意义。)

    在另一台计算机上,您可以使用nmap -p 6000-6099 Host_name在通常范围内探测打开的TCP端口。如今,很少有X服务器在TCP套接字上侦听,尤其是在回送接口外部。

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

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

    如果那显示了类似sshd之类的模棱两可的内容,则无法确定是X服务器还是巧合。

85

显示是Xorg的第一个参数。您可以ps然后grep Xorg退出。

[[email protected] 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实例,看它是否可以捕获它-不会;它仅捕获登录shell(“ 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