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修改密码命令:
-
dmtsai 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 dmtsai 能执行passwd;
-
passwd 的拥有者是 root 这个帐号;
-
dmtsai 执行 passwd 的过程中,会“暂时”获得 root 的权限;
-
/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 文件是使用哪一种压缩功能哩!

浙公网安备 33010602011771号