sudo 在哪里隐藏我的 root 的 .Xauthority 数据?

sudo 在哪里隐藏我的 root 的 .Xauthority 数据?

sudo我刚刚注意到处理文件的方式有一些奇怪的地方.Xauthority

sudo xauth add $(xauth list | tail -1)

user@server: sudo xauth info
Authority file:       /root/.xauthYZ21Nt
File new:             no
File locked:          no
Number of entries:    1
Changes honored:      yes
Changes made:         no
Current input:        (argv):1

user@server:  sudo xauth info
Authority file:       /root/.xauth3BFy5d
File new:             no
File locked:          no
Number of entries:    1
Changes honored:      yes
Changes made:         no
Current input:        (argv):1

user@server:  sudo xauth list
server/unix:10  MIT-MAGIC-COOKIE-1  c922ab48defdf43b1092dffb86c06eed

user@server: sudo ls -la /root | grep auth
-rw-r--r--  1 root root    0 Nov  9 14:40 .Xauthority
-rw-------  1 root root   57 Nov  9 15:23 .xauthsrxzxl

user@server:  pkexec xauth info
Authority file:       /root/.Xauthority
File new:             no
File locked:          no
Number of entries:    0
Changes honored:      yes
Changes made:         no
Current input:        (argv):1

因此,$XAUTHORITY每个 new 的值都是不同的sudo,它指向一个临时文件,该文件在sudo 退出时消失。因此,最后一个命令(使用pkexec而不是sudo并期望它位于/root/.Xauthority)无法看到 cookie。例如,sudo gedit运行良好,但pkexec env DISPLAY=$DISPLAY gedit失败。

为什么要以如此复杂的方式完成,数据存储在哪里,更重要的是,我如何访问.Xauthority数据pkexec

答案1

当 X 服务器以-auth选项启动时,它会创建一个带有(密码)的文件MIT-MAGIC-COOKIE-1,并且只有知道该密码的用户才能在 X 窗口系统中显示其窗口。

可以有多个MIT-MAGIC-COOKIE-1(网络登录,ssh -X...),但我认为在你的情况下,如果你检查这些文件 - 它们将具有完全相同的内容(cmp /root/.xauth1 /root/.xauth2)。

但是,如果您启动不同的 X 服务器并使用sudo(或su),则新密码应该不同。

因此,不同文件的原因是因为sudo不知道其他实例使用哪个显示器,并且它获取所需的唯一密码(并创建新文件来存储它)。

答案2

xauth cookie 存储在该临时文件 ( ) 中,该文件在返回时(例如,当命令完成时)~/.xauthXXXX被删除。sudosudo xauth info

我建议你看一下源代码pam_xauth模块:

#define XAUTHTMP ".xauthXXXXXX"
...
int
pam_sm_open_session (pam_handle_t *pamh, int flags UNUSED,
                     int argc, const char **argv)
{
...

                /* Generate the environment variable
                 * "XAUTHORITY=<homedir>/filename". */
                if (asprintf(&xauthority, "%s=%s/%s",
                             XAUTHENV, tpwd->pw_dir, XAUTHTMP) < 0) {
...
                fd = mkstemp(xauthority + sizeof(XAUTHENV));
...
                cookiefile = strdup(xauthority + sizeof(XAUTHENV));

                /* Save the filename. */
                if (pam_set_data(pamh, DATANAME, cookiefile, cleanup) != PAM_SUCCESS) {
...
int
pam_sm_close_session (pam_handle_t *pamh, int flags UNUSED,
                      int argc, const char **argv)
{
...
        if (pam_get_data(pamh, DATANAME, &data) != PAM_SUCCESS)
                return PAM_SUCCESS;
        cookiefile = data;
...
        if (unlink(cookiefile) == -1 && errno != ENOENT)
          pam_syslog(pamh, LOG_WARNING, "Couldn't remove `%s': %m", cookiefile);

至于pkexec,我认为您不应该使用pkexec.这已经够糟糕了,你可以用它们来运行它们sudo;-)

答案3

现在一切似乎都清楚了,谢谢@user499944。简而言之:

  • 临时.xauthXXXXXX文件是由pam_xauth.

  • 它们仅在设置时才创建$DISPLAY,这是 的情况,sudo但不是 的情况pkexec。跑步pkexed env DISPLAY=$DISPLAY command一事无成,因为$DISPLAY只是设定认证完成。系统日志中显示了这一点:

# after pkexec env DISPLAY=$DISPLAY xauth info
Nov 11 18:01:41 server pkexec[11650]: pam_xauth(polkit-1:session): user has no DISPLAY, doing nothing
Nov 11 18:01:41 server pkexec[11650]: user: Executing command [USER=root] [TTY=/dev/pts/3] [CWD=/home/user] [COMMAND=/usr/bin/env DISPLAY=localhost:10.0 xauth info]

# after sudo xauth info
Nov 11 18:04:12 server sudo[11666]: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/usr/bin/xauth info
# no message from pam_xauth about missing DISPLAY

答案4

回答有关的部分为什么 pam_xauth将每个cookie存储在单独的文件中,有两个原因:

  • 仅允许访问一个显示器,而不是用户当前的所有显示器,并且
  • 允许在会话结束时sudo通过删除文件来删除该访问权限。

总之:范围和生命周期。

相关内容