Linux学习笔记13——文件与目录的默认权限与隐藏权限

文件与目录的默认权限与隐藏权限

除了基本r, w, x权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下,我们还可以设置其他的系统隐藏属性, 这部份可使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性!让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security)!比较可惜的是,在 CentOS 7.x 当中利用 xfs 作为默认文件系统, 但是 xfs 就没有支持所有的 chattr 的参数了!仅有部份参数还有支持而已!

1,文件默认权限:umask

你知道当你创建一个新的文件或目录时,他的默认权限会是什么吗?呵呵!那就与 umask 这个玩意儿有关了!那么 umask 是在搞什么呢?基本上, umask 就是指定 “目前使用者在创建文件或目录时

候的权限默认值”, 那么如何得知或设置 umask 呢?他的指定条件以下面的方式来指定:

[root@docker1 tmp]# umask

0022 <==与一般权限有关的是后面三个数字!

[root@docker1 tmp]# umask -S

u=rwx,g=rx,o=rx

查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字体态的权限设置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。 第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。

在默认权限的属性上,目录与文件是不一样的。从第五章我们知道 x 权限对于目录是非常重要的! 但是一般文件的创建则不应该有执行的权限,因为一般文件通常是用在于数据的记录嘛!当然不需要执行的权限了。 因此,默认的情况如下:

扫描二维码关注公众号,回复: 4141300 查看本文章

若使用者创建为“文件”则默认“没有可执行( x )权限”,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下: -rw-rw-rw-

若使用者创建为“目录”,则由于 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下: drwxrwxrwx

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

(1)umask的利用与重要性:专题制作

想像一个状况,如果你跟你的同学在同一部主机里面工作时,因为你们两个正在进行同一个专题, 老师也帮你们两个的帐号创建好了相同群组的状态,并且将 /home/class/ 目录做为你们两个人的专题目录。 想像一下,有没有可能你所制作的文件你的同学无法编辑?果真如此的话,那就伤脑筋了!

这个问题很常发生啊!举上面的案例来看就好了,你看一下 test1 的权限是几分? 644 呢!意思是“如果 umask 订定为 022 ,那新建的数据只有使用者自己具有 w 的权限, 同群组的人只有 r 这个可读的权限而已,并无法修改喔!”这样要怎么共同制作专题啊!您说是吧!

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

[root@docker1 tmp]# umask 002

[root@docker1 tmp]# touch test3

[root@docker1 tmp]# mkdir test4

[root@docker1 tmp]# ll -d test[34] # 中括号 [ ] 代表中间有个指定的字符,而不是任意 字符的意思

-rw-rw-r-- 1 root root 0 11月 9 16:58 test3

drwxrwxr-x 2 root root 6 11月 9 16:59 test4

关于 umask 与权限的计算方式中,教科书喜欢使用二进制的方式来进行 AND 与 NOT的计算, 不过,鸟哥还是比较喜欢使用符号方式来计算~联想上面比较容易一点~但是,有的书籍或者是 BBS 上面的朋友,喜欢使用文件默认属性 666 与目录默认属性 777来与 umask 进行相减的计算~这是不好的喔!以上面例题来看, 如果使用默认属性相加减,则文件变成:666-003=663,亦即是 -rw-rw--wx ,这可是完全不对的喔! 想想看,原本文件就已经去除 x 的默认属性了,怎么可能突然间冒出来了? 所以,这个地方得要特别小心喔!在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基于安全的考虑啦~至于一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关于默认 umask 的设置可以参考 /etc/bashrc 这个文件的内容,不过,不建议修改该文件, 你可以参考第十章 bash shell 提到的环境参数配置文件 (~/.bashrc) 的说明!

2,文件隐藏属性

什么?文件还有隐藏属性?光是那九个权限就快要疯掉了,竟然还有隐藏属性,真是要命~但是没办法,就是有文件的隐藏属性存在啊!不过,这些隐藏的属性确实对于系统有很大的帮助的~ 尤其是在系统安全 (Security) 上面,重要的紧呢!不过要先强调的是,下面的chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, 其他的文件系统可能就无法完整的支持这个指令了,例如 xfs 仅支持部份参数而已。下面我们就来谈一谈如何设置与检查这些隐藏的属性吧!

