Linux 文件权限与 sudo:读取 rwx、练习 chmod 并排查访问错误

Linux 文件权限分别规定所有者、所属组和其他用户能否读取(r)、写入(w)或执行(x)文件。sudo 让获授权用户以另一用户的身份运行指定命令,目标通常是管理员。访问失败时,应先查看所有权与权限,仅为确有需要的操作使用提升后的权限。

开头查询的 notes.txt 会在后面的新练习目录中创建。请先完成“用 chmod 修改练习文件权限”中的准备步骤,再回到开头检查所有者、组和模式。账户背景可参阅Linux 用户、组与文件所有权。

先确认当前身份与文件所有者

权限不是孤立地附在文件上的一个数字。当前进程的用户和组、目标文件的所有者与组,以及沿途目录的权限共同影响访问。先用 id 查看当前身份,再用 ls -l 和 GNU stat 读取目标属性。

id
ls -l notes.txt
stat -c '%A %a %U %G %n' notes.txt

例如 -rw-r----- 1 learner editors ... notes.txt 中,开头的 - 表示普通文件,后三组 rw-、r--、--- 分别对应所有者、所属组和其他用户。名称只是示例,实际以本机结果为准。stat 的 %a 显示 640 等八进制模式。

r、w、x 对文件和目录的含义不同

同一字母在普通文件与目录上允许的操作不同。理解这种区别,才能解释为什么文件本身可读,仍可能无法通过路径打开它。

权限 普通文件 目录
r 读取内容 读取目录中的名称列表
w 修改内容 创建、删除或改名目录项所需的权限之一
x 允许执行可执行文件 按已知名称搜索、通过目录访问条目

打开文件需要对路径中各目录具有搜索/通过权限 x。删除文件通常取决于父目录的 w 与 x,而不是文件自身是否可写。粘滞位、访问控制列表(ACL)、文件系统属性及 SELinux 等策略还可能进一步限制结果。对脚本增加 x 也不自动保证解释器、文件格式或挂载条件满足执行要求。

用 chmod 修改练习文件权限

以下在主目录中新建练习目录和文件。若目录已存在,请换名并调整路径。逐条执行,mkdir 或 cd 失败就停止。printf 会写入当前目录中的 notes.txt,必须先确认当前目录正确且没有同名旧文件。

mkdir ~/linux-course-17-practice
cd ~/linux-course-17-practice
printf 'private notes\n' > notes.txt
ls -l notes.txt
chmod u=rw,g=r,o= notes.txt
stat -c '%A %a %n' notes.txt

u 代表所有者,g 代表所属组,o 代表其他用户。对这个普通练习文件,= 把各类权限设为给定值。常见 Linux 与 GNU stat 环境中的最后一行应类似 -rw-r----- 640 notes.txt;实际哪些用户可读,仍取决于身份、组和沿途目录。

数字模式把每类的 r=4、w=2、x=1 相加,所以 640 对应 rw-、r--、---。下面改成 600,仅保留所有者读写,并立即检查结果:

chmod 600 notes.txt
stat -c '%A %a %n' notes.txt

预期数字变为 600,文字模式为 -rw-------。要回到前一步,可对同一练习文件重新执行 chmod u=rw,g=r,o= notes.txt 并检查是否为 640。若结果不符,先确认文件、命令状态与文件系统是否支持预期模式,不要把命令无报错等同于预期权限已生效。

相比之下,chmod g+r notes.txt 仅在现有模式上增加组读取权限,chmod o-rwx notes.txt 则移除其他用户的三种权限。应明确选择是替换某类权限(=),还是增减指定权限位(+、-)。

单独检查目录权限

私人目录可使用 700,仅允许所有者列出、通过和修改条目。只在刚建立的练习目录内执行;若 private 已存在,先换名,创建失败就停止:

mkdir private
chmod 700 private
ls -ld private
stat -c '%A %a %n' private

常见结果是 drwx------ 700 private。ls -ld 的 -d 要求显示目录本身,而不是内部列表。误删目录的 x 可能使所有者也无法通过路径访问其文件。不要随意用 chmod -R 给整棵目录树应用同一数字:普通文件与目录对 x 的需求不同。

何时以及怎样使用 sudo?

sudo 根据当前账户获准的安全策略,以另一用户身份运行命令。并非所有账户都有管理员权限,具体授权由系统策略决定。以下 sudo -l 查询当前账户获准的操作,可能要求认证;无授权时,拒绝消息也是需要正确理解的结果。

sudo -l

仅在具体命令需要时使用 sudo command。遇到其他用户文件不可读,应先确认工作所需的访问范围,不能一开始就任意放宽权限。sudo 本身不会永久改变目标文件所有者,但经提升权限的命令创建的文件可能由管理员拥有,应检查它写入的位置及结果。

输出重定向可在 sudo 启动前由当前 Shell 处理,因此 sudo echo ... > protected-file 可能在打开目标文件时就失败。编辑配置时可评估符合授权策略的 sudoedit,而不是机械拼接带特权的重定向。sudo 策略应通过提供语法检查的 visudo 编辑,避免直接修改错误而失去管理访问。仍须事先确认具体系统政策与编辑范围。

按什么顺序诊断权限错误?

  1. 用 id 查看当前会话身份和组。最近调整过组成员关系时,确认本次登录是否已获得新组列表。
  2. 用 ls -l 或 stat 查看目标所有者与模式;目录本身用 ls -ld。
  3. 检查每级父目录的通过权限。安装了 util-linux namei 的系统,可用 namei -l path 逐项查看路径;将 path 换成实际目标路径。
  4. 基本模式无法解释时,再检查 ACL、SELinux、只读挂载和粘滞位等限制。不要以 chmod 777 作为首个解决办法。
  5. 明确所需访问范围后,应用最小必要变更,再以真正需要访问的用户身份验证。

练习结束后,先用 pwd 确认当前位置。若不再需要练习资料,可稍后确认内容后再清理;不要把生产数据或他人的文件作为本课 chmod 的目标。

官方参考

模式表示与修改见 man7 托管的上游 GNU chmod(1) 和 stat(1)。路径检查规则见 path_resolution(7),路径查询工具见 util-linux 的 namei(1);授权、命令执行和编辑规则见 sudo(8) 与 sudoers(5)。