二维码

认识 bash 基础与系统救援

632 人阅读 | 时间:2021年12月17日 23:29

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 所取代)

我们的训练机因为只安装基础的 Linux 系统,并没有安装 C shell,所以当你 cat /etc/shells 时,只有看到 bash 与 sh 而已喔! 如果有安装 C shell 的话,那就会将额外的 shell program 写入到这个文件当中了!

因为有许多软件会使用到系统上的 shell,但又担心用户或者是恶意攻击者会使用怪异的有问题的 shell 来操作软件。 因此某些软件在判断 shell 的合法性, 亦即直接参考 /etc/shells 的规范,来判断所谓的合法与不合法。

读者从之前的系统登入行为中,应该知道在文字界面登入后系统会给予一个 shell,而在图形界面时,也能够藉由按下「终端机」来取得 shell 的操作。 但取得的默认 shell 是哪一个? 需要从用户的设定资料里面搜寻。 请参考 /etc/passwd 里面,使用冒号 (:) 分隔的第 7 个字段,就是该帐号默认取得的 shell。

例题 7.1.1-1:查询合法的 shell 有哪些
  1. 请使用 cut 这个指令,将 /etc/passwd 这个文件的内容中,以冒号 (:) 为分隔字符 (delimiter),将第 1 及第 7 字段 (field) 输出到屏幕上

  2. 承上,找到关键字为 daemon 的那一行,daemon 用户所使用的 shell 是什么?

用户可以自由的切换所需要的 shell,不过不同的 shell 使用的方式、语法都有点差异。 举例来说, bash 使用的变量设定方式为 'var='content'', 但是 csh 使用的是' set var = 'content' ',csh 需要有 set ,不过等号两边可以有空格。 但是 bash 虽然不用 set ,但是等号两边不可以直接加空格, 这就有不一样的的地方。

  • 不同shell的切换

其实, shell 就是一只可以互动的程序而已,因此,基本上是可以互相呼叫而切换 shell 界面的! 只是我们的CentOS 8默认只有安装bash而已,因此进行底下的测试之前,需要安装额外的shell才行。

例题 7.1.1-2 :练习不同 shell 的切换
  1. 安装额外的 C shell 界面:

    1. 请先启用虚拟机的网络环境,并确认互联网为正常使用

    2. 使用 root 的身份,安装 tcsh 这个软件

  2. 在 bash 软件环境下,操作确认 shell 名称的命令 :

    1. 请使用 student 身份登录系统,取得终端机后,使用 echo $BASH的方式查阅有没有这个变量以及其输出的内容

    2. 请输入' echo $shell '观察有没有数据输出?

    3. 使用『 echo $0 '观察输出的数据是什么?

  3. 切换到 c shell 查看一下确认 shell 名称的命令:

    1. 使用' /bin/csh '切换 shell 成为 c shell

    2. 分别使用' echo $BASH'与' echo $shell '观察输出的数据为何?

    3. 使用『 echo $0 '观察输出的数据是什么?

    4. 先透过『 exit 』离开 c shell 之后,再次以 echo $0 观察目前的 shell 名称为何?

  4. 执行『 /sbin/nologin '看看输出的数据为何?

用户可以通过直接输入 shell 的可执行文件 (例如上述的 /bin/csh) 来直接切换到新的 shell 去工作,而想要确认当前 shell 是什么, 最简单的方式就是使用 echo $0 中列出当前的运行文件 。 另外,系统的用户帐号资料纪录在 /etc/passwd 当中,该档案里面竟然有 /sbin/nologin 这个 shell 呢! 这个 shell 就是给系统账户默认使用的不可交互的合法 shell 。

例题 7.1.1-3:尝试修改用户的默认 shell 程序
  1. 使用 root 身份:用 usermod 来修改 student 的 shell 变成 /sbin/nologin

  2. 使用 student 身份:修改完毕后,请到 tty3 的终端机,尝试使用 student 的帐号登入,看看会出现什么情况

  3. 使用 root 身份:请再次以 usermod 的方式将 student 的 shell 改回来 /bin/bash

