Linux 文件基本属性详解

学习目标: 掌握Linux文件权限系统,理解用户、组和其他用户的权限区别,熟练使用chmod、chown、chgrp命令管理文件权限。

Linux 文件权限概述

Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。

在Linux中我们可以使用 ll 或者 ls -l 命令来显示一个文件的属性以及文件所属的用户和组:

[root@www /]# ls -l
total 64
dr-xr-xr-x   2 root root 4096 Dec 14  2012 bin
dr-xr-xr-x   4 root root 4096 Apr 19  2012 boot
drwxr-xr-x  18 root root 3760 Aug 12 14:37 dev
drwxr-xr-x  84 root root 4096 Aug 12 14:37 etc
drwxr-xr-x   3 root root 4096 Jul 28 10:15 home
lrwxrwxrwx   1 root root    7 Dec 14  2012 lib -> usr/lib
drwxr-xr-x   2 root root 4096 Dec 14  2012 lib64
drwx------   2 root root 4096 Dec 14  2012 lost+found
drwxr-xr-x   2 root root 4096 Dec 14  2012 media
drwxr-xr-x   2 root root 4096 Dec 14  2012 mnt
drwxr-xr-x   2 root root 4096 Dec 14  2012 opt
dr-xr-xr-x 102 root root    0 Aug 12 14:37 proc
dr-xr-x---   5 root root 4096 Aug 12 14:52 root
drwxr-xr-x  25 root root  760 Aug 12 14:37 run
dr-xr-xr-x   2 root root 4096 Dec 14  2012 sbin
drwxr-xr-x   2 root root 4096 Dec 14  2012 srv
dr-xr-xr-x  13 root root    0 Aug 12 14:37 sys
drwxrwxrwt  10 root root 4096 Aug 12 15:01 tmp
drwxr-xr-x  12 root root 4096 Dec 14  2012 usr
drwxr-xr-x  20 root root 4096 Dec 14  2012 var

从上面的输出中,我们可以看到每个文件或目录的详细信息,包括:

  • 文件类型和权限(如:dr-xr-xr-x)
  • 硬链接数
  • 所有者
  • 所属组
  • 文件大小
  • 最后修改时间
  • 文件名

文件类型识别

在Linux中,第一个字符代表这个文件是目录、文件或链接文件等:

字符 文件类型 说明
d 目录 (directory) 包含其他文件或目录的文件夹
- 普通文件 (regular file) 文本文件、二进制文件等
l 符号链接 (symbolic link) 指向另一个文件的快捷方式
b 块设备文件 (block device) 如硬盘、U盘等块存储设备
c 字符设备文件 (character device) 如键盘、鼠标等字符设备
p 管道文件 (pipe) 用于进程间通信
s 套接字文件 (socket) 用于网络通信

文件权限详解

接下来的9个字符,以三个为一组,分别表示文件所有者、所属组和其他用户的权限。

rwx
所有者权限
rwx
所属组权限
rwx
其他用户权限

其中:

  • r (read) - 读权限
  • w (write) - 写权限
  • x (execute) - 执行权限
  • - - 无相应权限

对于目录来说,权限的含义有所不同:

权限 对文件的意义 对目录的意义
r (读) 可以读取文件内容 可以列出目录中的文件
w (写) 可以修改文件内容 可以在目录中创建、删除文件
x (执行) 可以作为程序执行 可以进入目录

更改文件属性

1. chgrp:更改文件属组

chgrp 命令用于更改文件或目录的所属组。

语法:

chgrp [-R] 属组名 文件名

参数说明:

  • -R:递归更改文件属组,更改目录时同时更改该目录下所有文件的属组

示例:

# 将文件 file.txt 的属组更改为 developers
chgrp developers file.txt

# 递归将目录 mydir 及其所有内容的属组更改为 www-data
chgrp -R www-data mydir

2. chown:更改文件属主和属组

chown 命令用于更改文件或目录的所有者和/或所属组。

语法:

