您的位置:首页 > 运维架构 > Linux

第七章、Linux 文件与目录管理

2013-05-15 14:20 316 查看

重点回顾

绝对路径:『一定由根目录 / 写起』;相对路径:『不是由 / 写起』
特殊目录有:., .., -, ~, ~account需要注意;
与目录相关的命令有:cd, mkdir, rmdir, pwd 等重要命令;
rmdir 仅能删除空目录,要删除非空目录需使用『 rm -r 』命令;
使用者能使用的命令是依据 PATH 变量所规定的目录去搜寻的;
不同的身份(root 与一般用户)系统默认的 PATH 并不相同。差异较大的地方在於 /sbin, /usr/sbin ;
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文件系统中,还可以使用chattr与lsattr配置及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为drwxrwxrwx, 文件则为-rw-rw-rw-。
文件具有SUID的特殊权限时,代表当使用者运行此一binary程序时,在运行过程中使用者会暂时具有程序拥有者的权限
目录具有SGID的特殊权限时,代表使用者在这个目录底下新建的文件之群组都会与该目录的群组名称相同。
目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删除!
观察文件的类型可以使用 file 命令来观察;
搜寻命令的完整档名可用 which 或 type ,这两个命令都是透过 PATH 变量来搜寻档名;
搜寻文件的完整档名可以使用 whereis 或 locate 到数据库文件去搜寻,而不实际搜寻文件系统;
利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的档名。


本章习题:

( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )

情境模拟题一:假设系统中有两个帐号,分别是 alex 与 arod ,这两个人除了自己群组之外还共同支持一个名为 project 的群组。假设这两个用户需要共同拥有 /srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。 请问该目录的权限配置应为何?请先以传统权限说明,再以 SGID 的功能解析。

目标:了解到为何专案开发时,目录最好需要配置 SGID 的权限!
前提:多个帐号支持同一群组,且共同拥有目录的使用权!
需求:需要使用 root 的身份来进行 chmod, chgrp 等帮用户配置好他们的开发环境才行! 这也是管理员的重要任务之一!

首先我们得要先制作出这两个帐号的相关数据,帐号/群组的管理在后续我们会介绍, 您这里先照著底下的命令来制作即可:

[root@www ~]# groupadd project        <==添加新的群组
[root@www ~]# useradd -G project alex <==创建 alex 帐号,且支持 project
[root@www ~]# useradd -G project arod <==创建 arod 帐号,且支持 project
[root@www ~]# id alex                 <==查阅 alex 帐号的属性
uid=501(alex) gid=502(alex) groups=502(alex),501(project) <==确实有支持!
[root@www ~]# id arod
uid=502(arod) gid=503(arod) groups=503(arod),501(project)

然后开始来解决我们所需要的环境吧!

首先创建所需要开发的专案目录:

[root@www ~]# mkdir /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxr-xr-x 2 root root 4096 Sep 29 22:36 /srv/ahome

从上面的输出结果可发现 alex 与 arod 都不能在该目录内创建文件,因此需要进行权限与属性的修改。 由於其他人均不可进入此目录,因此该目录的群组应为project,权限应为770才合理。

[root@www ~]# chgrp project /srv/ahome
[root@www ~]# chmod 770 /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxrwx--- 2 root project 4096 Sep 29 22:36 /srv/ahome
# 从上面的权限结果来看,由於 alex/arod 均支持 project,因此似乎没问题了!

实际分别以两个使用者来测试看看,情况会是如何?先用 alex 创建文件,然后用 arod 去处理看看。

[root@www ~]# su - alex       <==先切换身份成为 alex 来处理
[alex@www ~]$ cd /srv/ahome   <==切换到群组的工作目录去
[alex@www ahome]$ touch abcd  <==创建一个空的文件出来!
[alex@www ahome]$ exit        <==离开 alex 的身份

