Linux 的档案与目录管理--2
档案与目录的预设权限与隐藏权限
前面学习过每个档案都有若干个属性,包括读写执行(r、w、x)等基本权限,以及是否为目录(d)与档案(-)或者链接档(l)等等的属性。
要改变属性前面也学过了(chgrp、chown、chmod)
除了基本的 r、w、x 权限外,在 Linux 传统的 Ext2/Ext3/Ext4 档案系统下,我们还可以设定其他的系统隐藏属性。
这部分可使用 chattr 来设置,用 lsattr 来查看,最重要的属性就是可以设定其不可修改的特性!
其中有连让档案的拥有者都不能进行修改!这个属性是非常重要的,尤其是在安全机制上面(security)!
比较可惜的是,在 CentOS 7.x 当中利用 xfs 作为预设档案系统,但是 xfs 就没有支持 chattr 的参数了!仅有部分参数还有支持而已!
root将自己的 bashrc 档案复制给 hare :
复制档案: cp ~/.bashrc ~hare/bashrc
修改属性: chown hare:hare ~hare/bashrc
root想在 /tmp 下建立一个名为chapter且拥有者为 hare 的目录,并且人可以可以浏览但除了 hare 外其他人不可需改该目录下的档案:
建立目录: mkdir /tmp/chapter
修改属性: chown -R hare:hare /tmp/chapter
修改权限: chmod -R 755 /tmp/chapter
档案预设权限:umask
前面学了如何改变一个目录或档案的属性了,那么我们在新建一个新的档案或目录的时候,它预设的权限是什么呢?
umask 就是指【目前使用者在建立档案或目录时候的权限预设值】
$ umask
0022 <--注意是4个数字哦
四个数字分别代表:特殊权限、拥有者权限、所属组权限、其他人权限
$ umask -S <--这里是 Symbolic (象征性的)的简写
u=rwx,g=rx,o=rx <--这里就看的比较明白了吧(奇怪,上面的拥有者权限明明是 0 为什么用符号表示出来确是u=rwx呢?看下面吧↓↓↓)
Tips:
前面学到,在预设权限的属性上,目录与档案是不一样的。
(因为前面学 x 权限对于目录是非常重要的,但是档案默认不应该有 x 权限,因为档案通常用来记录资料嘛,当然不需要执行了)
预设情况如下:
- 若使用者建立为【档案】则预设【没有可执行(x)权限】,即只有 rw 这两个项目,也就是最大为 666 分,预设权限如下:
- -rw-rw-rw-
- 若使用者建立为【目录】,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放,即最大分数为 777 分,预设权限如下:
- drwxrwxrwx
umask 的分数指的是【该预设值需要减掉的权限!】
上面例子中,不理会特殊权限,umask的值为 022,所以 user 并没有被拿掉任何权限,而 group 和 others 都被拿掉了 2 (也就是 w 这个权限),那么当使用者:
建立档案时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
建立目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
umask的利用与重要性:专题制作
想象一下,老师为你和同学两人在同一主机创建账号并建立了相同群组的状态,需要你两人共同完成一个专题。
如果 umask 设定为 022 ,那新建的资料只有使用者自己具有 w 的权限,同群组的人只有 r 这个可读的权限而已,无法修改】
所以,如果我们需要共同编辑大量东西的时候就需要调整 umask 了(当然,你也可以自己一个个文档取修改权限),把 umask 设置为 002 不就好了么。
$ umask 002 #修改 umask 只需要在后面直接跟你需要修改的数字就好了
$ touch test3
$ mkdir test4
$ 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 对于新建档案与目录的预设权限是很有关系的!这个概念可以用在任何的服务器上面,尤其是你未来在架设档案服务器的时候(file server),例如 SAMBA Server 或 FTP Server ,都是很重要的概念,涉及到你的使用者能否将档案进一步利用的问题哦,不要轻视啊!
在预设情况下:
root 的 umask 预设为 022,这是基于安全的考虑(所以拿掉的比较多)
一般身份的 umask 预设为 002,保留了同群组写的能力(应该也是分 distributions 的,至少目前我的普通用户预设也是 022)
关于预设 umask 的设定可以参考 /etc/bashrc 这个档案的内容,不过不建议修改该档案,此处可以参考 bash shell 提到的环境参数设定档的说明(后面学)。
档案隐藏属性:chattr, lsattr
注意:chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统档案系统上面完整生效,其他档案系统可能不支持这个指令,例如 xfs 仅仅支持部分参数而已。
隐藏属性对系统有很大的帮助,尤其是在系统安全上面(Security)。
chattr(设定档案隐藏属性)
- 语法:
- chattr [+-=] [ASacdistu] 档案或目录名称
- 选项与参数:
- +: 增加某一个特殊参数,其他原本存在参数则不动;
- -: 移除某一个特殊参数,其他原本存在参数则不动;
- = : 设定一定,且仅有后面接的参数。
- A : 当设定了 A 这个属性时,若你有存取此档案(或目录)时,它的存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用档案系统挂在参数处理这个项目);
- S : 一般档案是非同步写入磁盘的(原理参照 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 而已
这个指令是很重要的,尤其是在系统的资料安全上!由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性哦。其中最重要的是 +i 和 +a 这两个属性了。
+i 可以让一个档案无法被更动,对于需要强烈的系统安全的人来说,真实相当的重要!里面有相当多的属性是需要 root 才能设定的呢。
此外,如果是 log file 这种的登录档案,就更需要 +a 这个可以增加,但是不能修改旧有的资料与删除的参数了。(后面在学如何设置吧)
lsattr(显示档案隐藏属性)
- 语法:
- lsattr [-adR] 档案或目录
- 选项与参数:
- -a : 将隐藏档的属性也秀出来;
- -d : 如果接的是目录,仅列出目录本身的属性而非目录内的档名;
- -R : 连同子目录的资料也一并列出来。
使用 chattr 设定后,可以利用 lsattr 来查看隐藏属性。不过,这两个执行在使用上必须要特别小心,否则会造成很大的困扰。
例如:某天将 /etx/shadow 这个档案给设定称为了具有 i 的属性,那么你想要新增用户的时候,可能就一直无法新增了,快去将 i 的属性拿掉吧。
档案特殊权限:SUID, SGID, SBIT, 权限设定
$ 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
观察 passwd 和 tmp 两个东东的权限好怪,权限不是应该只有 rwx 吗?为什么还有 s 和t 啊?
因为这两个权限的意义与系统的账号及系统的程序(process)有关,后面学习后就知道了。
目前只需要先知道 s 放在哪里称为 SUID/SGID 以及如何设置即可。
Set UID
当 s 这个标志出现在档案拥有者的 x 权限上时,被称为 Set UID,简称 SUID 的特殊权限。例如: /usr/bin/passwd 这个档案的权限状态为:【-rwsr-xr-x】。
SUID 的限制与功能:
- SUID 权限仅对二进位程序(binary program)有效;
- 执行者对于该程序需要具有 x 的可执行权限;
- 本权限仅在执行该程序的过程中有效(run-time);
- 执行者将具有该程序拥有者的权限(owner)的权限。
案例:
我们在 Linux 系统中,所有账号密码都记录在 /etc/shadow 这个档案里面,这个档案的权限是:【---------- 1 root root】,意思的(档案u、g、o都不具备任何权限,1个inode,拥有者和所属组都是root),那么因为root是天神的存在,所以可读可强制写入。
既然只有root可以强制写入,那么我的普通用户 hare 可以修改自己的密码吗?当然可以了,我在输入 passwd 这个指令的时候就可以直接输入新密码进行修改,也就是修改了 /etc/shadow 这个档案,为啥可以呢?
这就是 SUID 的功能了:
- hare 对于 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 hare 可以执行 passwd;
- passwd 的拥有者是 root 这个账号;
- hare 执行 passwd 的过程中,会【暂时】获取 root 的权限;
- /etc/shadow 就可以被 hare 所执行的 passwd 所修改。
但是如果 hare 使用 cat 去读取 /etc/shadow 时,就不可以了,因为 cat 不具有 SUID 的权限。
另外,SUID 仅可用在 binary program 上,不能用来 shell scripts 上面。
这是因为 shell script 只是将很多的 binary 执行档叫进来执行而已,所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的设定,而不是 shell script 本身。
SUID 对于目录也是无效的,这点需要特别注意。
Set GID
当 s 标志在档案拥有者的 x 项目为 SUID,当 s 在群组的 x 时则称为 Set GID,SGID。
$ 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 这个档案的内容,权限如下:
(CentOS 7.x 系列,似乎没有了 locate 这个指令,可以自己安装一下【yum install mlocate】)
$ 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 类似,我使用 hare 这个账号取执行 locate 时,将会获得 slocate 群组的支持,因此就能够读取 mlocate.db 了。
除了 binary program 之外,实际上 SGID 也能够用在目录上,这也是非常常见的一种用途。
当档案设定了 SGID 的权限后,将具有如下功能:
- 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
- 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若使用者在此目录下具有 w 的权限(可以新建档案),则使用者所建立的档案,该新档案的群组与此目录的群组相同。
SGID 对于专案开发来说是非常重要的!
Sticky Bit
这个 Sticky Bit, SBIT 目前只针对目录有效,对于档案已经没有效果了。
SBIT 对于目录的作用是:
- 当使用者对于此目录具有 w,x 权限,即具有写入的权限时;
- 当使用者在该目录下建立档案或目录时,仅有自己与 root 才有权利删除该档案。
即:当甲这个使用者在 A 目录是具有群组或其他人的身份,并拥有该目录 w 的权限,这表示【甲使用者对该目录内任何人建立的目录或档案均可进行“删除/更名/搬移”等动作。】不过,如果将 A 目录加上了 SBIT 的权限项时,则甲只能够针对自己建立的档案或目录进行删除/更名/移动等动作,而无法删除他人的档案。
例如,我们的 /tmp 本身的权限是【drwxrwxrwt】(不同distributions可能有所不同),这样的权限内容下,任何人都可以在 /tmp 内新增、修改档案,但仅有该档案/目录建立者与 root 能够删除自己的目录或档案。
这个特性也挺重要的。
可以做个简单的测试:
以 root 登入系统,cd 到 /tmp,touch test 并修改权限 777,然后用一般使用者登录,尝试删除 test 试试。
由于 SUID/SGID/SBIT 牵扯到程序的概念,因此学完关于程序方面的知识,建议在回来看一遍。
SUID/SGID/SBIT 权限设定
我们学了数字更改权限的方式为【三个数字】的组合,但是在 umask 的时候命名有四个数字,对喽,第一个数字就是代表这里的特殊权限啦。
- 4 为 SUID
- 2 为 SGID
- 1 为 SBIT
假如要将一个档案权限设定为【-rwsr-xr-x】时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4,也就是说:
【chmod 4755 filename】来设置,此外,还有【大 S】 与【大 T】 的产生,往下看。
可用范围如下表:
目录 | 档案 | |
---|---|---|
SUID | 不可用 | 可用 |
SGID | 可用 | 可用 |
SBIT | 可用 | 不可用 |
$ chmod 7666 test; ls -l test #注意这里只是范例,test为档案,不可以设置 SBIT 的,这里只是范例
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test # 因为 user, group, others 都没有 x 这个权限,所以 S 和 T 代表的就是【空的】
上面例子,连档案的拥有者都不具有 x 的权限,哪里来的权限给别人执行呢,所以 x 的权限就是空的啦,那 S 就变成大S 啦。
除了数字法之外,也可以通过符号来处理:
SUID 为 u+s
SGID 为 g+s
SBIT 为 o+t
# 設定權限成為 -rws--x--x 的模樣:
$ chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
# 承上,加上 SGID 與 SBIT 在上述的檔案權限中!
$ 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@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 档案是使用哪一种压缩功能呢。
指令与档案的搜索
档案的搜索可就厉害了,因为我们常常需要知道那个档案放在了哪里,才能够对该档案进行一些修改或维护的动作。有些时候某些软件设定档案的名称是不变的,但是各个 distributions 放置的目录则不同。此时就得要利用一些搜索指令将该档案的完整档案捉出来,这样才能改嘛!-
指令档名的搜索
我们知道在终端模式当中,连续输入两次 [tab] 按键就能够知道使用者有多少指令可以下达。那你知不知道这些指令的完整档名放在哪里?
例如,ls 这个指令放在哪里? 通过 which 或 type 来寻找吧。
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 时一起学吧。
档案档名的搜索
在 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 这个指令是非常强大的,但是花费的时间也是很多的。(因为它会直接搜索硬盘,如果硬盘比较老的话,那就有的等待了)
这个时候 whereis 就非常好用了。另外,whereis 可以加入选项来寻找相关的资料,例如,找执行档(binary)加 -b 就可以了,如果不加选项,那么就换列出所有相关资料出来。
whereis 到底使用的什么,才比 find 快那么多?
其实也没什么,只是因为 whereis 只找几个特定的目录而已,并没有去全系统的查找。
whereis 主要针对 /bin/sbin 底下的执行档,一级 /usr/share/man 底下的 manual page 档案,跟几个比较特殊的目录来处理而已。所以速度很快。
不过,就会有某些档案你是找不到的,想要知道 whereis 都取哪里查找了,可以用 whereis -l 看看有那些目录。
locate / updatedb
- 语法:
- locate [-ir] keyword
- 选项与参数:
- -i:忽略大小写的差异;
- -c:不输出档名,仅计算找到的档案数量;
- -l:仅输出几行的意思,例如输出 5 行,则是 -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 来寻找资料的时候特别的块,这是因为 locate 寻找的资料是由【已建立的资料库 /var/lib/mlocate/】里面的资料所搜寻到的,所以不用直接在硬盘中寻找。
有什么限制呢?因为它是经过资料库来搜索的,而资料库的建立预设是每天执行一次(每个 distribution 都不同),所以你新建的档案,可能会存在没有被收录进资料库的情况。那么 locate 就会告诉你,找不到。
此时,就需要去更新 资料库,直接输入【updatedb】就可以了,该指令会取读取 /etc/ipdatedb.conf 这个设定档案的设定,然后再去硬盘里面寻找档名的动作,最后就更新整个资料库的档案啦。
因为 updatedb 会寻找银盘,所以在执行的时候可能需要等待几分钟的时间。
- updatedb:根据 /etc/updatedb.conf 的设定去搜索系统硬盘内的档名,并更新 /var/lib/mlocate 内的资料库档案;
- locate:依据 /var/lib/mlocate 内的资料库记载,找出使用者输入的关键字档名。
find
- 语法:
- find [PATH] [option] [action]
- 选项与参数:
- 与时间有关的选项:共有 -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】。有没有加【+,-】差别很大。
图中最右边为目前的时间,越往左边则代表越早之前的时间轴。
- +4:代表大于等于5天前的档名:ex> find /var -mtime +4
- -4:代表小于等于4天内的档案档名:ex> find /var -mtime -4
- 4:代表 4-5 那一天的档案档名:ex> find /var -mtime 4
再来看看其他 find 的用法:
- 选项与参数:
- 2.与使用者或者群组名称有关的参数:
- -uid n : n为数字,这个数字是使用者的账号 ID,即 UID,这个 UID 是记录在 /etc/passwd 里面与账号名称对应的数字。(后面学)
- -gid n : n为数字,这个数字是群组名称的 ID,即 GID,这个 GID 记录在 /etc/group
- -user name : name 为使用者账号名称,例如:hare。
- -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:代表 1024 bytes。所以要找比 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 就列出来该档案,你可以这样做:
$ find /usr/bin /usr/sbin -prem /6000
因为 SUID 是 4 分,SGID 2 分,总共 6分,因此可用 /6000 来处理这个权限。
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 环境下是有特殊意义的,因此利用反斜线来跳脱。
如果你要找的档案是具有特殊属性的,如 SUID、档案拥有者、档案大小等等,那么利用 locate 是没有办法达成你的搜索的! 此时 find 就显得很重要了。
另外 find 还可以利用万用字符来寻找档名!例如,你想要找出 /etc 底下包含 httpd 的档案,那么就可以:
$ find /etc -name '*httpd*'
不但可以指定搜索的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的档名!真的很好用。
不过由于 find 在找资料的时候相当的操硬盘,所以没事情不要使用 find 啦!有更棒的指令代替哦,就是上面提到的 whereis 与 locate 喽!
hare
2020.3.13