Linux笔记:文件权限与归属

简介: 文件类型 -:普通文件 d:目录文件 l:链接文件 b:块设备文件 c:字符设备文件 p:管道文件 所属与权限 每个文件和目录都有所属的 所有者 所有组 并且规定了文件的所有者u、所有组g以及其他人o对文件所拥有的权限 r 可读 w 可写 x 可执行 目录文件的权限 r 表示能够读取目录内的文件列表; w 表示能够在目录内新增、删除、重命名文件; x 表示能够进入该目录。

文件类型

  • -:普通文件
  • d:目录文件
  • l:链接文件
  • b:块设备文件
  • c:字符设备文件
  • p:管道文件

所属与权限

每个文件和目录都有所属的

  • 所有者
  • 所有组

并且规定了文件的所有者u、所有组g以及其他人o对文件所拥有的权限

  • r 可读
  • w 可写
  • x 可执行

目录文件的权限

  • r 表示能够读取目录内的文件列表;
  • w 表示能够在目录内新增、删除、重命名文件;
  • x 表示能够进入该目录。

要开放目录给任何人浏览时,应该至少也要给予 r 及 x 的权限

特殊权限

SUID、 SGID 与 SBIT 的特殊权限位

SUID

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。

查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。

[root@localhost ~]# ls -l /etc/shadow
----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
[root@localhost ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd

如果原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。

所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在 /etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。

SGID

SGID 主要实现如下两种功能:

  • 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)
  • 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)

第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。