chattr (设置文件隐藏属性)

# 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

这个指令是很重要的,尤其是在系统的数据安全上面!由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让一个文件无法被更动,对于需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能设置的呢!

此外,如果是 log file 这种的登录文件,就更需要 +a 这个可以增加,但是不能修改旧有的数据与删除的参数了!怎样?很棒吧! 未来提到登录文件 (十八章) 的认知时,我们再来聊一聊如何设置他吧!

lsattr (显示文件隐藏属性)

# lsattr [-adR] 文件或目录

选项与参数:

-a :将隐藏文件的属性也秀出来;

-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;

-R :连同子目录的数据也一并列出来!

[root@study tmp]# chattr +aiS attrtest

[root@study tmp]# lsattr attrtest

--S-ia---------- attrtest

使用 chattr 设置后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个指令在使用上必须要特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他设置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!

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

我们前面一直提到关于文件的重要权限,那就是 rwx 这三个读、写、执行的权限。 但是,眼尖的朋友们在第五章的目录树章节中, 一定注意到了一件事,那就是,怎么我们的 /tmp 权限怪怪的? 还有,那个 /usr/bin/passwd 也怪怪的?怎么回事啊?看看先:

[root@study ~]# ls -ld /tmp ; ls -l /usr/bin/passwd

drwxrwxrwt. 14 root root 4096 Jun 16 01:27 /tmp

-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

不是应该只有 rwx 吗?还有其他的特殊权限( s 跟 t )啊?啊.....头又开始昏了~ @_@ 因为s 与 t 这两个权限的意义与系统的帐号 (第十三章)及系统的程序(process, 第十六章)较为相关, 所以等到后面的章节谈完后你才会比较有概念!下面的说明先看看就好,如果看不懂也没有关系, 先知道s放在哪里称为SUID/SGID以及如何设置即可,等系统程序章节读完后,再回来看看喔!

Set UID

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

SUID 权限仅对二进制程序(binary program)有效;

执行者对于该程序需要具有 x 的可执行权限;

本权限仅在执行该程序的过程中有效 (run-time);

执行者将具有该程序拥有者 (owner) 的权限。

讲这么硬的东西你可能对于 SUID 还是没有概念,没关系,我们举个例子来说明好了。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:“---------- 1 root root”,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 dmtsai 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入“passwd”这个指令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!

唔!有没有冲突啊!明明 /etc/shadow 就不能让 dmtsai 这个一般帐户去存取的,为什么dmtsai 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦!借由上述的功能说明,我们可以知道

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

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

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

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

但如果 dmtsai 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 dmtsai 执行 “cat /etc/shadow” 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:

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

SUID 权限仅对二进制程序(binary program)有效;

执行者对于该程序需要具有 x 的可执行权限;

本权限仅在执行该程序的过程中有效 (run-time);

执行者将具有该程序拥有者 (owner) 的权限。

讲这么硬的东西你可能对于 SUID 还是没有概念,没关系,我们举个例子来说明好了。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:“---------- 1 root root”,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 dmtsai 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入“passwd”这个指令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!

唔!有没有冲突啊!明明 /etc/shadow 就不能让 dmtsai 这个一般帐户去存取的,为什么dmtsai 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦!借由上述的功能说明,我们可以知道

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

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

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

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

但如果 dmtsai 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 dmtsai 执行 “cat /etc/shadow” 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下

另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shellscript 只是将很多的 binary 可执行文件叫进来执行而已!所以 SUID 的权限部分,还是得要看shell script 调用进来的程序的设置, 而不是 shell script 本身。当然,SUID 对于目录也是无效的~这点要特别留意。

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 的权限;

执行者在执行的过程中将会获得该程序群组的支持!

举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容 (详细说明会在下节讲述), mlocate.db 的权限如下:

