6.8 本章习题

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

  • 目标:了解到为何专案开发时,目录最好需要设置 SGID 的权限!
  • 前提:多个帐号支持同一群组,且共同拥有目录的使用权!
  • 需求:需要使用 root 的身份来进行 chmod, chgrp 等帮用户设置好他们的开发环境才行! 这也是管理员的重要任务之一! 首先我们得要先制作出这两个帐号的相关数据,帐号/群组的管理在后续我们会介绍, 您这里先照着下面的指令来制作即可:
    [root@study ~]# groupadd project        <==增加新的群组
    [root@study ~]# useradd -G project alex <==创建 alex 帐号,且支持 project
    [root@study ~]# useradd -G project arod <==创建 arod 帐号,且支持 project
    [root@study ~]# id alex                 <==查阅 alex 帐号的属性
    uid=1001(alex) gid=1002(alex) groups=1002(alex),1001(project) <==确实有支持!
    [root@study ~]# id arod
    uid=1002(arod) gid=1003(arod) groups=1003(arod),1001(project) <==确实有支持!
    

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

  • 首先创建所需要开发的专案目录:
    [root[@study](https://github.com/study "@study") ~]# mkdir /srv/ahome
    [root[@study](https://github.com/study "@study") ~]# ll -d /srv/ahome
    drwxr-xr-x. 2 root root 6 Jun 17 00:22 /srv/ahome
    
  • 从上面的输出结果可发现 alex 与 arod 都不能在该目录内创建文件,因此需要进行权限与属性的修改。 由于其他人均不可进入此目录,因此该目录的群组应为project,权限应为770才合理。
    [root[@study](https://github.com/study "@study") ~]# chgrp project /srv/ahome
    [root[@study](https://github.com/study "@study") ~]# chmod 770 /srv/ahome
    [root[@study](https://github.com/study "@study") ~]# ll -d /srv/ahome
    drwxrwx—-. 2 root project 6 Jun 17 00:22 /srv/ahome
    
  • 从上面的权限结果来看,由于 alex/arod 均支持 project,因此似乎没问题了!
  • 实际分别以两个使用者来测试看看,情况会是如何?先用 alex 创建文件,然后用 arod 去处理看看。
    [root[@study](https://github.com/study "@study") ~]# su - alex <==先切换身份成为 alex 来处理
    [alex[@www](https://github.com/www "@www") ~]$ cd /srv/ahome <==切换到群组的工作目录去
    [alex[@www](https://github.com/www "@www") ahome]$ touch abcd <==创建一个空的文件出来!
    [alex[@www](https://github.com/www "@www") ahome]$ exit <==离开 alex 的身份
    [root[@study](https://github.com/study "@study") ~]# su - arod
    [arod[@www](https://github.com/www "@www") ~]$ cd /srv/ahome
    [arod[@www](https://github.com/www "@www") ahome]$ ll abcd
    - rw-rw-r—. 1 alex alex 0 Jun 17 00:23 abcd
    
  • 仔细看一下上面的文件,由于群组是 alex ,arod并不支持!因此对于 abcd 这个文件来说, arod 应该只是其他人,只有 r 的权限而已啊!
    [arod[@www](https://github.com/www "@www") ahome]$ exit
    
  • 由上面的结果我们可以知道,若单纯使用传统的 rwx 而已,则对刚刚 alex 创建的 abcd 这个文件来说, arod 可以删除他,但是却不能编辑他!这不是我们要的样子啊!赶紧来重新规划一下。
  • 加入 SGID 的权限在里面,并进行测试看看:
    [root[@study](https://github.com/study "@study") ~]# chmod 2770 /srv/ahome
    [root[@study](https://github.com/study "@study") ~]# ll -d /srv/ahome
    drwxrws—-. 2 root project 17 Jun 17 00:23 /srv/ahome
    测试:使用 alex 去创建一个文件,并且查阅文件权限看看:
    [root[@study](https://github.com/study "@study") ~]# su - alex
    [alex[@www](https://github.com/www "@www") ~]$ cd /srv/ahome
    [alex[@www](https://github.com/www "@www") ahome]$ touch 1234
    [alex[@www](https://github.com/www "@www") ahome]$ ll 1234
    - rw-rw-r—. 1 alex project 0 Jun 17 00:25 1234
    
  • 没错!这才是我们要的样子!现在 alex, arod 创建的新文件所属群组都是 project,由于两人均属于此群组,加上 umask 都是 002,这样两人才可以互相修改对方的文件!所以最终的结果显示,此目录的权限最好是“2770”,所属文件拥有者属于root即可,至于群组必须要为两人共同支持的project 这个群组才行!

简答题部分:

  • 什么是绝对路径与相对路径绝对路径的写法为由 / 开始写,至于相对路径则不由 / 开始写!此外,相对路径为相对于目前工作目录的路径!
  • 如何更改一个目录的名称?例如由 /home/test 变为 /home/test2mv /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 -alfilelsattr
  • 尝试用 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) 的意思啰!