为何需要设定 /sbin/nologin 呢?

  • 许多系统默认要执行的软件,例如 mail 的邮件分析、WWW 的网页响应等等,系统不希望该软件使用 root 的权限,因为担心网络软件会被恶意人士所攻击。 因此系统就会依据该软件的特性给予'系统帐号',这些系统帐号就是有特殊的任务(执行某软件)而产生的,并不是要让一般用户通过该帐号来登录系统互动。 因此系统账号通常就是使用 /sbin/nologin 作为默认 shell

  • 某些服务器的账号,例如邮件服务器、FTP 服务器等,这些服务器的帐号本收就在收发email 或者是传输档案而已,这些帐号无须登录系统来取得互动 shell, 因此这些帐号就不需要可互动的 shell,此时就能给 /sbin/nologin。

例题 7.1.1-4:建立系统帐号给予的 shell 方式
  1. 针对 /sbin/nologin 以及一般 shell program 的登入者差异:

    1. 使用 id 这个指令检查系统有无 bin 与 student 这两个帐号的存在?

    2. 能不能在不知道密码的情况下,使用 root 切换成 student 这个账号? 为什么?

    3. 能不能在不知道密码的情况下,使用 root 切换成 bin 这个账号? 为什么?

  2. 建立一个不能取得互动 shell 的帐号

    1. 建立一个不可登录系统获取交互 shell 的帐号,账号名称为 puser1,密码为 MyPuser1

    2. 尝试在 tty3 登入该帐号,结果是?

7.1.2:变量设定规则

上一小节谈到的' echo $BASH'就是变数的功能,bash shell 会主动的建立 BASH 这个变量,且其内容就是 /bin/bash, 方便读者了解到目前的 shell 是哪只程序达成的。 那如何设定变数呢? 简单的配置方式和调用方式为 :

[student@localhost ~]$ 變數="變數內容"[student@localhost ~]$ echo $變數[student@localhost ~]$ echo ${變數}

