使用 .bashrc 保持 X11 转发

using .bashrc to keep X11 forwarding

当我切换到 root (sudo su) 时,我首先必须 运行 xauth list 作为我自己然后 xauth add <last entry from xauth list> 一旦我是 root。我通过 运行ning xauth add $(xauth -f ~<my username>/.Xauthority list|tail -1) 找到了一个很棒的小技巧,可以让这更容易。这很好,但我想将其自动化。

所以,我进入 /root/.bashrc 并添加了这个: xauth add $(xauth -f ~$SUDO_USER/.Xauthority list|tail -1)

不幸的是,这给出了错误 error in locking authority file ~<my user>/.Xauthority

如果我用我的用户名替换 $SUDO_USER 就可以了。显然 $SUDO_USER 设置正确,因为它知道要查找正确的权限文件。那么,这是怎么回事?

您可以在两个单独的连续语句中执行此操作以避免此锁定,示例:

xauthval=$(xauth -f ~YOUR_USER_NAME/.Xauthority list|tail -1)
(( $? == 0 )) && xauth add ${xauthval}

出于安全原因,您可能不想在生产系统上执行此操作。

~ expansion 在变量插值之前完成。如果你执行 strace,你会看到实际错误是 No such file or directory

openat(AT_FDCWD, "~<myuser>/.Xauthority-c", O_WRONLY|O_CREAT|O_EXCL, 0600) = -1 ENOENT (No such file or directory)
write(2, "xauth:  error in locking authori"..., 62xauth:  error in locking authority file ~<myuser>/.Xauthority

改用/home/$SUDO_USER/.Xauthority

真正的诀窍是使用eval获得第二轮扩张。

考虑:

#!/bin/bash

echo ~$SUDO_USER
eval echo ~$SUDO_USER

a="~$SUDO_USER"
eval b="~$SUDO_USER"

echo a = "$a"
echo b = "$b"

第一个 echo 表明您可以通过普通命令执行此操作,但我不建议这样做。

赋值可能是一种更安全的方法,因为您可以准确控制要计算两次的内容。

如果您想知道,我的示例执行如下:

$ env SUDO_USER=n1 ./sample_script
~n1
/home/n1
a = ~n1
b = /home/n1
$ env SUDO_USER=gnats ./sample_script
~gnats
/var/lib/gnats
a = ~gnats
b = /var/lib/gnats
$ 

如您所见,这也避免了假设所有主目录都在特定目录中。