Linux 文件权限

注意:权限限制是对普通用户适用的,但对 root 不适用。root 是不受权限限制的。

文件基本权限

ls -l   # 查看文件权限
文件类型和权限包含多少个文件目录文件所属用户(属主)文件所属用户组(属组)文件大小(单位:字节)文件最后修改时间文件名称
drwxr-xr-x.3rootroot21Dec 21 17:16app

文件类型和权限(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-x:yesgroup用户组的用户对 test1 有读、执行的权限。
    • r读:如cat
    • x执行:像lscat本身就是文件,只是可以当作命令来执行,这就是文件的可执行。
  • r–:除了tom以及yesgroup用户组中的所有用户外,其他的用户对 test1 有读的权限。

其实vim对文件的写,并非是真正的直接将内容写入到文件。底层实际上,复制一个以点开头的文件(隐藏文件),所有写入的内容是写入到这个隐藏文件中。当进行保存并且退出时,隐藏文件会替换原有的文件。【因此vim并非直接往文件中写入,因此对文件的写权限,不要用vim来进行测试,可以使用echo xxx > 该文件 来测试】

若用户对文件只有读权限,没有写权限,也可以通过vim来成功对该文件进行写入保存,但是使用echo写入则会报错说“没有权限”。

若用户对文件连读的权限都没有(用vim打开也看不到内容),也仍然可以用vim成功进行写入保存(保存关闭后也看不到内容,但用root可以看到这个文件内容被新写入内容覆盖了[而非将新写入内容追加到文件尾])。

目录文件:

  • x:进入目录
  • rx:显示目录内的文件名
  • wx:修改目录内的文件名(也可以直接删除目录内文件)

如果没有x权限,比如只有r权限,则可以通过llls看到目录中有哪些文件,但是看不到这些文件的具体属性;而如果只有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。

修改文件的权限

权限有两种表示方式:

  1. 字符:rwx
  2. 数字: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(这个是整体配置文件)

特殊权限

由于 rwx 3 种权限并不能满足日常所有的工作需要,所以 Linux 设计了一些特殊的权限。

但特殊的权限不建议用户手动去指定,建议保持系统的默认权限即可。

SUID    用于二进制可执行文件,执行命令时取得文件属主的权限
# 如 /usr/bin/passwd

SGID    
# 用于文件时,与SUID类似,在执行该文件时,用户将获得该文件所属组的权限。
# 【意义重大】用于目录时,在该目录下创建新的文件和目录,权限自动更改为该目录的属组

SBIT    用于目录,该目录下新建的文件和目录,仅root和自己可以删除
# 如 /tmp

SUID

Set UID。用于二进制可执行文件,执行命令时取得文件属主的权限

效果:rwxx 会变为 s (小写s)。

  • 注意:如果显示的是S(大写S),则说明这个位置虽然是设置了SUID,但是原本属主就没有x权限。

如:/usr/bin/passwd

文件类型和权限包含多少个文件目录文件所属用户(属主)文件所属用户组(属组)文件大小(单位:字节)文件最后修改时间文件名称
-rwsr-xr-x.1rootroot27856Mar 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和自己可以删除

效果:rwxx会变为t(小写t)。

  • 注意:如果显示的是T(大写T),则虽然这个位置设置了SBIT,但是原本其他用户是没有x权限的。

如:/tmp

文件类型和权限包含多少个文件目录文件所属用户(属主)文件所属用户组(属组)文件大小(单位:字节)文件最后修改时间文件名称
drwxrwxrwt.29rootroot4096Jan 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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值