[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 才有权力删除该文件

换句话说:当甲这个使用者于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示“甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。” 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

举例来说,我们的 /tmp 本身的权限是“drwxrwxrwt”, 在这样的权限内容下,任何人都可以在/tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:

1. 以 root 登陆系统,并且进入 /tmp 当中;

2. touch test,并且更改 test 权限成为 777 ;

3. 以一般使用者登陆,并进入 /tmp;

4. 尝试删除 test 这个文件!

SUID/SGID/SBIT 权限设置

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

4 为 SUID

2 为 SGID

1 为 SBIT

假设要将一个文件权限改为“-rwsr-xr-x”时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:“ chmod 4755 filename ”来设置!此外,还有大 S与大 T 的产生喔!参考下面的范例啦

下面的范例只是练习而已,所以鸟哥使用同一个文件来设置,你必须了解 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 是表示“该文件在执行的时候,具有文件拥有者的权限”,但是文件 拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的啦!

而除了数字法之外,你也可以通过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,

SBIT 则是 o+t 啰!来看看如下的范例:

# 设置权限成为 -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

4,观察文件类型:file

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

[root@study ~]# file ~/.bashrc

/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文本文件啊!

[root@study ~]# file /usr/bin/passwd

/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically

linked (uses shared libs), for GNU/Linux 2.6.32,

BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped

# 可执行文件的数据可就多的不得了!包括这个文件的 suid 权限、相容于 Intel x86-64 等级的硬件平台

# 使用的是 Linux 核心 2.6.32 的动态函数库链接等等。

[root@study ~]# file /var/lib/mlocate/mlocate.db

/var/lib/mlocate/mlocate.db: data <== 这是 data 文件!

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

5,指令与文件的搜寻

(1)which (寻找“可执行文件”)

# which [-a] command

选项或参数:

-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

范例一:搜寻 ifconfig 这个指令的完整文件名

[root@study ~]# which ifconfig

/sbin/ifconfig

范例二:用 which 去找出 which 的文件名为何?

[root@study ~]# which which

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

/bin/alias

/usr/bin/which

# 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥?

# 那就是所谓的“命令别名”,意思是输入 which 会等于后面接的那串指令啦!

# 更多的数据我们会在 bash 章节中再来谈的!

范例三:请找出 history 这个指令的完整文件名

[root@study ~]# which history

/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:

/usr/sbin:/usr/bin:/root/bin)

[root@study ~]# history --help

-bash: history: --: invalid option

history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg

# 瞎密?怎么可能没有 history ,我明明就能够用 root 执行 history 的啊!

这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名~ 所以,重点是找出“可执行文件”而已!且 which 后面接的是“完整文件名”喔!若加上 -a 选项,则可以列出所有的可以找到的同名可执行文件,而非仅显示第一个而已!

最后一个范例最有趣,怎么 history 这个常用的指令竟然找不到啊!为什么呢?这是因为history 是“bash 内置的指令”啦! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊(有 bash 就有 history!)!那怎办?没关系!我们可以通过 type 这个指令喔!关于 type 的用法我们将在 第十章的 bash 再来谈!

(2)文件文件名的搜寻

再来谈一谈怎么搜寻文件吧!在 Linux 下面也有相当优异的搜寻指令呦!通常 find 不很常用的!因为速度慢之外, 也很操硬盘!一般我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速, 并且没有实际的搜寻硬盘内的文件系统状态,比较省时间啦!

whereis (由一些特定的目录中寻找文件文件名)

# whereis [-bmsu] 文件或目录名

选项与参数:

-l :可以列出 whereis 会去查询的几个主要目录而已

-b :只找 binary 格式的文件

-m :只找在说明文档 manual 路径下的文件

-s :只找 source 来源文件

-u :搜寻不在上述三个项目当中的其他特殊文件

范例一:请找出 ifconfig 这个文件名

[root@study ~]# whereis ifconfig

ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz

范例二:只找出跟 passwd 有关的“说明文档”文件名(man page)

[root@study ~]# whereis passwd # 全部的文件名通通列出来!

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

[root@study ~]# whereis -m passwd # 只有在 man 里面的文件名才抓出来!

passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz

等一下我们会提到 find 这个搜寻指令, find 是很强大的搜寻指令,但时间花用的很大!(因为 find 是直接搜寻硬盘,为如果你的硬盘比较老旧的话,嘿嘿!有的等!) 这个时候whereis 就相当的好用了!另外, whereis 可以加入选项来找寻相关的数据,例如,如果你是要找可可执行文件 (binary) 那么加上 -b 就可以啦! 如果不加任何选项的话,那么就将所有的数据列出来啰!

