为什么是 Linux?
当今互联网世界,Linux 几乎无处不在。从你每天访问的网站、使用的云服务,到手机底层的 Android 系统、智能家电、超级计算机——它们绝大多数都运行在 Linux 之上。
为什么?因为 Linux 是开源的。
开源意味着它的每一行代码都暴露在阳光下,接受全世界顶尖开发者的审视、测试、改进。二十多年来,无数工程师、黑客、安全专家、学术机构反复审查过它的内核代码——漏洞被发现、被修复、被验证,周而复始,最终铸就了一个极其稳定、安全、可靠的操作系统。
一个有趣的反直觉事实是:开源反而让 Linux 更安全。闭源系统靠“隐藏代码”来防御攻击者,而 Linux 靠的是“代码足够好,即使你知道它怎么工作,也攻不破它”。全球最顶尖的黑客可以自由阅读 Linux 源码,但他们至今仍无法找到根本性的安全漏洞——这正是开源精神在安全领域的最佳证明。
这也是为什么几乎所有的云服务器都选择 Linux 作为宿主操作系统——它扛得住最严苛的生产环境,经得起最顶尖的攻击测试。
为什么需要掌握文件系统权限?
如果你买了一台云服务器,部署了一个网站或后端服务,那么文件系统权限就是你服务器的第一道防线。
它决定了:
一个常见的真实案例是:开发者把私钥文件权限设成了 775(所有人都可读),结果被恶意用户读取,导致代码仓库被窃取或篡改。另一个案例是:网站的 uploads 目录权限设置不当,导致攻击者上传并执行了恶意脚本,整个服务器沦陷。
这些问题的根源,都来自于对文件系统权限的理解不足。
掌握 Linux 文件系统权限,意味着你能精确控制“谁能对哪个文件做什么事”。这是保障服务器安全的基本功,也是每一位后端开发者、运维工程师、DevOps 工程师的必修课。
为什么要学 Linux 命令行?
很多人第一次打开 Linux 终端时,面对一个闪烁的光标,第一反应是:“为什么没有图形界面?”
这正是 Linux 与其他操作系统最大的不同:它默认把全部控制权交给你,而不是帮你做决定。
- 在图形界面里,你能做的操作受限于设计者提供的按钮和菜单。
- 在命令行里,你可以组合任意命令,完成任意复杂的任务——你能想到的,几乎都能做到。
有人说 Linux 命令行的学习曲线很陡峭,确实如此。但一旦翻过这道坡,你会获得一种完全不同的、更本质的人机交互体验,基于文本的人机交互信息量是远超图形界面交互的。命令行的本质是“编程式操作”。你每一次敲击命令,都是在指挥计算机执行精确的指令;当你把多条命令组合成 shell 脚本,就完成了一个自动化程序的编写。
配合 Linux Shell 编程,你可以:
这些任务如果靠图形界面手动操作,可能需要几个小时甚至几天;而在命令行里,往往只需要几十行脚本。
学习曲线虽陡,回报却极其丰厚。 这正是 Linux 命令行经久不衰的原因。
Linux 文件系统权限
目前绝大多数 Linux 发行版安装时默认使用的文件系统是 ext4。Linux 内核提供抽象层 VFS(Virtual File System,虚拟文件系统),向上给应用提供统一的文件操作接口;ext4 是真正在磁盘上组织目录结构、存储文件内容、记录权限与 inode 的实际文件系统。Windows 使用 NTFS 文件系统,二者并不原生互通:Windows 默认无法读取 Linux 的 ext4 磁盘分区;而 Linux 安装 NTFS 驱动后,就可以访问 Windows 的 NTFS 分区。

用户和组
用户:一个人;组:一群人。
- 用户 User :可以登录系统、拥有
/home/ 家目录、运行进程的个体。 - 组 Group:一组用户的集合,方便统一管理权限。
Linux 的权限控制,永远围绕三组对象展开。
三组对象

