如何在Linux上使用xauth通过其他用户运行图形应用程序


48

假设我的普通用户帐户是user1。我为一些x应用程序创建了单独的user2,我希望以user1身份登录到x应用程序,但是这样做会阻止它对user1数据进行读/写访问。我以为我可以使用xauth和sudo / su从user1到user2来运行此应用程序。我该怎么做呢?我不确定如何配置xauth。

Answers:


32

要有选择地使用xauth 以user1的身份运行:

xauth list|grep `uname -n`

这会为您打印十六进制授权条目。您可能还具有与这些主机关联的不同显示。

以user2设置您的显示(假定默认情况):

DISPLAY=:0; export DISPLAY

然后运行:

xauth add $DISPLAY . hexkey

注意$ DISPLAY之后和十六进制键之前的点。

当不再需要访问时,可以以user2的身份运行:

xauth remove $DISPLAY

问题1:user2 .Xauthority的用户主目录中没有文件。问题2:由于某种原因,由于某种原因,我不了解su,XAUTHORITY保留了user1的文件路径。但是user2无法读取该文件。
Otheus

似乎您unset XAUTHORITY 在user2下忘记了
套接字对

hexkeyxauth add命令一样从xauth list或做我必须创建一个随机的新的?
bonanza

富人:这是xauth列表的唯一输出。
John Eikenberry

1
执行此操作的另一种方法是类似“ ... xauth提取-$ DISPLAY | sudo -iu steam xauth合并-”。在这种情况下,我在.profile中设置了XAUTHORITY,因此'sudo -i'设置正确。
John Eikenberry'1

12

我把我.zshrc带线export XAUTHORITY=~/.Xauthority,现在我能够执行sudo -E xcommand。经过大量的谷歌搜索,对我来说这是最简单的方法。


1
请注意,此过程通常不需要您使用sudo -E(并且-E在大多数默认安装中已禁用using ),因为通常默认sudoers配置将允许将XAUTHORITY环境变量传递给sudo。
摊铺

@Guss 不需要 -E。可以将其设置为可以传递的变量,Red Hat或Debian都建议使用。
Daniel C. Sobral

@ DanielC.Sobral-我是这么说的:-)
Guss

@Guss哦,对不起。我以某种方式颠倒了你写的每句话。:-)
Daniel C. Sobral'5

仍然对我不起作用,在带有zsh的Mac OS X上
Sridhar Sarnobat

9

假设使用debian或ubuntu(在Red Hat / SUSE上应该类似)。

sudo apt-get install sux
sux user -c 'command'

+1好答案,毫无意义。顺便说一句,sux主要按照我上面的回答进行操作。当然,它更强大且更易于使用。
sleske

你可能注意到,该“sux的”确实是一个简单的 shell脚本,太..
马丁Mächler

5
sux无需维护(并已从Debian / Ubuntu的存储库中删除):packages.qa.debian.org/s/sux/news/20140101T172633Z.html
Rob W

9

第一:不要使用xhost +,这是很不安全的(空白允许/拒绝)。

而是使用X-Cookie机制:

su user2
cp /home/user1/.Xauthority /home/user2/.Xauthority 
export DISPLAY=:0

或者,如果您已sux安装,请使用它(请参阅Ehempel的答案)。

在这两种情况下,user2都将使用.Xauthority中的秘密cookie来授权X服务器,其他任何人都无法访问它。

笔记:

  • 根据您的文件权限,您可能必须以其他方式复制.Xauthority。
  • 除了复制外.Xauthority,您还可以使用xauth提取和复制授权密钥(请参阅Randall的答案)。如果.Xauthority文件中有多个键,则更具选择性。否则这是一个品味问题。

是的,我对该计算机具有root用户访问权限
Phil

这只是通过root访问手动复制xauth cookie。这与Randall在(当前)最高答案中解释的使用xauth没什么不同,只不过它复制了“ xauth列表”将显示的每个cookie。因此,这比仅添加您选择的cookie的顶级xauth答案安全性低。
John Eikenberry'1

@JohnEikenberry:是的,谢谢你指出这一点。我更新了答案。
sleske

7

这将为所有用户解决此问题:

cat <<EOF > /etc/profile.d/xauth.sh
#!/sbin/bash
export XAUTHORITY=~/.Xauthority
EOF

基本上这就是我所做的,效果很好,谢谢!
摊铺

3

作为根:

xhost local:yourusername

其中yourusername是您的用户名:)

然后执行su,因为您的用户 xclock应该已经安装了


2

这些只是黑客:

  • xauth +(不安全)
  • ssh -X user2 @ localhost(难看)

我认为上述sleske有适当的解决方案。


ssh -X这是一个非常简单且优雅的解决方案,不依赖于任何不推荐使用/未维护的gtk / kde东西(需要安装更多具有SUID位的二进制文件...)。
Stefan

2

我发现在KDE上最适合我的东西

kdesu -u username /path/to/program

在的debian部分上kde-cli-tools,而不是在其中$PATH/usr/lib/x86_64-linux-gnu/libexec/kf5/kdesu(显然取决于体系结构)。
Stefan

0

在suse / opensuse中采用这种方式:http ://www.novell.com/support/kb/doc.php? id= 7003743

只需修改/etc/pam.d/su,添加选项(粗体):

会话可选pam_xauth.so systemuser = 1

然后您可以在不带-的情况下使用su进行切换:

苏用户2

并以图形方式运行该应用程序。


-1

对于GNOME(实际上没有任何桌面环境,我仅将它与icewm一起使用)gksu

gksu -u username program


@Stefan注意到,这个Debian错误是关于以提升整个程序特权为前提的,这是个坏主意,而应该修改该程序以仅执行具有提升特权的最小帮助程序(使用PolicyKit)。这个问题(和我的回答)是关于减少特权的,这完全是另一回事,并且实际上是个好主意(例如,对于随机浏览,我有快捷方式可以在特权级别低于我的默认帐户下执行firefox,因此那里的任何攻击都可以'
不要

一切都很好,但是使用已弃用且未维护的SUID二进制文件是错误的。这个答案过去可能有用,但现在不再有用。
Stefan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.