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(高级场景)