用户权限 - Linux系统基本权限

1. 权限概述

Linux中的文件或目录的权限和用户及用户组关联很大,Linux中每个文件或目录都有一组共9个基础权限位,每三个字符被分为一组,他们分别是属主权限位(占三个字符)、属组权限位(占三个字符)、其他用户权限位(占三个字符)

比如rwxr-xr-x,linux中正是这9个权限位来控制文件属主(User)、属组(Group)、其他用户(Other)基础权限。

1.1 用户对资源的三种角色

角色 符号 说明
User(u) 属主用户 文件所有者
Group(g) 属组用户 包含组成员
Other(o) 匿名用户 其他人

1.2 用户访问文件流程

一个用户访问文件流程如下:

  1. 判断用户是否为文件的所有者,如果是,按所有者的权限进行访问
  2. 判断是否为文件的所有组成员,如果是,就按组的权限去访问
  3. 最终用户就是文件的其他的人,按其他人的权限去访问
1
2
rwx, rwx, r-x
User Group Other

1.3 权限与属主属组

文件权限对应表:

如果权限位不可读、不可写、不可执行,则用-来表示。

权限 符号 二进制 八进制
r 100 4
w 010 2
执行 x 001 1
无权限 - 000 0

权限组合:

权限组合 二进制 八进制 说明
rwx 111 7 读、写、执行
rw- 110 6 读、写
r-x 101 5 读、执行
r– 100 4 只读
-wx 011 3 写、执行
-w- 010 2 只写
–x 001 1 只执行
000 0 无权限

1.4 权限与属主属组作用示例

  • chown: Linux中用来改变某个文件属主的命令, 如漫画中所示, 将某个”资源”(门)的访问权限给予别人。(卖房)
  • chmod: Linux中用来改变某个文件的访问模式的命令, 如漫画中所示, chmod 777会将大门敞开, 谁都可以进出。(租房)

2. 权限修改命令chmod

chmod用于修改文件目录权限rwx,-R参数可以级联修改。

2.1 chmod命令语法

1
2
chmod [选项] 权限 文件/目录
chmod -R 权限 文件/目录 # 递归修改

2.2 chmod权限设置方式

方式1: 数字方式

1
2
3
chmod 777 dir/   # 修改dir目录权限为777
chmod 666 file # 修改file文件权限为666
chmod -R 766 dir/ # 递归修改目录及子目录权限

方式2: 字符方式

1
2
3
4
5
6
7
8
9
# 添加权限
chmod u+rwx,g+rwx,o+rwx dir/ # 等同于 chmod 777 dir/
chmod u+rw,g+rw,o+rw file # 等同于 chmod 666 file

# 移除权限
chmod u-x,g-w,o-r file

# 设置权限(精确设置)
chmod u=rwx,g=rx,o=r file

2.3 chmod示例

示例1: 修改目录权限

1
2
3
4
mkdir dir       # 建立目录
chmod 777 dir/ # 修改dir目录权限为777
# 等同于
chmod u+rwx,g+rwx,o+rwx dir/

示例2: 修改文件权限

1
2
3
4
touch dir/file  # 建立文件
chmod 666 dir/file # 修改file文件权限为666
# 等同于
chmod u+rw,g+rw,o+rw dir/file

示例3: 递归修改权限

1
chmod -R 766 dir/  # 修改目录及子目录权限

2.4 chmod常用选项

选项 功能
-R 递归修改目录及子目录权限
-v 显示详细过程
-c 只显示被修改的文件

3. 属主属组修改命令chown

chown用于更改属主以及属组,-R参数可以级联修改。

3.1 chown命令语法

1
2
3
chown [选项] 属主:属组 文件/目录
chown [选项] 属主.属组 文件/目录
chown -R 属主:属组 文件/目录 # 递归修改

3.2 chown示例

示例1: 修改所属主

1
2
3
4
mkdir dir               # 创建目录
chown bin dir/ # 修改所属主为bin
ll -d dir/ # 检查属主
# 输出: drwxr-xr-x 2 bin root 4096 7月 22 00:50 dir/

示例2: 修改所属组

1
2
3
4
5
chown .adm dir/         # 修改所属组为adm
# 或
chown :adm dir/ # 修改所属组为adm
ll -d dir/ # 检查属组
# 输出: drwxr-xr-x 2 bin adm 4096 7月 22 00:50 dir/

