🖥️ 第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。