当SSH在本地本地进入我的计算机时(不要问,这是一种解决方法),如果不运行,我将无法启动图形应用程序:
export DISPLAY=:0.0
如果先运行此程序,然后运行图形应用程序,那么一切都会顺利进行。如果不行,那就行不通了,没有显示器要附加。
是否有命令列出机器上所有可用的显示(即:所有可能的值)?
w
。更多信息:列出现有的X显示名称?
当SSH在本地本地进入我的计算机时(不要问,这是一种解决方法),如果不运行,我将无法启动图形应用程序:
export DISPLAY=:0.0
如果先运行此程序,然后运行图形应用程序,那么一切都会顺利进行。如果不行,那就行不通了,没有显示器要附加。
是否有命令列出机器上所有可用的显示(即:所有可能的值)?
w
。更多信息:列出现有的X显示名称?
Answers:
如果希望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显示屏形式:
:
。:
。使用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上的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服务器还是巧合。
显示是的第一个参数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
其转换为所需的任何格式。
ps aux |grep X
为我工作得更好
w
显示所有已登录的人及其显示。
DISPLAY=:0 netsurf "https://medium.com/"
...或export DISPLAY=:0
用于与进程共享变量,而不仅仅是与外壳程序共享
# 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
]
ps xeww | grep DISPLAY=:1024
现在使用起来很奇怪。我也在20号显示器上运行chrome-remote-desktop。
w
如果x服务器上没有运行任何应用程序(包括没有窗口管理器和桌面),则无法正常工作。但是ls /tmp/.X11-unix
确实有效。
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
ps e -u $USER | grep -Po " DISPLAY=[\.0-9A-Za-z:]* " | sort -u
吗?
( DISPLAY=:0 yourapp & )
。