示例3: 同时修改属主和属组

1
2
3
4
5
touch dir/file_test     # 创建文件
mkdir dir/dir_test # 创建目录
chown -R root.root dir/ # 递归修改目录及目录下的所有文件属主和属组
# 或
chown -R root:root dir/ # 递归修改目录及目录下的所有文件属主和属组

3.3 chown常用选项

选项 功能
-R 递归修改目录及子目录
-v 显示详细过程
-c 只显示被修改的文件

4. 基础权限设置案例

4.1 文件权限实验案例

实验环境准备

1
2
3
4
# 默认文件匿名用户仅有读权限
[root@liyanzhao ~]# echo "date" >> filename
[root@liyanzhao ~]# ll filename
-rw-r--r-- 1 root root 5 Jan 24 08:24 filename

测试读权限

1
2
3
4
# 测试读权限(无法执行或删除)
[root@liyanzhao ~]# su - bgx
[bgx@liyanzhao ~]$ cat /root/filename
date

增加执行权限

1
2
3
4
5
6
7
8
# 增加x执行权限
[root@liyanzhao ~]# chmod o+x /root/filename
[root@liyanzhao ~]# ll /root/filename
-rw-r--r-x 1 root root 5 Jan 24 08:24 /root/filename

# 测试执行权限
[bgx@liyanzhao ~]$ /root/filename
Wed Jan 24 08:28:34 EST 2018

增加写权限

1
2
3
4
5
6
7
# 增加w执行权限
[root@liyanzhao ~]# chmod o+w /root/filename
[root@liyanzhao ~]# ll /root/filename
-rw-r--rwx 1 root root 5 Jan 24 08:24 /root/filename

# 测试写权限
[bgx@liyanzhao ~]$ vim /root/filename

4.2 rwx对文件的影响

读取权限(r)

文件只有r权限: 具有读取\阅读文件内容权限

可以执行的操作:

  1. 能使用查看类命令catheadtaillessmore

不能执行的操作:

  1. 不能复制、不能移动、不能编辑,不能删除

写入权限(w)

如果文件只有w权限: 具有新增、修改文件内容的权限

可以执行的操作:

  1. 使用vim编辑会提示权限拒绝, 但可强制保存,会覆盖文件的所有内容
  2. 使用echocat命令重定向或追加重定向技术可以往文件内写入数据

不能执行的操作:

  1. 不能复制、不能移动、不能删除,(删除需要看上级目录w的权限)

执行权限(x)

文件只有x权限,具有执行文件的权限。

注意: 普通用户需要有r权限,管理员不需要

不能执行的操作:

  1. 不能执行、查看、编辑、复制、移动、删除

4.3 目录权限实验案例

实战案例1: 对目录没有w,对文件有rwx

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@liyanzhao ~]# mkdir /dirname
[root@liyanzhao ~]# echo "test" >> /dirname/filename
[root@liyanzhao ~]# chmod 777 /dirname/filename
[root@liyanzhao ~]# ll -d /dirname/
drwxr-xr-x 2 root root 22 Jan 24 08:40 /dirname/
[root@liyanzhao ~]# ll -d /dirname/filename
-rwxrwxrwx 1 root root 5 Jan 24 08:41 /dirname/filename

# 普通用户验证权限
[bgx@liyanzhao ~]$ cat /dirname/filename
test
[bgx@liyanzhao ~]$ rm -f /dirname/filename
rm: cannot remove '/dirname/filename': Permission denied

结论: 即使文件有rwx权限,如果目录没有w权限,也无法删除文件。

实战案例2: 对目录有w,对文件没有任何权限

1
2
3
4
5
6
7
8
9
10
11
12
[root@liyanzhao ~]# chmod 777 /dirname/
[root@liyanzhao ~]# chmod 000 /dirname/filename
[root@liyanzhao ~]# ll -d /dirname/
drwxrwxrwx 2 root root 22 Jan 24 08:40 /dirname/
[root@liyanzhao ~]# ll -d /dirname/filename
---------- 1 root root 5 Jan 24 08:41 /dirname/filename

# 普通用户验证权限
[bgx@liyanzhao ~]$ cat /dirname/filename
cat: /dirname/filename: Permission denied
[bgx@liyanzhao ~]$ rm -f /dirname/filename
[bgx@liyanzhao ~]$ touch /dirname/filename_2

