🖥️ 第04章 · 权限与用户管理

chmod chown chgrp useradd passwd sudo su umask

权限与用户管理

这一章讲 Linux 的多用户与权限模型:谁能读、谁能写、谁能执行,以及怎么切用户、怎么提权、怎么加用户。对一台托管了多个 Web 应用、数据库、监控的服务器来说,权限混乱是最常见的踩坑来源。

先看权限长什么样

用 ls -l 看一个文件的完整信息,开头那 10 个字符就是权限位:

ls -l /var/www/bangdream/server.js
-rw-r--r--  1  root  root  0  Sep  8 12:00 server.js
└┬┘└┬┘└┬┘     │  │    │
 │  │  └─ 其他用户(other)权限
 │  └─ 所属组(group)权限
 └─ 属主(user)权限

权限位分三组,每组 3 个字符(rwx):属主 / 属组 / 其他。

字母 含义 数字
r 可读 read 4
w 可写 write 2
x 可执行 execute 1
- 无此权限 0

数字权限就是把这三组转成三个数字,r=4 w=2 x=1,一组内相加。例如 rw-r--r-- = 644,rwxr-xr-x = 755。

数字 权限含义 常见用途
600 仅属主可读写 私钥、配置文件
644 属主读写,他人只读 普通文件、网页
700 仅属主全权限 私有目录
755 属主全权限,他人只读执行 可执行程序、目录

提示 目录必须有 x 权限才能进入,只有 r 只能"看到文件名"但进不去。所以目录常用 755,文件常用 644。

修改权限 chmod

chmod 644 file.conf      # 直接指定数字权限
chmod u+x script.sh      # 给属主加执行权限(u+ x)
chmod +x script.sh       # 简写:本就可以执行的人全都加上 x
chmod -R 755 /var/www/   # 递归改整个目录树

注意 数字权限最直接但不够直观;u+x、g-w、o+r 这种字母写法更好读,也最不容易改错。-R 递归改目录时,可能把里面的敏感文件也一并改了权限,先确认。

在这台服务器上给一个脚本加执行权限(比如 cron 要跑 /root/scripts/tieba_sign.py 时,脚本必须可执行):

chmod +x /root/scripts/tieba_sign.py
ls -l /root/scripts/tieba_sign.py   # 确认变成 -rwxr-xr-x

修改属主与属组 chown、chgrp

chown 改属主与(可选)属组,chgrp 只改属组。

chown 用户:组 文件          # 改属主和属组
chown 用户 文件             # 只改属主
chown -R 用户:组 目录       # 递归改目录下所有
chgrp -R www-data 目录      # 只改属组

在这台服务器上,Web 应用(如 /var/www/bangdream)通常属主是 root,属组是 www-data(nginx 的工作用户),这样 nginx 才能读:

chown -R root:www-data /var/www/bangdream
chmod -R 755 /var/www/bangdream

警告 chown/chmod 改的是整个树时,务必确认路径正确,否则可能让某些目录失去保护。属主和属组设置错误,是 Web 应用报 "Permission denied" 的最常见原因。

查看与切换用户 who、id、su

whoami          # 当前有效用户
id              # 当前用户的 uid/gid 与所属组
users           # 当前已经登录的所有用户
w               # 谁在、在干嘛、从哪来
su - 用户名      # 切换到另一个用户(带 - 会加载对方的完整环境)
exit            # 退出切换

sudo 提权

sudo 允许有权限的用户以其他身份(通常是 root)执行单条命令,而不用切过去。

sudo systemctl restart nginx    # 以 root 身份重启 nginx
sudo -i                         # 进入 root 的交互 Shell(加载完整环境)
sudo -l                         # 查看自己被授权了哪些 sudo 命令
sudo -u mysql mysql             # 以 mysql 用户身份运行 mysql

/etc/sudoers 里决定了谁能 sudo 什么。Debian/Ubuntu 默认让 sudo 组里的用户拥有全部权限;但要注意对哪些应用用户开放权限。

警告 别滥用 sudo。能用普通用户完成的就别提权;把 sudo 权限开放给陌生用户等于把 root 交出去。sudo 命令本身有日志(/var/log/auth.log),错了可追踪。

新建用户与修改密码 useradd、passwd

useradd -m -s /bin/bash 用户名        # -m 建家目录,-s 指定 Shell
passwd 用户名                         # 设置/修改密码(会提示输入)
useradd -aG sudo 用户名               # 加入 sudo 组(可选,Ubuntu 用 -aG)

注意 只跑 useradd 不建家目录,新用户登录时进不了自己的家目录——务必加 -m。Ubuntu 24.04 默认不启用 root 直接登录,运维一般用普通用户 + sudo。

查看系统里有哪些用户:

cut -d: -f1 /etc/passwd | sort

默认权限掩码 umask

umask 决定新建文件/目录时默认去掉哪些权限。它是"从 666 或 777 里扣掉的值"。

umask          # 查看当前掩码(常见 0022)
umask 022      # 设置

掩码 022 时:

  • 新文件默认 666 - 022 = 644;
  • 新目录默认 777 - 022 = 755。

提示 掩码越高,创建的新文件越保守。非要让新文件默认就私有,可以用 umask 077(新文件变 600)。

实战:给应用目录设对权限

以这台服务器上托管 Node 应用的目录(属主属组应区分应用进程用户与 nginx 用户)为例:

# 指定应用属主与组
chown -R nodeapp:www-data /var/www/bangdream
# 目录 755 可进入,文件 644 可读
find /var/www/bangdream -type d -exec chmod 755 {} \;
find /var/www/bangdream -type f -exec chmod 644 {} \;

提示 "目录 755 + 文件 644"是 Web 权的黄金组合;若要应用能写入(如上传、日志),再单独给对应目录(如 uploads/、logs/)开 775 或设属主为进程用户。

易错点

  • 目录要有 x 才能进,r 不够。
  • chmod -R 和 chown -R 会递归改动整棵目录,先确认路径再执行。
  • 属主/属组错了,Web 应用报 permission denied,先 ls -l 看属主属组。
  • 新建用户记得 -m,否则没有家目录。

相关命令

chmod、chown、chgrp、umask、useradd、usermod、userdel、passwd、sudo、su、whoami、id、groups。