【linux】权限深入解析

发布于:2025-06-30 ⋅ 阅读:(20) ⋅ 点赞:(0)

权限基础概念

权限=角色+属性。一切权限都是关于角色和权限类型的,核心角色一共分为三类——所有者(User):文件的创造者,所属组(Group):一组用户共享相同的权限,其他用户(Other):除上述两者的其他用户。权限类型,读(r),写(w),执行(x)。ls -l命令用于查看文件和目录的详细信息。

权限位三位为一组,第一位都只能是r或-,第二位是w或-,第三位是x或-,分别意味着,拥有者,所属组,其他的权限。权限都是确定的,只能有或没有。

 -rw-r--r--表示拥有者对此文件有读和写的权限,而所属组和other只有读的权限。

xian@hcss-ecs-887f:~/lession1$ tree
.
└── tt.txt

0 directories, 1 file
xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ echo "hello" > tt.txt
-bash: tt.txt: Permission denied
xian@hcss-ecs-887f:~/lession1$ 

虽然tt.txt在普通用户xian的目录中,但是所属组对tt.txt没有w权限,所以不能向文件写入内容。

sudo命令

sudo命令允许普通用户临时获取root权限,执行需要高权限的操作。例如,安装软件时可以使用

sudo apt-get install software_name

(Debian系)或

sudo yum install software_name

(CentOS系)。使用sudo时需谨慎,避免误操作带来的安全风险。那么是否就意味着有了sudo人人都是root呢?sudo是一个临时的操作,只能短时给用户提高权限,本质是将用户暂时添加进sudoers文件(只有文件内包括的用户才能使用sudo命名提权)。

权限的修改

chmod命令

字母表示法

顾名思义就是利用字母代表权限进行操作。例如,o+w即代表,对Other加上写权限。

xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-rw-r-- 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ chmod o+w my.txt
xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-rw-rw- 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ 
# 给所有者添加执行权限
chmod u+x script.sh

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

# 设置文件权限为 rw-r-----
chmod u=rw,g=r,o= file.conf

数字表示法 

用数字设置权限位,1代表有权限,0则代表没有。每一个角色的权限位都是一个二进制的三位数。

xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-rw-rw- 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ chmod 777 my.txt
xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ 

chown和chgrp

chown和chgrp都是更改角色的指令,chown命令用来修改文件所有者和所属组,chgrp命令用来修改文件的所属组。

chown

修改拥有者

xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-rw-rw- 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ chmod 777 my.txt
xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ su -
Password: 
root@hcss-ecs-887f:~# cd /home/xian/lession1
root@hcss-ecs-887f:/home/xian/lession1# chowm xian tt.txt
Command 'chowm' not found, did you mean:
  command 'chown' from deb coreutils (8.32-4.1ubuntu1.2)
  command 'choom' from deb util-linux (2.37.2-4ubuntu3.4)
Try: apt install <deb name>
root@hcss-ecs-887f:/home/xian/lession1# chown xian tt.txt
root@hcss-ecs-887f:/home/xian/lession1# ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 xian root 0 May 18 11:11 tt.txt
root@hcss-ecs-887f:/home/xian/lession1# 

同时修改拥有者和所属组

root@hcss-ecs-887f:/home/xian/lession1# ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 xian root 0 May 18 11:11 tt.txt
root@hcss-ecs-887f:/home/xian/lession1# chown root tt.txt
root@hcss-ecs-887f:/home/xian/lession1# ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
root@hcss-ecs-887f:/home/xian/lession1# chown xian:xian tt.txt
root@hcss-ecs-887f:/home/xian/lession1# ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 xian xian 0 May 18 11:11 tt.txt
root@hcss-ecs-887f:/home/xian/lession1# 

chgrp

chgrp只能修改文件的所属组,我们用到的并不多,一般都只用chown.

root@hcss-ecs-887f:/home/xian/lession1# ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 xian xian 0 May 18 11:11 tt.txt
root@hcss-ecs-887f:/home/xian/lession1# chgrp root tt.txt
root@hcss-ecs-887f:/home/xian/lession1# ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 xian root 0 May 18 11:11 tt.txt
root@hcss-ecs-887f:/home/xian/lession1# 

目录权限

如果我们对一个文件没有读写和执行的权限,那么我们无法向文件执行读取,执行和写入操作。

xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ echo "hello"->tt.txt
-bash: tt.txt: Permission denied

我们对文件没有wrx权限,那么我们能删除这个文件吗?

xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
-rw-r--r-- 1 root root 0 May 18 11:11 tt.txt
xian@hcss-ecs-887f:~/lession1$ rm tt.txt
rm: remove write-protected regular empty file 'tt.txt'? y
xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
xian@hcss-ecs-887f:~/lession1$ 

这里可以看到xian对文件"tt.txt"没有wrx权限,但是我们依旧能对文件进行删除操作。这里有一个误区,删除一个文件本质上是将它移除它的父目录,而非直接操作文件本身,所以只要这个xian对lession1这个目录有w权限就能删除这个目录下的任何文件。

进入一个一个文件需要什么权限呢?当我们对一个目录没有任何权限,我们不能进入这个目录。