chown [-R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
chown [-R] 属主名.属组名 文件名

示例:

# 进入 /root 目录将 install.log 的拥有者改为 bin 用户
cd ~
chown bin install.log

# 将文件 file.txt 的所有者改为 alice,所属组改为 developers
chown alice:developers file.txt

# 递归更改目录及其所有内容的所有者和所属组
chown -R alice.developers myproject

3. chmod:更改文件权限

chmod 命令用于更改文件或目录的权限。有两种设置方法:数字法和符号法。

数字法(八进制表示法)

使用数字表示权限,各权限的分数对照表如下:

  • r (读) = 4
  • w (写) = 2
  • x (执行) = 1
  • - (无权限) = 0

每种身份(owner/group/others)的权限分数需要累加,例如:

权限:-rwxrwx---
所有者:rwx = 4+2+1 = 7
所属组:rwx = 4+2+1 = 7
其他用户:--- = 0+0+0 = 0
权限数字:770

常用权限数字示例:

权限数字 符号表示 说明
777 rwxrwxrwx 所有用户都有读、写、执行权限
755 rwxr-xr-x 所有者有全部权限,其他用户只有读和执行权限
644 rw-r--r-- 所有者有读写权限,其他用户只有读权限
600 rw------- 只有所有者有读写权限

示例:

# 查看当前权限
ls -l .bashrc
# -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc

# 将权限设置为 777 (rwxrwxrwx)
chmod 777 .bashrc

# 再次查看权限
ls -l .bashrc
# -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc

# 将权限设置为 755 (rwxr-xr-x)
chmod 755 script.sh

# 递归设置目录权限
chmod -R 755 mydirectory

符号法

使用符号表示权限变更:

  • u:所有者 (user)
  • g:所属组 (group)
  • o:其他用户 (others)
  • a:所有用户 (all)
  • +:添加权限
  • -:移除权限
  • =:设置权限

示例:

# 为所有者添加执行权限
chmod u+x file.sh

# 为所有用户添加读权限
chmod a+r file.txt

# 移除所属组和其他用户的写权限
chmod go-w file.txt

# 设置所有者的权限为读写执行,所属组为读执行,其他用户为读
chmod u=rwx,g=rx,o=r file.sh

# 为目录设置权限,使所有用户都可以进入但只有所有者可以修改
chmod 755 directory
chmod o-w directory  # 等同于上一条命令

特殊权限

除了基本的rwx权限外,Linux还有三个特殊权限位:

1. SUID (Set User ID)

当文件设置了SUID权限时,任何用户执行该文件时,都会以文件所有者的身份执行。

# 设置SUID (在所有者执行位设置s)
chmod u+s file
# 或使用数字法 (在千位加4)
chmod 4755 file

2. SGID (Set Group ID)

当文件设置了SGID权限时,任何用户执行该文件时,都会以文件所属组的身份执行。当目录设置了SGID时,在该目录下创建的文件会自动继承目录的所属组。

# 设置SGID (在所属组执行位设置s)
chmod g+s directory
# 或使用数字法 (在千位加2)
chmod 2755 directory

3. Sticky Bit

当目录设置了Sticky Bit时,只有文件的所有者、目录的所有者或root用户才能删除或重命名该目录下的文件。

# 设置Sticky Bit (在其他用户执行位设置t)
chmod o+t directory
# 或使用数字法 (在千位加1)
chmod 1755 directory

权限查看技巧

使用stat命令查看详细权限

stat file.txt
# 输出示例:
# File: file.txt
# Size: 1024        Blocks: 8          IO Block: 4096   regular file
# Device: 801h/2049d  Inode: 262145      Links: 1
# Access: (0644/-rw-r--r--)  Uid: ( 1000/   alice)   Gid: ( 1000/ developers)
# Access: 2023-08-12 14:30:00.000000000 +0800
# Modify: 2023-08-12 14:25:00.000000000 +0800
# Change: 2023-08-12 14:35:00.000000000 +0800

使用find命令查找特定权限的文件

# 查找所有具有SUID权限的文件
find / -perm -4000

# 查找所有具有写权限的目录
find / -type d -perm -o=w

# 查找所有权限为777的文件
find / -perm 777
安全提示:
  • 不要随意设置777权限,这会带来严重的安全风险
  • 谨慎使用SUID和SGID权限,特别是对于root拥有的文件
  • 定期检查系统中是否有异常权限设置的文件
  • 对于Web目录,通常设置为755(目录)和644(文件)是安全的

实践练习

尝试以下练习来巩固所学知识:

  1. 创建一个新文件,查看其默认权限
  2. 使用chmod命令分别用数字法和符号法修改文件权限
  3. 创建一个目录,尝试设置不同的权限并测试效果
  4. 使用chown和chgrp命令更改文件的所有者和所属组
  5. 尝试设置SUID、SGID和Sticky Bit权限并观察效果