Linux 基础学习训练教材 - CentOS 8.x

第 4 堂课:Linux 基础文件权限与基础帐号管理

Linux 的权限概念相当的重要!这里先简略的了解一下。权限与帐号相关性很高喔!所以,也要玩一下帐号管理!

最近更新时间: 2020/03/16

从前几节课的练习中发现,使用 student 这种一般身份帐号在进行一些任务时,总是发现无法顺利的拷贝或者是进行其他的文件管理任务, 这是因为『权限不足』所致。本堂课要来介绍 Linux 基础文件系统,借以了解为何 student 的任务会成功或失败。 此外,为了管理权限,有时也需要管理用户帐号,因此基础帐号管理也在本堂课简单介绍。

4.1:Linux 传统权限

Linux 权限的目的是在『保护某些人的文件数据』,因此,读者在认识『权限』的角度上,应该要思考的是『这个文件的权限设置后, 会造成哪个个人?或某群人的读写开放或保护』。所以,这些权限最终都是『应用在某个/某群帐号』上面!而且,权限都是『设置在文件/目录』上, 不是设置在帐号上面的,这也要先厘清。

4.1.1:用户、群组与其他人

Linux 的文件权限在设置上,主要依据三种身份来决定,包括:

  • user / owner / 文件拥有者 / 用户:就是文件所属人
  • group / 群组:这个文件附属于那一个群组团队
  • others / 其他人:不是 user 也没加入 group 的帐号,就是其他人。

底下以一个小案例来说明这三种身份的用法。

假设读者还在学校当老师,你有一本书要让班上同学借阅,但你又不想管,此时你会如何决定『这本书 (文件)』的命运? 通常的作法是:

  • 用户:让某个学生当小老师,这本书就归他管 (用户),同学要借得要通过这位小老师
  • 群组:任何加入本班的同学 (一群帐号) 都是本班群组,这本书对本班群组的同学来说,大家都能借阅。
  • 其他人:不是本班的同学,例如隔壁班的阿花与阿咪,对这本书来说,他们都是属于『其他人』,其他人没有权限可以借阅这本书。

由上面这个简单的小案例,读者应该能够知道,Linux 上面的文件『都是针对帐号』来进行管理的, 只是为了方便管理上的设置 (班级同学与非本班其他同学) ,因此又将非本人的所有帐号分为两类,一类是加入用户所设置的群组, 一个则是没有加入群组的其他人。

  • 文件权限的观察

单纯的文件权限观察,可以使用 ls -l 或 ll 来查阅,底下为查找系统 /var/spool/mail 这个目录的权限方式:

[student@localhost ~]$ ls -ld /var/spool/mail
drwxrwxr-x. 2 root mail 32    2月 26 09:10 /var/spool/mail
[    A    ][B][C ] [D ] [E ]  [    F     ] [    G        ]

简单的分析,上述的数据共有七个字段,每个字段的意义为:

  1. 文件类型与权限,第 1 个字符为文件类型,后续 9 个字符每 3 个一组,共分 3 组,为三种身份的权限;
  2. 文件链接数,这与文件系统有关,读者可暂时略过;
  3. 该文件的拥有者,本例当中,拥有者身份为 root
  4. 该文件的所属群组,本例当中这个文件属于 mail 这个群组底下
  5. 这个文件的容量
  6. 该文件最后一次被修改/修订的日期时间
  7. 这个文件的文件名。

读者首先可以分析一下这个『文件』的『类型』。之前读者应该看过第一个字符为 - 以及 d 的表示方式,事实上还有很多常见的文件类型, 底下仅为常见的类型介绍:

  • -: 代表后面的文件名为一般文件
  • d: 代表后面的文件名为目录档
  • l: 代表后面的文件名为链接档 (有点类似 windows 的捷径概念)
  • b: 代表后面的文件名为一个设备档,该设备主要为区块设备,亦即保存媒体的设备较多
  • c: 代表后面的文件名为一个周边设备档,例如鼠标、键盘等

所以读者可以知道 /var/spool/mail 为一个目录文件 (d 开头,为 directory 的缩写)。确定了文件类型后,接下来的 9 个字符都是 rwx 与减号而已, 从这 9 个字符判断,读者大概可以猜出 rwx 的意义为:

  • r: read,可读的意思
  • w: write,可写入/编辑/修改的意思
  • x: eXecutable,可以运行的意思

