-
发生时间:2022-10-14
-
问题描述:
- 我本地电脑的 Ubuntu 系统下有个 along 用户,它具有 sudo 权限。
along:~$ cat /etc/group | grep along sudo:x:27:along along:x:1000:- 为研究 Linux 文件权限问题,我新建了 pat 用户。
along:~$ sudo adduser pat Adding user `pat' ... Adding new group `pat' (1001) ... Adding new user `pat' (1001) with group `pat' ... Creating home directory `/home/pat' ... Copying files from `/etc/skel' ... New password: Retype new password: passwd: password updated successfully Changing the user information for pat # 这里使用默认配置,为节省篇幅,省略后面的打印信息- 由于
/etc/skel配置了DIR_MODE=0750,所以其他用户(包括 along 用户)没有权限访问 pat 的 HOME 目录。
along:~$ ls -al /home total 16 drwxr-xr-x 1 root root 4096 Oct 17 06:55 . drwxr-xr-x 1 root root 4096 Oct 17 06:39 .. drwxr-xr-x 2 along along 4096 Oct 17 06:55 along drwxr-x--- 2 pat pat 4096 Oct 17 06:55 pat along:~$ ls -al /home/pat ls: cannot open directory '/home/pat': Permission denied- 接着我将 along 用户添加到 pat 群组。
along:~$ sudo adduser along pat Adding user `along' to group `pat' ... Adding user along to group pat Done. along:~$ cat /etc/group | grep pat pat:x:1001:along- 但发现 along 用户依然没有权限访问 pat 的 HOME 目录。此目录的权限是
0750,是允许同一群组的成员访问的。为什么 along 用户却无法访问?
along:~$ ls -al /home/pat ls: cannot open directory '/home/pat': Permission denied- 另外,我还注意到,如果使用
sudo -u along来查看 pat 的 HOME 目录,则可以成功。既然当前登录用户就是 along,敲不敲sudo -u along的效果应该一样啊?
along:~$ sudo -u along ls -al /home/pat total 20 drwxr-x--- 2 pat pat 4096 Oct 17 06:55 . drwxr-xr-x 1 root root 4096 Oct 17 06:55 .. -rw-r--r-- 1 pat pat 220 Oct 17 06:55 .bash_logout -rw-r--r-- 1 pat pat 3826 Oct 17 06:55 .bashrc -rw-r--r-- 1 pat pat 807 Oct 17 06:55 .profile -
问题类别:软件部署
-
原因分析:
- 为确认 along 用户确实已添加到 pat 群组了,我使用
groups命令再次进行检查。此时我发现不带用户名与带用户名的输出结果不一致。
along:~$ groups along along : along sudo pat along:~$ groups along sudo- 查看
groups命令的 manpage,有以下描述。也就是说,不带用户名时,groups 打印的是当前进程的群组信息;并且如果群组数据库(即/etc/group)被修改过,两者可能会不一致。
Print group memberships for each USERNAME or, if no USERNAME is specified, for the current process (which may differ if the groups database has changed).- 看样子是将 along 用户添加到 pat 群组的这个修改还没立即生效,不妨重新登录试试,发现果然如此。
# 重新登录后,群组权限会被重新加载,因此将 along 用户添加到 pat 群组终于生效了。 along:~$ sudo -iu along along:~$ ls -al /home/pat total 20 drwxr-x--- 2 pat pat 4096 Oct 17 06:55 . drwxr-xr-x 1 root root 4096 Oct 17 06:55 .. -rw-r--r-- 1 pat pat 220 Oct 17 06:55 .bash_logout -rw-r--r-- 1 pat pat 3826 Oct 17 06:55 .bashrc -rw-r--r-- 1 pat pat 807 Oct 17 06:55 .profile # 退出登录后,外层的 along 用户的群组权限还是旧的,因此还是无法访问 pat 的 HOME 目录。 along:~$ exit logout along:~$ ls -al /home/pat ls: cannot open directory '/home/pat': Permission denied- 后来又在 Stack Exchange 的一个回答 看到另一个方法:使用
newgrp命令。该命令会以另一个群组身份来重新登录。
along:~$ ls -al /home/pat ls: cannot open directory '/home/pat': Permission denied along:~$ newgrp pat along:~$ ls -al /home/pat total 20 drwxr-x--- 2 pat pat 4096 Oct 17 06:55 . drwxr-xr-x 1 root root 4096 Oct 17 06:55 .. -rw-r--r-- 1 pat pat 220 Oct 17 06:55 .bash_logout -rw-r--r-- 1 pat pat 3826 Oct 17 06:55 .bashrc -rw-r--r-- 1 pat pat 807 Oct 17 06:55 .profile- 至于上面执行
sudo -u along ls -al /home/pat可以成功,应该也是执行sudo -u along时会刷新群组信息给子进程导致的。
- 为确认 along 用户确实已添加到 pat 群组了,我使用
-
解决方案:
- 执行
adduser user group命令后,重新登录系统,或者执行newgrp group命令以刷新群组信息给当前进程。
- 执行
-
实施结果:
- along 用户具有访问 pat 用户的 HOME 目录的权限。
-
经验总结:
- 使用
adduser user group命令将用户添加到群组后,需要重新登录系统或者执行newgrp group命令,才能使配置生效。 - 之前安装 docker 并将 along 用户添加到 docker 群组后,执行
docker run报错Permission denied,其实也是同样的原因造成的。详见 docker 官方文档。
- 使用