6.4文件默认/隐藏权限的一些内容

umask:文件默认权限

通过umask可以查看创建文件时的默认权限(后三位分别表示:u、g、o 的权限)

一般有两种方式:

  • umask查看数字体态的权限设置分数
btc@btc:~$ umask
0002
  • umask -S以符号的形式显示默认权限(注意S大写)
btc@btc:~$ umask -S
u=rwx,g=rwx,o=rx

要注意的是,umask 的分数指的是“该默认值需要减掉的权限!”因为 r、w、x 分别是 4、2、1 分,所以啰!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉执行与写入的权限,也就是 3 分,这样了解吗?请问你, 5 分是什么?呵呵! 就是读与执行的权限啦!

以上面的例子来看,002指的是 o 被拿走 w 的权力,从-S的结果也能看出对应关系

tips : 创建文件时通常没有x(执行)权限,而创建文件夹时,一般都会有x权限

btc@btc:~$ touch 3
btc@btc:~$ mkdir 3s
btc@btc:~$ ls -l
-rw-rw-r-- 1 btc btc    0  1月 30 21:34 3
drwxrwxr-x 2 btc btc 4096  1月 30 21:34 3s

如何编辑umask默认权限

当我们需要新建文件给同群组的使用者共同编辑时,那么 umask 的群组就不能拿掉 2这个 w 的权限! 所以啰, umask 就得要是 002 之类的才可以!这样新建的文件才能够是 -rw-rw-r-- 的权限模样喔! 那么如何设置 umask 呢?简单的很,直接在 umask 后面输入 002就好了!

[root@study ~]# umask 002
[root@study ~]# touch test3
[root@study ~]# mkdir test4
[root@study ~]# ll -d test[34] # 中括号 [ ] 代表中间有个指定的字符,而不是任意字符的意思
-rw-rw-r--
. 1 root root 0 6月 16 01:12 test3
drwxrwxr-x. 2 root root 6 6月 16 01:12 test4

例题:假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?

答:umask 为 003 ,所以拿掉的权限为 --------wx,因此: 文件: (-rw-rw-rw-)(注意此处文件一般没有x权限) - (--------wx)= -rw-rw-r-- 目录: (drwxrwxrwx) - (d-------wx) = drwxrwxr--

文件隐藏属性

chattr(设置文件隐藏属性)

