Linux是一个多用户多任务操作系统,权限管理是保障系统安全的核心机制。通过合理的权限设置,可以控制用户对文件和目录的访问,保护系统安全。本章将深入讲解Linux的用户、组和权限管理。
Linux用户分类:
| 用户类型 | UID范围 | 说明 |
|---|---|---|
| 超级用户 | 0 | root用户,拥有最高权限 |
| 系统用户 | 1-999 | 系统服务用户,如www-data、mysql |
| 普通用户 | 1000+ | 普通用户,权限受限 |
东巴文观点:Linux通过UID(用户ID)识别用户,用户名只是为了方便人类记忆。
/etc/passwd - 用户信息文件:
# 查看用户信息
cat /etc/passwd
# 输出示例:
# root:x:0:0:root:/root:/bin/bash
# dbw:x:1000:1000:dbw,,,:/home/dbw:/bin/bash
# 格式说明:
# 用户名:密码占位符:UID:GID:描述:主目录:Shell
/etc/shadow - 用户密码文件:
# 查看密码信息(需要root权限)
sudo cat /etc/shadow
# 输出示例:
# root:$6$hash...:18500:0:99999:7:::
# dbw:$6$hash...:18500:0:99999:7:::
# 格式说明:
# 用户名:加密密码:最后修改日期:最小间隔:最大间隔:警告期:不活动期:过期日期:保留
东巴文提示:/etc/shadow文件权限为600,只有root可以读取,保护密码安全。
# 创建用户
sudo useradd username
# 创建用户并创建主目录
sudo useradd -m username
# 创建用户并指定Shell
sudo useradd -m -s /bin/bash username
# 创建用户并指定UID
sudo useradd -u 1500 username
# 创建用户并指定组
sudo useradd -g groupname username
# 创建用户并指定附加组
sudo useradd -G group1,group2 username
# 创建系统用户
sudo useradd -r -s /usr/sbin/nologin systemuser
# 创建用户并设置注释
sudo useradd -c "User Description" username
完整示例:
# 创建用户dbw
sudo useradd -m -s /bin/bash -G sudo,adm dbw
# 设置密码
sudo passwd dbw
东巴文最佳实践:创建用户时使用-m选项自动创建主目录。
# 修改用户名
sudo usermod -l newname oldname
# 修改用户主目录
sudo usermod -d /new/home -m username
# 修改用户Shell
sudo usermod -s /bin/zsh username
# 修改用户UID
sudo usermod -u 2000 username
# 修改用户主组
sudo usermod -g newgroup username
# 添加附加组
sudo usermod -aG groupname username
# 锁定用户
sudo usermod -L username
# 解锁用户
sudo usermod -U username
# 设置用户过期时间
sudo usermod -e 2024-12-31 username
东巴文提示:使用-aG添加附加组时,-a表示追加,不会覆盖原有组。
# 删除用户
sudo userdel username
# 删除用户及主目录
sudo userdel -r username
# 删除用户及所有相关文件
sudo userdel -r -f username
东巴文警告:删除用户前确保已备份重要数据。
# 修改当前用户密码
passwd
# 修改其他用户密码(需要root)
sudo passwd username
# 锁定用户密码
sudo passwd -l username
# 解锁用户密码
sudo passwd -u username
# 删除用户密码
sudo passwd -d username
# 查看密码状态
sudo passwd -S username
# 设置密码过期
sudo passwd -e username
# 设置密码最小天数
sudo passwd -n 7 username
# 设置密码最大天数
sudo passwd -x 90 username
# 设置警告天数
sudo passwd -w 7 username
Linux组分类:
| 组类型 | 说明 |
|---|---|
| 私有组 | 创建用户时自动创建的同名组 |
| 标准组 | 手动创建的组,可包含多个用户 |
| 系统组 | 系统服务使用的组 |
/etc/group - 组信息文件:
# 查看组信息
cat /etc/group
# 输出示例:
# root:x:0:
# sudo:x:27:dbw,tom
# dbw:x:1000:
# 格式说明:
# 组名:密码占位符:GID:组成员列表
/etc/gshadow - 组密码文件:
# 查看组密码信息(需要root权限)
sudo cat /etc/gshadow
# 格式说明:
# 组名:加密密码:组管理员:组成员
# 创建组
sudo groupadd groupname
# 创建组并指定GID
sudo groupadd -g 1500 groupname
# 创建系统组
sudo groupadd -r systemgroup
# 修改组名
sudo groupmod -n newname oldname
# 修改组GID
sudo groupmod -g 2000 groupname
# 删除组
sudo groupdel groupname
东巴文提示:不能删除用户的主组,必须先删除用户或修改用户主组。
# 添加用户到组
sudo gpasswd -a username groupname
# 从组中删除用户
sudo gpasswd -d username groupname
# 设置组管理员
sudo gpasswd -A admin groupname
# 设置组密码
sudo gpasswd groupname
# 删除组密码
sudo gpasswd -r groupname
# 查看用户信息
id
# 查看指定用户信息
id username
# 输出示例:
# uid=1000(dbw) gid=1000(dbw) groups=1000(dbw),27(sudo),100(users)
# 只显示UID
id -u
# 只显示GID
id -g
# 只显示组ID
id -G
# 只显示用户名
id -un
# 显示当前用户名
whoami
# 显示当前登录用户
who
# 输出示例:
# dbw tty1 2024-01-01 10:00
# dbw pts/0 2024-01-01 10:05 (192.168.1.100)
# 显示详细信息
who -a
# 显示登录用户及活动
w
# 输出示例:
# 10:00:00 up 1 day, 2:00, 2 users, load average: 0.00, 0.01, 0.05
# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
# dbw tty1 - 10:00 1:00 0.10s 0.10s -bash
# dbw pts/0 192.168.1.100 10:05 0.00s 0.20s 0.05s w
# 显示登录历史
last
# 输出示例:
# dbw pts/0 192.168.1.100 Mon Jan 1 10:00 still logged in
# reboot system boot 5.4.0-42-generic Mon Jan 1 09:00 still running
# 显示指定用户登录历史
last dbw
# 显示重启历史
last reboot
# 显示失败登录
lastb
# 显示当前用户所属组
groups
# 显示指定用户所属组
groups username
Linux文件权限分为三类:
| 权限 | 文件 | 目录 | 数字表示 |
|---|---|---|---|
| 读(r) | 查看文件内容 | 列出目录内容 | 4 |
| 写(w) | 修改文件内容 | 创建/删除文件 | 2 |
| 执行(x) | 执行文件 | 进入目录 | 1 |
东巴文理解:
Linux权限针对三类对象:
| 对象 | 说明 | 符号 |
|---|---|---|
| 所有者(user) | 文件的所有者 | u |
| 组(group) | 文件所属组的成员 | g |
| 其他用户(other) | 其他所有用户 | o |
| 所有人(all) | 所有用户 | a |
查看权限:
ls -l file.txt
# 输出示例:
# -rwxr-xr-- 1 dbw dbw 123 Jan 1 10:00 file.txt
# 权限解析:
# - 文件类型(-普通文件,d目录,l链接)
# rwx 所有者权限(读写执行)
# r-x 组权限(读执行)
# r-- 其他用户权限(只读)
权限符号:
-rwxr-xr--
│└┬┘└┬┘└┬┘
│ │ │ └─ 其他用户权限(r-- = 4)
│ │ └──── 组权限(r-x = 5)
│ └─────── 所有者权限(rwx = 7)
└───────── 文件类型(-)
权限数字计算:
| 权限 | 二进制 | 八进制 | 说明 |
|---|---|---|---|
| --- | 000 | 0 | 无权限 |
| --x | 001 | 1 | 只有执行 |
| -w- | 010 | 2 | 只有写 |
| -wx | 011 | 3 | 写和执行 |
| r-- | 100 | 4 | 只有读 |
| r-x | 101 | 5 | 读和执行 |
| rw- | 110 | 6 | 读和写 |
| rwx | 111 | 7 | 读写执行 |
常用权限组合:
| 权限 | 数字 | 说明 |
|---|---|---|
| -rw------- | 600 | 只有所有者可读写 |
| -rw-r--r-- | 644 | 所有者读写,其他用户只读 |
| -rwx------ | 700 | 只有所有者可读写执行 |
| -rwxr-xr-x | 755 | 所有者读写执行,其他用户读执行 |
| -rwxrwxrwx | 777 | 所有人可读写执行(不安全) |
东巴文最佳实践:
基本语法:
chmod [ugoa][+-=][rwx] 文件
参数说明:
| 参数 | 说明 |
|---|---|
| u | 所有者(user) |
| g | 组(group) |
| o | 其他用户(other) |
| a | 所有人(all) |
| + | 添加权限 |
| - | 移除权限 |
| = | 设置权限 |
示例:
# 给所有者添加执行权限
chmod u+x script.sh
# 给组添加写权限
chmod g+w file.txt
# 给其他用户移除读权限
chmod o-r file.txt
# 给所有人添加执行权限
chmod a+x script.sh
# 设置所有者读写执行,组读执行,其他用户只读
chmod u=rwx,g=rx,o=r file.txt
# 同时设置多个权限
chmod u=rwx,go=rx file.txt
# 参考其他文件设置权限
chmod --reference=file1.txt file2.txt
基本语法:
chmod 数字 文件
示例:
# 设置权限为755
chmod 755 script.sh
# 设置权限为644
chmod 644 file.txt
# 设置权限为600
chmod 600 private.txt
# 设置权限为700
chmod 700 dir/
# 设置权限为777(不推荐)
chmod 777 public/
# 递归修改目录及其子目录
chmod -R 755 /var/www/html/
# 递归修改所有目录为755
find /var/www/html -type d -exec chmod 755 {} \;
# 递归修改所有文件为644
find /var/www/html -type f -exec chmod 644 {} \;
东巴文技巧:使用find命令分别设置目录和文件权限,更安全。
# 显示修改过程
chmod -v 755 file.txt
# 只显示修改过的文件
chmod -c 755 file.txt
# 修改所有者
sudo chown user file.txt
# 修改所有者和组
sudo chown user:group file.txt
# 只修改组
sudo chown :group file.txt
# 递归修改
sudo chown -R user:group dir/
# 显示修改过程
sudo chown -v user file.txt
# 参考其他文件
sudo chown --reference=file1.txt file2.txt
# 修改网站目录所有者
sudo chown -R www-data:www-data /var/www/html/
# 修改用户主目录所有者
sudo chown -R dbw:dbw /home/dbw/
# 修改文件所有者为当前用户
sudo chown $USER:$USER file.txt
东巴文提示:修改所有者需要root权限。
# 修改组
sudo chgrp group file.txt
# 递归修改
sudo chgrp -R group dir/
# 显示修改过程
sudo chgrp -v group file.txt
# 参考其他文件
sudo chgrp --reference=file1.txt file2.txt
umask:设置创建文件时的默认权限掩码。
计算方法:
常用umask值:
| umask | 文件权限 | 目录权限 | 说明 |
|---|---|---|---|
| 000 | 666 (rw-rw-rw-) | 777 (rwxrwxrwx) | 无限制 |
| 022 | 644 (rw-r--r--) | 755 (rwxr-xr-x) | 默认值 |
| 027 | 640 (rw-r-----) | 750 (rwxr-x---) | 更安全 |
| 077 | 600 (rw-------) | 700 (rwx------) | 最安全 |
# 查看当前umask
umask
# 输出示例:
# 0022
# 设置umask
umask 027
# 创建文件测试
touch file.txt
ls -l file.txt
# 输出:-rw-r----- 1 dbw dbw ... file.txt
# 创建目录测试
mkdir dir1
ls -ld dir1
# 输出:drwxr-x--- 2 dbw dbw ... dir1
编辑配置文件:
# 编辑~/.bashrc
echo "umask 027" >> ~/.bashrc
# 或编辑/etc/profile(全局设置)
echo "umask 027" | sudo tee -a /etc/profile
# 使配置生效
source ~/.bashrc
东巴文最佳实践:服务器环境建议设置umask为027或077,提高安全性。
SUID(Set User ID):执行时以文件所有者身份运行。
特点:
rws东巴文比喻:SUID就像临时身份证,执行程序时暂时获得文件所有者的身份。
# 设置SUID
chmod u+s /usr/bin/passwd
# 数字方式设置SUID(4表示SUID)
chmod 4755 /usr/bin/passwd
# 查看SUID
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root ... /usr/bin/passwd
# ↑ s表示SUID
# 移除SUID
chmod u-s /usr/bin/passwd
passwd命令:
# 查看passwd命令权限
ls -l /usr/bin/passwd
# 输出:-rwsr-xr-x 1 root root ... /usr/bin/passwd
# 普通用户修改密码
passwd
# passwd命令以root身份运行,可以修改/etc/shadow
东巴文提示:SUID权限有安全风险,谨慎使用。
# 查找所有SUID文件
find / -perm -4000 2>/dev/null
# 查找所有SUID文件(详细)
find / -perm -4000 -exec ls -ld {} \; 2>/dev/null
SGID(Set Group ID):
特点:
rws(文件)或rws(目录)# 设置SGID(文件)
chmod g+s /usr/bin/wall
# 设置SGID(目录)
chmod g+s /shared/
# 数字方式设置SGID(2表示SGID)
chmod 2755 /shared/
# 查看SGID
ls -ld /shared/
# 输出:drwxrwsr-x 2 root dbw ... /shared/
# ↑ s表示SGID
# 移除SGID
chmod g-s /shared/
共享目录:
# 创建共享目录
sudo mkdir /shared
# 设置组
sudo chgrp dbw /shared
# 设置SGID
sudo chmod 2775 /shared
# 在共享目录创建文件
cd /shared
touch file.txt
# 查看文件组
ls -l file.txt
# 输出:-rw-r--r-- 1 dbw dbw ... file.txt
# ↑ 组为dbw,继承自目录
东巴文应用:SGID常用于共享目录,确保新建文件继承目录的组。
粘滞位(Sticky Bit):目录中的文件只能由所有者删除。
特点:
rwt东巴文比喻:粘滞位就像公共公告栏,所有人可以张贴,但只能撕下自己的。
# 设置粘滞位
chmod +t /tmp/
# 数字方式设置粘滞位(1表示粘滞位)
chmod 1777 /tmp/
# 查看粘滞位
ls -ld /tmp/
# 输出:drwxrwxrwt 15 root root ... /tmp/
# ↑ t表示粘滞位
# 移除粘滞位
chmod -t /tmp/
/tmp目录:
# 查看/tmp目录权限
ls -ld /tmp/
# 输出:drwxrwxrwt 15 root root ... /tmp/
# 用户dbw创建文件
touch /tmp/dbw_file.txt
# 用户tom尝试删除
rm /tmp/dbw_file.txt
# 输出:rm: cannot remove '/tmp/dbw_file.txt': Operation not permitted
东巴文提示:粘滞位常用于公共目录,如/tmp,防止用户互相删除文件。
特殊权限数字:
| 特殊权限 | 数字 | 说明 |
|---|---|---|
| SUID | 4 | 执行时以所有者身份运行 |
| SGID | 2 | 执行时以组身份运行/继承组 |
| 粘滞位 | 1 | 只能删除自己的文件 |
组合示例:
# SUID + 755
chmod 4755 /usr/bin/passwd
# SGID + 755
chmod 2755 /shared/
# 粘滞位 + 777
chmod 1777 /tmp/
# SUID + SGID + 755
chmod 6755 /usr/bin/someprogram
# 查找SUID文件
find / -perm -4000 2>/dev/null
# 查找SGID文件
find / -perm -2000 2>/dev/null
# 查找粘滞位目录
find / -perm -1000 2>/dev/null
# 查找所有特殊权限文件
find / -perm -7000 2>/dev/null
ACL(Access Control List):访问控制列表,提供更细粒度的权限控制。
特点:
东巴文观点:传统权限只能设置所有者、组、其他用户三类,ACL可以为任意用户设置权限。
# 查看文件系统是否支持ACL
tune2fs -l /dev/sda1 | grep "Filesystem features"
# 或查看挂载选项
mount | grep acl
# 临时启用ACL
sudo mount -o remount,acl /
# 永久启用ACL(编辑fstab)
sudo vim /etc/fstab
# 添加acl选项
# /dev/sda1 / ext4 defaults,acl 0 1
# 查看文件ACL
getfacl file.txt
# 输出示例:
# # file: file.txt
# # owner: dbw
# # group: dbw
# user::rw-
# user:tom:r-- # 用户tom有读权限
# group::r--
# mask::rw-
# other::r--
# 查看目录ACL
getfacl dir/
# 递归查看
getfacl -R dir/
# 给用户添加读写权限
setfacl -m u:tom:rw file.txt
# 给用户添加执行权限
setfacl -m u:tom:x script.sh
# 给用户移除权限
setfacl -x u:tom file.txt
# 给用户设置完整权限
setfacl -m u:tom:rwx file.txt
# 给组添加读写权限
setfacl -m g:developers:rw file.txt
# 给组添加执行权限
setfacl -m g:developers:rx dir/
# 移除组权限
setfacl -x g:developers file.txt
# 设置目录默认ACL
setfacl -d -m u:tom:rwx dir/
# 查看默认ACL
getfacl dir/
# 输出示例:
# # file: dir/
# # owner: dbw
# # group: dbw
# user::rwx
# group::r-x
# other::r-x
# default:user::rwx
# default:user:tom:rwx # 默认ACL
# default:group::r-x
# default:other::r-x
# 递归设置ACL
setfacl -R -m u:tom:rw dir/
# 递归移除ACL
setfacl -R -x u:tom dir/
# 备份ACL
getfacl -R dir/ > acl_backup.txt
# 恢复ACL
setfacl --restore=acl_backup.txt
东巴文最佳实践:ACL提供了更灵活的权限控制,但会增加管理复杂度,建议在必要时使用。
# 切换到root用户
su
# 切换到指定用户
su username
# 切换用户并加载环境变量
su - username
# 以指定用户执行命令
su -c "command" username
# 切换到root并执行命令
su -c "apt update"
su:切换用户,但不切换环境变量
su dbw
pwd # 仍然在原目录
echo $PATH # 使用原用户的PATH
su -:切换用户,并切换环境变量
su - dbw
pwd # 切换到用户主目录
echo $PATH # 使用新用户的PATH
东巴文提示:su -更彻底,推荐使用。
sudo:以超级用户或其他用户身份执行命令。
特点:
# 以root身份执行命令
sudo command
# 以指定用户身份执行命令
sudo -u username command
# 以root身份启动Shell
sudo -i
# 以root身份执行命令并保持环境变量
sudo -E command
# 查看sudo权限
sudo -l
# 编辑文件
sudo vim /etc/hosts
# 后台执行
sudo -b command
编辑sudoers文件:
# 使用visudo编辑(推荐)
sudo visudo
# 或直接编辑
sudo vim /etc/sudoers
sudoers文件格式:
用户 主机=(运行身份) 命令
示例:
# 允许用户dbw执行所有命令
dbw ALL=(ALL) ALL
# 允许用户dbw无密码执行所有命令
dbw ALL=(ALL) NOPASSWD: ALL
# 允许用户dbw只执行apt命令
dbw ALL=(ALL) /usr/bin/apt
# 允许用户dbw执行多个命令
dbw ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl
# 允许组sudo执行所有命令
%sudo ALL=(ALL) ALL
# 允许用户dbw以www-data身份执行命令
dbw ALL=(www-data) ALL
东巴文警告:编辑sudoers文件要小心,语法错误可能导致无法使用sudo。
查看sudo日志:
# Ubuntu/Debian
sudo cat /var/log/auth.log | grep sudo
# CentOS/RHEL
sudo cat /var/log/secure | grep sudo
| 特性 | sudo | su |
|---|---|---|
| 密码 | 当前用户密码 | 目标用户密码 |
| 权限控制 | 精确 | 全部或无 |
| 日志记录 | 有 | 无 |
| 安全性 | 高 | 低 |
| 适用场景 | 日常管理 | 完全切换用户 |
东巴文最佳实践:推荐使用sudo,安全性更高。
✅ 理解用户和组的概念 ✅ 掌握用户和组管理命令 ✅ 熟练使用chmod、chown、chgrp ✅ 理解SUID、SGID、粘滞位 ✅ 学会使用sudo和su
完成本章学习后,请确认您能够:
东巴文(db-w.cn) - 让Linux学习更简单