那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多? 其实那也没有什么,只是因为 whereis 只找几个特定的目录而已~并没有全系统去查询之故。所以说,whereis 主要是针对 /bin /sbin 下面的可执行文件, 以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理而已。所以速度当然快的多!不过,就有某些文件是你找不到的啦! 想要知道 whereis 到底查了多少目录?可以使用 whereis -l 来确认一下即可!

locate / updatedb

[root@study ~]# locate [-ir] keyword

选项与参数:

-i :忽略大小写的差异;

-c :不输出文件名,仅计算找到的文件数量

-l :仅输出几行的意思,例如输出五行则是 -l 5

-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等

-r :后面可接正则表达式的显示方式

范例一:找出系统中所有与 passwd 相关的文件名,且只列出 5 个

[root@study ~]# locate -l 5 passwd

/etc/passwd

/etc/passwd-

/etc/pam.d/passwd

/etc/security/opasswd

/usr/bin/gpasswd

范例二:列出 locate 查询所使用的数据库文件之文件名与各数据数量

[root@study ~]# locate -S

Database /var/lib/mlocate/mlocate.db:

8,086 directories # 总纪录目录数

109,605 files # 总纪录文件数

5,190,295 Bytes in file names

2,349,150 Bytes used to store database

这个 locate 的使用更简单,直接在后面输入“文件的部分名称”后,就能够得到结果。 举上面的例子来说,我输入 locate passwd ,那么在完整文件名 (包含路径名称) 当中,只要有passwd 在其中, 就会被显示出来的!这也是个很方便好用的指令,如果你忘记某个文件的完整文件名时~~

但是,这个东西还是有使用上的限制呦!为什么呢?你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速啰!

那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天执行一次 (每个 distribution 都不同,CentOS 7.x 是每天更新数据库一次!),所以当你新创建起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你“找不到!”呵呵!因为必须要更新数据库呀!

那能否手动更新数据库哪?当然可以啊!更新 locate 数据库的方法非常简单,直接输入“updatedb ”就可以了! updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔!

updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件;

locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。

find

# find [PATH] [option] [action]

选项与参数:

1\. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明

-mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;

-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;

-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。

-newer file :file 为一个存在的文件,列出比 file 还要新的文件文件名

范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出

[root@study ~]# find / -mtime 0

# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,

# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?

# find / -mtime 3 有变动过的文件都被列出的意思!

范例二:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出

[root@study ~]# find /etc -newer /etc/passwd

# -newer 用在分辨两个文件之间的新旧关系是很有用的!

时间参数真是挺有意思的!我们现在知道 atime, ctime 与 mtime 的意义,如果你想要找出一天内被更动过的文件名称, 可以使用上述范例一的作法。但如果我想要找出“4天内被更动过的文件文件名”呢?那可以使用“ find /var -mtime -4 ”。那如果是“4天前的那一天”就用“ find/var -mtime 4 ”。有没有加上“+, -”差别很大喔!我们可以用简单的图示来说明一下:

图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图 6.5.1 我们可以清楚的知道:

+4代表大于等于5天前的文件名:ex> find /var -mtime +4

-4代表小于等于4天内的文件文件名:ex> find /var -mtime -4

4则是代表4-5那一天的文件文件名:ex> find /var -mtime 4

非常有趣吧!你可以在 /var/ 目录下搜寻一下,感受一下输出文件的差异喔!再来看看其他find 的用法吧!

选项与参数:

2. 与使用者或群组名称有关的参数:

-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在

/etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。

-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在

/etc/group,相关的介绍我们会第四篇说明~

-user name :name 为使用者帐号名称喔!例如 dmtsai

-group name:name 为群组名称喔,例如 users ;

-nouser :寻找文件的拥有者不存在 /etc/passwd 的人!

-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!

当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,

这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。

范例三:搜寻 /home 下面属于 dmtsai 的文件

[root@study ~]# find /home -user dmtsai

# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,

# 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!

范例四:搜寻系统中不属于任何人的文件

[root@study ~]# find / -nouser

# 通过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时,