只不过 rwx 该如何与 root, mail 这个用户与群组套上关系?我们可以使用下图来查阅第 1, 3, 4 个字段的相关性:

图4.1-1、用户、群组与权限的相关性
图4.1-1、用户、群组与权限的相关性

如上图所示,第一组为文件拥有者的权限,第二组为文件拥有群组的权限,第三组为不是拥有者也没有加入该群组的其他人权限。 所以上述的文件权限为:

  • 拥有者为 root,root 具有 rwx 的权限 (第一组权限)
  • 群组设置为 mail,则所有加入 mail 这个群组的帐号可以具有 rwx 的权限 (第二组权限)
  • 不是 root 也没有加入 mail 的其他人 (例如 student 这个帐号) 具有 rx 的权限 (第三组权限)
实际练习:认识文件的权限概念,若有一个文件的类型与权限数据为『-rwxr-xr--』,请说明其意义为何?
  1. 拆开权限比特:先将整个类型与权限数据分开查阅,并将十个字符整理成为如下所示:
    [-][rwx][r-x][r--]
     0  123  456  789
    
  2. 理解各个位置的意义:
     0 为:代表这个文件名为目录或文件,本例中为文件(-);
    123为:拥有者的权限,本例中为可读、可写、可运行(rwx);
    456为:同群组用户权限,本例中为可读可运行(rx);
    789为:其他用户权限,本例中为可读(r),就是唯读之意 
  3. 同时注意到,rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号(-)。
实际练习:需要了解帐号本身与文件权限的应用关系!很重要喔!
  1. 帐号的前提假设情况:假设有帐号数据如下:
    帐号名称  加入的群组
    test1     test1, testgroup
    test2     test2, testgroup
    test3     test3, testgroup
    test4     test4
    
  2. 文件的状态:如果有下面两个文件,请分别说明 test1, test2, test3, test4 针对底下两个文件的权限各为何?
    -rw-r--r--  1 root     root          238 Jun 18 17:22 test.txt 
    -rwxr-xr--  1 test1    testgroup    5238 Jun 19 10:25 ping_tsai
  3. 关于 test.txt 文件权限与帐号间的关系:
    • test.txt 为一般文件 (-),拥有者为 root,所属群组为 root。
    • 权限方面,只有root这个帐号可以访问此文件,其他人则仅能读此文件。
    • 由于 test1, test2, test3, test4 既不是 root 本人,也没有加入 root 群组,因此四个人针对这个 test.txt 的文件来说,都属于其他人, 仅有可读 (r) 的权限。
  4. 关于 ping_tsai 文件权限与帐号间的关系:
    • ping_tsai 为一般文件 (-),拥有者为 test1,而所属群组为 testgroup。
    • 权限方面,test1 本人具有可读可写可运行,加入 testgroup 的用户可读可运行,其他非 testgroup 帐号成员的其他人,仅具有唯读
      • test1 就是这个 ping_tsai 的拥有者,因此具有可读、可写、可运行的权力(rwx)
      • test2 与 test3 都不是 test1,但是两个都有加入 testgroup 群组,因此 test2 与 test3 参考的权限为群组权限,亦即可读与可运行 (rx),但不可修改 (没有 w 的权限)
      • test4 不是 test1 也没有加入 testgroup 群组,因此 test4 参考其他人的权限,亦即可读 (r)

上面这个练习还挺重要的!因为,文件权限判断的重点,都是:『哪个用户可以对这个文件进行读、写、运行』这样的概念,而帐号是否加入这个文件所属群组, 就是个需要考虑的重点!

  • 观察帐号与权限的相关指令

如上面例题,读者可以知道 test1 属于 test1 及 testgroup 群组,所以可以理解帐号与权限的相关性。不过在实际的系统操作中, 若想知道帐号所属的群组,可以使用 id 这个指令来观察即可理解。

实际练习:承上题,student 这个帐号对于 ping_tsai 来说,具有什么权限?
  1. 首先需要了解 student 的所属群组,可使用 id 这个指令来查找即可:
    [student@localhost ~]$ id
    uid=1000(student) gid=1000(student) groups=1000(student) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    [student@localhost ~]$ id student
    uid=1000(student) gid=1000(student) groups=1000(student)
    # 可以加上帐号在 id 后面喔!若是自己本身,则会列出 selinux 相关的数据!
    
  2. 上述的数据中, gid 为所谓的『原生群组 (primary group)』, groups 则是所有支持的群组。
  3. 由 id 的输出中,发现 student 并没有加入 testgroup 群组,因此 student 针对 ping_tsai 为『其他人』亦即仅有 r 的权限。