查看当前用户命令:whoami
~$ whoami
jackey
查看当前用户和组:id username
~$ id jackey
uid=1000(jackey) gid=1000(jackey) groups=1000(jackey),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),114(lpadmin)
uid 是用户 ID,是 Linux 内核识别用户的唯一编号。1000 说明是第一个被创建的普通用户。jackey 是我的用户名。
gid=1000(jackey),gid 是主组 ID Primary Group。这是 jackey 默认归属的组。
groups=... :Supplementary Groups 附加组,额外拥有的组的权限:
4(adm):系统监控组。拥有读取 /var/log 系统日志的权限。24(cdrom):光驱组。允许 jackey 直接访问物理光驱或挂载 ISO 镜像。27(sudo):管理员组。只要是 sudo 组的成员,就可以通过 sudo 命令临时获得 root 权限。30(dip):拨号组。通常用于允许使用 ppp 拨号上网或配置 VPN 连接。46(plugdev):热插拔设备组。允许 jackey 在插入 U 盘、手机等 USB 设备时,系统自动挂载并访问里面的文件。100(users):通用用户组。这是一个传统组,通常用于允许同一台机器上的普通用户之间共享文件。114(lpadmin):打印管理组。允许 jackey 管理打印机(添加、删除、配置打印机)。
Linux 查看详细文件权限
在 Linux 中,使用命令 ls 加 -l 参数查看详细的文件权限:
/var/log$ ls -l
total 12352
-rw-r--r-- 1 root root 0 Aug 1 15:03 alternatives.log
-rw-r--r-- 1 root root 16958 Jul 30 16:56 alternatives.log.1
-rw-r--r-- 1 root root 1088 Jun 26 20:38 alternatives.log.2.gz
-rw-r--r-- 1 root root 4055 May 22 10:40 alternatives.log.3.gz
-rw-r----- 1 root adm 539 Aug 5 09:48 apport.log
-rw-r----- 1 root adm 462 Aug 4 10:30 apport.log.1
-rw-r----- 1 root adm 5238 Jul 31 15:03 apport.log.2.gz
-rw-r----- 1 root adm 2431 Jul 30 17:18 apport.log.3.gz
-rw-r----- 1 root adm 825 Jul 27 15:16 apport.log.4.gz
-rw-r----- 1 root adm 1082 Jul 15 19:53 apport.log.5.gz
-rw-r----- 1 root adm 120 Jul 5 12:50 apport.log.6.gz
-rw-r----- 1 root adm 273 Jun 21 12:28 apport.log.7.gz
drwxr-xr-x 2 root root 4096 Aug 4 09:54 apt
drwxr-xr-x 2 root root 4096 Aug 6 17:59 atop
... ...
[权限位] [所有者] [所属组]
权限位drwxrwxrwx :[文件类型][所属用户][所属组][其他用户]
d rwx rwx rwx
│ │││ │││ │││
│ │││ │││ ││└── 第10位:其他用户的执行权限 (x)
│ │││ │││ │└─── 第9位:其他用户的写权限 (w)
│ │││ │││ └──── 第8位:其他用户的读权限 (r)
│ │││ ││└────── 第7位:所属组的执行权限 (x)
│ │││ │└─────── 第6位:所属组的写权限 (w)
│ │││ └──────── 第5位:所属组的读权限 (r)
│ ││└────────── 第4位:所有者的执行权限 (x)
│ │└─────────── 第3位:所有者的写权限 (w)
│ └──────────── 第2位:所有者的读权限 (r)
└────────────── 第1位:文件类型 (d表示目录, -表示普通文件, l表示链接)
权限含义:
常见权限组合
# 文件常见权限
-rw-r--r-- # 644:所有者可读写,其他人只读(最常用)
-rw------- # 600:只有所有者可读写(密钥、配置文件)
-rwxr-xr-x # 755:所有者可读写执行,其他人可读执行(脚本)
-rwx------ # 700:只有所有者可读写执行(私有程序)
# 目录常见权限
drwxr-xr-x # 755:所有者可读写执行,其他人可读执行
drwxrwxr-x # 775:所有者和组可读写执行,其他人可读执行
drwx------ # 700:只有所有者可读写执行(私有目录)
权限与数字的对应规则
Linux 中使用 3 位二进制数表示 rwx 权限的组合:
r = 4 (100₂)
w = 2 (010₂)
x = 1 (001₂)
rwx = 7 (111₂)
rw- = 6 (110₂)
r-x = 5 (101₂)
--- = 0 (000₂)

