当通过 SSH 本地连接到我的计算机时(不要问,这是一种解决方法),我无法在不运行的情况下启动图形应用程序:
export DISPLAY=:0.0
如果我先运行它,然后运行图形应用程序,事情就会成功。如果没有,它就不起作用,没有可连接的显示器。
是否有一个命令可以列出机器上所有可用的显示(即:所有可能的值)?
答案1
如果您希望通过 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)
远程显示对应开放TCP端口6000以上;访问机器 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 服务器还是巧合。
答案2
显示是 的第一个参数Xorg
。然后你就可以ps
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
然后您可以awk
将其转换为您需要的任何格式。
答案3
# 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
]
答案4
在该/tmp
文件夹中还可以有指示会话编号.X??-lock
的文件。??
如果您想重新使用会话号,则需要删除它们。
您可以看到它们ls -a
正常使用,以 a 开头的文件.
被隐藏。