使用 .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
$
如您所见,这也避免了假设所有主目录都在特定目录中。
当我切换到 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
$
如您所见,这也避免了假设所有主目录都在特定目录中。