linux文件和目录管理(三)

linux文件和目录管理(三)

文件隐藏属性

不过要先强调的是,底下的chattr指令只能在Ext2/Ext3/Ext4的Linux传统档案系统上面完整生效,其他的档案系统可能就无法完整的支援这个指令了,例如xfs仅支援部份参数而已。

chattr:设定文件隐藏属性

chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设定一定,且仅有后面接的参数

A :当设定了A 这个属性时,若你有存取此文件(或目录)时,他的存取时间atime 将不会被修改,
可避免I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :一般文件是非同步写入磁盘的,如果加上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:显示文件隐藏属性

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

案例

[root@study tmp]# chattr +aiS attrtest 
[root@study tmp]# lsattr attrtest

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

[root@study ~]# ls -ld /tmp ; ls -l /usr/bin/passwd 
drwxrwxrw t . 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 )

Set UID

基本上SUID有这样的限制与功能:

只有可执行(x)的二进制程序才能设定setUID权限
命令执行者要对该程序拥有执行权限(x)
命令的执行者在执行该程序时会获得该程序文件的属主身份
setUID权限只在该程序的执行过程中有效,也就是说身份改变只在程序执行过程中有效

假如有一个用户dmtsai,想修改密码:那么,
dmtsai 对于/usr/bin/passwd 这个程式来说是具有x 权限的,表示dmtsai 能执行passwd;
passwd 的拥有者是root 这个帐号;
dmtsai 执行passwd 的过程中,会『暂时』获得root 的权限;
/etc/shadow 就可以被dmtsai 所执行的passwd 所修改。

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

Set GID

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

[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# ls -l /var/opt/gitlab/git-data/repositories
total 8
drwxr-sr-x 3 git root 4096 Sep 26 17:02 +gitaly
drwxr-s--- 6 git root 4096 Oct 16 12:18 @hashed

SUID 不同的是,SGID 可以针对文件或目录来设定!

如果是对文件来说, SGID 有如下的功能:

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


当一个目录设定了SGID 的权限后,他将具有如下的功能:

使用者若对于此目录具有r 与x 的权限时,该使用者能够进入此目录;
使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
用途:若使用者在此目录下具有w 的权限(可以新建文件),则使用者所建立的新文件,该新文件的群组与此目录的群组相同。

Sticky Bit:

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

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

SUID/SGID/SBIT 权限设定:

如何设定文件使成为具有SUID与SGID的权限呢?

已知数字型态更改权限的方式为『三个数字』的组合,那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
4 为SUID
2 为SGID
1 为SBIT

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

[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# ls -l a.test  //默认属性
-rwxr-xr-x 1 root root 0 Oct 26 11:02 a.test
[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# chmod 4755 a.test //加入具有SUID的权限
[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# ls -l a.test
-rwsr-xr-x 1 root root 0 Oct 26 11:02 a.test
[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# chmod 6755 a.test //加入具有SUID/SGID的权限
[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# ls -l a.test
-rwsr-sr-x 1 root root 0 Oct 26 11:02 a.test

SBIT和他们一样。只是SBIT必须是文件夹。

查看文件类型: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

# 执行档的资料可就多的不得了!
#使用的是Linux核心2.6.32的动态函数库连结等等。

命令与文件的搜索

which:查询命令的执行文件。

which [-a] command 
选项或参数:
-a :将所有由PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# which ls
alias ls=\'ls --color=auto\'
/usr/bin/ls

#出现了命令别名和命令的文件位置。
这个指令是根据『PATH』这个环境变量所规范的路径,去搜索执行文件的命令。所以如果命令不在PATH里面,那么是搜索不到的。

[root@iZ2zec61wsgboa6h0j9jjfZ tmp]# which history
/usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

whereis:搜索文件名或目录

whereis [-bmsu]文件或目录名
选项与参数:
-l :可以列出whereis 会去查询的几个主要目录而已
-b :只找binary 格式的文件
-m :只找在说明档manual 路径下的文件
-s :只找source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件

[root@iZ2zec61wsgboa6h0j9jjfZ ~]# whereis nginx
nginx: /usr/bin/nginx /usr/local/nginx

locate:搜索文件名或目录

[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

范例三:想查找一个在/usr/下的一个叫nginx.conf的文件,但是不知道他在哪个目录。
[root@iZ2zec61wsgboa6h0j9jjfZ ~]# locate /usr/*/nginx.conf
/usr/local/nginx/conf/nginx.conf

它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。

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用在分辨两个文件之间的新旧关系是很有用的!


图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。
+4代表大于等于5天前的文件:ex> find /var -mtime +4
-4代表小于等于4天内的文件文件:ex> find /var -mtime -4
4则是代表4-5那一天的文件文件:ex> find /var -mtime 4

选项与参数:
2. 与使用者或群组名称有关的参数:
-uid n :n 为数字,这个数字是使用者的帐号ID,亦即UID ,这个UID 是记录在
/etc/passwd 里面与帐号名称对应的数字。
-gid n :n 为数字,这个数字是群组名称的ID,亦即GID,这个GID 记录在
/etc/group。
-user name :name 为使用者帐号名称喔!例如root
-group name:name 为群组名称喔,例如users ;
-nouser :寻找文件的拥有者不存在/etc/passwd 的人!
-nogroup :寻找文件的拥有群组不存在于/etc/group 的文件!
当你自行安装软体时,很可能该软体的属性当中并没有文件拥有者,
这是可能的!在这个时候,就可以使用-nouser 与-nogroup 搜寻。

案例

范例三:搜寻/home底下属于dmtsai的文件 
[root@study ~]# find /home -user dmtsai
#这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,
# 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!

范例四:搜寻系统中不属于任何人的文件
[root@study ~]# find / -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?

范例七:找出系统中,大于1MB的文件
[root@study ~]# find / -size +1M