# 不要太紧张,那有时候是正常的~尤其是你曾经以源代码自行编译软件时。

如果你想要找出某个使用者在系统下面创建了啥咚咚,使用上述的选项与参数,就能够找出来啦! 至于那个 -nouser 或 -nogroup 的选项功能中,除了你自行由网络上面下载文件时会发生之外, 如果你将系统里面某个帐号删除了,但是该帐号已经在系统内创建很多文件时,就可能会发生无主孤魂的文件存在! 此时你就得使用这个 -nouser 来找出该类型的文件啰!

选项与参数:

3. 与文件权限及名称有关的参数:

-name filename:搜寻文件名称为 filename 的文件;

-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:

c: 代表 Byte, k: 代表 1024Bytes。所以,要找比 50KB

还要大的文件,就是“ -size +50k ”

-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 设备文件 (b, c),

目录 (d), 链接文件 (l), socket (s), 及 FIFO (p) 等属性。

-perm mode :搜寻文件权限“刚好等于” mode 的文件,这个 mode 为类似 chmod

的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !

-perm -mode :搜寻文件权限“必须要全部囊括 mode 的权限”的文件,举例来说,

我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,

当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,

因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。

-perm /mode :搜寻文件权限“包含任一 mode 的权限”的文件,举例来说,我们搜寻

-rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------

也会被列出来,因为他有 -rw.... 的属性存在!

范例五:找出文件名为 passwd 这个文件

[root@study ~]# find / -name passwd

范例五-1:找出文件名包含了 passwd 这个关键字的文件

[root@study ~]# find / -name "*passwd*"

# 利用这个 -name 可以搜寻文件名啊!默认是完整文件名,如果想要找关键字,

# 可以使用类似 * 的任意字符来处理

范例六:找出 /run 目录下,文件类型为 Socket 的文件名有哪些?

[root@study ~]# find /run -type s

# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,

# 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!

范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性

[root@study ~]# find / -perm /7000

# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,

# 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000 ~瞭乎?

上述范例中比较有趣的就属 -perm 这个选项啦!他的重点在找出特殊权限的文件啰! 我们知道 SUID 与 SGID 都可以设置在二进制程序上,假设我想要找出来 /usr/bin, /usr/sbin 这两个目录下, 只要具有 SUID 或 SGID 就列出来该文件,你可以这样做:

[root@study ~]# find /usr/bin /usr/sbin -perm /6000

因为 SUID 是 4 分,SGID 2 分,总共为 6 分,因此可用 /6000 来处理这个权限! 至于 find后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意喔! 最后,我们再来看一下 find 还有什么特殊功能吧!

选项与参数:

4\. 额外可进行的动作:

-exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。

-print :将结果打印到屏幕上,这个动作是默认动作!

范例八:将上个范例找到的文件使用 ls -l 列出来~

[root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \;

# 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名,

# 所以仅能使用 ls -l 不可以使用 ll 喔!注意注意!

范例九:找出系统中,大于 1MB 的文件

[root@study ~]# find / -size +1M

find 的特殊功能就是能够进行额外的动作(action)。我们将范例八的例子以图解来说明如下:

该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:

{} 代表的是“由 find 找到的内容”,如上图所示,find 的结果会被放置到 {} 位置中;

-exec 一直到 \; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令内的额外动作。 在本例中就是“ ls -l {} ”啰!

因为“ ; ”在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。

通过图 6.5.2 你应该就比较容易了解 -exec 到 \; 之间的意义了吧!

如果你要找的文件是具有特殊属性的,例如 SUID 、文件拥有者、文件大小等等, 那么利用locate 是没有办法达成你的搜寻的!此时 find 就显的很重要啦! 另外,find 还可以利用万用字符来找寻文件名呢!举例来说,你想要找出 /etc 下面文件名包含 httpd 的文件, 那么你就可以这样做:

[root@study ~]# find /etc -name '*httpd*'

不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的文件名!真是好好用! 不过由于 find 在寻找数据的时后相当的操硬盘!所以没事情不要使用find 啦!有更棒的指令可以取代呦!那就是上面提到的 whereis 与 locate 啰!

猜你喜欢

转载自blog.csdn.net/qq_22059611/article/details/84075881