其中变量有许多的设置规则需要遵守:

  • 变量与变量内容以一个等号'='来链接

  • 等号两边不能直接接空白字符

  • 变数名称只能是英文字母与数字,但是开头字符不能是数字

  • 变量内容若有空白字符可使用双引号'"'或单引号'''将变量内容结合起来

  • 承上,双引号内的特殊字符如 $ 等,可以保有原本的特性

  • 承上,单引号内的特殊字符则仅为一般字符( 纯文字)

  • 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空白字符, ' 等)变成一般字符

  • 在一串指令的执行中,还需要借由其他额外的指令所提供的信息时,可以使用反单引号''指令'或 '$(指令)'。

  • 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容

  • 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量

  • 通常大写字符为系统默认变量,自行设定变量可以使用小写字符,方便判断 (纯粹依照用户兴趣与嗜好)

  • 取消变量的方法为使用 unset :『unset 变量名称』

例题 7.1.2-1: 设定与呼叫变量
  1. 设定一个名为 myname 的变量,变量的内容为' peter pan "

  2. 使用 echo 呼叫出 myname 的内容

  3. 是否能够设定 2myname 的内容为' peter pan '呢?

  4. 设定 varsymbo 变量的内容为' $myname ',$myname 就是纯文本数据不是变量 (不是 peter pan)。 设定完毕后呼叫出来

  5. 设定 hero 变量的内容为 I am $myname ',其中 $myname 会依据 myname 变量的内容而变化。 设定完毕请呼叫出来。

  6. 使用 uname -r 秀出目前的核心版本

  7. 设定 kver 变量,内容为' my kernel version is 4.xx ',其中 3.xx 为 uname -r 输出的信息。 请注意, kver 变量设定过程中,需要用到 uname -r 这个指令的协助。

变量设定的过程当中,使用子指令' $(command) '的操作为相当重要的。 例如底下的案例中,管理员可以很快速的找到前一堂课谈到的特殊权限文件并列出该档案的权限:

例题 7.1.2-2:透过子指令 $() 来处理资料的流程
  1. 使用 man find 找出 -perm 的功能为何?

  2. 使用『 find /usr/bin /usr/sbin -perm /6000 』找出所有含有特殊权限的文件名

  3. 使用『 ls -l $(find /usr/bin /usr/sbin -perm /6000) '将所有档名的权限列出

如上的第3个范例,读者可以将第1个示例的文件名找到后,一个一个以 ls -l 去查询权限,不过效能与时间花费太多。 此时透过子指令的功能即可快速的找到相对应的资料。 底下亦为常见的操作功能:

例题 7.1.2-3:同样透过子指令来处理
  1. 使用 find 的功能,找出在 /usr/sbin 及 /usr/bin 底下权限为 4755 的档案

  2. 建立 /root/findfile 目录

  3. 将步骤 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 路径搜索变量,他会影响到用户操作的行为,设定错误会有相当严重的后果。

例题 7.1.3-1: 关于 PATH 的重要性,不同账号的使用
  1. 使用系统管理器的身份处理和配置相关变量数据 :

    1. 印出 PATH 这个变量的内容,并观察每个项目中间的分隔符号为何?

    2. 设定一个名为 oldpath 的变量,内容就是 ${PATH}

    3. 设定 PATH 的内容成为 /bin 而已 (非常重要,不可设错! )

    4. 此时输入以前曾操作过得 useradd --help 及 usermod --help 等指令,屏幕显示的讯息为何?

    5. 若使用 /sbin/usermod --help,可以正常显示嘛?

    6. 请设置 PATH 的内容成为 ${oldpath} ,恢复正常的路径资料。

  2. 使用普通帐号 student 的身份来执行下列的练习动作:

    1. 建立 ~student/cmd/ 目录,且将 /bin/cat 复制成为 ~student/cmd/scat

    2. 输入『 ~student/cmd/scat /etc/hosts 』确认指令正常无误。

    3. 输入' scat /etc/hosts '会发生什么问题?

    4. 如何让 student 用户直接使用 scat 而不须使用 ~student/cmd/scat 来执行?

由于 PATH 设定错误时,可能会导致系统的 crash 状态,尤其是当 PATH 并未含有 /bin 这个搜索路径时,有相当高的机率会造成 Linux 系统的当机。 因此,在上述的练习中,PATH 的设定请务必小心谨慎!

命令提示字符在每个系统中都不一样,但那是可以修改的,就透过 PS1 这个变量来修改即可。

例题 7.1.3-2: 认识 PS1 这个变量的使用情境
  1. 呼叫出 PS1 这个变量的内容

  2. 请查询上述变量内容中 \W 及 \$ 的意义为何 (请 man bash 由 PS1 关键字查询)

  3. 假设操作者已经做了 15 个指令,则命令提示字符输出如:『 [student@localhost 15 ~]$ 』该如何设定 PS1?

7.1.4:区域/全局变量、父程序与子程序

变量是有使用范围的,一般来说变量的使用范围分为:

  • 区域变量:变量只能在目前这个 shell 当中存在,不会被子程序所沿用

  • 全局变量:变数会储存在一个共享的内存空间,可以让子程序继承使用。

如 7.1.2 当中提到的将变量提升成为全局变量的方式为透过 export,观察可用 env 或 export 来观察。

例题 7.1.4-1: 了解区域变量、全局变量、父程序、子程序间的关系
  1. 在父程序执行底下的动作,找寻区域变量与全局变量

    1. 使用 set 或 env 或 export 观察是否存在 mypp 这个变数?

    2. 设定 mypp 的内容为' from_ppid ',并且呼叫出来

    3. 使用 set 或 env 或 export 观察是否存在 mypp 这个变数?

  2. 变成子程序并持续讨论变数:

    1. 执行' /bin/bash '进入下一个 bash 的子程序环境中

    2. 使用 set 或 env 或 export 观察是否存在 mypp 这个变数? 同时说明为什么?

    3. 设定 mypp2 的内容为' from_cpid ',并且呼叫出来

    4. 使用『 exit 』离开子程序回到原本的父程序

  3. 在父程序处理全局变量,测试 export 的功能:

    1. 观察是否存在 mypp2 这个变数? 为什么?

    2. 使用' export mypp '后,使用 env 或 export 观察是否存在?

  4. 切换成为子进程,并确认全局变量的存在:

    1. 执行' /bin/bash '进入下一个 bash 的子程序环境中

    2. 使用 set 或 env 或 export 观察是否存在 mypp 这个变数? 同时说明为什么?

    3. 回到原本的父程序中。

基本上,由原本的bash衍生出来的程序都是该bash的子程序,而bash可以执行bash产生一只bash的子程序,两只bash之间仅有全局变量(环境变量)会带给子程序,而子程序的变数,基本上是不会回传给父程序的。

7.1.5:使用 kill 管理程序

某些时刻管理员会有想要手动移除某些特定程序的时刻发生,例如某些很占资源的 bash 程序的管理等等,此时就可以通过使用 kill 这个指令来处理。 基本上,kill 并不是'删除'程序,而是给予程序一个'讯号 (signal) '来管理,预设的讯号为 15 号,该讯号的功能为'正常关闭程序'的意思。 而想要强制关闭该程序,就得要使用 -9 这个号码来处理了。

例题 7.1.5:使用 kill 管理/传送程序的讯号
  1. 使用' vim checking.txt ',随便编辑几个字,然后将 vim 程序放进背景中暂停

  2. 使用 jobs -l 进一步列出该程序的 PID 号码

  3. 使用' kill PID号码 '尝试删除该工作,是否能够生效?

  4. 若无法删除,请使用' kill -9 PID号码'的方式来删除,是否能够生效?

  5. 再次使用 vim checking.txt 时,会出现什么讯息? 如何解决?

若使用者有特别的需求需要删除掉某些特定的程序,就可以透过这样的机制来处理。

上面的例题内的动作只是测试而已,基本上不应该如此删除资料! 否则容易出问题!

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 读取配置文件的流程是:

  1. /etc/profile:这是系统整体的设定,你最好不要修改这个档案;

  2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile (只会读 1 个,依据优先级决定):属于用户个人设定,你要改自己的资料,就写入这里!

由于 login shell 已经读取了 /etc/profile 因此已经设定了大部分的全局变量设定,所以 non-login shell 只需要少部份的设定即可。 故 non-login shell 只会读取一个个人设定文件,亦即是:

  • ~/.bashrc

例题 7.1.6-1:理解 login shell 与 non-login shell 的环境参数读取行为
  1. 观察一下 ~/.bash_profile 的内容,说明该文件设定了什么项目?

  2. 观察 ~/.bashrc 的内容,说明该文件设定了什么项目?

由于 ~/.bash_profile 也是读取 ~/.bashrc ,因此用户只需要将设定放置于家目录下的 .bashrc 就可以让两者读取了。

事实上,也建议你可以前往 /etc/profile 这个档案内容瞧一瞧,看看到底 login shell 读了哪些设定文件喔!
例题 7.1.6-2:尝试设定 student 的操作环境
  1. 请在 student 的家目录编辑 .bashrc ,增加底下的项目:

    1. 设定 history 可以输出 10000 笔资料

    2. 设定执行 cp 时,其实会主动加入 cp -i 的选项

    3. 设定执行rm时,其实会主动加入rm-i的选项

    4. 设定执行 mv 时,其实会主动加入 mv -i 的选项

    5. 增加 PATH 的搜索目录在 / home/student/cmd/ 目录

    6. 设定一个变量名称为 kver,其内容是目前的核心版本

    7. 强迫语系使用 zh_TW.utf8 这个项目,且必须要设定为全局变量

    8. 让提示字符项目中,增加时间与操作指令次数的项目。

    9. 使用 wc 指令分析 ~/.bash_history 的行数,将该行数纪录于 h_start 的变量中

  2. 设定完毕后,如何在不注销的情况下,让设定生效?

当用户注销bash时,bash会依据家目录下的.bash_logout来进行后续的动作,因此若用户有需要额外进行某些工作时,可以在此档案中设定。

不过用户应该要特别注意的, .bash_logout 仅会在 login-shell 的环境下,注销才会执行。 在 non-login shell 的环境下注销, 这个文件并不会被运作的。

例题 7.1.6-3: 处理 logout 额外执行的任务
  1. 每次注销 bash 时,都会:

    1. (1)使用 date 取得' YYYY/MM/DD HH:MM '的格式,并且转存到家目录的 history.log 文件中

    2. (2)使用 history 加上管线命令与 wc 来分析结束时的 history 行数,将该数值设定为 h_end,搭配之前设定的 h_start 开始的行数, 计算出这次执行指令的行数号码 (应该是 h_end - h_start +1 ),设定为 h_now,透过 history ${h_now} 将最新的指令转存到 history.log 当中。

  2. 尝试使用 su - student 来登入 student ,再随意进行数个指令,之后注销 bash 回到原本的 bash 当中,观察 ~/history.log 是否有信息纪录?

7.2:系统救援

我们在前一堂课提到过简易的系统救援,直接以 root 的密码与身份来进入救援模式,然后处理好了档案系统。 但万一 root 的 shell 被不小心修改了, 导致无法使用 root 的密码进入系统时,该如何处理? 底下的动作比较严重,请读者务必要学会救援的方式。

7.2.1:透过正规的 systemd 方式救援

我们前面讲过许多重要的系统管理,其中包括档案系统与这节课提到的 shell 功能。 想一想,如果产生底下的问题时,该如何处理?

  • 文件系统或者是 /etc/fstab 设定文件写错了!

  • root 的 shell 被误改成为 nologin,导致无法使用 root 了 (即使知道密码)

要处理这个练习,请先进行如下的动作之后,让系统被破坏,才能够加以练习:

[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来看看会出现什么问题。

认识 bash 基础与系统救援
图 7.2.1-1、因为文件系统与 root 身份出问题的状态

如上图所示,开机后出现文件系统状态,系统要求输入 root 密码,虽然用户输入正确的密码了,却无法取得 root 的 bash 操作界面, 因为设置到错误的 shell 了。 此时正规的救援模式无法使用,需要用到 systemd 开机流程里面,让系统进入到一个小小的救援操作系统, 该操作系统是模拟出来的,仅仅用来作为挂载档案系统的功能。 处理的流程为:

重新开机,且进入菜单后的五秒内按下方向键,并将光棒选择到第一个开机菜单项目上面

认识 bash 基础与系统救援
图 7.2.1-2、光棒的移动和进入编辑模式的参考按钮( e)

按下『e』来进入菜单编辑画面,如下所示,并且在 linux 那一行的最后面增加『 rd.break 』的项目,之后按下 [Ctrl]+x 来进入救援模式

认识 bash 基础与系统救援
图 7.2.1-3、互动编辑核心参数,加入进入救援模式的方案

救援模式会将根目录挂载到 /sysroot 这个目录下,不过是默认挂载成只读,因此管理员请用' mount -o remount,rw /sysroot '将该目录重新挂载成可读写, 然后使用' chroot /sysroot '将根目录切换到 /sysroot 底下,就可以成功的取用原本的作业系统了。

认识 bash 基础与系统救援 认识 bash 基础与系统救援 
图 7.2.1-4重新挂载为可读写,并进行更换根目录的行为 (chroot)
  1. 此时系统提示字符只有『 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
  2. 最后使用 reboot 重新开机,就能够正常的开机进入系统环境了。

最后一个步骤之所以要处理 /.autorelabel 这个情况,是因为 CentOS 8 默认会启用 SELinux 这个安全强化模块,但是此模块在救援模式并没有开启, 所以被更动到的档案在下次开机后,可能会产生无法读取的问题。 系统开机会去找 /.autorelabel,若发现有此档案则会重新写入SELinux的相关设定,因此系统在重新开机的流程中共会启动两次,原因为第一次会重新写入SELinux设定,第二次才是正常开机。

认识 bash 基础与系统救援
图 7.2.1-4、SELinux 的重设过程
根据上课的经验,filesystem 的问题与 user 的问题最好于一次 rd.break 的救援流程中解决,否则由于现有的 Linux 系统程序为平行处理, 若卡在 /home 检测过 90 秒后,再次进入给予 root 密码的程序中,就会由于无法跑到系统重整 (./autolabel 的动作要求),导致帐号资料密码文件无法被读取, 此时系统会 crash 。

7.2.2:透过 bash 直接救援 (Optional)

若读者以前有接触过 Linux 的话,应该知道开机流程中,可以使用 init=/bin/bash 直接让核心呼叫 bash 来操作系统。 CentOS 8 的 grub2 与 systemd 也保留此功能,此操作行为与 rd.break 相当接近。

  1. 同样在开机过程中,使用第一个开机菜单,然后按下 e 来进入互动编辑模式

  2. 在 linux 那一行的最后面加入 init=/bin/bash 然后按下 [ctrl]+x 来启动

  3. 出现『 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 基础与系统救援
图 7.2.2-1、直接使用 bash 救援!

因为这个方案是 bash 直接控管的,与 systemd 的管理机制无关,因此用户无法使用 reboot 来重新开机。 此时请按下电脑的 reset 按钮或强制关机再次重新开机。 之后应该就可以顺利的开机了。

除非正常流程已经无法解决,否则尽量不要使用此方法救援。

7.3:课后练习操作

  • 上课的课后练习,非作业:

  1. 变量的相关操作( 全部用 root 身份进行)

    1. 将 /sbin/nologin, /bin/false, /bin/true 等档案设定为系统合法的 shell

    2. 查看目前 /etc/passwd 当中,有哪些账号是可以使用 bash 登入系统的?

    3. 目前有哪些全局变量存在

    4. 显示出 PS1 的内容

    5. 将 PS1 的内容改成类似' C:\win> ',再测试看看

    6. 显示出目前的 PATH 内容

    7. 让 PATH 延伸到支持 /opt/bin 目录

    8. 设定 kver 为 uname -r 的输出结果

    9. 将 kver 设定成为全局变量

    10. 由 man 7 signal 找到 1 号是在干麻的?

    11. 透过上述的功能,找到 rsyslog 这个软件的 PID,并对他下达 signal 1 的讯号

    12. 查看一下 /var/log/messages 出现了什么讯息?

    13. 再由 man 7 signal 找到 SIGTSTP 与 SIGINT 分别是几号? 其中 SIGINT 其实是 [ctrl]+c 而 SIGTSTP 就是 [ctrl]+z 的意思。

    14. 开另外一个 bash 窗口,并且启用 vim 软件

    15. 由原本的 root 环境,找到 vim 的 PID,并且尝试将该 PID 放入背景暂停中,并查阅另一个窗口的结果

    16. 使用 $(( )) 的功能,计算一天共有几秒钟?

  • 作业 (不提供学生答案,仅提供教师参考答案)

作业硬盘操作帮助:

  • 开启云端虚拟机前,请务必确认你开启的硬盘是'unit07',否则就会做错题目

  • 若要使用图形界面,请务必使用 student 身份登入,若需要切换身份,再启用终端机处理。

  • 若有简答题需要使用中文,请自行以第一堂课的动作自行处理输入法安装。

  • 每部虚拟机均有独特的网卡地址,请勿使用他人硬盘上传,否则计分为 0 分。

  • 每位同学均有自己的 IP 尾数,请先向老师询问您的 IP 尾数,才可以进行作业上传。

  • 最终上传作业结果,请务必使用 root 身份上传。

  • 进入操作硬盘后,先用 root 身份执行 vbird_book_setup_ip, 执行流程请参考:vbird_book_setup_ip

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


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

  1. (30%) 因为某些缘故,目前这个操作系统应该是无法顺利开机的。 请使用本节课程所介绍的方式来进行系统的救援。 根据猜测,可能的原因与管理员曾经动过 chsh 这个指令有关,同时,管理员似乎也更动过 fstab 这个配置文件。 请依据这些之前的可能举动,来恢复系统的可登入状态。 (hint: 千万不要忘记 .autorelabel 的动作! )

  2. (10%) 请处理下面账户与 shell 的相关事宜:

    1. (3%) 请将系统中的 /bin/false 与 /bin/true 这两个档案变成合法的 shell

    2. (3%) 请将 examuser1 的 shell 变成 /bin/true

    3. (4%) 因为你即将建立一个 FTP 服务器,这个服务器上面的用户只能单纯的使用 FTP 功能,因此你想要让这些帐号无法使用 shell。 假设三个帐号 myuser1, myuser2, myuser3 的帐号,这三个帐号将无法使用交互界面操作系统,且密码为 MyPassWordhehe

  3. (10%) 透过 bash shell 的功能,进行档案的查询与复制

    1. (5%) 找出系统中文件所有者为 examuser1 的文件名,并将这些找到的文件名(含权限)复制到 /root/findout/ 目录内

    2. (5%) 找出在 /usr/sbin 及 /usr/bin 底下权限为 4755 的档案,并将这些档案复制到 /root/findperm/ 目录内

  4. (5%) 在你的系统中,尝试找到一个执行 sleep 的程序,并且使用各种方法,将该程序删除 (如果你上传成绩时,有重新开机过, 唯一这一题就得要重作,才会有分数! )。

  5. (45%) 特别的帐号成立行为要处理的:

    1. (3%) 透过' history | tail -n 1 | awk '{print $1}' '取得最后一笔历史纪录,然后将该数值指定为 hist_end 变数

    2. (3%) 请使用『 cat ~/.history_start 』取得登录时记载的历史命令笔数,将该数值指定为 hist_start 变量

    3. (3%) 设定一个名为 hist_size 的变量,内容为 hist_end - hist_start 的数值 (有多种计算方式,能成功即可! )

    4. (3%) 将离开的日期,使用 YYYY/MM/DD HH:MM '的格式累加写入到 ~/history.log 文件中

    5. (3%) 透过『 history $hist_size 』取得最后最新的数笔纪录后,将该数据累加到 ~/history.log 档案中。

    6. (3%) 默认使用 bash 作为 shell

    7. (3%) 会读入 /etc/examvar 设定文件

    8. (3%) 拥有一个名为 myip 的变量,变量内容为' ifconfig | grep 'inet ' | cut -d 't' -f 2 | cut -d ' ' -f 2 ' 的执行成果 (每个同学操作指令的结果都不会相同,但是指令会是一样的)

    9. (3%) 使用 zh_TW.utf8 语系数据

    10. (3%) 增加 ~examuser10/scripts/ 目录作为指令执行时所寻找的目录位置

    11. (3%) 命令提示字符增加时间项目在里面

    12. (3%) 默认历史命令纪录 5000 笔,文件纪录也会是 5000 笔

    13. (3%) 操作 cp 时,自动给予 cp -i 的选项

    14. (3%) 通过『 wc -l ~/.bash_history | cut -d ' ' -f 1 '的指令取得前一次登录的历史命令次数, 并将该数值转存到 ~/.history_start 文件内(这个文件每次都覆盖)

    15. (3%) 建立名为 examuser10 的帐号,密码为 MyPassWordhehe,且这个帐号登录后,默认会有后续的一些基础设定

    16. 登录行为:

    17. 注销的行为:

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


©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×