而除了 id 可以观察帐号与权限的相关性,在文件类型部份,可以使用前一堂课谈到的 file 来查找。

实际练习:使用 file 与 ls -l 查看不同文件名的文件类型
  1. 先以 ls -l 检查可能不能文件类型的 /etc/init.d /etc/passwd /dev/vda /dev/zero 等文件名:
    [student@localhost ~]$ ll /etc/init.d /etc/passwd /dev/vda /dev/zero
    brw-rw----. 1 root disk 252, 0  3月  9 16:21 /dev/vda
    crw-rw-rw-. 1 root root   1, 5  3月  9 16:21 /dev/zero
    lrwxrwxrwx. 1 root root     11  5月 11  2019 /etc/init.d -> rc.d/init.d
    -rw-r--r--. 1 root root   2433  3月  8 00:15 /etc/passwd
    
    根据前面第一个字符判断, /dev/vda 为区块设备文件、 /dev/zero 为周边设备文件、 /etc/init.d 为链接文件、/etc/passwd 为一般文件。
  2. 再使用 file 查找一下上述的文件名类型:
    [student@localhost ~]$ file /etc/init.d /etc/passwd /dev/vda /dev/zero
    /etc/init.d: symbolic link to rc.d/init.d
    /etc/passwd: ASCII text
    /dev/vda:    block special (252/0)
    /dev/zero:   character special (1/5)
    
    可以显示出更多的结果喔!

使用 ls -l 可以很快速的看到文件属性、权限的概观,不过,其实读者也能使用 getfacl 这个指令来了解文件的相关属性与权限。 如下所示,同样使用 /var/spool/mail 作为范本:

[student@localhost ~]$ getfacl /var/spool/mail
getfacl: Removing leading '/' from absolute path names
# file: var/spool/mail   <==文件名
# owner: root            <==文件拥有者
# group: mail            <==文件群组
user::rwx                <==用户的权限
group::rwx               <==同群组帐号的权限
other::r-x               <==其他人的权限

通过 getfacl 可以更清楚的查找到文件的拥有者与相关的权限设置,只不过就没有文件的类型、修改的时间等参数。

4.1.2:文件属性与权限的修改方式

文件的权限与属性的修改,若以 ls -l 的输出来说,则每个部份可以修改的指令参照大致如下:

[student@localhost ~]$ cd /dev/shm/
[student@localhost shm]$ touch checking
[student@localhost shm]$ ls -l checking
-rw-rw-r--. 1 student student 0  3月 14 21:45 checking
 [ chmod ]    [chown] [chgrp]    [   touch  ] [  mv  ]

由于一般帐号仅能修改自己文件的文件名、时间与权限,无法随意切换用户与群组的设置。因此底下的例题中, 读者应该使用 root 的身份来进行处理,方可顺利进行。首先,切换身份成为 root ,并且将工作目录切换到 /dev/shm。

[student@localhost shm]$ su -
password:
[root@localhost ~]# cd /dev/shm
[root@localhost shm]# ll checking
-rw-rw-r--. 1 student student 0 Mar 14 21:45 checking
# 因为不同的帐号使用的语系不同,root 使用英文语系,因此可以发现日期格式不同。
  • 使用 chown 修改文件拥有者

查找系统中是否有名为 daemon 的帐号,如果存在该帐号,请将 checking 的用户改为 daemon 所拥有,而非 student 所拥有。

[root@localhost shm]# id daemon
uid=2(daemon) gid=2(daemon) groups=2(daemon)

[root@localhost shm]# chown daemon checking
[root@localhost shm]# ll checking
-rw-rw-r--. 1 daemon student 0 Mar 14 21:45 checking

其实 chown 的功能非常多,chown 也可以用来进行群组的修改,也能同时修改文件拥有者与群组。建议读者们应该 man chown 查找相关语法。

  • 使用 chgrp 修改文件拥有的群组

系统的群组都纪录在 /etc/group 文件内,若想要了解系统是否存在某个群组,可以使用 grep 这个关键字截取指令来查找。 举例来说,当系统内有 bin 这个群组时,就将 checking 的群组改为 bin 所有,否则就不予修改。

