一文读懂linux下文件权限

经常在部署一个网站的时候,已将代码上传了,数据库也导入了,配置文件也改动了。但输入域名一看,还是报错了,原因很可能就是因为文件权限导致的。今天一起来看看linux下文件权限

用户、组

linux哲学一切皆文件,所有文件都会有自己的所有者、所属组。另外,任何用户肯定必须属于一个组。除开文件的所有者和所在组的用户外,系统的其它用户都是文件的其它人。如何查看linux下的用户,可以通过查看/etc/passwd文件来查看。

# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
……

通过ls -l命令,可以查看文件的所有者、所属组等一些属性。

# ll
total 17484
drwxr-xr-x  3 root root     4096 Dec  2  2019 backup
drwxr-xr-x  2 root root     4096 May 15 08:32 bin
drwxr-xr-x 10 root root     4096 Jan  8  2020 c_language_code
drwxr-xr-x  2 root root     4096 Jun 12 10:46 c_practice
-rw-r--r--  1 root mail     8500 Sep 13 03:47 dead.letter

当然,我们可以通过命令来修改文件的所有者及所属组

# 同时改变用户和组 -R表示递归修改
# chown -R www:www backup
# ll -d backup
drwxr-xr-x 3 www www 4096 Dec  2  2019 backup

# 仅改变用户
# chown -R root backup
# ll -d backup
drwxr-xr-x 3 root www 4096 Dec  2  2019 backup

# 仅改变组
# chown -R :root backup
# ll -d backup
drwxr-xr-x 3 root root 4096 Dec  2  2019 backup
# 还可以通过chgrp改变组
# chgrp -R www backup/

文件权限

现在我们来看看文件的权限,查看文件的权限也是通过ls -l来查看。

drwxr-xr-x

上面共10个字符,可以分为四组,d、rwx、r-x、r-x。

  • d表示该文件的类型,常见的有-(文件),d(目录),b(块设备)
  • 第二组表示的是文件的用户所拥有的权限,rwx分别表示为可读、可写、可执行。如果以-代替,则表示没有那个权限。
  • 第三组表示的是文件的组所拥有的权限
  • 第四组表示的是文件的其他人所拥有的权限

可读可写可执行说起来有点抽象,另外对于不同文件类型,所表示的意义又有不同。下面,我列一个表格来帮助大家来理解:

文件 目录
r表示可以查阅该文件的信息,可以通过cat/less/more/head/tail等命令查阅文件信息 r表示可以列出该目录下文件列表,可以执行ls命令
w表示可以修改文件内容,可以通过vim修改文件内容 w表示可以在该目录下创建或删除文件,可以执行touch、mv等命令
x表示可以执行该文件 x表示可以进入到该目录下,可以执行cd命令

下面,来看一个命令chmod,通过该命令可以修改文件的权限。先介绍下权限的数字表示法:

  • r 4
  • w 2
  • x 1
# chown -R root:root study_file/
# chmod 700 study_file/ #数字方法设置权限
# ll -d study_file/
drwx------ 2 root root 4096 5月   5 13:13 study_file/

# chmod u=rwx,g=r,o=r 1.txt
# chmod a-x 1.txt
# chmod 600 *.txt
# ll
总用量 4
-rw------- 1 root root 34 5月   5 12:22 1.txt
-rw------- 1 root root  0 5月   5 13:13 2.txt
-rw------- 1 root root  0 5月   5 13:13 3.txt

文件默认权限

当我们创建一个文件时,这个文件默认就会设置权限。

# touch 1.txt
# ls -l 1.txt 
-rw-r--r-- 1 root root 0 Sep 13 14:48 1.txt

# mkdir abc
# ll -d abc
drwxr-xr-x 2 root root 4096 Sep 13 14:51 abc

可以看到,新创建的文件权限为644。那么这个644是怎么来的呢?原来系统会给新创建的文件默认权限,这个默认权限可以通过umask来查看。

# umask
0022
# umask -S
u=rwx,g=rx,o=rx

通过umask -S查看的权限即为新创建目录的默认权限,如果是文件的话,则需要减去x权限,所以新文件的默认权限是644(rw-r-xr-x)

文件隐藏属性

不知道大家用过宝塔没,当我们通过宝塔新建一个站点的时候,宝塔默认会在网站的根目录下创建一个.user.ini文件。这个文件很奇怪,即使你是root用户,想要删除它也办不到。

