(改编自Linux:通过ssh + screen启动会话时,wmctrl无法打开显示)
显示和权限
X程序需要两条信息才能连接到X显示器。
它需要的显示,这是典型的地址:0
,当你在本地登录或:10
,:11
等等。当你在远程登录(但数量取决于有多少X连接有效改变)。显示器的地址通常在DISPLAY
环境变量中指示。
它需要显示密码。X显示密码称为魔术cookie。魔术cookie不会直接指定:它们始终存储在X授权文件中,这些文件是“显示:42
具有cookie 123456
” 形式的记录的集合。X授权文件通常在XAUTHORITY
环境变量中指示。如果$XAUTHORITY
未设置,则程序使用~/.Xauthority
。
您正在尝试对桌面上显示的窗口执行操作。如果您是唯一使用台式机的人,则显示名称很可能是:0
。查找X授权文件的位置更加困难,因为在Debian squeeze或Ubuntu 10.04下设置的gdm,它位于具有随机生成名称的文件中。(您之前没有问题,因为早期版本的gdm使用了默认设置,即存储在中的cookie ~/.Xauthority
。)
获取变量的值
以下是获取DISPLAY
and 值的几种方法XAUTHORITY
:
您可以从桌面上系统地启动屏幕会话,也许会自动在登录脚本中(从~/.profile
;开始;但是仅当在X:下登录时才执行此操作:测试if DISPLAY
设置为以开头的值:
(应该涵盖所有可能的情况)遇到))。在~/.profile
:
case $DISPLAY in
:*) screen -S local -d -m;;
esac
然后,在ssh会话中:
screen -d -r local
你也可以保存的值DISPLAY
,并XAUTHORITY
在文件中调出值。在~/.profile
:
case $DISPLAY in
:*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
esac
在ssh会话中:
. ~/.local-display-setup.sh
screen
您可以检测正在运行的进程的值,DISPLAY
也可以XAUTHORITY
从正在运行的进程中检测值。这很难自动化。您必须弄清楚连接到要处理的显示器的进程的PID,然后从/proc/$pid/environ
(eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')
¹)获取环境变量。
复制cookie
另一种方法(遵循Arrowmaster的建议)是不尝试$XAUTHORITY
在ssh会话中获取的值,而是使X会话将其cookie复制到中~/.Xauthority
。由于cookie每次登录时都会生成,因此如果您将过时的值保留在中就没有问题~/.Xauthority
。
如果可以通过NFS或其他允许远程管理员查看其内容的网络文件系统访问主目录,则可能存在安全问题。除非您已启用X TCP连接(默认情况下,Debian禁用了它们),否则它们仍需要以某种方式连接到您的计算机。因此,对于大多数人而言,这要么不适用(无NFS),要么不成问题(无X TCP连接)。
要在登录桌面X会话时复制cookie,请在~/.xprofile
或~/.profile
(或登录时读取的其他脚本)中添加以下行:
case $DISPLAY:$XAUTHORITY in
:*:?*)
# DISPLAY is set and points to a local display, and XAUTHORITY is
# set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
¹ 原则上,它缺少适当的引号,但在此特定情况下$DISPLAY
,$XAUTHORITY
将不包含任何shell元字符。