[root@localhost shm]# grep myname /etc/group
# 不会出现任何信息,因为没有这个群组存在的意思。

[root@localhost shm]# grep bin /etc/group
bin:x:1:        <==代表确实有这个群组存在!

[root@localhost shm]# chgrp bin checking
[root@localhost shm]# ll checking
-rw-rw-r--. 1 daemon bin 0 Mar 14 21:45 checking
  • 使用 chmod 搭配数字法修改权限

由于文件纪录了三种身份,每种身份都拥有 rwx 的最大权限与 --- 没权限的情况。为了搭配性的方便,于是使用 2 比特的方法来记忆! 亦即是 2 进位的情况:

  • r ==> read    ==> 22 ==> 4
  • w ==> write   ==> 21 ==> 2
  • x ==> eXecute ==> 20 ==> 1

于是每种身份最低为 0 分,最高则为 r+w+x --> 4+2+1 --> 7 分!而因为有 3 种身份,因此用户,群组,其他人的身份, 最多为 777 最少为 000 。以上述 checking (-rw-rw-r--)的分数来说,用户为 rw=6, 群组为 rw=6,其他人为 r=4,亦即该文件权限为 664。

实际练习:让 daemon 可读、可写、可运行 checking,让加入 bin 群组的用户可唯读该文件,让其他人没有权限!
  1. 先分析应该完成的权限设计,基本上,应该会是『rwxr-----』,因为:
    • daemon 为用户,可读可写可运行则为 rwx = 7
    • 加入 bin 的群组为唯读,亦即为 r-- = 4
    • 其他人没权限,因此为 --- = 0
  2. 最终可以使用『 chmod 740 checking 』修改权限
    [root@localhost shm]# chmod 740 checking
    [root@localhost shm]# ll checking
    -rwxr-----. 1 daemon bin 0 Mar 14 21:45 checking
    
  • 使用 chmod 搭配符号法修改权限

另外,读者也能够通过直观的方式来进行权限的设置,亦即使用 u,g,o 代表用户、群组与其他人, 然后使用 +, -, = 来加入/减少/直接设置权限,使用表列方式说明如下:

chmodu(user)
g(group)
o(other)
a(all)
+(加入)
-(减去)
=(设置)
r
w
x
文件或目录

举例来说,让 daemon 可读可写可运行 checking 文件,bin 群组的用户们为可读可写,其他人则为可读,使用符号法的处理方式:

[root@localhost shm]# chmod u=rwx,g=rw,o=r checking
[root@localhost shm]# ll checking
-rwxrw-r--. 1 daemon bin 0 Mar 14 21:45 checking
  • 其他属性的修改

假如读者需要修改时间参数与文件名,就得要使用 touch 与 mv 这两个指令了。举例来说, 让 checking 的修改日期改到 1 月 5 日的中午 12 点(年度不变),实验的方式如下:

[root@localhost shm]# touch -t 01051200 checking
[root@localhost shm]# ll checking
-rwxrw-r--. 1 daemon bin 0 Jan  5 12:00 checking

至于文件名的修改则是前一堂课谈到的 mv 这个指令。

例题 4.1.2-1:实际设置文件权限
  1. 使用 root 身份,并且移动工作目录到 /dev/shm
  2. 将 /etc/fstab 拷贝到 /dev/shm 底下
  3. 将 /dev/shm/fstab 更改文件名成为 newfs
  4. 让 newfs 的用户成为 sshd 、群组成为 wheel
  5. sshd 这个帐号可读、可写 newfs,wheel 群组成员仅可读,其他人则无任何权限
  6. 让这个文件的日期设置为前一天的 13:30 (日期请依据实际日期来指定)。
  7. 让所有的人都可以运行 newfs 这个文件 (请使用符号法,同时不要更动到既有的权限!)

4.2:基础帐号管理

帐号管理是系统管理员很重要的一个任务,例如学校的教学环境中,教师通常需要预先建置学生的帐号,以方便学期间上课使用。 公司行号一样也需要让管理员建置好员工的帐号密码,才能让员工顺利的办公。此外,『将帐号分组』也是很重要的一项工作。

4.2.1:简易帐号管理

读者应该还记得,要登录系统的时候,需要输入两个数据,一个是点击帐号名称,再来则是输入该帐号的密码。 因此,最简单的帐号管理,即是创建帐号与给予密码的任务。