[root@localhost ~]# cd /tmp
[root@localhost tmp]# mkdir testdir
[root@localhost tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Dec 26 19:05 testdir/
[root@localhost tmp]# chmod -Rf 777 testdir/
[root@localhost tmp]# chmod -Rf g+s testdir/
[root@localhost tmp]# ls -ald testdir/
drwxrwsrwx. 2 root root 6 Dec 26 19:05 testdir/
SBIT

SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件

当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T;
原本有 x 执行权限则会写成 t;
原本没有 x 执行权限则会被写成 T。

[root@localhost tmp]# su - jon
Last login: Wed Dec 26 19:10:03 CST 2018 on pts/0
[jon@localhost tmp]$ ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Dec 26 19:07 /tmp
[jon@localhost ~]$ cd /tmp
[jon@localhost tmp]$ ls -ald
drwxrwxrwt. 17 root root 4096 Dec 26 19:07 .
[jon@localhost tmp]$ echo "Hello World." > test
[jon@localhost tmp]$ chmod 777 test
[jon@localhost tmp]$ ls -al test
-rwxrwxrwx. 1 jon jon 10 Dec 26 19:10 test

文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限

[root@localhost tmp]# su - test
Last login: Wed Dec 26 19:15:29 CST 2017 on pts/1
[test@localhost ~]$ cd /tmp
[test@localhost tmp]$ rm -f test
rm: cannot remove ‘test’: Operation not permitted

[test@localhost tmp]$ exit
Logout
[test@localhost tmp]# cd ~
[root@localhost ~]# chmod -R o+t testdir/
[root@localhost ~]# ls -ld linux/
drwxrwsrwt. 2 root root 6 Dec 26 19:34 testdir/

chmod [参数] 权限 文件或目录名称
chmod ['[ugoa]*(-+=)+|-+=+'] 文件或目录名称
X并非实际的权限,man的解释
execute/search only if the file is a directory or already has execute permission for some user (X)

  • 对于文件ugo必须其中之一有x权限,然后使用X才有效。如果任何用户都没有x权限,则使用X不生效,不会添加x权限。
  • 对于目录使用X和x的效果一样。

chown [参数] 所有者:所属组 文件或目录名称
-R 递归操作

chgrp [参数] 组 文件或目录名称

文件的隐藏属性

即被隐藏起来的权限,默认情况下不能直接被用户发觉。

chattr 命令用于设置文件的隐藏权限
chattr [参数] 文件,通过 +参数或 -参数来增加或移除隐藏权限

  • i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
  • a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
  • S 文件内容在变更后立即同步到硬盘(sync)
  • s 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
  • A 不再修改这个文件或目录的最后访问时间(atime)
  • b 不再修改文件或目录的存取时间
  • D 检查压缩文件中的错误
  • d 使用 dump 命令备份时忽略本文件/目录
  • c 默认将文件或目录进行压缩
  • u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
  • t 让文件系统支持尾部合并(tail-merging)
  • X 可以直接访问压缩文件中的内容
[root@localhost ~]# echo "for Test" > test
[root@localhost ~]# chattr +a test
[root@localhost ~]# rm test
rm: remove regular file ‘test’? y
rm: cannot remove ‘test’: Operation not permitted

lsattr 命令用于显示文件的隐藏权限
lsattr [参数] 文件

[root@localhost ~]# ls -al test
-rw-r--r--. 1 root root 9 Dec 26 19:45 test
[root@localhost ~]# lsattr test
-----a---------- test
[root@localhost ~]# chattr -a test
[root@localhost ~]# lsattr test
---------------- test
[root@localhost ~]# rm test
rm: remove regular file ‘test’? y

文件访问控制列表

一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。
对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。

  • 基于普通文件或目录设置 ACL 其实就是针对指定的用户或用户组设置文件或目录的操作权限。
  • 如果针对某个目录设置了 ACL,则目录中的文件会继承其 ACL;
  • 若针对文件设置了 ACL,则文件不再继承其所在目录的 ACL。

在没有针对普通用户对 root 管理员的家目录设置 ACL之前,普通用户无法访问 /root 目录

[root@localhost ~]# su - jon
Last login: Wed Dec 26 19:51:12 CST 2018 on pts/0
[jon@localhost ~]$ cd /root
-bash: cd: /root: Permission denied
[jon@localhost root]$ exit

setfacl 命令用于管理文件的 ACL 规则
文件的 ACL 提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用 setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。

setfacl [参数] 文件名称

  • -R 递归参数,针对目录文件
  • -m 针对普通文件
  • -b 删除某个文件的 ACL
[root@localhost ~]# setfacl -Rm u:jon:rwx /root
[root@localhost ~]# su - jon
Last login: Wed Dec 26 19:55:02 CST 2018 on pts/1
[jon@localhost ~]$ cd /root
[jon@localhost root]$ ls
anaconda-ks.cfg Downloads Pictures Public
[jon@localhost root]$ cat anaconda-ks.cfg
[jon@localhost root]$ exit

文件的权限最后一个点(.)变成了加号(+) ,这就意味着该文件已经设置了 ACL 了。

[root@localhost ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 6 2018 /root

getfacl 命令用于显示文件上设置的 ACL 信息
getfacl 文件名称

[root@localhost ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:jon:rwx
group::r-x
mask::rwx
other::

目录
相关文章
|
18天前
|
Linux
Linux(5)WIFI/BT调试笔记
Linux(5)WIFI/BT调试笔记
36 0
|
19天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
2月前
|
人工智能 安全 Unix
Linux常用命令笔记大全(建议收藏!!)
Linux常用命令笔记大全(建议收藏!!)
74 0
|
20天前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
2月前
|
安全 Ubuntu Shell
Linux之用户权限和文件权限详解
Linux之用户权限和文件权限详解
|
5天前
|
存储 运维 Java
Linux笔记02 —— Shell补充
Linux笔记02 —— Shell补充
30 2
|
5天前
|
安全 Linux Shell
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
17 1
|
5天前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
13天前
|
编解码 Linux
FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx
在《FFmpeg开发实战》一书中,介绍了如何在Linux环境下为FFmpeg集成libopus和libvpx,以支持WebM格式的Opus和VP8/VP9编码。首先,下载并安装libopus。接着,下载并安装libvpx。最后,在FFmpeg源码目录下,重新配置FFmpeg,启用libopus和libvpx,编译并安装。通过`ffmpeg -version`检查版本信息,确认libopus和libvpx已启用。
FFmpeg开发笔记(十二)Linux环境给FFmpeg集成libopus和libvpx
|
13天前
|
编解码 Linux
FFmpeg开发笔记(十)Linux环境给FFmpeg集成vorbis和amr
在Linux环境下,为FFmpeg添加对AAC、MP3、OGG和AMR音频格式的支持,需安装libogg、libvorbis和opencore-amr库。首先,从官方源下载各库的最新源码,如libogg-1.3.5、libvorbis-1.3.7和opencore-amr-0.1.6,然后解压并依次执行`./configure`、`make`和`make install`进行编译安装。接着,在FFmpeg源码目录中,使用`./configure`命令重新配置,并重新编译安装FFmpeg。最后,验证FFmpeg版本信息确认已启用ogg和amr支持。
FFmpeg开发笔记(十)Linux环境给FFmpeg集成vorbis和amr