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
被删除。sudo
sudo 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
通过删除文件来删除该访问权限。
总之:范围和生命周期。