请读者尝试创建一个名为 myuser1 的帐号,以及给予 MypassworD 的密码,方式如下:(记得,帐号管理是系统管理员的任务, 所以,身份一定要是 root 才行!)

[root@localhost ~]# useradd  myuser1
[root@localhost ~]# passwd  myuser1
Changing password for user myuser1.
New password:          <==此处输入密码
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
Retype new password:   <==再输入密码一次
passwd: all authentication tokens updated successfully.

[root@localhost ~]# id myuser1
uid=1014(myuser1) gid=1015(myuser1) groups=1015(myuser1)

给予密码的 passwd 这个指令操作时,有几个重点,需要特别注意:

  • 单纯输入 passwd 是『修改自己的密码』,因此,改到谁的密码是很需要确认的。所以如上表所示, 要特别注意第一行出现的是哪一个帐号 (常常有同学不小心改到 root 的密码了...)
  • 由于系统管理员可以给予帐号任意的密码,因此虽然 MypassworD 并不是一个好密码,不过系统还是予以接受。 但是,还是不要设置太过简单的密码,系统很容易被攻破!
  • 出现 New 的关键字,代表输入新的密码,输入 Retype 则是显示刚刚的密码已经可以被接受。

而若帐号设置错误,可以使用 userdel 删除帐号,例如:

[root@localhost ~]# userdel -r myuser1
# 有趣的是, myuser1 的出现也能用 [tab] 按钮喔! userdel -r my[tab] 看看!

加上 -r 的目的是要该帐号连同家目录与电子邮件新件夹通通删除的意思。如果忘记加上 -r 的话,那就需要手动删除用户的家目录与邮件文件。 一般帐号自己能不能修改自己的密码?以及如何修改?参考底下的例题看看:

例题 4.2.1-1:一般帐号修改自己的密码方式
  1. 先另开一个窗口,用 student 身份,输入 passwd student 与 passwd ,分别会出现什么消息?
  2. 直接输入 passwd 之后,尝试修改自己的密码,分别输入 123456 以及 password 两种常见密码,会出现什么错误?
  3. 请尝试到一个可以被系统接受的密码为止。
  4. 最终,请另外再以 root 将 student 密码修改回原本的 mystdgo !

上面的范例中,我们可以知道一般帐号也是能修改自己密码的,只是,密码的强度要够,否则你的密码将无法通过系统的强度验证, 那就无法顺利的修改一般用户的密码了!接下来,以 root 身份管理其他用户的帐号与密码吧!

例题 4.2.1-2:创建与删除用户的简单方式,以及添加用户时,会产生的系统的新数据!
  1. 创建名为 myuser2 的帐号,该帐号密码为 mypassWORD
  2. 创建名为 myuser3 的帐号,该帐号密码为 mypassWORD
  3. 观察 myuser2 与 myuser3 的 id 情况
  4. 观察 /home 与 /var/spool/mail 这两个目录的内容,是否有名为 myuser2 及 myuser3 的文件名存在?
  5. 使用 userdel myuser2 删除帐号 (注意,不要加上 -r 的参数)
  6. 再次观察 /home 与 /var/spool/mail 的内容,myuser2 文件名是否存在?该文件名的权限为何?
  7. 重新创建名为 myuser2 的帐号,密码亦同为 mypassWORD,尝试讨论 (1)创建过程中出现的问题原因为何? (2)是否能够顺利创建该帐号?
  8. 承上,请在 tty4 以后的终端机,使用 myuser2 登录系统,登录后是否出现问题?为什么?
  9. 再次使用 userdel -r 的方式删除 myuser2 与 myuser3,是否能够顺利删除?
  10. 承上,若无法顺利删除帐号,请以手动的方式自行删除余留的用户家目录与邮件文件。

4.2.2:帐号与群组关联性管理

若需要创建帐号时,给予帐号一个次要的群组支持,就需要先行建置群组。举例而言,以学校专题制作为例,有三个帐号 prouser1, prouser2, prouser3 加入共有的群组 progroup 时,该如何创建?首先,应该要先创建群组,通过 groupadd 来处理,再来则是通过 useradd --help 找到次要群组支持的选项为 -G 的项目, 即可创建好群组、帐号与密码。同时,管理员可以通过 passwd --help 找到 --stdin 的选项来操作密码的给予。整体流程如下:

[root@localhost ~]# groupadd progroup
[root@localhost ~]# grep progroup /etc/group
progroup:x:1001:    <==确定有 progroup 在设置档当中了