[root@www ~]# su - arod
[arod@www ~]$ cd /srv/ahome
[arod@www ahome]$ ll abcd
-rw-rw-r-- 1 alex alex 0 Sep 29 22:46 abcd
# 仔细看一下上面的文件,由於群组是 alex ,arod并不支持!
# 因此对於 abcd 这个文件来说, arod 应该只是其他人,只有 r 的权限而已啊!
[arod@www ahome]$ exit

由上面的结果我们可以知道,若单纯使用传统的 rwx 而已,则对刚刚 alex 创建的 abcd 这个文件来说, arod 可以删除他,但是却不能编辑他!这不是我们要的样子啊!赶紧来重新规划一下。

加入 SGID 的权限在里面,并进行测试看看:

[root@www ~]# chmod 2770 /srv/ahome
[root@www ~]# ll -d /srv/ahome
drwxrws--- 2 root project 4096 Sep 29 22:46 /srv/ahome

测试:使用 alex 去创建一个文件,并且查阅文件权限看看:
[root@www ~]# su - alex
[alex@www ~]$ cd /srv/ahome
[alex@www ahome]$ touch 1234
[alex@www ahome]$ ll 1234
-rw-rw-r-- 1 alex project 0 Sep 29 22:53 1234
# 没错!这才是我们要的样子!现在 alex, arod 创建的新文件所属群组都是 project,
# 由於两人均属於此群组,加上 umask 都是 002,这样两人才可以互相修改对方的文件!

所以最终的结果显示,此目录的权限最好是『2770』,所属文件拥有者属於root即可,至於群组必须要为两人共同支持的project 这个群组才行!

简答题部分:

什么是绝对路径与相对路径

绝对路径的写法为由 / 开始写,至於相对路径则不由 / 开始写!此外,相对路径为相对於目前工作目录的路径!

如何更改一个目录的名称?例如由 /home/test 变为 /home/test2

mv /home/test /home/test2

PATH 这个环境变量的意义?

这个是用来指定运行档运行的时候,命令搜寻的目录路径。

umask 有什么用处与优点?

umask 可以拿掉一些权限,因此,适当的定义 umask 有助於系统的安全, 因为他可以用来创建默认的目录或文件的权限。

当一个使用者的 umask 分别为 033 与 044 他所创建的文件与目录的权限为何?

在 umask 为 033 时,则默认是拿掉 group 与 other 的 w(2)x(1) 权限,因此权限就成为『文件 -rw-r--r-- , 目录 drwxr--r-- 』而当 umask 044 时,则拿掉 r 的属性,因此就成为『文件 -rw--w--w-,目录 drwx-wx-wx』

什么是 SUID ?

当一个命令具有 SUID 的功能时,则:

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

当我要查询 /usr/bin/passwd 这个文件的一些属性时(1)传统权限;(2)文件类型与(3)文件的隐藏属性,可以使用什么命令来查询?

ls -al

file

lsattr

尝试用 find 找出目前 linux 系统中,所有具有 SUID 的文件有哪些?

find / -perm +4000 -print

找出 /etc 底下,文件大小介於 50K 到 60K 之间的文件,并且将权限完整的列出 (ls -l):

find /etc -size +50k -a -size -60k -exec ls -l {} \;

注意到 -a ,那个 -a 是 and 的意思,为符合两者才算成功

找出 /etc 底下,文件容量大於 50K 且文件所属人不是 root 的档名,且将权限完整的列出 (ls -l);

find /etc -size +50k -a ! -user root -exec ls -ld {} \;

find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;

上面两式均可!注意到 ! ,那个 ! 代表的是反向选择,亦即『不是后面的项目』之意!

找出 /etc 底下,容量大於 1500K 以及容量等於 0 的文件:

find /etc -size +1500k -o -size 0

相对於 -a ,那个 -o 就是或 (or) 的意思罗!


参考数据与延伸阅读

小洲大大回答 SUID/SGID 的一篇讨论:

http://phorum.vbird.org/viewtopic.php?t=20256
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: