注意:权限限制是对普通用户适用的,但对 root 不适用。root 是不受权限限制的。
文件基本权限
ls -l # 查看文件权限
文件类型和权限 | 包含多少个文件目录 | 文件所属用户(属主) | 文件所属用户组(属组) | 文件大小(单位:字节) | 文件最后修改时间 | 文件名称 |
---|---|---|---|---|---|---|
drwxr-xr-x. | 3 | root | root | 21 | Dec 21 17:16 | app |
文件类型和权限(10个字符):
- 第一个字符[-dlbcfs]:为文件类型
-
:文件d
:目录l
:符号链接(类似windows的快捷方式)b
:块特殊文件【设备】:如移动硬盘,插入移动硬盘后,linxu会把移动硬盘看成是块特殊文件来进行操作。c
:字符特殊文件【设备】:如终端f
:命名管道【进程相关】s
:套接字文件【通信相关】
- 后面9个字符:文件权限
- 从左往右:
- 1~3 文件所属用户的权限
- 4~6 文件所属用户组的权限(文件所属用户并不一定存在于文件所属组,只是创建文件时,会将用户以及其初始组作为新文件的的所属用户以及所属用户组)
- 7~9 除了所属用户和所属用户组外,其他的用户及用户组的权限
- 从左往右:
注意:不同类型的文件,权限的rwx的含义是不同的。
普通文件:
- r:读
- w:写
- x:执行
数字权限的表示方法:
- r=4
- w=2
- x=1
其实就是100、010、001 八进制的表示方式。
-rw-r-xr-- 1 tom yesgroup mtime test1
- test1这个文件是普通文件(rwx分别为读、写、执行)
- rw-:tom 对 test1 有读、写的权限
- r读:如
cat
- w写
- r读:如
- r-x:yesgroup用户组的用户对 test1 有读、执行的权限。
- r读:如
cat
- x执行:像
ls
、cat
本身就是文件,只是可以当作命令来执行,这就是文件的可执行。
- r读:如
- r–:除了tom以及yesgroup用户组中的所有用户外,其他的用户对 test1 有读的权限。
其实vim对文件的写,并非是真正的直接将内容写入到文件。底层实际上,复制一个以点开头的文件(隐藏文件),所有写入的内容是写入到这个隐藏文件中。当进行保存并且退出时,隐藏文件会替换原有的文件。【因此vim并非直接往文件中写入,因此对文件的写权限,不要用vim来进行测试,可以使用
echo xxx > 该文件
来测试】若用户对文件只有读权限,没有写权限,也可以通过vim来成功对该文件进行写入保存,但是使用echo写入则会报错说“没有权限”。
若用户对文件连读的权限都没有(用vim打开也看不到内容),也仍然可以用vim成功进行写入保存(保存关闭后也看不到内容,但用root可以看到这个文件内容被新写入内容覆盖了[而非将新写入内容追加到文件尾])。
目录文件:
- x:进入目录
- rx:显示目录内的文件名
- wx:修改目录内的文件名(也可以直接删除目录内文件)
如果没有x权限,比如只有r权限,则可以通过
ll
或ls
看到目录中有哪些文件,但是看不到这些文件的具体属性;而如果只有w权限,则真的什么都做不到,要修改目录中的文件名或删除文件,都需要有进入该目录的权限。如果仅有wx而没有r权限,虽然不能显示目录中有什么文件,但如果你本来就知道有什么文件,仍然可以直接对这些文件进行重命名、删除等操作。
新创建的文件的权限
新创建的文件有默认权限,根据 umask值
计算,属主和属组根据当前进程的用户来设定。
修改权限命令
chmod # 修改文件、目录权限【普通用户也可以执行此命令,前提是这个用户是该文件的属主(仅仅是同一属组是不可以的)】
chown # 更改属主、属组【只有root用户有权限执行此命令】【权限更改立即生效】
chgrp # 可以单独更改属组,不常用【只有root用户有权限执行此命令】【权限修改立即生效】
修改文件的属主、属组
# 修改文件属主
chown 新用户(新属主) 文件 # 修改文件属主
chown uesr1 testdir # 将文件 testdir 的属主改为 user1
# 修改文件属组
chown :新用户组(新所属用户组) 文件 # 修改文件属组
chown :group1 testdir # 将文件 testdir 的属组改为 group1
chgrp 新用户组(新所属用户组) 文件 # 修改文件属组
chgrp group1 testdir # 将文件 testdir 的属组改为 group1
# 同时修改文件属主与属组
chown 新用户(新属主):新用户组(新所属用户组) 文件
chown user1:group1 testdir # 将文件 testdir 的属主改为 user1 , 属组改为 group1。
修改文件的权限
权限有两种表示方式:
- 字符:rwx
- 数字:7或6或5或4或3或2或1(r=4,w=2,x=1的组合)
以字符方式修改权限
chmod 范围+-=权限 文件
范围:
- u:属主
- g:属组
- o:除属主、属组外的其他用户
- a:所有用户(u+g+o)
修改符号:
+
:添加-
:减少=
:设定为
chmod u+w testfile # 对文件 testfile 的属主添加写权限(如果本身就已经有写权限,也不会报错)
chmod g-x testfile # 对文件 testfile 的属组删除执行权限(如果本身就没有执行权限,也不会报错)
chmod a+w testfile # 对文件 testfile 的所有用户同时添加写权限
以数字方式修改权限
和以字符方式修改权限不同,以数字方式修改权限需要同时设定3段权限(属主、属组、其他用户)的数值,而不能单独对属主、属组、其他用户来设置。
chmod 644 testfile # 等同于 rw--w--w-
chmod 764 testfile # 等同于 rwxrw--w-
注意:如果文件的属主刚好是文件的属组中的成员,而属主与属组的权限又发生了冲突,则对于该属主用户,以属主的权限为准。
如属主只有读的权限,属组只有写的权限,则属主只能读,不能写。可以理解成属组权限实际上是指除属主以外的属组成员的权限。
新创建的文件的默认权限
默认权限参考 umask
值来改变。
umask值
因shell的登录方式(non-login shell 或 login shell)可能还不一样(默认是一样的,但可以修改成不一样的)。默认情况下:
账号 uid大于199 且 uid=gid 的时候,且 用户名=用户组名 的时候,umask值是 002,而其他用户下,umask值是022。(并且umask还可以被修改)
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then umask 002 else umask 022 fi
参考: https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_001.html
对于文件和目录来说, 最大的权限其实都是777,但是执行权限对于文件来说,很可怕,而对目录来说执行权限是个基本权限。所以默认目录的最大权限是777,而文件的默认最大权限就是666。
普通文件默认权限原本为 666,但需要减去 umask值
【可以直接在命令行中键入 umask 回车来查看 umask值(0022)】。
因此 666 - 022 = 644 ,默认权限为 rw--w--w-
。
目录文件默认权限原本为 777, 减去 umask值
后:777 - 022 = 755,默认权限为 rwxr-xr-x
。
修改 umask
临时修改,重新打开另一个终端即失效。
umask 023
umask 23
# 效果都是 0023
永久修改,需要直接写入文件。
影响默认umask值
的文件:
# 修改均非立即生效,需要重新登录/另外打开一个终端。
/etc/bashrc # non-login shell
/etc/profile # login shell
-
non-login shell 指的是,你开机登录系统后(图形界面),然后去打开terminal,此时不需要再次输入密码登录。这就是所谓的 non-login shell。
-
login shell 则是比如你已经terminal 登录了,现在要切换用户,如果使用
su 用户名
,因为没有变更shell,所以即便输入了密码登录还是 non-login,但如果你使用su - 用户名
,会在输入密码后登录到该用户名的shell,这种就是 login shell 的登录方式。- login shell方式登录的时候,那么首先会读取和执行
/etc/profiles
(这个是整体配置文件)
- login shell方式登录的时候,那么首先会读取和执行
特殊权限
由于 rwx
3 种权限并不能满足日常所有的工作需要,所以 Linux 设计了一些特殊的权限。
但特殊的权限不建议用户手动去指定,建议保持系统的默认权限即可。
SUID 用于二进制可执行文件,执行命令时取得文件属主的权限
# 如 /usr/bin/passwd
SGID
# 用于文件时,与SUID类似,在执行该文件时,用户将获得该文件所属组的权限。
# 【意义重大】用于目录时,在该目录下创建新的文件和目录,权限自动更改为该目录的属组
SBIT 用于目录,该目录下新建的文件和目录,仅root和自己可以删除
# 如 /tmp
SUID
Set UID。用于二进制可执行文件,执行命令时取得文件属主的权限
效果:rwx
的x
会变为 s
(小写s)。
-
注意:如果显示的是
S
(大写S),则说明这个位置虽然是设置了SUID,但是原本属主就没有x权限。
如:/usr/bin/passwd
文件类型和权限 | 包含多少个文件目录 | 文件所属用户(属主) | 文件所属用户组(属组) | 文件大小(单位:字节) | 文件最后修改时间 | 文件名称 |
---|---|---|---|---|---|---|
-rwsr-xr-x. | 1 | root | root | 27856 | Mar 31 2020 | /usr/bin/passwd |
s
表示的意思是:不管是 root 用户还是普通用户,在执行这条命令的时候,都会以这个文件的属主(当前该文件的属主是 root)的身份来执行操作
当然,可以往
visudo
里添加这条命令(文件)给特定的用户,但是一旦用户很多,这个权限控制就会变得困难。因此 Linux 使用了这种SUID
特殊权限来进行设置。
chmod 4xxx 文件
# xxx为原本的3个数字权限
chmod 4700 testfile
SGID
Set GID。
用于文件时,与SUID类似,在执行该文件时,用户将获得该文件所属组的权限。
用于目录,在该目录下创建新的文件和目录,权限自动更改为该目录的属组
当 s 权限位于所属组的 x 权限位时,就被称为 SetGID,简称 SGID
特殊权限。
用于目录时,一般是在做文件共享的时候使用。
参考:https://blog.csdn.net/xiaocainiaoshangxiao/article/details/17378611?utm_source=blogxgwz9#commentBox
当
SGID
作用于目录时,意义就非常重大了。当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID
修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。
chmod 2xxx 文件/目录文件
# xxx为原本的3个数字权限
chmod 2755 testfile
SBIT
Sticky Bit。用于目录,该目录下新建的文件和目录,仅root和自己可以删除
效果:rwx
的x
会变为t
(小写t)。
-
注意:如果显示的是
T
(大写T),则虽然这个位置设置了SBIT
,但是原本其他用户是没有x权限的。
如:/tmp
文件类型和权限 | 包含多少个文件目录 | 文件所属用户(属主) | 文件所属用户组(属组) | 文件大小(单位:字节) | 文件最后修改时间 | 文件名称 |
---|---|---|---|---|---|---|
drwxrwxrwt. | 29 | root | root | 4096 | Jan 30 19:28 | /tmp |
chmod 1xxx 文件目录
# xxx为原本的3个数字权限
chmod 1755 testdir
那 user1 在 /tmp 下创建了一个目录,user2虽然不能删除这个目录,可否在这个目录里新建文件(之后再删除这个文件)呢?这具体就看 user1 创建的那个目录是否允许其他用户在该目录下创建用户了。默认该目录的权限应该为:drwxr-xr-x
(755),因此,默认是不允许其他用户在其中创建文件的。
注意: chmod
除了可以使用 4xxx、2xxx、1xxx来设置特殊权限,还可以通过组合。如3xxx,就是同时设置了2xxx 与 1xxx;7xxx就时同时设置了 4xxx、2xxx、1xxx。