[root@localhost ~]# useradd -G progroup prouser1
[root@localhost ~]# useradd -G progroup prouser2
[root@localhost ~]# useradd -G progroup prouser3
[root@localhost ~]# id prouser1
uid=1001(prouser1) gid=1002(prouser1) groups=1002(prouser1),1001(progroup)

[root@localhost ~]# echo mypassword
mypassword    <== echo 会将消息从屏幕上输出

[root@localhost ~]# echo mypassword | passwd --stdin prouser1
Changing password for user prouser1.
passwd: all authentication tokens updated successfully.
[root@localhost ~]# echo mypassword | passwd --stdin prouser2
[root@localhost ~]# echo mypassword | passwd --stdin prouser3

读者可以发现到使用 passwd --stdin 的方式来给予密码时,密码会纪录到屏幕与 history 的环境中,因此不见得适用于所有需要资安的系统中。 不过对于大量建置帐号时,会是一个很好用的工具。

另外,如果创建好帐号之后才想到要修改群组资源时,不需要删除帐号再重建,此时可以通过 usermod 来进行修改。举例来说,当 prouser1 还需要加入 student 群组时, 可以使用 usermod -G 的方式来处理!不过需要留意到 -a 的选项才行。

例题 4.2.2-1:使用 usermod 管理已经存在的帐号之属性变化
  1. 使用 usermod -G student prouser1 将 prouser1 加入 student 群组的支持,并观察次要群组支持的状态
  2. 请使用 usermod --help 查找 -a 的选项功能为何?
  3. 请使用 usermod -a -G progroup prouser1 来延伸给予群组,并检查其次要群组的情况喔!

4.3:帐号与权限用途

用户能使用系统上面的资源与权限有关,因此简易的帐号管理之后,就需要与权限搭配设计。

4.3.1:单一用户所有权

一般用户只能够修改属于自己的文件的 rwx 权限,因此,若 root 要协助拷贝数据给一般用户时,需要特别注意该数据的权限。 例如底下的范例中,管理员要将 /etc/tcsd.conf 拷贝给 student 时,需要注意相关的事宜如下:

[root@localhost ~]# ls -l /etc/tcsd.conf
-rw-------. 1 tss tss 7046 Dec 14 00:44 /etc/tcsd.conf  <==一般用户根本没权限

[root@localhost ~]# cp /etc/tcsd.conf ~student/
[root@localhost ~]# ls -l ~student/tcsd.conf
-rw-------. 1 root root 7046 Mar 15 23:13 /home/student/tcsd.conf

[root@localhost ~]# chown student.student ~student/tcsd.conf
[root@localhost ~]# ls -l ~student/tcsd.conf
-rw-------. 1 student student 7046 Mar 15 23:13 /home/student/tcsd.conf

原本 root 拷贝数据给 student 时,若没有考量到权限,则 student 依旧无法读取该文件的内容,这在数据的拷贝行为上,需要特别注意才行。

另外,如果用户想要自己拷贝指令,或者是进行额外的工作任务,可以将指令移动到自己的家目录来处理, 例如 student 想要将 ls 拷贝成为 myls 并且直接运行 myls 来运作系统,可以这样处理:

[student@localhost ~]$ cp /bin/ls myls
[student@localhost ~]$ ls -l myls
-rwxr-xr-x. 1 student student 166448  3月 15 23:15 myls

[student@localhost ~]$ chmod 700 myls
[student@localhost ~]$ ls -l myls
-rwx------. 1 student student 166448  3月 15 23:15 myls
# 未来这个文件,就只有 student 自己能玩!

[student@localhost ~]$ myls
bash: myls: 找不到指令...

[student@localhost ~]$ ./myls
Desktop    Downloads  history.log  myls      Public     Templates  Videos
Documents  group      Music        Pictures  tcsd.conf  text1.txt
# 但是,要运行就得要这样做!当然,也能自己写入 PATH 变量内!如下:

[student@localhost ~]$ mkdir bin
[student@localhost ~]$ mv myls bin
[student@localhost ~]$ myls
bin      Documents  group        Music     Public     Templates  Videos
Desktop  Downloads  history.log  Pictures  tcsd.conf  text1.txt

