最近更新时间: 2017/03/20
前一节课谈到文件系统且最终有一个简单的文件系统错误救援。但如果发生严重问题时该如何是好?此时可能需要一个简易的救援模式,
包括通过 systemd 以及直接取得一个 bash 来处理。那如何使用 bash ?这就需要了解一下 bash shell 的功能了。
7.1:bash shell 基础认识
7.1.1:系统与用户的 shell
7.1.2:变量设置规则
7.1.3:影响操作行为的变量
7.1.4:区域/全域变量、父进程与子进程
7.1.5:使用 kill 管理进程
7.1.6:login shell and non-login shell
7.2:系统救援
7.2.1:通过正规的 systemd 方式救援
7.2.2:通过 bash 直接救援 (Optional)
7.3:课后练习操作
7.1:bash shell 基础认识
之前课程讲过登录系统取得的文本型交互界面就称为 shell,shell 的操作环境能够依据用户的喜好来设置,用户也能够切换不同的 shell。
而 shell 最重要的就是变量,这在许多的编程语言里面都是需要注意到的部份。
7.1.1:系统与用户的 shell
系统所有合法的 shell 都在 /etc/shells 这个文件内,读者可以查找该文件的内容。在 /etc/shells 常见的合法 shell 如下:
/bin/sh (已经被 /bin/bash 所取代)
/bin/bash (就是 Linux 缺省的 shell)
/bin/tcsh (集成 C Shell ,提供更多的功能)
/bin/csh (已经被 /bin/tcsh 所取代)
因为有许多软件会使用到系统上的 shell,但又担心用户或者是恶意攻击者会使用怪异的有问题的 shell 来操作软件。因此某些软件在判断 shell 的合法性,
亦即直接参考 /etc/shells 的规范,来判断所谓的合法与不合法。
读者从之前的系统登录行为中,应该知道在文本界面登录后系统会给予一个 shell,而在图形界面时,也能够借由按下『终端机』来取得 shell 的操作。
但取得的缺省 shell 是哪一个?需要从用户的设置数据里面搜索。请参考 /etc/passwd 里面,使用冒号 (:) 分隔的第 7 个字段,就是该帐号缺省取得的 shell。
例题:
请使用 cut 这个指令,将 /etc/passwd 这个文件的内容中,以冒号 (:) 为分隔字符 (delimiter),将第 1 及第 7 字段 (field) 输出到屏幕上
承上,找到关键字为 daemon 的那一行,daemon 用户所使用的 shell 是什么?
用户可以自由的切换所需要的 shell,不过不同的 shell 使用的方式、语法都有点差异。举例来说, bash 使用的变量设置方式为 『var='content'』,
但是 csh 使用的是『 set var = 'content' 』,csh 需要有 set ,不过等号两边可以有空格。但是 bash 虽然不用 set ,但是等号两边不可以直接加空格,
这就有不一样的的地方。
例题:练习不同 shell 的切换
请使用 student 身份登录系统,取得终端机后,使用『 echo $BASH 』的方式查阅有没有这个变量以及其输出的内容
请输入『 echo $shell 』观察有没有数据输出?
使用『 /bin/csh 』切换 shell 成为 c shell
分别使用『 echo $BASH 』与『 echo $shell 』观察输出的数据为何?
使用『 echo $0 』观察输出的数据是什么?
先通过『 exit 』离开 c shell 之后,再次以 echo $0 观察目前的 shell 名称为何?
运行『 /sbin/nologin 』看看输出的数据为何?
用户可以通过直接输入 shell 的运行档 (例如上述的 /bin/csh) 来直接切换到新的 shell 去工作,而想要确认目前的 shell 是什么,
最简单的方式就是使用『 echo $0 』列出目前的运行档。另外,写入在 /etc/shells 内有个名为 /sbin/nologin 的 shell,就是给系统帐号缺省使用的不可交互的合法 shell 。
例题:
请使用 usermod 来修改 student 的 shell 变成 /sbin/nologin
修改完毕后,请到 tty3 的终端机,尝试使用 student 的帐号登录,看看会出现什么情况
请再次以 usermod 的方式将 student 的 shell 改回来 /bin/bash
为何需要设置 /sbin/nologin 呢?
许多系统缺省要运行的软件,例如 mail 的邮件分析、WWW 的网页回应等等,系统不希望该软件使用 root 的权限,因为担心网络软件会被恶意人士所攻击。
因此系统就会依据该软件的特性给予『系统帐号』,这些系统帐号就是有特殊的任务(运行某软件)而产生的,并不是要让一般用户通过该帐号来登录系统交互。
因此系统帐号通常就是使用 /sbin/nologin 作为缺省 shell
某些服务器的帐号,例如邮件服务器、FTP 服务器等,这些服务器的帐号本收就在收发 email 或者是传输文件而已,这些帐号无须登录系统来取得交互 shell,
因此这些帐号就不需要可交互的 shell,此时就能给 /sbin/nologin。
例题:
使用 id 这个指令检查系统有无 bin 与 student 这两个帐号的存在?
能不能在不知道密码的情况下,使用 root 切换成 student 这个帐号?为什么?
能不能在不知道密码的情况下,使用 root 切换成 bin 这个帐号?为什么?
创建一个不可登录系统取得交互 shell 的帐号,帐号名称为 puser1,密码为 MyPuser1
尝试在 tty3 登录该帐号,结果是?
7.1.2:变量设置规则
上一小节谈到的『 echo $BASH 』就是变量的功能,bash shell 会主动的创建 BASH 这个变量,且其内容就是 /bin/bash。
方便读者了解到目前的 shell 是哪只程序达成的。如何设置变量呢?简单的设置方式与调用方式为:
[student@localhost ~]$ 变量="变量内容"
[student@localhost ~]$ echo $变量
[student@localhost ~]$ echo ${变量}
其中变量有许多的设置规则需要遵守:
变量与变量内容以一个等号『=』来链接
等号两边不能直接接空白字符
变量名称只能是英文本母与数字,但是开头字符不能是数字
变量内容若有空白字符可使用双引号『"』或单引号『'』将变量内容结合起来
承上,双引号内的特殊字符如 $ 等,可以保有原本的特性
承上,单引号内的特殊字符则仅为一般字符 (纯文本)
可用转义字符『 \ 』将特殊符号(如 [Enter], $, \, 空白字符, ' 等)变成一般字符
在一串指令的运行中,还需要借由其他额外的指令所提供的信息时,可以使用反单引号『`指令`』或 『$(指令)』。
若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容
若该变量需要在其他子进程运行,则需要以 export 来使变量变成环境变量
通常大写字符为系统缺省变量,自行设置变量可以使用小写字符,方便判断 (纯粹依照用户兴趣与嗜好)
取消变量的方法为使用 unset :『unset 变量名称』
例题:
设置一个名为 myname 的变量,变量的内容为『 peter pan 』
使用 echo 调用出 myname 的内容
是否能够设置 2myname 的内容为『 peter pan 』呢?
设置 varsymbo 变量的内容为『 $var 』,$var 就是纯文本数据不是变量。设置完毕后调用出来
设置 hero 变量的内容为『 I am $myname 』,其中 $myname 会依据 myname 变量的内容而变化。设置完毕请调用出来。
使用 uname -r 秀出目前的内核版本
设置 kver 变量,内容为『 my kernel version is 3.xx 』,其中 3.xx 为 uname -r 输出的信息。请注意,
kver 变量设置过程中,需要用到 uname -r 这个指令的协助。
变量设置的过程当中,使用子指令『 $(command) 』的操作为相当重要的。例如底下的案例中,管理员可以很快速的找到前一堂课谈到的特殊权限文件并列出该文件的权限:
例题:
使用 man find 找出 -perm 的功能为何?
使用『 find /usr/bin /usr/sbin -perm /6000 』找出所有含有特殊权限的文件名
使用『 ls -l $(find /usr/bin /usr/sbin -perm /6000) 』将所有文件名的权限列出
如上的第 3 个范例,读者可以将第 1 个范例的文件名找到后,一个一个以 ls -l 去查找权限,不过性能与时间花费太多。
此时通过子指令的功能即可快速的找到相对应的数据。底下亦为常见的操作功能:
例题:
使用 find 的功能,找出在 /usr/sbin 及 /usr/bin 底下权限为 4755 的文件
创建 /root/findfile 目录
将步骤 1 找到的文件连同权限拷贝到 /root/findfile 目录下。
7.1.3:影响操作行为的变量
某些变量会影响到用户的操作行为,许多变量之前曾经提及,本节集中说明。
LANG LC_ALL
语系数据,例如使用 date 输出信息时,通过 LANG 可以修改输出的消息数据。
PATH
运行档搜索的路径~目录与目录中间以冒号(:)分隔,由于运行档/指令的搜索是依序由 PATH 的变量内的目录来查找,所以,目录的顺序也是重要的。
HOME
代表用户的家目录,亦即用户看到的 ~ 代表的目录。
MAIL
当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱文件 (mailbox)。
HISTSIZE
这个与『历史命令』有关。我们曾经下达过的指令可以被系统记录下来,而记录的『笔数』则是由这个值来设置的。
RANDOM
『随机乱数』的变量。目前大多数的 distributions 都会有乱数产生器,亦即 /dev/random 文件。读者可以通过这个乱数文件相关的变量 ($RANDOM) 来随机取得乱数。在
BASH 的环境下,RANDOM 变量的内容介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。
PS1
命令提示字符,可使用 man bash 搜索 PS1 关键字,即可了解提示字符的设置方式。
?
$? 这个变量内容为指令的回传值,当回传值为 0 代表指令正常运作结束,当不为 0 则代表指令有错误。
比较需要注意到的变量是 PATH 路径搜索变量,他会影响到用户操作的行为,设置错误会有相当严重的后果。
例题:关于 PATH 的重要性
请用 root 的身份来处理底下的任务
印出 PATH 这个变量的内容,并观察每个项目中间的分隔符号为何?
设置一个名为 oldpath 的变量,内容就是 ${PATH}
设置 PATH 的内容成为 /bin 而已 (非常重要,不可设错!)
此时输入以前曾操作过得 useradd --help 及 usermod --help 等指令,屏幕显示的消息为何?
若使用 /sbin/usermod --help,可以正常显示嘛?
请设置 PATH 的内容成为 ${oldpath} ,恢复正常的路径数据。
请改用 student 的身份来运行下列练习
创建 ~student/cmd/ 目录,且将 /bin/cat 拷贝成为 ~student/cmd/scat
输入『 ~student/cmd/scat /etc/hosts 』确认指令正常无误。
输入『 scat /etc/hosts 』会发生什么问题?
如何让 student 用户直接使用 scat 而不须使用 ~student/cmd/scat 来运行?
Tips 由于 PATH 设置错误时,可能会导致系统的 crash 状态,尤其是当 PATH 并未含有 /bin 这个搜索路径时,有相当高的几率会造成 Linux 系统的当机。
因此,在上述的练习中,PATH 的设置请务必小心谨慎!
命令提示字符在每个系统中都不一样,但那是可以修改的,就通过 PS1 这个变量来修改即可。
例题:
调用出 PS1 这个变量的内容
请查找上述变量内容当中 \W 及 \$ 的意义为何 (请 man bash 通过 PS1 关键字查找)
假设操作者已经做了 15 个指令,则命令提示字符输出如:『 [student@localhost 15 ~]$ 』该如何设置 PS1?
7.1.4:区域/全域变量、父进程与子进程
变量是有使用范围的,一般来说变量的使用范围分为:
区域变量:变量只能在目前这个 shell 当中存在,不会被子进程所沿用
全域变量:变量会保存在一个共用的内存空间,可以让子进程继承使用。
如 7.1.2 当中提到的将变量提升成为全域变量的方式为通过 export,观察可用 env 或 export 来观察。
例题:
使用 set 或 env 或 export 观察是否存在 mypp 这个变量?
设置 mypp 的内容为『 from_ppid 』,并且调用出来
使用 set 或 env 或 export 观察是否存在 mypp 这个变量?
运行『 /bin/bash 』进入下一个 bash 的子进程环境中
使用 set 或 env 或 export 观察是否存在 mypp 这个变量?同时说明为什么?
设置 mypp2 的内容为『 from_cpid 』,并且调用出来
使用『 exit 』离开子进程回到原本的父进程
观察是否存在 mypp2 这个变量?为什么?
使用『 export mypp 』后,使用 env 或 export 观察是否存在?
运行『 /bin/bash 』进入下一个 bash 的子进程环境中
使用 set 或 env 或 export 观察是否存在 mypp 这个变量?同时说明为什么?
回到原本的父进程中。
基本上,由原本的 bash 衍生出来的进程都是该 bash 的子进程,而 bash 可以运行 bash 产生一只 bash 的子进程,两只 bash 之间仅有全域变量 (环境变量) 会带给子进程,
而子进程的变量,基本上是不会回传给父进程的。
7.1.5:使用 kill 管理进程
某些时刻管理员会有想要手动移除某些特定进程的时刻发生,例如某些很占资源的 bash 进程的管理等等,此时就可以通过使用 kill 这个指令来处理。
基本上,kill 并不是『删除』进程,而是给予进程一个『信号 (signal) 』来管理,缺省的信号为 15 号,该信号的功能为『正常关闭进程』的意思。
而想要强制关闭该程序,就得要使用 -9 这个号码来处理了。
例题:
使用 vim & 将 vim 进程放进背景中暂停
使用 jobs -l 进一步列出该进程的 PID 号码
使用『 kill PID号码 』尝试删除该工作,是否能够生效?
若无法删除,请使用『 kill -9 PID号码 』的方式来删除,是否能够生效?
若用户有特别的需求需要删除掉某些特定的进程,就可以通过这样的机制来处理。
7.1.6:login shell and non-login shell
当读者下达『 echo ${PS1} 』时,应该有发现 PS1 这个影响操作行为的变量已经设置好了,故应该理解为已经有设置档在协助用户登录时规划好操作环境的流程。
而读者应该也会发现到,取得 bash 的情况有很多种,但大致可分为两大类:
一种是需要输入帐号与密码才能够取得 bash 的行为,例如从 tty2 登录,或者是输入『 su - 』来取得某个帐号的使用权,这种情况被称为是 login shell 的变量设置档读取方式。
一种是用户已经取得 bash 或者是其他的交互界面,然后通过该次登录后运行 bash ,例如从图形界面按下终端机、直接在文本界面输入 bash 来取得 bash 子进程、输入『 su 』来切换身份等等,
这种方式通常不需要重新输入帐号与密码,因此称为 non-login shell 的变量设置档读取方式。
通常 login shell 读取设置档的流程是:
/etc/profile:这是系统整体的设置,你最好不要修改这个文件;
~/.bash_profile 或 ~/.bash_login 或 ~/.profile (只会读 1 个,依据优先级决定):属于用户个人设置,你要改自己的数据,就写入这里!
由于 login shell 已经读取了 /etc/profile 因此已经设置了大部分的全域变量设置,所以 non-login shell 只需要少部份的设置即可。
故 non-login shell 只会读取一个个人设置档,亦即是:
例题:
观察一下 ~/.bash_profile 的内容,说明该文件设置了什么项目?
观察 ~/.bashrc 的内容,说明该文件设置了什么项目?
由于 ~/.bash_profile 也是读取 ~/.bashrc ,因此用户只需要将设置放置于家目录下的 .bashrc 就可以让两者读取了。
例题:尝试设置 student 的操作环境
请在 student 的家目录编辑 .bashrc ,增加底下的项目:
设置 history 可以输出 10000 笔数据
设置运行 cp 时,其实会主动加入 cp -i 的选项
设置运行 rm 时,其实会主动加入 rm -i 的选项
设置运行 mv 时,其实会主动加入 mv -i 的选项
增加 PATH 的搜索目录在 /home/student/cmd/ 目录
设置一个变量名称为 kver,其内容是目前的内核版本
强迫语系使用 zh_TW.utf8 这个项目,且必须要设置为全域变量
让提示字符项目中,增加时间与操作指令次数的项目。
使用 wc 指令分析 ~/.bash_history 的行数,将该行数纪录于 h_start 的变量中
设置完毕后,如何在不注销的情况下,让设置生效?
当用户注销 bash 时,bash 会依据家目录下的 .bash_logout 来进行后续的动作,因此若用户有需要额外进行某些工作时,
可以在此文件中设置。
不过用户应该要特别注意的, .bash_logout 仅会在 login-shell 的环境下,注销才会运行。在 non-login shell 的环境下注销,
这个文件并不会被运作的。
例题:
每次注销 bash 时,都会:
(1)使用 date 取得『 YYYY/MM/DD HH:MM 』的格式,并且转存到家目录的 history.log 文件中
(2)使用 history 加上管线命令与 wc 来分析结束时的 history 行数,将该数值设置为 h_end,搭配之前设置的 h_start 开始的行数,
计算出这次运行指令的行数号码 (应该是 h_end - h_start +1 ),设置为 h_now,通过 history ${h_now} 将最新的指令转存到 history.log 当中。
尝试使用 su - student 来登录 student ,再随意进行数个指令,之后注销 bash 回到原本的 bash 当中,观察 ~/history.log 是否有信息纪录?
7.2:系统救援
我们在前一堂课提到过简易的系统救援,直接以 root 的密码与身份来进入救援模式,然后处理好了文件系统。但万一 root 的 shell 被不小心修改了,
导致无法使用 root 的密码进入系统时,该如何处理?底下的动作比较严重,请读者务必要学会救援的方式。
7.2.1:通过正规的 systemd 方式救援
要处理这个练习,请先进行如下的动作之后,让系统被破坏,才能够加以练习:
[root@localhost ~]# vim /etc/fstab
/dev/mapper/centos-home1 /home xfs defaults 0 0
[root@localhost ~]# usermod -s /sbin/nologin root
[root@localhost ~]# su -
This account is currently not available.
如此才能够确认 1. 文件系统被破坏以及 2. root 的身份设置错误 (shell 无法使用)。接下来运行 reboot 来看看会出现什么问题。
图7.2.1、因为文件系统与 root 身份出问题的状态
如上图所示,开机后出现文件系统状态,系统要求输入 root 密码,虽然用户输入正确的密码了,却无法取得 root 的 bash 操作界面,
因为设置到错误的 shell 了。此时正规的救援模式无法使用,需要用到 systemd 开机流程里面,让系统进入到一个小小的救援操作系统,
该操作系统是仿真出来的,仅仅用来作为挂载文件系统的功能。处理的流程为:
重新开机,且进入菜单后的五秒内按下方向键,并将光棒选择到第一个开机菜单项目上面
图7.2.2、光棒的移动与进入编辑模式的参考按钮 (e)
按下『 e 』来进入菜单编辑画面,如下所示,并且在 linux16 那一行的最后面增加『 rd.break 』的项目,之后按下 [Ctrl]+x 来进入救援模式
图7.2.3、交互编辑内核参数,加入进入救援模式的方案
救援模式会将根目录挂载到 /sysroot 这个目录下,不过是缺省挂载成唯读,因此管理员请用『 mount -o remount,rw /sysroot 』将该目录重新挂载成可读写,
然后使用『 chroot /sysroot 』将根目录切换到 /sysroot 底下,就可以成功的取用原本的操作系统了。
重新挂载为可读写,并进行更换根目录的行为 (chroot)
此时系统提示字符只有『 sh-4.2# 』也是正常的,请运行『 mount -a 』之后就可以进行『 usermod -s /bin/bash root 』等动作!一般建议动作流程如下:
[root@localhost ~]# mount -a
[root@localhost ~]# usermod -s /bin/bash root
[root@localhost ~]# vim /etc/fstab
/dev/mapper/centos-home /home xfs defaults 0 0
[root@localhost ~]# touch /.autorelabel
[root@localhost ~]# exit
最后使用 reboot 重新开机,就能够正常的开机进入系统环境了。
最后一个步骤之所以要处理 /.autorelabel 这个情况,是因为 CentOS 7 缺省会激活 SELinux 这个安全强化模块,但是此模块在救援模式并没有打开,
所以被更动到的文件在下次开机后,可能会产生无法读取的问题。系统开机会去找 /.autorelabel ,若发现有此文件则会重新写入 SELinux 的相关设置,
因此系统在重新开机的流程中共会启动两次,原因为第一次会重新写入 SELinux 设置,第二次才是正常开机。
Tips 根据上课的经验,filesystem 的问题与 user 的问题最好于一次 rd.break 的救援流程中解决,否则由于现有的 Linux 系统进程为平行处理,
若卡在 /home 侦测过 90 秒后,再次进入给予 root 密码的进程中,就会由于无法跑到系统重整 (./autolabel 的动作要求),导致帐号数据密码档无法被读取,
此时系统会 crash 。
7.2.2:通过 bash 直接救援 (Optional)
若读者以前有接触过 Linux 的话,应该知道开机流程中,可以使用 init=/bin/bash 直接让内核调用 bash 来操作系统。 CentOS 7 的 grub2 与 systemd
也保留此功能,此操作行为与 rd.break 相当接近。
同样在开机过程中,使用第一个开机菜单,然后按下 e 来进入交互编辑模式
在 linux16 那一行的最后面加入 init=/bin/bash 然后按下 [ctrl]+x 来启动
出现『 bash-4.2# 』之后,进行如下的动作来处理:
[root@localhost ~]# mount -o remount,rw /
[root@localhost ~]# mount -a
[root@localhost ~]# /usr/sbin/usermod -s /bin/bash root
[root@localhost ~]# /usr/bin/vim /etc/fstab
[root@localhost ~]# /usr/bin/touch /.autorelabel
[root@localhost ~]# reboot
因为这个方案是 bash 直接控管的,与 systemd 的管理机制无关,因此用户无法使用 reboot 来重新开机。此时请按下电脑的 reset 按钮或强制关机再次重新开机。
之后应该就可以顺利的开机了。
Tips 除非正常流程已经无法解决,否则尽量不要使用此方法救援。
7.3:课后练习操作
前置动作:请使用 unit07 的硬盘进入作业环境,并请先以 root 身分运行 vbird_book_setup_ip
指令设置好你的学号与 IP 之后,再开始底下的作业练习。
请使用 root 的身份进行如下实做的任务。直接在系统上面操作,操作成功即可,上传结果的程序会主动找到你的实做结果。
因为某些缘故,目前这个操作系统应该是无法顺利开机的。请使用本节课程所介绍的方式来进行系统的救援。
根据猜测,可能的原因与管理员曾经动过 chsh 这个指令有关,同时,管理员似乎也更动过 fstab 这个设置档。
请依据这些之前的可能举动,来恢复系统的可登录状态。(hint: 千万不要忘记 .autorelabel 的动作!)
请处理底下帐号与 shell 的相关事宜:
请将系统中的 /bin/false 与 /bin/true 这两个文件变成合法的 shell
请将 examuser1 的 shell 变成 /bin/true
因为你即将创建一个 FTP 服务器,这个服务器上面的用户只能单纯的使用 FTP 功能,因此你想要让这些帐号无法使用 shell。
假设三个帐号 myuser1, myuser2, myuser3 的帐号,这三个帐号将无法使用交互界面操作系统,且密码为 MyPassWordhehe
通过 bash shell 的功能,进行文件的查找与拷贝
找出系统中文件拥有者为 examuser1 的文件名,并将这些找到的文件名(含权限)拷贝到 /root/findout/ 目录内
找出在 /usr/sbin 及 /usr/bin 底下权限为 4755 的文件,并将这些文件拷贝到 /root/findperm/ 目录内
在你的系统中,尝试找到一个运行 sleep 的进程,并且使用各种方法,将该进程删除。
创建名为 examuser10 的帐号,密码为 MyPassWordhehe,且这个帐号登录后,缺省会有底下的设置:
登录行为:
缺省使用 bash 作为 shell
会读入 /etc/examvar 设置档
拥有一个名为 myip 的变量,变量内容为『 ifconfig eth0 | grep 'inet ' | cut -d 't' -f 2 | cut -d ' ' -f 2 』
的运行成果 (每个同学操作指令的结果都不会相同,但是指令会是一样的)
使用 zh_TW.utf8 语系数据
增加 ~examuser10/scripts/ 目录作为指令运行时所寻找的目录位置
命令提示字符增加时间项目在里面
缺省历史命令纪录 5000 笔
操作 cp 时,自动给予 cp -i 的选项
通过『 wc -l ~/.bash_history | cut -d ' ' -f 1 』的指令取得前一次登录的历史命令次数,并将该数值转存成为 ~/.history_start
注销的行为:
通过『 history | tail -n 1 | awk '{print $1}' 』取得最后一笔历史纪录,然后将该数值指定为 hist_end 变量
请使用『 cat ~/.history_start 』取得登录时记载的历史命令笔数,将该数值指定为 hist_start 变量
设置一个名为 hist_size 的变量,内容为 hist_end - hist_start 的数值 (有多种计算方式,能成功即可!)
将离开的日期,使用『 YYYY/MM/DD HH:MM 』的格式累加写入到 ~/history.log 文件中
通过『 history $hist_size 』取得最后最新的数笔纪录后,将该数据累加到 ~/history.log 文件中。
作业结果传输:请以 root 的身分运行 vbird_book_check_unit 指令上传作业结果。
正常运行完毕的结果应会出现【XXXXXX;aa:bb:cc:dd:ee:ff;unitNN】字样。若需要查阅自己上传数据的时间,
请在操作系统上面使用: http://192.168.251.250 检查相对应的课程文件。
修改历史:
2016/07/14:这一堂课讲比较多的 bash 以及前一节课的高端救援问题!
2017/03/20:增加了习题了!
2016/07/14以来统计人数