# rm -f .user.ini 
rm: cannot remove ‘.user.ini’: Operation not permitted

这里我们要将下另一个概念,文件的隐藏属性,为什么叫隐藏属性呢?因为你通过ls -l是看不出这个文件有什么不一样的。

# ll .user.ini 
-rw-r--r-- 1 root root 51 Sep  5 18:48 .user.ini

想要看出蹊跷,就需要使用lsattr来查看

# lsattr .user.ini 
----i--------e-- .user.ini

这里,我们需要记住几个字符的含义:

  • i表示系统不允许对这个文件进行任何的修改。如果目录具有这个属性,那么任何的进程只能修改目录之下的文件,不允许建立和删除文件。
  • a表示系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。

所以,如果我们想要删除这个文件就需要修改它的隐藏属性。通过chattr可以做到:

# chattr -i .user.ini 
# rm -f .user.ini  <===删除成功了

文件特殊权限

是不是感觉linux文件权限太复杂了,怎么又来一个特殊权限。心疼头发三秒~。

我们来看一个文件

ls /usr/bin/passwd  -l
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

发现没有,怎么出现了一个奇怪的东西s。这个s出现在了文件所有者的x上面,此时就被称为Set UID,简称为SUID。如果出现在所属组的x上面,则表示SGID。如果是在其他人的x上面,则表示Sticky。

下面通过一个表格来解释下各特殊权限的用处:

文件 目录
SUID 此用户将继承此程序的所有者权限 无意义
SGID 此用户将继承此程序的所属组权限 此目录下所有用户新建文件都自动继承此目录的用户组
Sticky 无意义 目录中每个用户仅能删除、移动或改名自己的文件或目录

下面,我们通过/usr/bin/passwd这个文件来讲解下SUID的用途。

我们知道,linux下每个用户都可以修改自己的密码,而root则可以修改所有用户的密码。那你有没有想过,为什么普通用户也可以修改自己的密码?密码不是保存在/etc/shadow文件中的么?这个文件对于普通用户没有写入权限阿。

# ls -l /etc/shadow
---------- 1 root root 969 Sep 10 09:37 /etc/shadow

这个就是SUID的用途了,普通用户通过passwd命令来修改自己的密码。执行期间,用户会暂时拥有该文件所有者即root的权限,所以普通用户可以修改自己的密码。如果该文件特殊权限为SGID,那么执行期间就会拥有该文件所属组的权限。

SGID除了可以作用于文件外,还可以作用于目录,注意,对于文件和目录,它的作用完全不同。我们通过一个场景来讲解SGID对于目录的作用。

下面,我们模拟一个场景:公司现在需要开发一个项目,原型图已经给出,需要交给设计部门design进行设计。现在创建一个目录project1_ps。design部门所有人员对这个目录下的文件均具有rwx权限。

我们知道,在linux中,当新建一个文件或目录时,所有者是自己,所属组为自己所属的组。这样一来,当设计师a新建了一个文件时,其他用户对这个文件是其他人的权限,不符合我们的要求。所以,我们需要SGID来完成需求。

# groupadd design  #创建design用户组
# useradd -G design --no-create-home dgn1 # 创建用户
# useradd -G design --no-create-home dgn2 # 创建用户
# id dgn1
uid=1003(dgn1) gid=1004(dgn1) 组=1004(dgn1),1003(design)
# id dgn2
uid=1004(dgn2) gid=1005(dgn2) 组=1005(dgn2),1003(design)

# mkdir design # 工作目录
# chgrp design design/
# chmod 2770 design/  <== 如果是SUID则是4770
# ll -d design/
drwxrws--- 2 root design 4096 5月   5 19:06 design/

# su dgn1
$ umask
0022
$ umask 0002
$ touch design/1.ps
$ ls design -l
总用量 0
-rw-rw-r-- 1 dgn1 design 0 5月   5 19:31 1.ps  <=== 新创建的文件默认组为design了

最后,我们来看看Sticky。这个非常好理解,目录中每个用户仅能删除、移动或改名自己的文件或目录。其实/tmp目录就是使用该特殊权限。

# ll /tmp -d
drwxrwxrwt. 9 root root 868352 Sep 13 08:24 /tmp