【发布时间】:2013-12-22 02:24:06
【问题描述】:
当我插入外部驱动器时,我有一个从 udev 运行的脚本。它总是有效的。但是在从 Linux 3.8/Xorg 1.12/Mint 14(Ubuntu 12.10 兼容)升级到 Linux 3.11/Xorg 1.14/Mint 16(Ubuntu 13.10 兼容),它不再工作了。
脚本仍在运行,但没有任何需要显示的命令起作用。我通过退出 udev 守护进程并手动运行 udevd --debug 以获取详细输出(更多信息见下文)来解决这个问题。
此脚本曾在 Mint 14/12.10 中工作:
export DISPLAY=:0
UUID=$1
DEV=$2
notify-send -t 700 "mounting $DEV ($UUID)"
gnome-terminal -t "Backing up home..." -x rsync long line of data
zenity --warning --text="Done."
但在 Mint 16/13.10 中不再存在。如果您想知道可能的解决方案,我逐渐添加了一些东西,现在看起来像这样:
export DISPLAY=:0.0
xhost +local:
xhost +si:localuser:root
xhost +
DISPLAY=:0.0
export DISPLAY=:0.0
UUID=$1
DEV=$2
notify-send -t 700 "mounting $DEV ($UUID)"
gnome-terminal -t "Backing up home..." -x rsync long line of data
zenity --warning --text="Done." --display=:0.0
但它仍然不起作用。 udevd --debug 仍然显示:
'(err) 'No protocol specified'
'(err) ''
'(err) '** (gnome-terminal:24171): WARNING **: Could not open X display'
'(err) 'No protocol specified'
'(err) 'Failed to parse arguments: Cannot open display: '
'(err) 'No protocol specified'
'(err) ''
'(err) '** (zenity:24173): WARNING **: Could not open X display'
'(err) 'No protocol specified'
'(err) ''
'(err) '(zenity:24173): Gtk-WARNING **: cannot open display: :0.0'
'(err) 'No protocol specified'
请注意,任何 bash 逻辑都有效。将测试变量回显到>>/tmp/test.log 有效。它只是访问不再工作的显示。
这快把我逼疯了。现在实现这一目标的正确方法是什么?
2013 年 12 月 20 日更新
因此,在之前的 Ubuntu 中,X 命令会使用用户自动找到通往当前X 的路径。
现在,我似乎每次都需要这两件事:
- 在
X上使用用户:xhost +si:localuser:root
- 在
root/udev方面:- 使用用户的
~/.Xauthority文件将X复制到/root
- 使用用户的
这“感觉”就像是时光倒流。这仅在我每次以同一用户身份登录时脚本化才有效,因此我可以在脚本执行时从该用户的家中复制 .Xauthority 文件。
旧的 Ubuntu 使用了什么“技巧”来自动“神奇”地完成这项工作?
【问题讨论】:
-
您是否检查了工作 X 会话中的
XAUTHORITY环境变量? IIRC,Ubuntu更改了.Xauthority文件的默认路径。 -
它仍然在
~中(并且相应地设置了ENV) - 我相信它一直在~中。 -
但是如果在另一个用户启动桌面会话时脚本以 root 身份运行,
~将会不同。但确定你检查过了! -
你可能想在serverfault.com上试试这个问题,你可能会得到更好的结果。
-
是的,至少我认为我明白了。 Aparently,root 曾经拥有访问权限(如脚本所示,该脚本曾经在没有任何额外身份验证选项的情况下工作)。似乎不再是了,所以
xhost +afaik 应该涵盖这一点。
标签: linux ubuntu xorg udev linux-mint