在Linux中我们可以使用ll -l或者lls-l命令来显示一个文件的属性以及文件所属的用户和组
除此之外,"d"在Linux中代表该文件是一个目录文件,我们有时会看到 s(针对可执行文件或目录,使文件在执行阶段,临时拥有文件所有者的权限)和 t(针对目录,任何用户都可以在此目录中创建文件,但只能删除自己的文件),文件设置 s 和 t 权限,会占用 x 权限的位置。
在Liux中第一个字符代表这个文件是目录、文件或链接文件等等:
rwx
的三个参数的组合。以 root 的身份登陆 Linux,并执行如下指令:
[root@CncLucZK test]# ll -l
total 5280
-rw-r--r-- 1 root root 38 Oct 12 23:10 add.sh #root用户都没有执行权限x,其他用户也没有
-rw-r--r-- 1 root root 41 Oct 12 23:10 awk.sh
-rw-r--r-- 1 root root 5324748 Oct 12 23:10 blog.docx
drwxr-xr-x 3 root root 4096 Oct 9 21:11 config
-rwxr-xr-x 1 zk zk 90 Oct 13 18:56 demo2.txt
-rw-r--r-- 1 root root 90 Oct 13 20:06 demonew.txt
-rw-r--r-- 1 root root 90 Oct 14 00:53 demoold.txt
-rw-r--r-- 1 root root 2612 Oct 12 23:10 demotmo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
-rw-r--r-- 1 root root 79 Oct 12 23:10 demo.txt.bz2
-rw-r--r-- 1 root root 312 Oct 13 20:07 differ.patch
-rw-r--r-- 1 root root 0 Oct 13 19:03 differ.txt
-rw-r--r-- 3 root root 95 Oct 12 23:10 hardlink.txt
-rw-r--r-- 3 root root 95 Oct 12 23:10 index.html
-rw-r--r-- 1 root root 37 Oct 12 23:10 replace.txt
-rw-r--r-- 1 root root 9 Oct 12 23:10 softlink
-rw-r--r-- 1 root root 381 Oct 12 23:10 test1.sh
-rwxr-xr-x 1 root root 117 Oct 12 23:10 test.sh
lrwxrwxrwx 1 root root 7 Oct 12 23:10 tmp_s.txt -> tmp.txt #tmp_s.txt快捷方式指向tmp.txt具体文件或目录
-rw-r--r-- 1 root root 6 Oct 12 23:10 tmp.txt
drwx--x--x 4 root root 4096 Oct 12 23:10 user
drwx--x--x 6 root root 4096 Oct 12 23:10 users
-rw-r--r-- 1 root root 382 Oct 13 18:33 users.tar.gz
从左至右用 0-9 这些数字来表示。
第 0 位确定文件类型,第 1-3 位确定属主(该文件的所有者)拥有该文件的权限。
第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。
其中,第 1、4、7 位表示读权限,如果用 r 字符表示,则有读权限,如果用 - 字符表示,则没有读权限;
第 2、5、8 位表示写权限,如果用 w 字符表示,则有写权限,如果用 - 字符表示没有写权限;第 3、6、9 位表示可执行权限,如果用 x 字符表示,则有执行权限,如果用 - 字符表示,则没有执行权限。
可能其他版本或早些版本还有一位,最后一位此文件受 SELinux 的安全规则管理
r --> 4
w --> 2
x --> 1
所有者 = rwx = 4+2+1 = 7
所属组 = rw- = 4+2 = 6
其他人 = r-x = 4+1 = 5
[root@CncLucZK ~]# chmod [-R] 权限值 文件名 #权限值就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
[root@CncLucZK test]# ll -l demo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK test]# chmod 776 demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rwxrwxrw- 1 zk root 2612 Oct 15 23:01 demo.txt
通常我们以 Vim 编辑 Shell 文件批处理文件后,文件权限通常是 rw-rw-r–(644),那么,如果要将该文件变成可执行文件,并且不让其他人修改此文件,则只需将此文件的权限该为 rwxr-xr-x(755)即可。
既然文件的基本权限就是 3 种用户身份(所有者user、所属组group和其他人others)搭配 3 种权限(rwx),chmod 命令中用 u、g、o 分别代表 3 种身份,还用 a 表示全部的身份(all 的缩写)。另外,chmod 命令仍使用 r、w、x 分别表示读、写、执行权限。
使用字母修改文件权限的 chmod 命令,其基本格式如下图所示。
如果我们要设定 demo.txt 文件的权限为 rwxr-xr-x,则可执行如下命令:
[root@CncLucZK test]# chmod 644 demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK test]# chmod u=rwx,go=rx demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rwxr-xr-x 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK test]# chmod 644 demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rw-r--r-- 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK test]# chmod a+w demo.txt
[root@CncLucZK test]# ll -l demo.txt
-rw-rw-rw- 1 zk root 2612 Oct 15 23:01 demo.txt
[root@CncLucZK ~]# chmod u+x,g+x,o+x demo.txt
[root@CncLucZK ~]# ll -d demo.txt
-rwxr-xr-x 1 root root 59 Oct 10 23:09 demo.txt
[root@CncLucZK ~]# chmod a-x demo.txt
[root@CncLucZK ~]# ll -d demo.txt
-rw-r--r-- 1 root root 59 Oct 10 23:09 demo.txt
Linux 是注重安全性的操作系统,而安全的基础在于对权限的设定,不仅所有已存在的文件和目录要设定必要的访问权限,创建新的文件和目录时,也要设定必要的初始权限。Windows 系统中,新建的文件和目录时通过继承上级目录的权限获得的初始权限,而 Linux 不同,它是通过使用 umask 默认权限来给所有新建的文件和目录赋予初始权限的。
如何得知 umask 默认权限的值呢?直接通过 umask 命令即可:
[root@CncLucZK ~]# umask
0022
#root用户默认是0022,普通用户默认是 0002
umask 默认权限由 4 个八进制数组成,但第 1 个数代表的是文件所具有的特殊权限(SetUID、SetGID、Sticky BIT),后 3 位数字 “022” 才是本节真正要用到的 umask 权限值,将其转变为字母形式为 ----w–w-。
注意,虽然 umask 默认权限是用来设定文件或目录的初始权限,但并不是直接将 umask 默认权限作为文件或目录的初始权限,还要对其进行 “再加工”。
文件(或目录)的初始权限 = 文件(或目录)的最大默认权限 - umask权限
显然,如果想最终得到文件或目录的初始权限值,我们还需要了解文件和目录的最大默认权限值。在 Linux 系统中,文件和目录的最大默认权限是不一样的:
接下来,我们利用字母权限的方式计算文件或目录的初始权限。以 umask 值为 022 为例,分别计算新建文件和目录的初始权限:
[root@CncLucZK test]# ll demotmo.txt
-rw-r--r-- 1 root root 2612 Oct 12 23:10 demotmo.txt
[root@CncLucZK test]# ll -d users
drwx--x--x 6 root root 4096 Oct 12 23:10 users
注意,在计算文件或目录的初始权限时,不能直接使用最大默认权限和 umask 权限的数字形式做减法,这是不对的。例如,若 umask 默认权限的值为 033,按照数字形式计算文件的初始权限,666-033=633,但我们按照字母的形式计算会得到 (rw-rw-rw-) - (----wx-wx) = (rw-r–r–),换算成数字形式是 644。
这里的减法,其实是“遮盖”的意思,也就是说,最大默认权限中和 umask 权限公共的部分,通过减法运算会被遮盖掉,最终剩下的“最大默认权限”,才是最终赋予文件或目录的初始权限。
[root@CncLucZK test]# umask
0022
[root@CncLucZK test]# su - zk
Last login: Sat Oct 15 23:12:21 CST 2022 on pts/0
[zk@CncLucZK ~]$ umask
0002
[zk@CncLucZK ~]$ umask 0003
[zk@CncLucZK ~]$ umask
0003
不过,这种方式修改的 umask 只是临时有效,一旦重启或重新登陆系统,就会失效。如果想让修改永久生效,则需要修改对应的环境变量配置文件 /etc/profile。例如:
[root@CncLucZK test]# vi /etc/profile
...
if [ $UID -gt 199]&&[ "'id -gn'" = "'id -un'" ]; then
umask 002
#如果UID大于199(普通用户),则使用此umask值
else
umask 022
#如果UID小于199(超级用户),则使用此umask值
fi
…
参考文献:
Linux 文件基本属性
Linux权限位(超详细)