5.1 使用者与群组

Linux 多用户多任务环境下,文件权限针对三种身份:

身份含义对应角色
Owner(拥有者)文件的创建者每个人的私人房间
Group(群组)同群组的帐号全家人共用的客厅
Others(其他人)以上都不是陌生人,没门进不来

💡 鸟哥用”王家三兄弟”的比喻最传神:三毛房间的抽屉(Owner)只有自己能翻,客厅的电视(Group)三兄弟都能看,邻居张小猪(Others)连门都进不了——除非三毛亲自开门让他进来。root 是万能的天神,无视一切权限。

三个核心文件记录了用户与群组信息(第十三章详讲):

文件内容
/etc/passwd所有帐号信息
/etc/shadow密码
/etc/group所有群组名

每个帐号可以同时属于多个群组——这是团队协作的关键设计。

5.2 Linux 文件权限概念

5.2.1 ls -al 输出解读(本章最重要的技能)

[root@study ~]# ls -al
-rw-r--r--.  1  root  root  1864  May  4 18:01  initial-setup-ks.cfg
drwx------.  3  root  root    24  May  4 17:59  .dbus
[--1--] [2] [ 3 ] [ 4 ] [ 5 ] [     6     ] [      7       ]

七个字段:

栏位名称说明
1权限10 个字符(本章核心)
2链接数有多少文件名链接到此 i-node
3拥有者文件所属的用户
4群组文件所属的群组
5文件大小单位 Bytes
6修改日期太久远只显示年份;ls -l --full-time 看完整时间
7文件名. 开头 = 隐藏文件

第一栏的 10 个字符拆解

 -   rwx   rwx   rwx
[类型] [Owner][Group][Others]

第一个字符 = 文件类型

字符类型说明
-正规文件文本、二进制、数据文件
d目录directory
l链接文件link,类似 Windows 快捷方式
b区块设备block device,如硬盘(可随机存取)
c字符设备char device,如键盘/鼠标(一次性读取)
ssocket网络数据接口
pFIFO管道,解决多进程同时存取同一文件的错误

后 9 个字符 = rwx 三组,位置永不改变:

字符含义数值
rread 可读4
wwrite 可写2
xexecute 可执行1
-无此权限0

💡 -rwxr-xr-- = 拥有者 rwx(7) + 群组 r-x(5) + 其他人 r—(4) = 754。数字权限在这一刻就已经可以心算了。

5.2.2 改变文件属性与权限

三个命令(均支持 -R 递归):