结论: 如果目录有w权限, 可以在目录内创建文件, 删除文件(跟文件本身权限无关)。

4.4 rwx对目录的影响

读取权限(r)

目录只有r权限: 具有浏览目录及子目录权限

可以执行的操作:

  1. 能使用ls命令浏览目录及子目录, 同时会提示权限拒绝
  2. 能使用ls -l命令浏览目录及子目录, 会带问号,同时只能看到文件名

总结: 目录只有r权限,仅仅只能浏览内的文件名,无其他操作权限

写入权限(w)

如果目录只有w权限: 具有增加、删除或修改目录内文件名权限(需要x配合)

注意: 如果目录有w权限, 可以在目录内创建文件, 删除文件(跟文件本身权限无关)

不能执行的操作:

  1. 不能进入目录、不能复制目录、不能删除目录、不能移动目录

执行权限(x)

目录只有x权限

可以执行的操作:

  1. 只能进入目录

不能执行的操作:

  1. 不能浏览、复制、移动、删除

5. 权限小结

5.1 文件权限总结

权限组合 说明 可执行操作
rw 读、写 可以查看和编辑文件内容
rx 读、执行 只能查看和执行文件、不能编辑、复制、移动、删除
r 只读 只能查看文件内容
w 只写 可以写入,但需要配合其他权限
x 只执行 可以执行,但普通用户需要r权限

5.2 目录权限总结

权限组合 说明 可执行操作
rx 读、执行 允许浏览目录内文件以及子目录、并允许在目录内新建文件, 不允许创建、删除文件和目录
rwx 读、写、执行 完全控制,可以浏览、创建、删除文件
r 只读 只能浏览文件名,无其他操作
w 只写 需要配合x权限使用
x 只执行 只能进入目录

5.3 注意事项

文件权限:

  • x权限小心给予,建议赋予r或rw即可
  • 可执行文件才需要x权限

目录权限:

  • w权限小心给予,建议无特殊需求赋予rx即可
  • 目录通常需要rx权限才能正常使用

6. 实战实验

6.1 实验需求

  1. 创建andy,alice用户为ateam组, 用户统一使用password为密码
  2. 要求ateam组的成员可以访问/home/ateam-text目录, 并且可以在目录下创建,删除文件
  3. 在目录下andy创建的文件可以让alice修改

6.2 实验步骤

步骤1: 创建用户和组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 创建ateam组
[root@localhost ~]# groupadd ateam

# 创建andy用户,加入ateam组
[root@localhost ~]# useradd andy -g ateam
[root@localhost ~]# echo "password" | passwd --stdin andy

# 创建alice用户,加入ateam组
[root@localhost ~]# useradd alice -g ateam
[root@localhost ~]# echo "password" | passwd --stdin alice

# 验证用户和组
[root@localhost ~]# id andy
uid=1001(andy) gid=1001(ateam) groups=1001(ateam)
[root@localhost ~]# id alice
uid=1002(alice) gid=1001(ateam) groups=1001(ateam)

步骤2: 创建共享目录

1
2
3
4
5
6
7
8
9
10
11
12
# 创建共享目录
[root@localhost ~]# mkdir /home/ateam-text

# 设置目录属主和属组为ateam
[root@localhost ~]# chown root:ateam /home/ateam-text

# 设置目录权限:属主rwx,属组rwx,其他用户无权限
[root@localhost ~]# chmod 770 /home/ateam-text

# 验证权限
[root@localhost ~]# ll -d /home/ateam-text
drwxrwx--- 2 root ateam 4096 Feb 2 10:00 /home/ateam-text

步骤3: 设置SGID位(可选,确保新建文件属于ateam组)

1
2
3
4
5
6
7
# 设置SGID位,确保在目录下创建的文件属于ateam组
[root@localhost ~]# chmod g+s /home/ateam-text

# 验证
[root@localhost ~]# ll -d /home/ateam-text
drwxrws--- 2 root ateam 4096 Feb 2 10:00 /home/ateam-text
# 注意:s表示SGID位已设置

步骤4: 测试权限

测试1: andy创建文件

1
2
3
4
5
6
7
8
9
10
11
# 切换到andy用户
[root@localhost ~]# su - andy
[andy@localhost ~]$ cd /home/ateam-text