若仅想要让自己运行,可以将权限改为 700 之类的模样。而『在本目录运行』则需要使用『 ./command 』的型态来运行, 若想要直接输入指令即可,那需要放入用户自己家目录下的 bin 子目录才行 (与 $PATH 变量有关)。因此本范例中,最终将 myls 移动到 /home/student/bin/ 目录下。

例题 4.3.1-1:用户自己创建的指令程序功能
  1. 让 student 帐号直接运行 mymore 即可达成与 more 相同功能的目的 (亦即将 more 拷贝成为 mymore ,并放置到正确的位置即可)

4.3.2:群组共用功能

某些情境下,群组可能需要共享某些文件数据。举例来说,在学校做专题时,同组专题成员可能需要个别的帐号,不过却需要一个共享的目录, 让大家可以共同分享彼此的专题成果。举例来说, progroup 成员 prouser1, prouser2, prouser3 (前小节建置的帐号数据),需要共用 /srv/project1/ 的目录, 则该目录的建置与共享可以使用如下的方式来达成:

[root@localhost ~]# mkdir /srv/project1
[root@localhost ~]# chgrp progroup /srv/project1
[root@localhost ~]# chmod 770 /srv/project1
[root@localhost ~]# ls -ld /srv/project1
drwxrwx---. 2 root progroup 6 Mar 16 00:38 /srv/project1/

此时 progroup 的成员即可在 project1 目录内进行任何动作。但 770 并非最好的处理方式,下一堂课读者们将会学习到 SGID 的功能, 届时才会学到较为正确的权限设置。

除了共享目录之外,在运行档的可运行权限设计上,也能够针对群组来给予可运行权,让其他人不可随意运行共用的指令。 例如让 mycat 运行与 cat 相同的结果,但是仅有 progroup 的用户能够运行,可以这样运行:

[root@localhost ~]# which cat
/usr/bin/cat
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
# 基本上,我们运行指令时,该指令名称就会到 PATH 设置的目录去找,
# 找到的第一个同名的指令,就会被运行喔!

[root@localhost ~]# cp /usr/bin/cat /usr/local/bin/mycat
[root@localhost ~]# ll /usr/local/bin/mycat
-rwxr-xr-x. 1 root root 51856 Mar 16 00:42 /usr/local/bin/mycat

[root@localhost ~]# chgrp progroup /usr/local/bin/mycat
[root@localhost ~]# chmod 750 /usr/local/bin/mycat
[root@localhost ~]# ll /usr/local/bin/mycat
-rwxr-x---. 1 root progroup 51856 Mar 16 00:42 /usr/local/bin/mycat

接下来,请读者分别以 student 与 prouser1 的身份运行一次『 mycat /etc/hosts 』,即可发现不同点了。

那如何切换身份成为 prouser1 呢?基本上,可以使用『 su - prouser1 』即可切换该身份! 倒不用一定要从其他终端机登录喔!
例题 4.3.2-1:设置群组共用的功能。
  1. 前提与目标:student 有个群组名为 student,任何加入 student 的用户可以在 /srv/mystudent/ 目录中进行任何动作,但没加入 student 的用户,仅能读与运行,不能写入。
  2. 先创建 /srv/mystudent 目录
  3. 修改上述目录的群组成为 student,并观察有没有修改成功
  4. 最后权限应该更改为几分才对?

4.4:课后练习操作

  • 上课的课后练习,非作业:
  1. 文件权限的探索与确认:
    1. 查看系统上的 /etc/chrony.keys 这个文件,并且说明这个文件名的:(1)拥有者 (2)拥有群组 (3)权限几分?
    2. 上述文件名的类型是什么档? (一般、目录、链接或设备档等等)
    3. 请问 chrony 这个用户对于 /etc/chrony.keys 这个文件,具有什么权限 (写下 r/w/x)
    4. 请问 root 对于这个文件,又具有什么权限?
  2. 帐号管理:
    1. 创建名为 theuser1, theuser2, theuser3 三个帐号,三个帐号都加入 thegroup 群组,且密码都是 thisgroup
    2. 观察 theuser1 的 UID 与 GID 规划,记下来他是几号喔!
    3. 单纯使用 userdel 不要加上 -r 来删除 theuser1 这个帐号
    4. 现在,请使用查找到的 UID 与 GID 数据,来重新建置 theuser1 这个帐号,且这个帐号可以使用原本的家目录等资源。
  3. 权限管理:
    1. 创建一个名为 /srv/thegroup 目录,这个目录可以让 thegroup 的成员在里面做任何事情
    2. /usr/local/sbin/myif 拷贝来自 /sbin/ifconfig 文件,这个文件只有 thegroup 成员可以运行,其他人无任何权限。
  • 作业 (不提供学生答案,仅提供教师参考答案)