命令全称作用
chgrpchange group改群组(组名必须存在于 /etc/group
chownchange owner改拥有者(用户名必须在 /etc/passwd 中)
chmodchange mode改权限

chmod 两种方式

数字法(最常用):

chmod 755 script.sh    # rwxr-xr-x → 拥有者全权,其他人只读执行
chmod 644 file.txt     # rw-r--r-- → 拥有者可写,其他人只读
chmod 740 secret.txt   # rwxr----- → 只有拥有者和群组碰得到

符号法(不知道原权限时好用):

chmod u=rwx,go=rx file    # 设置:拥有者全权,群组和他人读+执行
chmod a+x script           # 追加:所有人加执行权(a=all,+=加,-=去)
chmod a-x file             # 去除:拿掉所有人的执行权
chmod g+w,o-r file         # 组合:群组加写,他人去读
  • u=user, g=group, o=others, a=all
  • +=加入, -=去除, ==设置为
  • chown root:root file = 同时改拥有者和群组(用冒号,别用点,有些用户名含点会导致歧义)

5.2.3 目录与文件的权限意义(最核心的区分)

文件和目录的 rwx 完全不同——这是新手最容易混淆的地方:

对文件而言:rwx 针对”文件的内容

权限含义
r可以读文件的实际内容(如 cat 看文本)
w可以编辑/新增/修改文件内容(不能删除文件本身!
x可以被系统执行(Linux 不以扩展名判断能否执行,就看 x)

对目录而言:rwx 针对”目录里的文件名列表”(这个抽屉里放了什么文件)

权限含义比喻
r可以 ls 列出文件名抽屉里装了灯,能看到有哪些文件夹
w可以新增/删除/重命名/移动文件(不管文件本身权限!可以放东西进抽屉、丢掉抽屉里的东西
x可以 cd 进入这个目录(工作目录)抽屉的钥匙!

💡 这是本章最重要的表格:目录的 w 权限意味着”我能丢掉这个抽屉里的任何文件”——即使那个文件属于 root 且权限是 700,只要它在你的目录里,你就能删掉它!因为删除改的是目录列表,不是文件内容。

权限需求速查表(以用户 dmtsai 对 /dir1/file1 的操作为例):

操作需要 /dir1 的权限需要 file1 的权限
读 file1x(能进门)r(能读内容)
改 file1xrw
执行 file1xrx
删除 file1wx(能进门+能改动抽屉)不需要!
复制 file1 到 /dir2x(/dir1)r(源文件) + wx(目标目录/dir2)

注意:只需要 x 即可进入目录并读取文件——目录的 r 不是必须的(没灯也可以摸黑拿文件,只是 Tab 自动补全会失效)。

网站架设常见错误:给目录只设了 r--(比如 744),结果服务器进程进不了目录(没 x),用户看到的全是”Permission Denied”。正确做法:开放浏览 = rx 至少要给,w 绝不能随便给。

5.2.4 Linux 文件种类与扩展名

  • Linux 没有”扩展名”概念——文件能不能执行只取决于权限里的 x,跟 .exe/.bat 没关系
  • 但使用扩展名是约定俗成的习惯(*.sh 脚本、*.tar.gz 压缩包、*.html 网页),方便人识别
  • x 权限 ≠ 文件确实可运行:给纯文本文件加 x 也不能执行,只是拥有了”可执行的资格”
  • 网络下载的可执行文件传到 Linux 后 x 可能丢失 → chmod a+x 补回来

文件名限制:最长 255 个英文字符或 128 个中文字符;避免用 * ? > < ; & ! [ ] | \ ' " \ ( ) { }这些字符;**文件名开头不要是-+`**(会被当成指令选项)。

5.3 Linux 目录配置

5.3.1 FHS 标准

Filesystem Hierarchy Standard —— 让所有 Linux distribution 的目录结构保持统一。将目录按两个维度分类:

可分享(shareable)不可分享(unshareable)
不变的(static)/usr(软件)、/opt(第三方)/etc(配置)、/boot(内核)
可变的(variable)/var/mail/var/spool/var/run/var/lock

FHS 只定义三层目录,但这是整个文件系统的骨架

第一层:/(根目录)——与开机有关

目录用途重要性
/bin单人维护模式下也能用的基础指令(cat, chmod, cp, bash…)→ CentOS 7 已链接到 /usr/bin⭐⭐⭐
/boot内核文件(vmlinuz)和 grub2 开机菜单⭐⭐⭐
/dev所有设备文件(/dev/sda, /dev/tty, /dev/null…)⭐⭐⭐
/etc几乎所有系统配置文件(/etc/passwd, /etc/fstab, /etc/issue…)⭐⭐⭐
/lib开机时会用到的函数库 → CentOS 7 已链接到 /usr/lib⭐⭐
/media可移除设备挂载点(光盘、U 盘)
/mnt临时挂载点
/opt第三方协力软件(KDE 等)
/run开机后产生的运行时数据(用内存仿真,不占磁盘)
/sbinroot 才能用的系统管理指令(fdisk, fsck, ifconfig…)→ CentOS 7 已链接到 /usr/sbin⭐⭐
/srv网络服务的数据目录
/tmp任何人都能存取的临时目录(FHS 建议开机时清空)⭐⭐

建议存在的目录/home(用户主文件夹,~)、/root(管理员主文件夹,放在根目录下是因为单人维护模式只挂 / 时需要能访问)、/lost+found(ext 文件系统修复后存放碎片,xfs 没有)。

虚拟文件系统(不占硬盘)/proc(进程/内核/硬件状态,如 /proc/cpuinfo)、/sys(内核与硬件的更底层信息)

“五大目录”的历史变迁:早期救援模式只挂载 /,所以 /etc + /bin + /dev + /lib + /sbin 必须跟 / 放一起。到 CentOS 7,/bin/sbin/lib/lib64 全部通通移进 /usr 然后用符号链接指向:

/bin   → usr/bin
/sbin  → usr/sbin
/lib   → usr/lib
/lib64 → usr/lib64
/var/lock → /run/lock
/var/run  → /run

第二层:/usr(Unix Software Resource,不是 user)——与软件安装/执行有关

相当于 Windows 的 C:\Windows\(部分)+ C:\Program Files\ 综合体,刚装完系统最占空间的目录。

目录用途
/usr/bin/所有用户指令(与 /bin 合并)
/usr/sbin/非开机必需的系统指令(与 /sbin 合并)
/usr/lib//lib 合并
/usr/local/自行安装的软件放这里(有自己的 bin/etc/lib 子树,与系统软件隔离)
/usr/share/硬件无关的只读数据(man, doc, zoneinfo)
/usr/src/源代码(内核源码放 /usr/src/linux/

第三层:/var(variable)——与系统运行过程有关

系统运行后渐渐占硬盘的目录(缓存、日志、邮件、数据库):

目录用途
/var/log/登录文件——系统出问题第一个来看的地方
/var/mail/var/spool/mail/用户邮件
/var/spool/队列数据(cron 任务、待发邮件)
/var/lib/程序运行期间的数据(如 MySQL 数据库 /var/lib/mysql/
/var/cache/应用程序缓存

💡 现在回头看第二章的分区规划:为什么建议 /var 独立分区?因为 /var 不断增长(日志、邮件),如果跟 / 放一起,一旦 /var 写满 → / 也满了 → 系统崩溃。独立出来至少 / 活着,还能进救援模式。

5.3.3 绝对路径与相对路径

类型写法例子
绝对路径/ 开始写/home/dmtsai/.bashrc
相对路径不以 / 开头,相对于当前目录../var/log(回到上一层再进 var/log)

两个特殊目录:. = 当前目录,.. = 上一层目录。

./run.sh 的意思:当前目录下名为 run.sh 的文件。之所以要加 ./,是因为当前目录不在系统的指令搜寻路径(PATH)里,不加 ./ 系统不知道去哪里找。

关键命令

命令用途
ls -al列出所有文件(含隐藏)的详细权限与属性
ls -l --full-time显示完整时间格式(年月日时分)
chgrp 群组名 文件名改变文件所属群组
chown 用户:群组 文件名改变文件拥有者(:群组可省略)
chmod 755 文件名数字法改权限(rwx=4+2+1)
chmod u=rwx,go=rx 文件名符号法改权限(u/g/o/a + +/-/=)
chmod a+x 文件名给所有人加执行权
su -切换为 root(exit 退回)
uname -r查看 Linux 核心版本
uname -m查看操作系统位版本(x86_64)
lsb_release -a查看 LSB 和 distribution 版本信息(需先安装 redhat-lsb)