当我切换到根用户(sudo su)时,我必须首先以我自己的身份运行xauth list,然后在我是根用户后运行xauth add <last entry from xauth list>。我找到了一个很好的小技巧,可以通过运行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的设置是正确的,因为它知道要查找正确的授权文件。那么,这是怎么回事?
发布于 2019-09-13 02:24:46
~ 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
发布于 2021-07-04 20:55:16
真正的诀窍是使用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
$ 如您所见,这也避免了假设所有的主目录都在一个特定的目录中。
发布于 2019-09-13 01:05:09
您可以在两个单独的连续语句中完成此操作,以避免此锁定,例如:
xauthval=$(xauth -f ~YOUR_USER_NAME/.Xauthority list|tail -1)
(( $? == 0 )) && xauth add ${xauthval}出于安全原因,您可能不希望在生产系统上执行此操作。
https://stackoverflow.com/questions/57910169
复制相似问题