1.8.3 权限与属性相关命令(chmod、chown、chgrp、umask)
权限与属性相关命令用于控制文件与目录的访问、归属与默认权限,是系统安全与协作的基础。
权限模型概览与原理草图
权限含义
- 权限位:读 r(4)、写 w(2)、执行 x(1)
- 目录权限:r 可列出、w 可创建/删除、x 可进入/访问
- 实际权限由属主/属组/其他三类对象决定
chmod:修改权限#
命令解释
- chmod 755 file:数字法,u=rwx,g=rx,o=rx
- chmod u+x,g-w,o=r file:符号法
- chmod -R 750 /data/app:递归设置目录及文件权限
完整示例(含预期效果)
# 1) 准备文件与目录
mkdir -p /tmp/perm_demo && cd /tmp/perm_demo
echo "hello" > app.sh
ls -l
# 预期: -rw-r--r-- 1 user user ...
# 2) 为脚本添加执行权限
chmod 755 app.sh
ls -l app.sh
# 预期: -rwxr-xr-x 1 user user ...
# 3) 仅允许属主访问(常见于敏感文件)
chmod 600 app.sh
ls -l app.sh
# 预期: -rw------- 1 user user ...
排错
- 运行脚本提示 Permission denied:
- 检查是否有执行位:ls -l app.sh
- 解决:chmod u+x app.sh
- 目录无法进入:
- 需要 x 权限:chmod u+x /path
练习
- 创建目录 secure_dir,设置仅属主可读写进入(700),验证其他用户无法访问。
- 给目录 shared 设置 750,并通过属组共享访问。
chown:修改属主#
命令解释
- chown user file:修改属主
- chown user:group file:修改属主与属组
- chown -R www:www /var/www:递归修改
完整示例
# 1) 创建示例文件
touch /tmp/perm_demo/index.html
ls -l /tmp/perm_demo/index.html
# 预期: -rw-r--r-- 1 user user ...
# 2) 修改属主与属组(需要 root)
sudo chown www:www /tmp/perm_demo/index.html
ls -l /tmp/perm_demo/index.html
# 预期: -rw-r--r-- 1 www www ...
排错
- Operation not permitted:
- 原因:非 root 用户修改属主
- 解决:使用 sudo 或具备 CAP_CHOWN 权限
练习
- 将 /tmp/perm_demo 目录下全部文件属主改为 www,属组改为 www,再验证权限是否满足 Web 服务读取。
chgrp:修改属组#
命令解释
- chgrp group file:只修改属组
- chgrp -R dev /opt/project:递归修改
完整示例
# 1) 创建示例文件
touch /tmp/perm_demo/dev.conf
# 2) 修改属组为 dev(需要 dev 组存在)
sudo chgrp dev /tmp/perm_demo/dev.conf
ls -l /tmp/perm_demo/dev.conf
# 预期: -rw-r--r-- 1 user dev ...
排错
- invalid group:
- 原因:组不存在
- 解决:sudo groupadd dev
练习
- 创建组 ops,将目录 /tmp/perm_demo 属组改为 ops,并设置组可写(g+w)。
umask:默认权限掩码#
命令解释
- umask:查看当前掩码
- umask 022:设置当前会话掩码
- 规则:实际权限 = 默认权限 - umask
- 文件默认 666,目录默认 777
- 例如 umask 022:文件 644,目录 755
完整示例
# 1) 查看当前 umask
umask
# 预期: 0022
# 2) 设置并验证
umask 027
touch /tmp/perm_demo/umask_file
mkdir -p /tmp/perm_demo/umask_dir
ls -l /tmp/perm_demo/umask_file /tmp/perm_demo/umask_dir
# 预期:
# -rw-r----- 1 user user ... umask_file
# drwxr-x--- 2 user user ... umask_dir
持久化配置
# /etc/profile 或 ~/.bashrc
umask 022
排错
- 新建文件权限过宽或过窄:
- 检查 umask 与应用自身权限设置
练习
- 将 umask 设置为 077,创建文件与目录,观察权限变化。
最佳实践与安全建议#
- 生产环境遵循最小权限原则
- 服务账号与业务目录分离,避免 root 直接操作
- 对共享目录使用组权限或 ACL(高级场景)