[root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设置一定,且仅有后面接的参数
A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上 S 这个属性时,当你进行任何文件的修改,该更动会“同步”写入磁盘中。
a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性
c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,
但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!” 
对于系统安全性有相当大的助益!只有 root 能设置此属性
s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!
注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置
注意2:xfs 文件系统仅支持 AadiS 而已
范例:请尝试到/tmp下面创建文件,并加入 i 的参数,尝试删除看看。
[root@study ~]# cd /tmp
[root@study tmp]# touch attrtest <==创建一个空文件
[root@study tmp]# chattr +i attrtest <==给予 i 的属性
[root@study tmp]# rm attrtest <==尝试删除看看
rm: remove regular empty file
'attrtest'? y
rm: cannot remove
'attrtest': Operation not permitted
# 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设置!

范例:请将该文件的 i 属性取消!
[root@study tmp]# chattr -i attrtest

示范:

btc@btc:~$ chattr +i 3
chattr: 不允许的操作 设置 3 的标志时
btc@btc:~$ sudo su -
root@btc:~# cd /home/btc
root@btc:/home/btc# chattr +i 3
root@btc:/home/btc# rm 3
rm: 无法删除 '3': 不允许的操作
root@btc:/home/btc# rm -f 3
rm: 无法删除 '3': 不允许的操作
root@btc:/home/btc# ls
1.txt  3   公共  视频  文档  音乐  snap
2.txt  3s  模板  图片  下载  桌面

lsattr 显示文件隐藏属性

[root@study ~]# lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来!
[root@study tmp]# chattr +aiS attrtest
[root@study tmp]# lsattr attrtest
--S-ia---------- attrtest

示范:

root@btc:/home/btc# chattr -i 3
root@btc:/home/btc# chattr +aiS 3
root@btc:/home/btc# lsattr 3
--S-ia--------e------- 3
root@btc:/home/btc# 

文件特殊权限:SUID,SGID,SBIT

文件的权限除了我们熟知的rwx之外,还有其他的特殊权限:s和t。

  • Set UID

当s这个标志出现在文件拥有者的x权限上时,例如/usr/bin/passwd这个文件的权限状态:-rwsr-xr-x,此时就被称为 Set UID,简称为SUID的特殊权限。那么SUID的权限对于一个文件的特殊功能是什么呢?基本上SUID有这样的限制与功能:

  • SUID 权限仅对二进制程序(binary program)有效;
  • 执行者对于该程序需要具有 x 的可执行权限;
  • 本权限仅在执行该程序的过程中有效 (run-time);
  • 执行者将具有该程序拥有者 (owner) 的权限。

举个例子——passwd修改密码命令:

  1. dmtsai 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 dmtsai 能执行passwd;

  2. passwd 的拥有者是 root 这个帐号;

  3. dmtsai 执行 passwd 的过程中,会“暂时”获得 root 的权限;

  4. /etc/shadow 就可以被 dmtsai 所执行的 passwd 所修改。


  • Set GID

当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 啰!是这样没错!_。 举例来说,你可以用下面的指令来观察到具有 SGID 权限的文件喔:

[root@study ~]# ls -l /usr/bin/locate
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate

与 SUID 不同的是,SGID 可以针对文件或目录来设置!如果是对文件来说, SGID 有如下的功能:

  • SGID 对二进制程序有用;
  • 程序执行者对于该程序来说,需具备 x 的权限;
  • 执行者在执行的过程中将会获得该程序群组的支持!

举个例子:

[root@study ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40496 Jun 10 2014 /usr/bin/locate
-rw-r-----
. 1 root slocate 2349055 Jun 15 03:44 /var/lib/mlocate/mlocate.db

与 SUID 非常的类似,若我使用 dmtsai 这个帐号去执行 locate 时,那 dmtsai 将会取得slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!非常有趣吧!

除了 binary program 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途!当一个目录设置了 SGID 的权限后,他将具有如下的功能:

  • 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;

  • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;

  • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。


  • Sticky Bit

这个 Sticky Bit,SBIT 目前只针对目录有效,对于文件已经没有效果了。SBIT 对于目录的作用是:

  • 当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;

  • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

举例来说,我们的 /tmp 本身的权限是“drwxrwxrwt”, 在这样的权限内容下,任何人都可以在/tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。


小结

前面介绍过 SUID 与 SGID 的功能,那么如何设置文件使成为具有 SUID 与 SGID 的权限呢?这就需要第五章的数字更改权限的方法了! 现在你应该已经知道数字体态更改权限的方式为“三个数字”的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!

  • 4为 SUID
  • 2为 SGID
  • 1 为 SBIT

假设要将一个文件权限改为“-rwsr-xr-x”时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:“ chmod 4755 filename ”来设置!

**Tips **注意:下面的范例只是练习而已,所以鸟哥使用同一个文件来设置,你必须了解 SUID不是用在目录上,而 SBIT 不是用在文件上的喔!

[root@study ~]# cd /tmp
[root@study tmp]# touch test <==创建一个测试用空档
[root@study tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test

最后一个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? 因为 s 与 t都是取代 x 这个权限的,但是你有没有发现阿,我们是下达 7666 喔!也就是说, user,group 以及 others 都没有 x 这个可执行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是“空的”啦!怎么说? SUID 是表示“该文件在执行的时候,具有文件拥有者的权限”,但是文件 拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的啦! _

当然,除了数字法之外,也可以通过符号法来处理:

# 设置权限成为 -rws--x--x 的模样:
[root@study tmp]# chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
# 承上,加上 SGID 与 SBIT 在上述的文件权限中!
[root@study tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test

观察文件类型 file

如果你想要知道某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary, 且其中有没有使用到动态函数库 (share library) 等等的信息,就可以利用 file 这个指令来检阅喔!举例来说:

root@btc:/home/btc# file 1.txt
1.txt: ASCII text  # 告诉我们这是 ASCII 的纯文本文件
root@btc:/home/btc# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2344480b478a675609210ed886207d6cbdc8cdd7, for GNU/Linux 3.2.0, stripped # 可执行文件的数据可就多的不得了!包括这个文件的 suid 权限、相容于 Intel x86-64 等级的硬件平台
# 使用的是 Linux 核心 3.2.0 的动态函数库链接等等。

通过这个指令,我们可以简单的先判断这个文件的格式为何喔!包括未来你也可以用来判断使用 tar 包裹时,该 tarball 文件是使用哪一种压缩功能哩!

posted @ 2026-01-31 01:15  yorkchain  阅读(6)  评论(0)    收藏  举报