作业硬盘一般操作说明:

  • 打开云端虚拟机前,请务必确认你打开的硬盘是『unit04』,否则就会做错题目
  • 若要使用图形界面,请务必使用 student 身份登录,若需要切换身份,再激活终端机处理。
  • 若有简答题需要使用中文,请自行以第一堂课的动作自行处理输入法安装。
  • 每部虚拟机均有独特的网卡地址,请勿使用他人硬盘上传,否则计分为 0 分。
  • 每位同学均有自己的 IP 尾数,请先向老师询问您的 IP 尾数,才可以进行作业上传。
  • 最终上传作业结果,请务必使用 root 身份上传。
  • 进入作业硬盘后,先用 root 身份运行 vbird_book_setup_ip , 运行流程请参考:vbird_book_setup_ip

作业当中,某些部份可能为简答题~若为简答题时,请将答案写入 /home/student/ans.txt 当中,并写好正确题号,方便老师订正答案。 请注意,文件名写错将无法上传!

ps: 请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。

  1. (15%)请将底下的答案写入 /home/student/ans.txt 的文件中:
    1. 系统内有名为 /examdata/exam.check 的文件,这个文件的 (1)拥有者、 (2)群组 各为何?且 (3)权限是几分?
    2. 承上,该文件的文件类型是什么 (说明是纯文本档?数据库档还是 32 比特或 64 比特运行档等)?
    3. 承上,请问 student 对于 exam.check 这个文件来说,具有什么权限?(写下 rwx 或 --- 等权限标志即可)
  2. (40%)请『依序』进行如下的帐号管理任务:
    1. 创建三个用户,帐号名称分别为: examuser1, examuser2, examuser3 ,三个人都加入 examgroup 的次要群组支持,同时三个用户的密码都是『 ItIsExam 』。 (i 与 e 都是大写字符)
    2. 创建一个用户,帐号名称为 examuser4,密码为『 ItIsExam 』但这个帐号没加入 examgroup 群组
    3. 请删除系统中的 examuser5 这个帐号,同时将这个帐号的家目录与邮件文件同步删除。
    4. 有个帐号 myuser1 不小心被管理员删除了,但是这个帐号的家目录与相关邮件都还存在。请参考这个帐号可能的家目录所保留的 UID 与 GID, 并尝试以该帐号原有的 UID/GID 信息来重建该帐号。而这个帐号的密码请给予 ItIsExam 的样式。(相关建置帐号的指令,请参考 man useradd 等在线文档的说明)
    5. 让 examuser1 额外加入 student 这个群组,亦即 examuser1 至少有加入 examgroup 与 student 群组
  3. (45%)请进行如下的权限管理任务:
    1. 使用 root 将 /etc/gshadow 拷贝给 examuser4 (放在这个用户的家目录),且这个帐号要能够完整使用该文件才行。
    2. 创建一个空的文件,文件名为 /srv/examcheck.txt,这个文件可以让 examuser1 完整的使用,而 examuser2 与 examuser3 可以读取,但不能运行与写入, 至于 examuser4 什么权限都没有。
    3. examgroup 群组的成员想要共用 /srv/examdir 目录,而没有加入 examgroup 的其他人不具备任何权限,应该如何处理?
    4. /usr/local/bin/mymore 拷贝来自 /bin/more,但我只想要让 examgroup 的成员能够运行 /usr/local/bin/mymore 这个指令,其他人不能运行这个指令。
    5. 创建一个名为 /examdata/change.txt 的空文件,这个文件的拥有者为 sshd,拥有群组为 users,sshd 可读可写,users 群组成员可读, 其他人没权限。且这个文件的修改日期请调整成 2012 年 12 月 21 日 (日期正确即可,时间随便)

作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用浏览器查找: http://192.168.251.254 检查相对应的课程文件。 相关流程请参考: vbird_book_check_unit

修改历史:
  • 2016/07/01:加入了习题项目了!
  • 2017/03/09:修改了习题作业,比较适合做为练习之用喔!
  • 2020/03/16:加入了习题的解答,基本上,变动的幅度不大!
2020/03/16 以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计