linux档案和目录管理(后续)

资料来自鸟哥的linux私房菜

四:档案和目录的预设权限和隐藏权限

umask:预设权限,相比与chomd的4,2,1权限,档案满分为666,目录满分为777,umask可以预设消除部分权限,比如一个原本777的目录,umask 002,这个目录的权限就变成775,一开始预设权限002,然后如果创建文件权限就会是664,目录权限775。

[root@study ~]# umask 
0022              <==与一般权限有关的是后面三个数字!
[root@study ~]# umask -S
u=rwx,g=rx,o=rx

[root@study ~]# umask
0022
[root@study ~]# touch test1 
[root@study ~]# mkdir test2 
[root@study ~]# ll -d test* 
-rw-r--r-- . 1 root root 0 6月16 01:11 test1
 drwxr-xr-x . 2 root root 6 6月16 01:11 test2

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

chattr:设定档案的隐藏属性

[root@study ~]# 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 而已

范例:请尝试到/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
--S-ia---------- attrtest

SUID:

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

SGID:

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

SBIT:

  • 当使用者对于此目录具有w, x 权限,亦即具有写入的权限时;
  • 当使用者在该目录下建立档案或目录时,仅有自己与root 才有权力删除该档案
  • 4 为SUID
  • 2 为SGID
  • 1 为SBIT
root@study ~]# cd /tmp 
[root@study tmp]# touch test                   <==建立一个测试用空档 
[root@study tmp]# chmod 4755 test; ls -l test  <==加入具有SUID的权限 
-rw s r-xr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]# chmod 6755 test; ls -l test  <==加入具有SUID/SGID的权限 
-rw s r- s r-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权限 
-rw S rw S rw T 1 root root 0 Jun 16 02:53 test

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档案!

五:指令和档案的查找

which:根据PATH环境变量中规划的路径,去找可执行档案的档名,终点是找出执行档案。

[root@study ~]# 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 

whereis:在特定的档案中寻找目录或档案

[root@study ~]# 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

loacte/updatedb:在后面输入档案的部分名称就可以查找了,不过我自己的系统中找不到这个命令,因为需要安装mlocate,然后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

find:找档案或者目录都可以。

[root@study ~]# 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用在分辨两个档案之间的新旧关系是很有用的!

选项与参数:
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 
#透过这个指令,可以轻易的就找出那些不太正常的档案。如果有找到不属于系统任何人的档案时,
# 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软体时。

选项与参数:
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 ~了乎?

选项与参数:
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
[root@study ~]# find /etc -name '*httpd*'


关于这次的总结:
  • 绝对路径:『一定由根目录/ 写起』;相对路径:『不由/ 写起,而是由相对当前目录写起』
  • 特殊目录有:., .., -, ~, ~account需要注意;
  • 与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;
  • rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』指令;
  • 使用者能使用的指令是依据PATH 变数所规定的目录去搜寻的;
  • ls 可以检视档案的属性,尤其-d, -a, -l 等选项特别重要!
  • 档案的复制、删除、移动可以分别使用:cp, rm , mv等指令来操作;
  • 检查档案的内容(读档)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
  • cat -n 与nl 均可显示行号,但预设的情况下,空白行会不会编号并不相同;
  • touch 的目的在修改档案的时间参数,但亦可用来建立空档案;
  • 一个档案记录的时间参数有三种,分别是access time(atime), status time (ctime), modification time(mtime),ls 预设显示的是mtime。
  • 除了传统的rwx权限之外,在Ext2/Ext3/Ext4/xfs档案系统中,还可以使用chattr与lsattr设定及观察隐藏属性。常见的包括只能新增资料的+a 与完全不能更动档案的+i 属性。
  • 新建档案/目录时,新档案的预设权限使用umask 来规范。预设目录完全权限为drwxrwxrwx, 档案则为-rw-rw-rw-。
  • 档案具有SUID的特殊权限时,代表当使用者执行此一binary程式时,在执行过程中使用者会暂时具有程式拥有者的权限
  • 目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的档案之群组都会与该目录的群组名称相同。
  • 目录具有SBIT的特殊权限时,代表在该目录下使用者建立的档案只有自己与root能够删除!
  • 观察档案的类型可以使用file 指令来观察;
  • 搜寻指令的完整档名可用which 或type ,这两个指令都是透过PATH 变数来搜寻档名;
  • 搜寻档案的完整档名可以使用whereis 找特定目录或locate 到资料库去搜寻,而不实际搜寻档案系统;
  • 利用find 可以加入许多选项来直接查询档案系统,以获得自己想要知道的档名。


posted @ 2018-03-05 16:55  zzy0306  阅读(272)  评论(0编辑  收藏  举报