# andy创建文件
[andy@localhost ateam-text]$ touch andy_file.txt
[andy@localhost ateam-text]$ echo "andy's content" > andy_file.txt

# 查看文件权限
[andy@localhost ateam-text]$ ll
-rw-rw-r-- 1 andy ateam 15 Feb 2 10:05 andy_file.txt

测试2: alice修改andy创建的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 切换到alice用户
[andy@localhost ateam-text]$ exit
[root@localhost ~]# su - alice
[alice@localhost ~]$ cd /home/ateam-text

# alice可以查看文件
[alice@localhost ateam-text]$ cat andy_file.txt
andy's content

# alice可以修改文件(因为文件属组是ateam,alice也是ateam组成员)
[alice@localhost ateam-text]$ echo "modified by alice" >> andy_file.txt
[alice@localhost ateam-text]$ cat andy_file.txt
andy's content
modified by alice

# 验证文件权限
[alice@localhost ateam-text]$ ll
-rw-rw-r-- 1 andy ateam 35 Feb 2 10:08 andy_file.txt

测试3: alice创建和删除文件

1
2
3
4
5
6
7
8
# alice创建文件
[alice@localhost ateam-text]$ touch alice_file.txt
[alice@localhost ateam-text]$ echo "alice's content" > alice_file.txt

# alice删除andy创建的文件
[alice@localhost ateam-text]$ rm -f andy_file.txt
[alice@localhost ateam-text]$ ll
-rw-rw-r-- 1 alice ateam 16 Feb 2 10:10 alice_file.txt

步骤5: 优化配置(确保文件可被组内成员修改)

如果希望ateam组成员创建的文件默认可以被其他组成员修改,可以设置umask:

1
2
3
4
5
6
7
8
# 在/etc/profile或~/.bashrc中添加
umask 002 # 文件默认权限为664,目录默认权限为775

# 或者为ateam组设置默认权限
# 在/etc/bashrc中添加
if [ $(id -gn) = "ateam" ]; then
umask 002
fi

6.3 完整实验脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
# 创建ateam组和用户实验脚本

# 创建组
groupadd ateam

# 创建用户
useradd andy -g ateam
echo "password" | passwd --stdin andy

useradd alice -g ateam
echo "password" | passwd --stdin alice

# 创建共享目录
mkdir -p /home/ateam-text
chown root:ateam /home/ateam-text
chmod 2770 /home/ateam-text # 2表示SGID位

# 验证
echo "=== 用户信息 ==="
id andy
id alice

echo "=== 目录权限 ==="
ll -d /home/ateam-text

echo "=== 测试完成 ==="
echo "andy和alice可以使用密码'password'登录系统"
echo "共享目录: /home/ateam-text"

7. 权限最佳实践

7.1 文件权限建议

文件类型 建议权限 说明
配置文件 644 (rw-r–r–) 所有者可读写,其他用户只读
可执行文件 755 (rwxr-xr-x) 所有者可执行,其他用户可执行
脚本文件 755 (rwxr-xr-x) 需要执行权限
日志文件 644 (rw-r–r–) 所有者可读写
敏感文件 600 (rw——-) 只有所有者可读写

7.2 目录权限建议

目录类型 建议权限 说明
用户家目录 755 (rwxr-xr-x) 所有者完全控制,其他用户可进入
共享目录 775 (rwxrwxr-x) 组内成员可读写
临时目录 777 (rwxrwxrwx) 所有用户可读写(谨慎使用)
系统目录 755 (rwxr-xr-x) 标准系统目录权限

7.3 特殊权限位

权限位 符号 说明 示例
SUID s 执行时以文件所有者身份运行 chmod u+s file
SGID s 执行时以文件属组身份运行,目录中新建文件继承属组 chmod g+s dir
Sticky t 目录中只有文件所有者可以删除自己的文件 chmod o+t dir

8. 命令总结

8.1 权限管理命令

命令 功能 常用选项
chmod 修改文件/目录权限 -R 递归修改
chown 修改文件/目录属主和属组 -R 递归修改
chgrp 修改文件/目录属组 -R 递归修改
umask 设置默认权限掩码

8.2 权限查看命令

命令 功能
ls -l 查看文件详细权限
ls -ld 查看目录详细权限
stat 查看文件完整属性信息
getfacl 查看文件ACL权限