权限在目录上的介绍、进程管理初探以及 SUID/SGID/SBIT 的功能
前一堂课主要讲 Linux 基础权限概念。虽然有了三种身份与各三个权限的概念,但是实际应用于目录及文件则有不同的情况, 因为文件与目录放置的『内容务』不同所致。此外,权限与实际操作者取得的进程是有关系的, 因此本堂课亦将介绍进程的概念以及基础的观察、管理等任务。
从前一小节我们知道了 Linux 的文件权限设置上有三种身份,每种身份则有三种权限 (rwx)。不过文件系统里面的文件类型很多,基本上就有一般文件与目录文件, 这两种文件类型的权限意义并不相同。
基本上,目录与文件的『内容物』有点不太一样,这也就造成权限对目录及文件产生不同的影响作用。
文件是实际含有数据的地方,包括一般文本档、数据库内容档、二进位可运行档(binary program)等等。 因此,权限对于文件来说,他的意义是这样的:
可读 (r) 代表可以读取文件实际的内容,可编辑 (w) 的意思是可以写入/编辑/添加/修改文件的内容的权限, 但并不具备有删除该文件本身的权限!
可运行 (x) 代表该文件具有可以被运行的权限,但该文件的代码能不能运行则是另一回事。举例来说,一个单纯的文本文件, 内容为一封信件时,你也可以设置该文件拥有 x 的可运行权限,但该文件的内容其实不具备运行档的功能。因此当该文件被运行时,就会出现程序错误的情况。
对于文件的rwx来说, 主要都是针对『文件的内容』而言,与文件文件名的存在与否没有关系。
文件是存放实际数据的所在,而目录主要的内容在记录文件名清单,文件名与目录有强烈的关连。如果是针对目录时,rwx 的意义如下:
若以较人性化的角度来思考,让文件变成文件夹、目录变成抽屉,则 rwx 的功能汇整如下表:
组件 | 内容 | 思考对象 | r | w | x |
文件 | 详细数据data | 文档文件夹 | 读到文档内容 | 修改文档内容 | 运行文档内容 |
目录 | 文件名 | 可分类抽屉 | 读到文件名 | 修改文件名 | 进入该目录的权限(key) |
读者须注意,目录的 rw 与『文件名』有关,而文件的 rw 则与『文件的内容,包括代码与数据等』有关。比较特别的是目录的 x, 该权限代表用户能否打开抽屉取得该抽屉内的文件名数据。
drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh系统有个帐号名称为vbird,这个帐号并没有支持root群组。现在:请问vbird对这个目录有何权限?是否可切换到此目录中成为 vbird 的工作目录?
有经验的同学就会发现,虽然对目录有 r 的权限,但是其他权限都没有的话,当你使用『 ls -l somedir 』时,就会发现到该目录底下的文件名信息中, 某些权限属性是看不到的!试想,如果你打开电灯,看到『被锁上的玻璃柜』,你可以看到内部的所有数据,但是你没办法拿出来 (没钥匙), 所以,就无法查看玻璃柜内部物品的详细说明 (例如,制造日期写在物品的底部,结果你看不到底部啊!)
drwx------ 5 student student 4096 Jul 04 11:16 /home/student/ -rwx------ 1 root root 128 Jul 04 11:18 /home/student/the_root_data现在:请问 student 能不能删除 the_root_data 文件?
根据上述的权限意义,假如用户想在『 /dir1/file1 』这个文件与『 /dir2 』这个目录之间进行如下的动作时,用户应该具有哪些『最小权限』才能运作?
操作动作 | /dir1 | /dir1/file1 | /dir2 | 重点 |
读取 file1 内容 | 要能够进入 /dir1 才能读到里面的文档数据! | |||
修改 file1 内容 | 能够进入 /dir1 且修改 file1 才行! | |||
运行 file1 内容 | 能够进入 /dir1 且 file1 能运作才行! | |||
删除 file1 文件 | 能够进入 /dir1 具有目录修改的权限即可! | |||
将 file1 拷贝到 /dir2 | 要能够读 file1 且能够修改 /dir2 内的数据 | |||
将 file1 移动到 /dir2 | 两个目录均需要被更改 |
请先思考上述表格内容的权限意义之后,再进行底下的例题:
drwxrwxr-x root root /dev/shm/unit05/ drwxr-xr-- root root /dev/shm/unit05/dir1/ -rw-r--r-- root root /dev/shm/unit05/dir1/file1 (拷贝来自 /etc/hosts) drwxr-x--x root root /dev/shm/unit05/dir2/ -rw-r--r-- root root /dev/shm/unit05/dir2/file2 (拷贝来自 /etc/hosts) drwxr-xr-x root root /dev/shm/unit05/dir3/ -rw-rw-rw- root root /dev/shm/unit05/dir3/file3 (拷贝来自 /etc/hosts) drwxrwxrwx root root /dev/shm/unit05/dir4/ -rw------- root root /dev/shm/unit05/dir4/file4 (拷贝来自 /etc/hosts)
在 Linux 系统运作中,所有在系统上面运作的都是通过触发程序成为内存中的进程后,才能够顺利的操作系统。进程的观察与管理是相当重要的, 所以读者应该先认识进程后,才能够进一步管理。
在一般的理解中,程序与进程的关系是这样的:
进程的触发流程与在内存当中的管理,简单的图标为:
上图比较需要注意的是,同一只程序有时候会被多个用户运行触发,因此系统当中可能会有多个代码相同的『进程』存在! 那系统如何了解到底是哪只进程在运作?此时就需要知道 PID (Process ID) 了。PID 是系统处理内存内进程的最重要的参考依据。 如下图 5.2-2 所示,不同的用户登录都是运行 /bin/bash 这个 shell,读者也应该知道系统管理需要管理员身份的 bash 才能够运作, 一般帐号的 bash 能做的事情相对较少。但其实两者都是运行 bash 的。
进程是有相依性的!举例来说,你想要运行 office 软件时,因为 office 软件是依附在图形界面上,因此你一定要启动 X server 这个图形界面服务器后, 才有办法顺利运作 office 的。此时你可以说, X server 是父进程,而 office 就是子进程了。
此外,读者也尝试使用过 su 来切换身份成为 root,此时 su 会给予一个具有 root 权限的 bash 环境,那么用户登录的 bash 就被称为父进程, 由 su - 取得后的 bash 就是子进程,如下图来观察:
进程的观察大多使用 ps, pstree, top 等指令,不过最好根据观察的对象来学习!底下列出几个常见的观察对象与所使用的指令对应。
如果用户仅想知道目前的 bash 界面相关的进程,可以使用简易的 ps -l 即可!输出界面示意:
[student@localhost ~]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 14132 14125 0 80 0 - 6860 - pts/0 00:00:00 bash 0 R 1000 14182 14132 0 80 0 - 11191 - pts/0 00:00:00 ps
每个项目的意义简单说明如下:
上述的 PPID 即是父进程之意,因此 ps 的 PID 是 14182 而 PPID 是 14132,至于 14132 这个 PID 的主人就是 bash 。 而因为 bash 大部分在提供用户一个输入的界面,因此并没有在运行 (run),故大部分的时间其实是在等待用户输入指令, 因此上面读者应该可以发现到 bash 的 S (state) 状态为 S (sleep) 。
观察全系统进程的方式主要有两种,一种是进程关联树,亦即 pstree ,他相对简单很多。为了显示的方便,建议读者可以下达 -A 的选项, 以 ASCII 的显示字符输出,比较不容易出现乱码:
[student@localhost ~]$ pstree -A systemd-+-ModemManager---2*[{ModemManager}] |-NetworkManager---2*[{NetworkManager}] .......(中间省略)...... |-systemd-+-(sd-pam) | |-at-spi-bus-laun-+-dbus-daemon---{dbus-daemon} .......(中间省略)...... | |-gnome-shell-cal---5*[{gnome-shell-cal}] | |-gnome-terminal--+-bash---pstree | | `-3*[{gnome-terminal-}] .......(底下省略)......
读者可以看到用户通过图形界面的 gnome-terminal 来取得 bash ,然后再以 bash 来启动 pstree 的情况。若需要加上 PID (p) 与用户数据 (u), 可以直接使用 -up 来加入即可。
[student@localhost ~]$ pstree -Aup systemd(1)-+-ModemManager(973)-+-{ModemManager}(991) | `-{ModemManager}(998) |-NetworkManager(1104)-+-{NetworkManager}(1111) | `-{NetworkManager}(1113) .......(中间省略)...... |-systemd(14104,student)-+-(sd-pam)(14117) | |-at-spi-bus-laun(14804)-+-dbus-daemon(14809)---{dbus-daemon}(14810) .......(中间省略)...... | |-gnome-shell-cal(14924)-+-{gnome-shell-cal}(14926) | | |-{gnome-shell-cal}(14928) | | |-{gnome-shell-cal}(14944) | | |-{gnome-shell-cal}(14945) | | `-{gnome-shell-cal}(15103) | |-gnome-terminal-(15372)-+-bash(15381)---pstree(15673) | | |-{gnome-terminal-}(15373) | | |-{gnome-terminal-}(15374) | | `-{gnome-terminal-}(15375) .......(底下省略)......
如上所示,每个进程后面多出来的括号内的数值,就是该进程的 PID。另外需要注意的是,当父进程、子进程的拥有者不同时, 在程序名称后面才会加上用户的信息,否则会省略用户的名称。而因为同一只程序会产生多个进程,因此每个进程就会有独立的 PID,这也需要特别注意。
除了较简易的 pstree 之外,读者最好也能够记忆 ps aux 这一个指令的用途,这个指令可以将系统中的进程调用出来,且输出的信息较为丰富。 显示的信息有点像这样:
[student@localhost ~]$ ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.5 244840 10084 ? Ss 3月16 0:04 /usr/lib/systemd/systemd rhgb --switched-root - root 2 0.0 0.0 0 0 ? S 3月16 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 3月16 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 3月16 0:00 [rcu_par_gp] .......(中间省略)...... student 15372 0.1 2.5 823144 47796 ? Ssl 14:44 0:00 /usr/libexec/gnome-terminal-server student 15381 0.0 0.2 27548 5320 pts/1 Ss+ 14:44 0:00 bash student 15436 0.0 0.6 321332 12448 tty4 Sl 14:45 0:00 /usr/libexec/ibus-engine-libzhuyin --ibus .......(中间省略)...... student 15747 0.0 0.2 57184 3952 pts/0 R+ 14:52 0:00 ps aux
每一个项目代表的意义简易说明如下:
读者亦可以通过 top 这个指令来观察进程的动态信息。top 可以协助读者未来在管理进程的 CPU 使用量上面的一个很重要的工具。 直接输入 top 即可每 5 秒钟更新一次进程的现况,如下表所示:
[student@localhost ~]$ top top - 15:12:55 up 6 days, 25 min, 3 users, load average: 0.14, 0.04, 0.01 Tasks: 287 total, 1 running, 284 sleeping, 2 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 1828.4 total, 207.4 free, 1129.2 used, 491.8 buff/cache MiB Swap: 2048.0 total, 1999.5 free, 48.5 used. 519.0 avail Mem <==这一行是指令列! PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 14845 student 20 0 4388328 235688 84132 S 0.2 12.6 0:09.16 gnome-shell 14990 root 20 0 204224 30028 9072 S 0.2 1.6 0:02.59 sssd_kcm 15931 student 20 0 64020 4940 4040 R 0.2 0.3 0:00.04 top 15878 root 20 0 0 0 0 I 0.1 0.0 0:00.04 kworker/4:3-events_freezable_power_ 1 root 20 0 244840 10084 6268 S 0.0 0.5 0:04.70 systemd
离开 top 可以使用 q 来离开即可。至于 top 每一行的意义说明如下:
top - 15:12:55 up 6 days, 25 min, 3 users, load average: 0.14, 0.04, 0.01
代表目前时间为 15:12:55,本系统开机了 6 天 25 分钟这么久的时间,目前有 3 为用户登录,工作负载为 0.14, 0.04 及 0.01。 那三个数据代表 1, 5, 15 分钟内的平均工作负载。所谓的工作负载为『单一时间内,CPU 需要运作几个工作』之意,并非 CPU 使用率。 如果 CPU 数量有 8 内核,那么此数据低于 8 是可接受的 (每一个内核全力负责一个工作之意)。
Tasks: 287 total, 1 running, 284 sleeping, 2 stopped, 0 zombie
目前共有 287 个进程,其中 1 个在运行,284 个睡着了,2 个停止的,没有僵尸进程。
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
这里才是 CPU 的使用率百分比,比较需要注意 id (idle) 与 wa (I/O wait),id 越高代表系统越闲置, wa 越高代表进程卡在读写磁盘或网络等 I/O 上,此时系统性能会比较糟糕。
MiB Mem : 1828.4 total, 207.4 free, 1129.2 used, 491.8 buff/cache MiB Swap: 2048.0 total, 1999.5 free, 48.5 used. 519.0 avail Mem
分别代表物理内存 (Mem) 与内存置换 (Swap) 的总量,与使用量。需要注意的是,上表中虽然 free 仅有 207.4MiB,但是后续有 491.8 buff/cache (缓存) 的量, 所谓的缓存指的是 Linux 会将系统曾经取用的文件暂存在内存,以加速未来访问该文件的性能 (内存的速度比磁盘快了 10 倍以上), 当内存不足时,系统就会将缓存回收,以保持系统的可用性。右下角那个 avail Mem 指的大致就是 free + buff/cache 的量, 因此,目前可用的内存量还有 519MiBytes 这么多喔!
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
top 程序运行的状态栏,每个项目的意义为:
在缺省的情况下,top 所显示的进程会以 CPU 的使用率来排序,这也是管理员最需要的一个观察任务。许多时候系统发生资源不足或者是性能变差的时候, 最简易的方法为使用 top 观察最忙碌的几只进程,借以处理程序的性能问题。此外,也能通过 top 观察 I/O wait 的 CPU 使用率, 可以找到 I/O 最频繁的几只进程,借以了解到哪些进程在进行哪些行为,或者是系统性能的瓶颈,借以作为未来升级硬件的依据。
系统运作时,内存内的进程量非常的大,但每个进程的重要性都不一样。为了让系统比较快速的运行重要的进程,因此设计上增加了 Priority (PRI) 这个优先序的设置。 基本上,PRI 越低代表系统会运行较多次该进程,也就是该进程会比较早被运行完毕 (因为同一周期会被运行较多次)。简单的运作示意图如下:
但是 PRI 是系统自行弹性规划的,用户并不能更改 PRI。为此,Linux 提供一个名为 Nice (NI) 的数值来让用户『影响』进程的 PRI。 基本上, PRI 与 NI 的关系如下:
PRI(new) = PRI(old) + NI
所以读者可以知道 NI 越小会让 PRI 变小,则进程的优先序会往前挪,相反的,NI 越大会造成 PRI 越大,就让进程的优先序变落后了。 但是 NI 的使用是有限制的,基本限制如下:
要影响 NI 主要通过 nice 与 renice 来处理,也能够通过 top 来处理已经存在的进程的 NI。
不同的软件在计算与输出 priority (PRI) 的方式并不一样,例如:
[student@station10-101 ~]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 17663 17657 1 80 0 - 6860 - pts/0 00:00:00 bash 0 R 1000 17714 17663 0 80 0 - 11191 - pts/0 00:00:00 ps现在,再以 top -d2 -p 17663 来单独观察这个 bash 的相关信息: (每个人的 PID 都不会一样喔!)
[student@station10-101 ~]$ top -d2 -p 17663 top - 17:58:01 up 6 days, 3:11, 3 users, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.1 hi, 0.0 si, 0.0 st MiB Mem : 1828.4 total, 164.3 free, 1128.4 used, 535.7 buff/cache MiB Swap: 2048.0 total, 1999.7 free, 48.2 used. 519.4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17663 student 20 0 27440 5476 3604 S 0.0 0.3 0:00.02 bash所以可以很明显的发现, ps -l 以及 top 的输出,对于 PRI 的基准值就不一样了!现在,再来查看一下 ps -eo pid,ni 的结果:
[student@station10-101 ~]$ ps -eo pid,pri,ni,comm | grep 17663 17663 19 0 bash所有的输出情境中,NI 的数值不会改变,但是 PRI 的数值都不一样! ps -eo 的输出结果,PRI 的基准数据则是 19 喔!
[student@station10-101 ~]$ man renice NAME renice - alter priority of running processes SYNOPSIS renice [-n] priority [-g|-p|-u] identifier... # 所以语法是 renice -n NI -p PID 的情境! [student@station10-101 ~]$ renice -n -5 -p 17663 renice: failed to set priority for 17663 (process ID): 拒绝不符权限的操作看起来并不成功!因为一般用户只能调整为比 0 还大的 NI 值,亦即只能调降自己的优先序~
[student@station10-101 ~]$ renice -n 10 -p 17663 17663 (process ID) old priority 0, new priority 10 # 看起来修改成功了!所以来查阅一下! [student@station10-101 ~]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 17663 17657 0 90 10 - 6860 - pts/0 00:00:00 bash 0 R 1000 17855 17663 0 90 10 - 11191 - pts/0 00:00:00 ps # 果然从 80 ,经过 80+10 于是 PRI 得到 90 这样的数据! [student@station10-101 ~]$ top -d2 -p 17663 top - 18:05:54 up 6 days, 3:18, 3 users, load average: 0.00, 0.00, 0.00 Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 1828.4 total, 163.2 free, 1129.3 used, 535.9 buff/cache MiB Swap: 2048.0 total, 1999.7 free, 48.2 used. 518.4 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17663 student 30 10 27440 5484 3604 S 0.0 0.3 0:00.05 bash # top 的 PRI 则是从 20 增加到 30 了!亦即是 20+10 得到 30 [student@station10-101 ~]$ ps -eo pid,pri,ni,comm | grep 17663 17663 9 10 bash # 这个输出比较可恶~他是从 19 - 10 来得到 9 这个数据的!
[student@station10-101 ~]$ renice -n 5 -p 17663
renice: failed to set priority for 17663 (process ID): 拒绝不符权限的操作
也就是说,NI 值在各个软件之间的观察并无不同,但是 PRI 在各个软件之下就不一样了。top 与 ps -l 的结果都发现, PRI 越低, 优先序越高。但是 ps -eo 里面的输出,则是 PRI 越高,运行序越高!完全是两码子事...所以,主要是要记得 NI 即可!PRI 作为简易的参考之用即可。 另外,用户只能将 NI 越调越高~不能调降~即使调降后依旧是正值也不行!
工作管理 (job control) 是用在 bash 环境下的,也就是说:『当用户登录系统取得 bash shell 之后,在单一终端机接口下同时进行多个工作的行为管理 』。 举例来说,用户在登录 bash 后,可以一边拷贝文件、一边进行数据搜索、一边进行编译,还可以一边进行 vim 程序撰写之意。 不过要进行 job control 时,需要特别注意到几个限制:
常见的工作管理使用的符号与组合按键如下:
常见的系统操作也会用到这方面的技术!看看底下的例题就知道了:
某些权限主要是针对『运作当下所需要的权限』来设计的,这些权限无法以传统权限来归类,且与操作者的所需要的特权权限 (root 身份或额外群组) 有关。 这就是 SUID, SGID 与 SBIT 的设计。
一般用户可以通过 passwd 来修改自己的密码,只是需要输入原始的密码,且密码的变动需要严格的规范。
如上例题,系统的密码纪录在 /etc/shadow 内,但是用户并没有权限可以更改,不过一般用户确实有自己修改密码的需求。 此时 Linux 使用一种称为 Set UID (SUID) 的技术来处理这方面的疑问。系统设置一个 SUID 的权限旗标到 passwd 运行挡上, 当用户运行 passwd 指令时,就能够借由 SUID 来切换运行权限。SUID 的基本功能为:
观察 /usr/bin/passwd 的权限数据,如下所示:
[student@localhost ~]$ ls -l /usr/bin/passwd -rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd
读者可发现用户权限的 x 变成了 s ,此即 SUID 的权限旗标。由 SUID 的定义来看,passwd 设置了 SUID,且 passwd 的拥有者为 root 这个人, 因此只要任何人具有 x 的运行权,当用户运行 passwd 时,就会自动通过 SUID 转换身份成为 owner ,亦即变成了 root 的身份。 所以 student 运行 passwd 的过程中,身份会自动的变成 root。简单的绘图如下说明:
--bash(student)--+..................+---bash(student)---> | | |--passwd(root)----|
亦即只有在运行 passwd 这个指令的过程中,student 身份暂时变成了 root 了!等到 passwd 运行完毕后,就又回复到原本的 student 身份。 这就是 SUID 的功能了!
与 SUID 类似的,SGID 为将特殊的权限旗标设置在群组的 x 上。对文件来说, SGID 的功能为:
除了二进位程序文件外,SGID 亦可设置于目录上,当一个目录设置了 SGID 之后,会具有如下的功能:
以人类社团的社办来说,当你在童军社的社办公室撰写出一份活动草案时,这份活动草案的著作者应该是属于你的,但是草案的拥有群组应该是『童军社』, 而不是『属于你的原生家庭』吧?这就是 SGID 的主要功能。在前一堂课中,管理员曾经创建一个共享目录 /srv/project1/, 当时的权限设置为 770 是有问题的,因为每个用户在该目录下产生的新文件所属群组并非共享群组。因此,共享目录底下新建的数据应属于共享群组才对, 所以应该加上 SGID 的权限旗标设置才对。
前几堂课谈过 /tmp 是所有帐号均可写入的一个暂存目录,因此 /tmp 理论上应该是 777 的权限才行。但是如果是 777 的权限, 代表任何人所创建的任何数据,都可能被随意的删除,这就有问题。因此 /tmp 会加上一个 Sticky bit 的特殊权限旗标,该旗标的功能为:
SUID/SGID/SBIT 的权限旗标是在 Linux 的传统三个身份三个权限之外的,因此会有第四个权限分数产生。而这个权限分数的计算方式为:
因此,观察底下的 Rocky Linux 的文件权限分数:
[student@localhost ~]$ ll -d /usr/bin/passwd /usr/bin/locate /tmp
drwxrwxrwt. 16 root root 4096 Feb 23 17:16 /tmp
-rwx--s--x. 1 root slocate 41048 May 16 2022 /usr/bin/locate
-rwsr-xr-x. 1 root root 32656 May 15 2022 /usr/bin/passwd
若有小写 s 或 t 存在时,该字段需要加入 x 的权限,因此 /tmp 的传统权限为『 drwxrwxrwx (777) 』外加一个 SBIT,因此分数为『 1777 』。 而 /usr/bin/locate 传统权限会成为『 -rwx--x--x (711) 』外加一个 SGID,因此分数会成为『 2711 』。 至于 /usr/bin/passwd 的传统权限是『 -rwxr-xr-x (755) 』,外加一个 SUID,因此分数成为『 4755 』。
除了数字法之外,符号法的使用上,可以使用类似底下的方式分别给予 SUID/SGID/SBIT:
作业硬盘一般操作说明:
作业当中,某些部份可能为简答题~若为简答题时,请将答案写入 /home/student/ans.txt 当中,并写好正确题号,方便老师订正答案。 请注意,文件名写错将无法上传!
请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。
作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。 正常运行完毕的结果应会出现【XXXXXX_aa:bb:cc:dd:ee:ff_unitNN】字样。若需要查阅自己上传数据的时间, 请在操作系统上面使用浏览器查找: http://192.168.251.254 检查相对应的课程文件。 相关流程请参考: vbird_book_check_unit