Linux 新建报告不想默认公开:用 umask 在子 Shell 中收紧权限

2026-10-24 / 0 评论 / 4 阅读

Linux 新建报告不想默认公开:用 umask 在子 Shell 中收紧权限 教程示意图

适用场景

在多人使用的 Linux 主机上生成报告时,如果新文件默认允许其他用户读取,可能不符合资料管理要求。本文使用 Bash 和普通本地文件系统,在个人主目录中新建练习目录,演示如何让新文件默认只有本人可读写,新目录默认只有本人可进入。

练习不需要管理员权限,不修改全局登录配置,也不操作现有业务目录。先在没有默认访问控制列表的个人目录练习;如果使用共享目录、网络文件系统或容器挂载目录,应另行核对权限规则。

原理:掩码负责去掉权限

文件创建掩码 umask 表示创建对象时需要去掉哪些权限。它不是直接给文件设置最终权限,也不会自动修改已经存在的文件。常见程序创建普通文件时申请的基础权限为 666,创建目录时为 777;使用 077 掩码后,常见结果分别为 600 和 700。

这里的计算本质是按位清除,不能把所有情况都理解为十进制减法。程序如果主动申请更少权限,umask 不会替它补齐。例如普通文件原本没有执行权限,设置掩码也不会使它成为可执行程序。创建权限与继承规则

掩码属于进程状态。子进程通常继承父进程的掩码,但在子 Shell 中修改不会反向改变外层终端。这正适合只为一次报告生成任务收紧权限。Bash 的 umask 说明

准备工作

打开 Bash 终端,使用自己的普通用户。下面的 HOME 是系统已经提供的个人主目录变量;练习只读取它,不需要改写。目录名用于本次实验,里面只放无敏感内容的演示文件。

先查看当前掩码和主目录权限:

umask
ls -ld "$HOME"

记下掩码输出。它可能显示为四位八进制数,前导零属于正常表示形式。不要为了让结果与教程相同,先把整台系统的默认值改掉。

分步骤操作

第一步:新建独立练习目录

mkdir -m 700 "$HOME/umask-report-demo"

只有命令成功后才继续。这里没有使用允许复用现有目录的参数;如果提示目录已存在,应先检查内容,或改用新的练习目录名,并同步修改后续路径。不要直接把已有目录当作空白实验环境。

显式设置 700 的目的是限制练习目录入口,使其他普通用户无法直接进入。mkdir 的模式参数用于指定新建目录的权限。目录创建参数

第二步:在子 Shell 中生成报告

(
    umask 077
    cd "$HOME/umask-report-demo" || exit 1
    mkdir reports || exit 1
    printf '%s\n' '练习报告:磁盘巡检完成。' > reports/report.txt
    stat -c '%a %n' reports reports/report.txt
)

圆括号中的命令在子 Shell 环境执行。先设置掩码,再创建目录和文件,顺序不能颠倒。cd 后的失败处理保证进入目录失败时不会继续在错误位置创建文件。

在普通、没有默认访问控制列表的本地目录中,预期 reports 为 700,报告文件为 600。前者允许本人列出、进入和写入目录;后者允许本人读写文件,同组用户和其他用户没有对应权限。

第三步:确认外层终端保持原值

umask
ls -ld "$HOME/umask-report-demo/reports"
ls -l "$HOME/umask-report-demo/reports/report.txt"

外层掩码应与开始记录的值一致。权限列表中,目录应显示本人拥有读、写、执行权限,报告文件应显示本人拥有读写权限,其余普通权限位置为短横线。

第四步:确认旧文件不会被重新收紧

不要拿真实敏感文件做实验。理解这一边界即可:如果一个文件已经存在,单纯修改掩码后再次写入,通常不会重设它的原有权限。因此,生成正式报告时应区分新建输出与覆盖旧文件,不能认为加上一行掩码设置就解决了所有历史权限问题。

验证方法

验收包括目录为 700、文件为 600、外层掩码不变三个条件。权限数字说明当前普通模式位的状态,不能证明系统中所有访问路径都被隔离。

如果结果与预期不同,应停止放入真实资料,检查文件是否原本存在、程序是否在创建后主动改权限,以及父目录是否设置了默认访问控制列表。Linux 文档明确说明,默认访问控制列表可能改变创建权限的处理方式。

常见错误

把 077 理解为最终权限,会误以为文件应显示 077。实际上它描述需要屏蔽的权限。把掩码设在报告生成之后,也无法补救已经创建出来的宽松权限。

另一个误区是在某个终端设置掩码后,认为后台服务、其他终端和定时任务都同时改变了。它们有自己的进程环境,应在实际创建文件的任务中配置并验证。

安全与回退

本文使用子 Shell,执行结束后外层终端自动恢复原有环境。不要为了演示去编辑系统级配置文件。也不要将权限收紧等同于加密:管理员、备份系统和获得本人会话权限的程序仍可能访问资料。

清理时,确认练习文件没有被换成正式资料,再只删除已知对象:

rm -i "$HOME/umask-report-demo/reports/report.txt"
rmdir "$HOME/umask-report-demo/reports"
rmdir "$HOME/umask-report-demo"

删除文件时先阅读交互提示。目录非空导致删除失败时,应检查剩余内容,不要改用递归强制删除掩盖问题。

参考资料与转载说明

本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。

评论一下?

OωO
取消