xian@hcss-ecs-887f:~$ ls -l
total 4
drwxrwxr-x 2 xian xian 4096 May 21 11:49 lession1
xian@hcss-ecs-887f:~$ chmod 000 lession1
xian@hcss-ecs-887f:~$ ls -l
total 4
d--------- 2 xian xian 4096 May 21 11:49 lession1
xian@hcss-ecs-887f:~$ cd lession1
bash: cd: lession1: Permission denied
xian@hcss-ecs-887f:~$ 

当对一个目录有x权限时,我们可以进入这个目录

xian@hcss-ecs-887f:~$ chmod u+x lession1
xian@hcss-ecs-887f:~$ ls -l
total 4
d--x------ 2 xian xian 4096 May 21 11:49 lession1
xian@hcss-ecs-887f:~$ cd lession1
xian@hcss-ecs-887f:~/lession1$ 

既然有x权限就可以进入目录,那么w和r对于目录意味着什么呢?

在linux中,w和r权限对于目录的含义与普通文件完全不同,要理解目录的权限,首先要理解目录,目录在Linux中是一种特殊文件,存储了其包含的文件/子目录的名称和inode指针。因此,权限控制的是对这份“目录清单”的操作能力。

r权限:

 没有r权限就不能查看目录下的文件名和子目录。

root@hcss-ecs-887f:~/lession1# cd /home/xian
root@hcss-ecs-887f:/home/xian# pwd
/home/xian
root@hcss-ecs-887f:/home/xian# ls -l
total 4
d--x------ 2 xian xian 4096 May 21 11:49 lession1
root@hcss-ecs-887f:/home/xian# su xian
xian@hcss-ecs-887f:~$ cd lession1
xian@hcss-ecs-887f:~/lession1$ ls
ls: cannot open directory '.': Permission denied
xian@hcss-ecs-887f:~/lession1$ 

w权限:

w权限决定了是否能修改目录的结构,如新建文件,删除文件,重命名文件。没有w权限,就不能执行相应的操作。

root@hcss-ecs-887f:/home/xian# ls -l
total 4
dr-xrwxr-x 2 xian xian 4096 May 21 11:49 lession1
root@hcss-ecs-887f:/home/xian# su xian
xian@hcss-ecs-887f:~$ cd lession1
xian@hcss-ecs-887f:~/lession1$ touch bb.txt
touch: cannot touch 'bb.txt': Permission denied
xian@hcss-ecs-887f:~/lession1$ 

linux用户隔离

一个linux系统,一般都是多个用户共同使用,不同的用户的数据肯定是不能互用的,那么linux多用户之间是怎么相互隔离的呢?用户的数据肯定是储存在用户这个目录下的,在新建用户的时候会新建一个目录来储存这个用户的数据。这个目录建立在home目录中

root@hcss-ecs-887f:/# cd home
root@hcss-ecs-887f:/home# ls
xian

缺省权限

在Linux系统中,对于普通文件,起始权限666默认不带可执行,gcc编译后会加上x权限;对于目录,起始权限777,默认就有x权限(没有x权限进不了目录)。但是我们创建的文件为什么不是默认666的权限呢

xian@hcss-ecs-887f:~/lession1$ touch hh.txt
xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-rw-r-- 1 xian xian 0 Jun 29 22:34 hh.txt
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
xian@hcss-ecs-887f:~/lession1$ 

 这是因为有umask(权限掩码),最终权限 = 起始权限 & (~umask)。

umask

为什么要有权限掩码呢?在大多数情况下,我们创建了一个文件是肯定会加上一些限制的,不会让所有人都随便访问,不设置访问和修改限制是极不安全的。最终权限 = 起始权限 & (~umask)。起始权限是由OS(操作系统)本身决定的,我们无法修改。通过对umask的修改就可以控制我们创建出的文件的初始权限。这样既保证了系统的灵活可配置性,也保证了我们对文件权限的控制权。

xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-rw-r-- 1 xian xian 0 Jun 29 22:34 hh.txt
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
xian@hcss-ecs-887f:~/lession1$ umask
0002

在这里我们的umash是0002(第一个0是特殊权限位,后三位为权限位),限制了others的写权限。直接输入umask就可以查看自己当前的umash,想要修改,直接在后面跟上数字就可以修改。 但是这样的修改只在当前的有效,退出终端后就失效,umask会自动恢复。

xian@hcss-ecs-887f:~/lession1$ umask 0027    # 设置为0027(文件默认权限640,目录750)
xian@hcss-ecs-887f:~/lession1$ touch cxk.txt
xian@hcss-ecs-887f:~/lession1$ ls -l
total 0
-rw-r----- 1 xian xian 0 Jun 29 22:55 cxk.txt
-rw-rw-r-- 1 xian xian 0 Jun 29 22:34 hh.txt
-rwxrwxrwx 1 xian xian 0 May 18 12:08 my.txt
xian@hcss-ecs-887f:~/lession1$ 

umask是储存在配置文件中的,想要彻底修改umask需修改配置文件

用户配置文件:

# 编辑用户配置文件
echo "umask 0027" >> ~/.bashrc    # 追加umask设置
source ~/.bashrc                  # 立即生效

全局配置文件:

sudo nano /etc/profile            # 在文件末尾添加 umask 0022
sudo nano /etc/bashrc             # 或修改其他全局配置文件

以下是适应不同场景的umask设置推荐


网站公告

今日签到

点亮在社区的每一天
去签到