权限数字如 775,第一位 7 代表所属用户权限为 rwx,第二位 7 代表所属组权限为 rwx,第三位 5 代表其他用户权限为 r-x 。
完整数字对应表:
| | | |
|---|
7 | | rwx | |
6 | | rw- | |
5 | | r-x | |
4 | | r-- | |
3 | | -wx | |
2 | | -w- | |
1 | | --x | |
0 | | --- | |
chmod 命令 - 修改文件权限
基本用法:chmod [选项] 权限数字或符号表示 文件
chmod 600 file.txt # 修改 file.txt 文件的权限为 600,文件所有者 rw-,其他组和其他用户无权限访问
# │
# 权限的数字表示
符号表示:chmod [who][+/-/=][permission] file
who:u=user, g=group, o=others, a=all+/-/=: +增加权限, -移除权限, =设置权限
chmod u+x script.sh # 给所有者添加执行权限
chmod g-w file.txt # 移除组的写权限
chmod o=r file.txt # 设置其他人的权限为只读
chmod a+x script.sh # 给所有人添加执行权限
chmod u=rwx,g=rx,o= file.txt # 所有者全权限,组可读执行,其他人无
递归修改目录:
# 递归修改目录下所有文件
chmod -R 755 /path/to/dir # 目录和所有子文件都改为 755
# 区分文件和目录(推荐)
find /path/to/dir -type f -exec chmod 644 {} \; # 文件 644
find /path/to/dir -type d -exec chmod 755 {} \; # 目录 755
chown 命令 - 修改文件所属权
# 语法
chown [选项] 所有者[:所属组] 文件
# 示例
chown jackey file.txt # 将所有者改为 jackey
chown :staff file.txt # 将所属组改为 staff
chown jackey:staff file.txt # 同时修改所有者和所属组
chown -R jackey:staff /dir # 递归修改目录下所有文件
场景:
# 1. 修改文件所有者
sudo chown jackey config.conf
# 2. 修改文件所属组
sudo chown :docker /var/run/docker.sock
# 3. 同时修改所有者和所属组
sudo chown www-data:www-data /var/www/index.html
# 4. 递归修改整个目录
sudo chown -R jackey:jackey /home/jackey/project/
# 5. 只修改所有者,保持所属组不变
sudo chown jackey file.txt
# 6. 只修改所属组,保持所有者不变
sudo chown :developers file.txt
新建文件的权限从何而来?
Linux 执行命令 umask 会输出一个数字,它是用户文件创建掩码值,决定了新建文件或目录时“去掉”哪些权限。
$ umask
0002
# 含义:
0 0 2
│ │ │
│ │ └── 其他用户 (others):去掉 2 (写权限)
│ └──── 所属组 (group):不去掉任何权限 (0)
└────── 所有者 (user):不去掉任何权限 (0)
文件的默认基础权限是 666(rw-rw-rw-,文件默认没有执行权限)。
目录的默认基础权限是 777(rwxrwxrwx,目录必须有执行权限才能 cd 进去)。
在这个基础上,去掉 umask 的权限即是创建文件/夹的默认权限。
jackey@jackey-HBB-WX9:~$ umask
0002
jackey@jackey-HBB-WX9:~$ vim file.txt
jackey@jackey-HBB-WX9:~$ mkdir testDirectory
jackey@jackey-HBB-WX9:~$ ls -l | grep file.txt && ls -l | grep testDirectory
-rw-rw-r-- 1 jackey jackey 0 Aug 6 20:34 file.txt
drwxrwxr-x 2 jackey jackey 4096 Aug 6 20:34 testDirectory
特殊权限
SUID(Set User ID)
当 SUID 设置到可执行文件上,任何用户运行该程序时,暂时获得文件所有者的权限:
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... /usr/bin/passwd
# ↑ SUID 标志(s 代替了 x)
# 设置 SUID
chmod u+s program
chmod 4755 program # 4 表示 SUID
SUID 是把双刃剑。设置不当可能导致权限提升漏洞(如允许普通用户以 root 身份执行程序)。非必要不要随意设置 SUID。
SGID(Set Group ID)
对目录设置 SGID,新创建的文件会继承目录的组,而不是创建者的组
chmod g+s directory
chmod 2755 directory # 2 表示 SGID
Sticky Bit(粘滞位)
对目录设置粘滞位,只有文件所有者才能删除自己的文件
ls -ld /tmp
# drwxrwxrwt 1 root root ... /tmp
# ↑ 粘滞位 (t)
chmod +t directory
chmod 1777 directory # 1 表示粘滞位
在 Linux 上使用私钥 git 拉取远程仓库代码经常会遇到的报错如下:
git pull github main
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0775 for'/home/jackey/.ssh/github' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/jackey/.ssh/github": bad permissions
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
这种情况下就是私钥的权限太过宽松导致的,将私钥文件设置成 600 权限即可解决。
权限的本质,是“谁能对什么做什么”的精确描述。 它赋予了系统管理员对服务器最细粒度的控制力——多一分则宽松,少一分则阻塞。
权限设置是一门平衡的艺术:
太宽松 → 安全风险(任何人都能读你的私钥)
太严格 → 程序无法运行(Web 服务器读不到静态文件)
关键在于:只给必要的权限,不多给一分。
如果你对 Linux 系统管理感兴趣,以下方向值得继续深入:
ACL(访问控制列表):setfacl / getfacl,实现更细粒度的权限控制
文件属性:chattr +i 设置不可变文件,lsattr 查看
SELinux / AppArmor:Linux 内核级的安全模块,提供更强的访问控制