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
从上面的输出中,我们可以看到每个文件或目录的详细信息,包括:
在Linux中,第一个字符代表这个文件是目录、文件或链接文件等:
| 字符 | 文件类型 | 说明 |
|---|---|---|
d |
目录 (directory) | 包含其他文件或目录的文件夹 |
- |
普通文件 (regular file) | 文本文件、二进制文件等 |
l |
符号链接 (symbolic link) | 指向另一个文件的快捷方式 |
b |
块设备文件 (block device) | 如硬盘、U盘等块存储设备 |
c |
字符设备文件 (character device) | 如键盘、鼠标等字符设备 |
p |
管道文件 (pipe) | 用于进程间通信 |
s |
套接字文件 (socket) | 用于网络通信 |
接下来的9个字符,以三个为一组,分别表示文件所有者、所属组和其他用户的权限。
其中:
r (read) - 读权限w (write) - 写权限x (execute) - 执行权限- - 无相应权限对于目录来说,权限的含义有所不同:
| 权限 | 对文件的意义 | 对目录的意义 |
|---|---|---|
r (读) |
可以读取文件内容 | 可以列出目录中的文件 |
w (写) |
可以修改文件内容 | 可以在目录中创建、删除文件 |
x (执行) |
可以作为程序执行 | 可以进入目录 |
chgrp 命令用于更改文件或目录的所属组。
语法:
chgrp [-R] 属组名 文件名
参数说明:
-R:递归更改文件属组,更改目录时同时更改该目录下所有文件的属组示例:
# 将文件 file.txt 的属组更改为 developers
chgrp developers file.txt
# 递归将目录 mydir 及其所有内容的属组更改为 www-data
chgrp -R www-data mydir
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
chmod 命令用于更改文件或目录的权限。有两种设置方法:数字法和符号法。
使用数字表示权限,各权限的分数对照表如下:
r (读) = 4w (写) = 2x (执行) = 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还有三个特殊权限位:
当文件设置了SUID权限时,任何用户执行该文件时,都会以文件所有者的身份执行。
# 设置SUID (在所有者执行位设置s)
chmod u+s file
# 或使用数字法 (在千位加4)
chmod 4755 file
当文件设置了SGID权限时,任何用户执行该文件时,都会以文件所属组的身份执行。当目录设置了SGID时,在该目录下创建的文件会自动继承目录的所属组。
# 设置SGID (在所属组执行位设置s)
chmod g+s directory
# 或使用数字法 (在千位加2)
chmod 2755 directory
当目录设置了Sticky Bit时,只有文件的所有者、目录的所有者或root用户才能删除或重命名该目录下的文件。
# 设置Sticky Bit (在其他用户执行位设置t)
chmod o+t directory
# 或使用数字法 (在千位加1)
chmod 1755 directory
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
# 查找所有具有SUID权限的文件
find / -perm -4000
# 查找所有具有写权限的目录
find / -type d -perm -o=w
# 查找所有权限为777的文件
find / -perm 777
尝试以下练习来巩固所学知识: