二维码

指令下达行为与基础档案管理

710 人阅读 | 时间:2021年12月17日 23:21

2.1:文字界面终端操作行为的建立

其实我们都是透过'软件'或'程序'在跟系统作沟通的。 文字模式登录后所取得的程序被称为壳(Shell),这是因为这支程序负责最外面跟用户(我们)沟通, 所以才被戏称为壳程序! CentOS 8 的默认壳程序为 bash,用户最好一开始就能够建立良好的操作行为,对于未来的 Linux 使用上,会有很大的帮助。

另外,关于 CLI 的环境,有几个常见会搞混的名词,这里我们先来理解一下:

  • 实体控制台 (Physical Console):直接提供键盘、鼠标、屏幕等实体功能的硬件,就可称为实体控制台。 以我们上课的环境来说, 那个 remote-viewer 应该可以假装为一个模拟出来的实体控制台。 如果以实体 Linux server 来说,那一个实体电脑所在处,就是实体控制台。

  • 虚拟控制台 (Virtual Console):前一堂课我们谈到可以使用组合按键分别进入 tty1~tty6,这 6 个可供登入的环境, 都是由实体控制台模拟出来控制台环境,因此就被称为虚拟控制台。 每一个虚拟控制台都是独立的,可供不同的用户登入。

  • 终端机 (Terminal):每个虚拟控制台都会提供一个界面,该界面可以提供键盘出入以及屏幕输出,这个界面就称为终端机。 用户在终端机登录帐号与密码后,即可取得壳程序(shell)来进行系统的互动。 一般终端机大多指纯文字界面,不过就广义的说法, 图形界面 (Graphical User Interface, GUI) 也可视为一种终端机。

  • 壳程序 (Shell):让用户输入指令串,然后将该指令串丢进系统执行的软件,就可称为是壳程序。

2.1.1:文字模式指令下达的方式

bash shell 环境下,指令的下达基本上有几个需要注意的地方:

[student@localhost ~]$ command  [-options]  [parameter1...]
  • command (指令部份):

    • 一行命令中第一个输入的部分是指令(command)或可执行文件(例如script)或完整执行文件名

    • 『 command 』:为指令的名称,例如查看历史命令的指令为 history 等等;

  • [-option] (选项部分) :

    • 中括号『 [ ] 』不存在实际的指令中,仅作为一个说明提示,提示为 -option 在指令列中可有亦可无之意;

    • 『 -options ':为选项,通常选项前面会带有减号 (-),例如 -h ;

    • options 有时会提供长选项,此时会使用两个减号,例如 --help。

    • 注意,选项 -help 通常代表 -h -e -l -p 之意,与 --help 的单一长选项不同。

    • 选项有时会带有参数,因此可能会发现 [-option para] 或 [--option=para] 之类的语法

  • [parameter1...] (参数部份):

    • 『 parameter1 ':参数,为依附在选项后面的参数,或者是 command 的参数;

    • 若有 parameters... 后面有小数点,则代表可以加上多个参数之意。

  • 命令运行的注意事项 :

    • 指令、选项、参数之间都以空格或 [tab] 作为区分,不论空几格都视为一格,故空白是特殊字符

    • [Enter]按键代表着一行指令的开始启动。

    • Linux 的世界中,英文大小写为不同的字符,例如 cd 与 CD 是不一样的指令。

  • 用 date 练习格式化日期输出

前一堂课我们使用过 ls 与 ll 这两个简易的指令来查看文件名,那如果想要知道目前的时间,或者是格式化输出时间时,就得要使用 date 这个指令来处理!

[student@localhost ~]$ date 二  3月  3 17:54:38 CST 2020

因为 student 选择中文语系的关系,所以屏幕上出现的就会是中文的星期二与月日这样。 若需要格式化的输出,就得要加上特别的选项或参数来处理,例如一般台湾我们常见 2020/03/03 这样的日期输出格式, 此时你可能要这样下达指令:

[student@localhost ~]$ date +%Y/%m/%d 2020/03/03

上述的选项数据 (+%Y/%m%d) 基本上不太需要背诵,使用线上查询的方式来处理即可。 最简单的处理方式,可以通过--help 这个长选项来查询各个选项的功能,如下所示:

[student@localhost ~]$ date --help Usage: date [OPTION]... [+FORMAT]   or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]                 <==上面這兩行是語法的部份 Display the current time in the given FORMAT, or set the system date.      <==這一行是指令說明 Mandatory arguments to long options are mandatory for short options too.   <==底下是主要的 option 說明   -d, --date=STRING          display time described by STRING, not 'now'       --debug                annotate the parsed date,                               and warn about questionable usage to stderr   -f, --file=DATEFILE        like --date; once for each line of DATEFILE   -I[FMT], --iso-8601[=FMT]  output date/time in ISO 8601 format.                                FMT='date' for date only (the default),                                'hours', 'minutes', 'seconds', or 'ns'                                for date and time to the indicated precision.                                Example: 2006-08-14T02:34:56-06:00   -R, --rfc-email            output date and time in RFC 5322 format.                                Example: Mon, 14 Aug 2006 02:34:56 -0600       --rfc-3339=FMT         output date/time in RFC 3339 format.                                FMT='date', 'seconds', or 'ns'                                for date and time to the indicated precision.                                Example: 2006-08-14 02:34:56-06:00   -r, --reference=FILE       display the last modification time of FILE   -s, --set=STRING           set time described by STRING   -u, --utc, --universal     print or set Coordinated Universal Time (UTC)       --help     顯示此求助說明並離開       --version  顯示版本資訊並離開 FORMAT controls the output.  Interpreted sequences are:  <==底下則是格式 (FORMAT) 的說明   %%   a literal %   %a   locale's abbreviated weekday name (e.g., Sun)   %A   locale's full weekday name (e.g., Sunday)   %b   locale's abbreviated month name (e.g., Jan) ......

整个辅助文件大致上可分为几个部分:

  • Usage (执行语法部份) :

    • date [OPTION]... [+FORMAT]

    • date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

    • 执行语法共有两个项目,分别是:

    • 第 3 行则是说明这个指令的用途是: (1)显示目前的时间,并可进行格式化输出,以及 (2)设定系统时间。

  • Mandatory arguments... (主要选项说明):

    • 例如『 -d, --date=STRING 』的意思是,可以用『 -d STRING 』,也可以用『 --date=STRING 』的意思。

    • 那个 STRING 是你指定的日期,而不是现在的时间。 例如想要知道昨天的日期,可以使用『 date -d yesterday 』或『 date --date=yesterday 』来展示的意思。

  • FORMAT controls... (详细 FORMAT 格式的说明):

    • 例如 %a 代表星期几的英文小写,可以使用 date +%a 来展示

    • 例如 %A 代表星期几的英文大写

    • 在此项目就查询到 %Y, %m, %d 的相关选项功能!

例题 2.1.1-1:使用 date --help 找出说明文件,进一步完成底下的动作:

  1. 如果需要秀出『 小时:分钟 』的格式,例如:『 15:20 ',要如何执行指令?

  2. 请直接输入指令' date +%s',对照 --help 功能,查询一下输出的信息是什么?

  3. 如果要显示两天以前 (2 days ago) 的『 +%Y/%m/%d ',要如何下达指令?

  4. 如果需要显示出' 公元年-日-月 小时:分钟 '的格式,日期与时间中间有一个空格! 该如何下达指令?

你懂这个 command --help 的用法之后,未来许多指令你都可以自己查用法了! 举例来说,你知道 cal 这个指令的功能与如何应用嘛?

例题 2.1.1-2:使用 cal 搭配 cal --help 查询相关选项,完成底下的题目。

  1. cal 这个指令的功能是什么?

  2. 显示目前这个月份的月历

  3. 显示今年的年历

  4. 显示前一个月、本月、下一个月的月历

2.1.2:身份切换su-的使用

继续来玩一下 date 这个指令! 从前一小节使用 date --help 后,可以发现语法有两种情况,如下所示:

[student@localhost ~]$ date --help Usage: date [OPTION]... [+FORMAT]   or:  date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] Display the current time in the given FORMAT, or set the system date.

指令说明当中,可以是'显示, display'也能够是'设定, set'日期。 语法的第一行就是显示日期而已,第二行当然就是设定日期了。 如果使用 student 身份来设定日期,会有什么状况?

# 先注意,設定日期的格式是: MMDDhhmmYYYY,也就是 月日時分年,除了年,其他都有兩位數 [student@station10-101 ~]$ date 三  3月  4 00:04:53 CST 2020  <==當下的日期 [student@station10-101 ~]$ date 030400052020  <==重設為當下的時間 date: 無法設定時間: 此項操作並不被允許 三  3月  4 00:05:00 CST 2020  <==這個動作其實沒有生效!

可以发现到日期并没有变更到正确的日期,而且 date 也明白的告诉操作者,操作者没有权限 (Operation not permitted)! 因为日期的设定要系统管理员才能够设定的。 此时我们就得要切换身份成为系统管理员(root)才行。 处理的方法如下:

[student@localhost ~]$ su - 密碼:  <==輸入密碼時,不會出現 * 符號! [root@localhost ~]#

本教学系统 root 的密码为 myCentOS8,请注意大小写不同! 因此在'密码:'后面输入 myCentOS8 之后,你就可以发现用户的身份变换成为 root 了! 此时再次使用 date 来看看日期能否被设定为正确?

[root@localhost ~]# date 030400052020 Wed Mar  4 00:05:00 CST 2020 [root@localhost ~]# date Wed Mar  4 00:05:20 CST 2020 [root@localhost ~]# hwclock -w

读者们可以发现上表两个指令的操作相差约 20 秒钟,因此输出的信息就会有两秒钟的误差。 不过,日期确实就被修订成为目前的状态。 但如果需要完整的设定系统时间,则需要使用 hwclock -w 写入 BIOS 时间钟才行。 (由于虚拟机的 BIOS 也是虚拟的,因此就不需要使用 hwclock 写入)

另外, root 的身份是作为系统管理所需要的功能,因此做完任何系统维护行为后,请回复到一般用户的身份较佳 (这个习惯请务必养成! )。

例题 2.1.2-1:

  1. 为何当你使用 su - 切换成 root 之后,想要使用方向键上/下去呼叫刚刚下达的'date 030400052020 '指令却呼叫不出来?

  2. 如何退出 root 再次成为 student ?

2.1.3:语系功能切换

由于我们的系统环境使用中文,因此在日期的输出方面可能就是以中文为主。 那如果想要显示为英文年月时,就得要修改一个变量,如下所示:

[student@localhost ~]$ date 三  3月  4 00:12:33 CST 2020  <==這個時候是中文 [student@localhost ~]$ LANG=en_US.utf8  <==這個 LANG 就可以改語系 [student@localhost ~]$ date Wed Mar  4 00:13:10 CST 2020  <==輸出就變成英文了!

你可以发现日期已经变更成为英文的方式来显示了! 此即 LANG 语系变量的设置功能。 台湾地区经常使用的语系有中文 (zh_TW) 与英文 (en_US) 的万国码两种, 当然,比较旧的数据可能需要使用 big5 编码,所以台湾常见的语系有:

  • zh_TW.utf8

  • zh_TW.big5

  • en_US.utf8

我们操作终端机 (terminal) 需要很多显示的环境,还有一些基础的设定,这些设定很多都是可以调整的。 为了方便用户可以自行修订参数, 因此,我们就使用类似上面的 LANG 这个'变量'来设定一些功能。 透过修改这些'变量',就能够影响操作环境或操作行为了。 那如何查看某个变数呢? 透过echo这个指令,搭配变量取用方法即可。 常见的呼叫变量的方式有:

[student@localhost ~]$ echo $var [student@localhost ~]$ echo ${var} # 簡單的說,就是變數名稱 (var) 前面加上錢字號成為 $var 即可。詳細規範則加上大括號成為 ${var} 即可。

至于语系的变化其实有两个变量可以使用,除了常用的 LANG 之外,也可以通过 LC_ALL 来修订! 但一般建议使用 LANG 即可。 既然已经知道语系的设定变量为 LANG,通过上面的呼叫方式,则查阅目前语系的方法就是:

[student@localhost ~]$ echo ${LANG} en_US.utf8

实际练习:修改一下语系资料,同时查看一下系统中的全部语系数据有哪些

  1. 先将语系调整为预设的 zh_TW.utf8

    [student@station10-101 ~]$ LANG=zh_TW.utf8 [student@station10-101 ~]$ echo ${LANG} zh_TW.utf8  <==這樣就變更了語系
  2. 语系数据有很多,包括语言文字、货币符号、数值模式、时间格式、住址格式等等,每个项目是可以独立设定的。 想要知道当前语系底下所有的上述输出信息,用 locale 指令来查询,如下:

    [student@station10-101 ~]$ locale.utf8                <==整體語系,底下則是個別訊息的語系 LC_CTYPE="zh_TW.utf8" LC_NUMERIC="zh_TW.utf8" LC_TIME="zh_TW.utf8" LC_COLLATE="zh_TW.utf8" LC_MONETARY="zh_TW.utf8" LC_MESSAGES="zh_TW.utf8" LC_PAPER="zh_TW.utf8" LC_NAME="zh_TW.utf8" LC_ADDRESS="zh_TW.utf8" LC_TELEPHONE="zh_TW.utf8" LC_MEASUREMENT="zh_TW.utf8" LC_IDENTIFICATION="zh_TW.utf8" LC_ALL= [student@station10-101 ~]$ locale --help 使用方式: locale [參數…] 名稱   或者:  locale [參數…] [-a|-m] 取得語區資料特定的資訊  系統相關資訊:   -a, --all-locales          寫出存在的語區資料名稱   -m, --charmaps             寫出存在的字集對照表名稱 ....
  3. 列出目前这部 Linux 主机上面所有支持的语系有哪些? 从上题的最终 locale --help 可以查到 -a 的选项,因此: 上面的资料量输出比较多,如果超出整个窗口的行列范围,我们可以按下 [shift]+[pageup] 向上翻页,或 [shift]+[pagedown] 向下翻页喔! 你就可以看到所有的语系资料了。

    [student@station10-101 ~]$ locale -a C             <==標準 C 程式語言語系 C.utf8 en_AG en_AU en_AU.utf8 ...... zh_TW zh_TW.euctw zh_TW.utf8
  4. 若想要改变整体系统的语系显示,可以使用 localectl 这个指令来处理。 例如,虽然我们 student 帐号使用的是中文语系, 但是整个 Linux 系统的默认语系还是英文的,如下:

    [student@station10-101 ~]$ echo ${LANG} zh_TW.utf8 <==是中文 [student@station10-101 ~]$ localectl    System Locale:.UTF-8  <==是英文        VC Keymap: us       X11 Layout: us [student@station10-101 ~]$ localectl --help localectl [OPTIONS...] COMMAND ... ...... Commands:   status                   Show current locale settings   set-locale LOCALE...     Set system locale   <==看起來是可以設定成為不同的語系   list-locales             Show known locales   set-keymap MAP [MAP]     Set console and X11 keyboard mappings ...... [student@station10-101 ~]$ localectl set-locale zh_TW.utf8 # 這個指令要經過 root 驗證,因為會更動到系統設定值!所以這裡先知道即可。不建議修改啦!

2.1.4:常见的热键与组合按键

除了上个例题谈到的可以上下移动屏幕画面的组合按键之外,在纯文本模式 (bash shell) 的环境下,建议读者们一定要熟记且经常应用的热键与组合键有:

  • [tab]:可以是命令补齐,可以是文件名补齐,也能是变数名称补齐

  • [ctrl]+c:中断一个运作中的指令

  • [shift]+[PageUp], [shift]+[PageDown]:上下移动屏幕画面

例题 2.1.4-1:

  1. 系统中以if及 ls 为开头的指令,各有哪些?

  2. 有个以 ifco 为开头的指令,详细指令名称我忘记了,你可以找到这个指令名称嘛?

  3. 操作一个指令' find / '这个指令输出很乱,我不想看了,该如何中断这个指令?

  4. 操作一个指令『 ls ' 』,因为不小心多按了一个单引号,导致指令输入行为很怪异,如何中断?

  5. 我想用' ll -d 』去看一下 /etc/se 开头的档案有哪些,可以怎么做?

  6. 我想要知道,到底有多少变量是由 H 开头的? 如何使用 echo 去查阅?

2.1.5:线上求助方式

ll, ls, date, cal 均可使用 --help 来查询语法与相关的选项、参数数据,但某些指令则没有办法显示详细的信息。 例如底下的小算盘命令:

[student@localhost ~]$ bc --help usage: bc [options] [file ...]   -h  --help         print this usage and exit   -i  --interactive  force interactive mode   -l  --mathlib      use the predefined math routines ......

并没有说明算术逻辑的符号,例如指数应用、小数点位数、加减乘除的符号等等。 在开始说明之前,我们先来使用 bc 软件的功能, 进行一下,如果你没有计算机在身边时,如何通过文字界面来进行数值运算:

[student@localhost ~]$ bc bc 1.07.1 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 1+2+3+4 10 1/3 0  <==預設不輸出小數點後資料 quit

bc 指令为 Linux 纯文本界面下的小算盘,你可以使用 bc --help 查询到相关的选项资料,但是如上所示,加减乘除的符号, 还有小数点位数数据,以及离开 (quit) 等信息,则没有显示于 --help 的输出画面中。 Linux 有提供一个名为 manual page (手册页) 的功能, 你可以用 manual 缩写 (man) 来查询,如下所示:

[student@localhost ~]$ man bc bc(1)                           General Commands Manual                           bc(1) NAME        bc - An arbitrary precision calculator language SYNTAX        bc [ -hlwsqv ] [long-options] [  file ... ] DESCRIPTION        bc is a language that supports arbitrary precision numbers with interactive exe‐        cution of statements.  There are some similarities in the syntax to the  C  pro‐        gramming language.  A standard math library is available by command line option.        If requested, the math library is  defined  before  processing  any  files.   bc        starts  by  processing code from all the files listed on the command line in the        order listed.  After all files have been processed, bc reads from  the  standard        input.   All  code  is executed as it is read.  (If a file contains a command to        halt the processor, bc will never read from the standard input.) ......    OPTIONS        -h, --help               Print the usage and exit.        -i, --interactive               Force interactive mode. ......    VARIABLES ......        There  are four special variables, scale, ibase, obase, and last.  scale defines        how some operations use digits after the decimal point.  The  default  value  of        scale is 0. ibase and obase define the conversion base for input and output num‐        bers.  The default for both input and output is base 10.  last (an extension) is        a  variable  that  has the value of the last printed number.  These will be dis‐        cussed in further detail where appropriate.  All of  these  variables  may  have        values assigned to them as well as used in expressions. ......        - expr The result is the negation of the expression.        ++ var The variable is incremented by one and the new value is the result of the               expression.        -- var The variable is decremented by one and the new value is the result of the               expression.        var ++                The result of the expression is the value of the variable and  then  the               variable is incremented by one.        var -- The  result  of  the expression is the value of the variable and then the               variable is decremented by one.        expr + expr               The result of the expression is the sum of the two expressions. ......    MATH LIBRARY        If bc is invoked with the -l option, a math library is preloaded and the default        scale  is  set  to  20.   The math functions will calculate their results to the        scale set at the time of their call.  The math  library  defines  the  following        functions: ......    EXAMPLES        In  /bin/sh,   the following will assign the value of "pi" to the shell variable        pi.                pi=$(echo "scale=10; 4*a(1)" | bc -l) ...... AUTHOR        Philip A. Nelson        philnelson@acm.org ......

此 man 是比较详细的数据,在该画面中,你可以使用下面的按钮来移动屏幕显示整份文档的位置:

  • [enter]:向文件后面移动一行

  • [PageUp]/[PageDown]:向文件前/后移动一页

  • 方向键上/下:向文件前/后移动一行

  • g:移动到整份文件的第一行

  • G:移动到整份文件的最后一行

  • q:离开 man page

有兴趣的话,读者们可以自己慢慢的阅读 man page。 如果是短时间要查询重要的项目,例如我们需要调整输出的小数点位数 (scale) 时, 可以'跑到整份文件的第一行,然后输入斜线 / ,输入关键字'之后 man page 就可以自动帮你找关键字。

  • /keyword:命令 man page 找到关键字

  • n:向整份文件的下方继续找关键词

  • N:向整份文件的上方继续找关键词

例题 2.1.5-1:搭配 man page 的查询来运作指令,可以开启两个终端机进行操作:

  1. 在 bc 的执行环境中,让 1/3 可以输出 .3333 这样的格式

  2. 以 man bc 当中,找关键词' pi= ',然后在 bc 的环境中,算出 pi 的 50 位数结果。

  3. 在 bc 的环境下,算出 1000/17 的'余数 (remainder)』

  4. 在 man date 的环境下,找到第一个范例 (Examples),并说明该指令的意义为何?

man page 除了上述的功能之外,其实 man page 的第一行也显示了该指令/档案的功能,例如 BC(1) 代表的是 1 号 man page, 而共有 9 种左右的 man page 号码,其意义为:

代号代表内容
1用户在shell环境中可以操作的指令或可执行文件
2系统核心可调用的函数与工具等
3一些常用的函数(function)与函式库(library),大部分为C的函式库(libc)
4装置档案的说明,通常在/dev下的档案
5配置文件或者是某些文件的格式
6游戏(games)
7惯例与协议等,例如Linux档案系统、网路协定、ASCII code等等的说明
8系统管理员可用的管理指令
9跟kernel有关的文件

上述的表格内容可以使用'man man'来更详细的取得说明。 透过这张表格的说明, 未来你如果使用man page在察看某些数据时,就会知道该指令/档案所代表的基本意义是什么了。

实际练习:让我们来理解一下 man man 查到的选项功能,以及了解每个数字的意义

  1. 先以man man找一下 -k与 -f 这两个选项的差别: 文件说明中,-f类似 whatis 指令,显示较为完整的查询,而 -k 则是与 apropos 指令相似,列出的是关键词的内容。 两者都是在查询有没有某个 man page 的意思。 底下我们来查查看这两个差别在哪里: 见鬼! 没东西! 这是因为我们的man还没有构建数据库的问题所致。 处理方案很简单,通过 root 执行 mandb 即可! 下达指令前,请注意你的身份为何啊!

    [student@station10-101 ~]$ man man MAN(1)                             Manual pager utils                            MAN(1) NAME        man - an interface to the on-line reference manuals SYNOPSIS        man  [-C  file]  [-d] [-D] [--warnings[=warnings]] [-R encoding] [-L locale] [-m ...... DESCRIPTION ......        The table below shows the section numbers of the manual followed by the types of        pages they contain.        1   Executable programs or shell commands        2   System calls (functions provided by the kernel)        3   Library calls (functions within program libraries)        4   Special files (usually found in /dev)        5   File formats and conventions eg /etc/passwd        6   Games        7   Miscellaneous  (including  macro  packages  and  conventions),  e.g. man(7),            groff(7)        8   System administration commands (usually only for root)        9   Kernel routines [Non standard] ...... OPTIONS ......    Main modes of operation        -f, --whatis               Equivalent to whatis.  Display a short description from the manual  page,               if available.  See whatis(1) for details.        -k, --apropos               Equivalent  to  apropos.   Search  the short manual page descriptions for               keywords and display any matches.  See apropos(1) for details. ......
    [student@station10-101 ~]$ man -f passwd passwd: nothing appropriate. [student@station10-101 ~]$ man -k passwd passwd: nothing appropriate.
    [student@station10-101 ~]$ su - 密碼: [root@station10-101 ~]# mandb ...... Checking for stray cats under /usr/local/share/man... Checking for stray cats under /var/cache/man/local... 112 man subdirectories contained newer manual pages. 7466 manual pages were added. 0 stray cats were added. 0 old database entries were purged. [root@station10-101 ~]# exit logout [student@station10-101 ~]$
  2. 现在,让我们查询一下,系统里面关于 passwd 的说明文件可能有多少? 这样就很轻松的可以查询到,passwd(1) 是指令,可以变更密码, passwd(5) 则是档案,意思是密码文件。

    [student@station10-101 ~]$ man -f passwd openssl-passwd (1ssl) - compute password hashes passwd (1)           - update user's authentication tokens passwd (5)           - password file # 只有左側是完整的 passwd 的項目,才會列出來 [student@station10-101 ~]$ man -k passwd chpasswd (8)         - 成批更新使用者的口令 chgpasswd (8)        - update group passwords in batch mode fgetpwent_r (3)      - get passwd file entry reentrantly getpwent_r (3)       - get passwd file entry reentrantly gpasswd (1)          - administer /etc/group and /etc/gshadow grub2-mkpasswd-pbkdf2 (1) - Generate a PBKDF2 password hash. lpasswd (1)          - Change group or user password openssl-passwd (1ssl) - compute password hashes pam_localuser (8)    - require users to be listed in /etc/passwd passwd (1)           - update user's authentication tokens passwd (5)           - password file passwd2des (3)       - RFS password encryption pwhistory_helper (8) - Helper binary that transfers password hashes from passwd or shad... saslpasswd2 (8)      - set a user's sasl password smbpasswd (5)        - The Samba encrypted password file sslpasswd (1ssl)     - compute password hashes userpasswd (1)       - A graphical tool to allow users to change their passwords. vncpasswd (1)        - change the VNC password # 無論是左側還是右側,只要有 passwd 這個關鍵字,就列出來!
  3. 如何查询 passwd (5) 呢? 先用默认的方法来查 passwd 的用途: 前面几行就告诉你,这是 (1) 的指令说明! 如果想要知道 passwd(5) 的话,这样做: 如此就可以查询两个相同文件名,但不同位置与功能的说明文件了!

    [student@station10-101 ~]$ man passwd PASSWD(1)                            User utilities                           PASSWD(1) NAME        passwd - update user's authentication tokens SYNOPSIS        passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i        inactivedays] [-S] [--stdin] [username] DESCRIPTION        The passwd utility is used to update user's authentication token(s). ......
    [student@station10-101 ~]$ man 5 passwd PASSWD(5)                      Linux Programmer's Manual                      PASSWD(5) NAME        passwd - password file DESCRIPTION        The  /etc/passwd  file is a text file that describes user login accounts for the        system.  It should have read permission allowed for all users  (many  utilities,        like  ls(1)  use it to map user IDs to usernames), but write access only for the        superuser. ......

2.1.6:管线命令的应用

从前几小节的练习中,有时候我们会发现几件事情:(1)指令输出的数据量常常很大,一个屏幕装不下,连使用[shift]+[pageup] 都没有办法全部看完; (2)在 man bc 时,找那个 pi= 的项目中,范例提到在文字界面下,可以透过某些方式不要进入 bc 去算 pi !

尤其是第2个项目,里面就谈到那个| 的符号,这个符号我们称作'管线 (pipe) '! 它的目的是'将前一个指令输出的数据,交由后面的指令来处理'的意思~我们来谈谈该指令的意义:

[student@localhost ~]$ echo "scale=10; 4*a(1)" | bc -l

如果你将上面的指令分成两部份来看,第一部份先执行'echo "scale=10; 4*a(1)"',就可以发现从屏幕上输出『 scale=10; 4*a (1) '的字样,echo 这个指令很单纯的将后续的数据当成文本消息输出到屏幕上。 这些数据之后被带入到 bc 指令中,亦即直接在 bc 的环境中进行 scale=10; 4*a(1) 的运算之意。

  • 大量数据的展示,用 more 与 less 处理

有两个指令很常使用于大量数据输出时的片段展示,那就是 more 与 less。 more 会一页一页翻动,但是无法向前回去查询之前的画面。 至于 less 就是 man page 的操作环境。

例题 2.1.6-1:实验 more 与 less 搭配管线命令的方法

  1. 分别透过 more 与 less 将 ll /etc 的结果一页一页翻动;

  2. 承上,尝试找到 passwd 相关字样的文件名结果

  3. 使用 find /etc 的指令,但是将结果交给 less 来查询

  4. 承上,若使用的身份为 student 时,能否找到错误讯息呢?

  5. 透过管线的功能,计算出一年365天共有几秒钟?

并不是所有的指令都支持管线命令的,例如之前谈到的 ls, ll, find 或本章稍晚会提到的 cp, mkdir 等指令。 能够支持管道| 的指令,就被称为管线命令。

  • 只列出关键字的 grep keyword 撷取字符方法

除了使用| less 的功能加上斜线 (/) 找到关键字的方法之外,我们也可以通过 grep 来取得关键字! 以上头的例题来看,如果要使用 ll /etc/ 找出 passwd 的关键字『那一行』的话,可以简单的这样做:

[student@localhost ~]$ ll /etc/ | grep 'passwd'

例题 2.1.6-2:练习 grep 来抓关键词那一行

  1. 以 ifconfig 指令来观察系统的所有适配器 IP

  2. 使用管线命令搭配 grep 取得关键字,来取出有 IP 的那行讯息即可。

2.2:Linux 档案管理初探

在 Linux 的系统下,总是会需要用到档案管理的情况发生,包括建立目录与档案、复制与移动档案、删除档案与目录等等。 另外,读者也应该要知道在 Linux 的系统下,那些目录是正规系统会存在的,以及该目录又应该要放置哪些资料等等。

2.2.1:Linux 目录树系统简介

所有的 Linux distribions 理论上都应该要遵循当初 Linux 开发时所规范的各项标准,其中之一就是档案系统的阶层标准 (Filesystem Hierarchy Standard, FHS)。 基本上 FHS 只是一个基本建议值,详细的资料还是保有让各个 distribution 自由设计的权力! 无论如何,FHS 还是规范了根目录与 /usr, /var 这三个目录内应该要放置的数据就是了。

另外,根据档案是否经常变动,以及档案运作的情况,大致上有几个比较重要的目录分类:

  • static (固定的内容):包含不会变动的工具程序、函式库与说明文件等

  • dynamic / variable (变动的内容):可能会被运作中的程序所修改掉

  • persistent (持续性内容):开机之后会持续存在且大多不会变动的数据,例如一些环境设定信息

  • runtime (运行中的内容):包含用户程序或系统程序运行中的资料,这些数据会在重新启动后被删除

CentOS 7 以后 (包含CentOS 8) 的系统目录规范跟以前的版本差异挺大的,详细的资料还请参考相关文件,底下仅就个别目录中应该要放置的数据做个基本的解释。 请自行' ll / '对照下表的相关目录说明。

目录名称应放置文件内容(一定要知道的内容)
/bin
/sbin
/bin 主要放置一般用户可操作的
指令 /sbin 主要放置系统管理员可
操作的指令 这两个数据目前都是链接文件,分别链接到 /usr/bin, /usr/sbin 当中
/boot与开机有关的档案,包括核心档案/开机管理程序与配置文件
/dev是 device 的缩写,放置设备文件,包括硬盘档、键盘鼠标终端档案等
/etc一堆系统配置文件,包括帐号、密码与各式服务软件的配置文件大多在此目录内
/home
/root
/home 是一般帐号的家目录默认放置
位置 /root 则是系统管理器的家目录了!
/lib
/lib64
系统库与核心库,其中/lib包含核心驱动程序,而其他软件的库若为64位,则使用/lib64目录内的函式库档案。 这两个目录目前也都是链接到 /usr/lib, /usr/lib64 内。
/proc将内存内的数据做成档案类型,放置于这个目录下,连同某些核心参数也能手动调整
/sys跟 /proc 类似,只是比较针对硬件相关的参数方面。
/usr是 usr 不是 user 喔! 是 unix software resource 的缩写,与 Unix 程序有关。 从CentOS 7开始, 系统相关的所有软件、服务等,均放置在这个目录中了! 因此不能与根目录分离。
/var是一些变动数据,系统运作过程中的服务资料、暂存资料、登录数据等等。
/tmp一些用户操作过程中会启用的临时文件,例如 X 软件相关的数据等等。

Linux 是由工程师开发的,许多的目录也沿用 Unix 的规范,Unix 也是工程师开发的,所以许多的目录命名通常就与该目录要放置的数据有点相关性。 例如 bin, sbin 就类似 binary, system binary (二进制程序、系统管理二进制) 来结合这样~

目录名称应放置文件内容(以后用到就知道了)
/media
/mnt
/media 主要是系统上临时挂载使用的装置(如即插即用 USB)之惯
用目录 /mnt 主要是使用者或管理员自行暂时手动挂载的目录
/opt/opt 是 optional 的意思,通常是第三方第三方所开发的软件放置处
/run系统进行服务软件运作管理的功能,CentOS 7以后,这个目录也放在内存当中了!
/srv通常是给各类服务 (service) 放置数据使用的目录

另外,在 Linux 环境下,所有的目录都是根目录 (/) 衍生出来的,从根目录开始撰写的文件名也就被称为'绝对路径'。 而磁盘规划方面,若需要了解磁盘与目录树的搭配,可以使用 df (display filesystem) 的软件来查阅:

[student@localhost ~]$ df 檔案系統                 1K-區段    已用    可用 已用% 掛載點 devtmpfs                  918108       0  918108    0% /dev tmpfs                     936140       0  936140    0% /dev/shm tmpfs                     936140    9388  926752    2% /run tmpfs                     936140       0  936140    0% /sys/fs/cgroup /dev/mapper/centos-root 10475520 4359596 6115924   42% / /dev/vda2                1998672  149448 1727984    8% /boot /dev/mapper/centos-home  3135488   70240 3065248    3% /home tmpfs                     187228      16  187212    1% /run/user/42 tmpfs                     187228       4  187224    1% /run/user/0 tmpfs                     187228       4  187224    1% /run/user/1000

上表中最左侧为档案系统,最右侧则是挂载点。 挂载点有点类似 windows 系统的 C:, D:, E: 等磁盘槽的意思。 在 Linux 底下所有的档案都是从目录树分出来,因此档案系统也需要跟目录结合在一起。 以上表来说,'当你进入 /boot 这个目录时, 就可以看到 /dev/vda2 这个设备的内容'之意。

此外,系统也已经将内存模拟成档案系统,提供用户将暂存资料放置于高速的内存内。 只是这些数据在关机后就会消失。 这些目录包括很重要的 /dev/shm (上表)。

例题 2.2.1-1:

  1. 使用 ll / 观察档名,在出现的画面中,『链接档』与『一般目录』的差别中,最左边的字符分别是什么?

  2. /proc 与 /sys 的档案容量分别有多大? 为什么?

  3. /boot/vmlinuz 开头的文件名为系统的'核心档案',找出来 CentOS 8 的环境下,这个核心档案容量有多大?

  4. 使用 man ls 及 man ifconfig 两个指令查询完毕后,猜测 ls 与 ifconfig '可能'放置在哪些目录内?

  5. 如果你有一个暂时使用的文件需要经常访问,且文件容量相当大,为了加速,你可以将这个文件暂时放置于哪里来做编辑? 只是编辑完毕后必须要重新复制回原本的目录去。

2.2.2:工作目录的切换与相对/绝对路径

默认的情况下,用户取得 shell 的环境时,通常就是在自己的'家目录',例如 windows 档案总管打开后, 出现在画面中的,通常是'我的文件夹'之类的环境。 若要变更工作目录,例如变更工作目录到 /var/spool/mail 去,可以这样做:

[student@localhost ~]$ ls Desktop    Downloads  Music     Public     text1.txt Documents  group      Pictures  Templates  Videos [student@localhost ~]$ cd /var/spool/mail [student@localhost mail]$ ls rpc  student

如上所示,一开始读者会在 student 家目录下,因此单纯使用 ls 时,会列出工作目录 (家目录) 底下的资料,亦即是一堆家目录应该会存在的目录名称。 而当读者操作' cd /var/spool/mail '之后,工作目录会变成该目录,所以提示字符里面也将 ~ 变成了 mail 了。 因此使用 ls 所列出的工作目录下的资料, 就会有不一样的文件名出现。 读者在操作指令时,要特别注意'工作目录'才行。 而列出当前工作目录的方法为使用 pwd:

[student@localhost mail]$ pwd /var/spool/mail [student@localhost mail]$

读者操作系统时,不要只看提示字符下的文件名,最好能够查阅实际的目录较佳。 如下案例:

[student@localhost mail]$ cd /etc [student@localhost etc]$ pwd /etc [student@localhost etc]$ cd /usr/local/etc [student@localhost etc]$ pwd /usr/local/etc [student@localhost etc]$

操作者可发现,自从进到 /etc 之后,提示字符内的目录位置一直是' etc ',然而使用 pwd 就能够发现两者的差异。 这在系统管理时非常的重要,若去错目录,会导致档案修订的错误!

除了根目录与主目录之外,Linux 上有一些比较特别的目录需要记忆:

目录名称目录意义
/根目录,从根目录写起的文件名只会存在一个
~用户的家目录,不同用户的家目录均不相同
.一个小数点,代表的是'本目录',亦即目前的工作目录之意
..两个小数点,代表的是'上一层目录'"
-一个减号,代表'上一次的工作目录'之意

操作者应该要注意,根据文件名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative)。 这两种文件名/路径的写法依据是这样的:

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/student/.bashrc;

  • 相对路径:相对于目前路径的文件名写法。 例如 ./home/student 或 .. /.. /home/student/ 等等。 开头不是/就属于相对路径的写法

例题 2.2.2-1:了解文件名撰写的'绝对路径文件名'与'相对路径文件名'的操作

  1. 前往 /var/spool/mail 并观察当下的工作目录

  2. 观察上一层目录的文件名资料,查询一下有没有『 anacron 』这个文件名存在?

  3. 请前往'上一层目录的那个 anacron 目录'

  4. 在当下的目录中,如何查询 /var/log 这个目录的内容? 分别使用两种方式 (相对/绝对路径) 来查阅

  5. 回到 student 家目录

  6. 分别使用'预设'、'相对路径'、'绝对路径'、'工作目录底下'执行 ifconfig 的方法

2.2.3:简易档案管理练习

由本章的说明,读者可以清楚 /etc 与 /boot 为两个相当重要的目录,其中 /etc 更是需要备份的所在。 若读者使用 student 的身份来暂时进行档案管理行为时,例如将 /etc 完整备份时,可以如何进行?

  1. 先前往 /dev/shm 这个内存模拟的目录来操作后续指令:

    [student@localhost ~]$ cd /dev/shm [student@localhost shm]$ pwd /dev/shm
  2. 创建一个名为 backup 的目录,等待备份数据 :

    [student@localhost shm]$ mkdir backup [student@localhost shm]$ ll 總計 0 drwxrwxr-x. 2 student student 40  3月  4 13:14 backup
  3. 进入 backup 目录当中:

    [student@localhost shm]$ cd backup [student@localhost backup]$ pwd /dev/shm/backup
  4. 将 /etc 完整的复制过来:复制使用的指令说明,你应该要 cp --help 去查阅! 也可以使用 man cp 去查阅! 因为 cp 会自动忽略目录的复制,因此需要如下的指令来复制目录才行

    [student@localhost backup]$ cp --help 用法:cp [選項]... [-T] 來源 目的地   或:cp [選項]... 來源... 目錄    <==這個是最常用的指令串!   或:cp [選項]... -t 目錄 來源... Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY. Mandatory arguments to long options are mandatory for short options too.   -a, --archive                same as -dR --preserve=all    <==嘗試完整保留權限       --attributes-only        don't copy the file data, just the attributes       --backup[=CONTROL]       make a backup of each existing destination file ......   -R, -r, --recursive          copy directories recursively  <==複製目錄 ...... # 開始嘗試將 /etc 檔名複製到本目錄 (.) 底下 [student@localhost backup]$ cp /etc . cp: -r not specified; omitting directory '/etc'
  5. 开始复制目录 (-r) 的动作: 因为系统很多保密的文件是不许被一般用户所读取的,因此 student 许多文件无法顺利复制也是正确的! 操作者无须担心。

    # 剛剛 cp --help 有看到 -r 可以複製目錄,因此加上這個選項功能來處理目錄複製: [student@localhost backup]$ cp -r /etc . cp: 無法開啟 ‘/etc/crypttab’ 來讀取資料: 拒絕不符權限的操作 cp: 無法存取 ‘/etc/pki/CA/private’: 拒絕不符權限的操作 cp: 無法存取 ‘/etc/pki/rsyslog’: 拒絕不符權限的操作 ....... [student@localhost backup]$ ll 總計 0 drwxr-xr-x. 135 student student 5020  3月  4 13:21 etc
  6. 再次复制文件,同时将错误消息发送到垃圾桶,不要显示在屏幕上:

    [student@localhost backup]$ cp -r /etc . 2> /dev/null [student@localhost backup]$ ll -d /etc ./etc drwxr-xr-x. 135 student student 5020  3月  4 13:22 ./etc drwxr-xr-x. 135 root    root    8192  3月  3 17:54 /etc

透过上面的练习,最终我们知道其实 student 身份复制的 /dev/shm/backup/etc 是没有完整的备份的! 因为两者的容量大小、内容档案、权限都不相同之故。 至于相关的指令功能、选项功能等等,请自由 man cp、 man mkdir 来预先了解。

另外,在一些错误讯息要丢弃的环境中,也可以在指令的最后面加上 2> /dev/null 来将错误的数据导向垃圾桶 (/dev/null)。

例题 2.2.3-1:

  1. 先查看一下有没有 /dev/shm/backup/etc/passwd* 的文件名存在?

  2. 复制使用 cp 而删除可以使用 rm。 尝试删除前一题的文件名,并确认该档案已经不存在了。

  3. 查看一下 /dev/shm/backup/etc/X11 是『档案』还是『目录』?

  4. 如何删除前一题谈到的目录?

  5. 若想要删除 /dev/shm/backup/etc/xdg 这个目录,且'每个档案删除前均须询问',须加上哪个选项?

2.3:课后练习操作

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

  1. 先查看一下目前语文系资料,同时将语系数据改为 C 这个语系资料

  2. CentOS 8.1 释出的时间是 2020/02/09 这一天,假设为格林威治时间 (GMT) 的 0 点好了,如何以 +%s 计算出该天累加的 Linux 时间总秒数?

  3. 那总天数又是多少? 可以通过 bc 来计算

  4. 假设你看到一个人的密码,他的密码日期被推算为 18310,你觉得该密码被建立的日期,大概是什么时候?

  5. 2020年的10月10号大概是星期几?

  6. 历史命令据说可以记载 1000 比,而历史的大小中文 HISTORY,取其前面 4 个英文字母来看,在你目前的终端机中, 有没有相关的 HIST 变量可以参考? 将该变量内容叫出来

  7. 转到 /dev/shm 目录,然后按序完成下面的动作:

    1. 将 /dev/shm 变成工作目录

    2. 建立名为 check 的目录

    3. 将上述的目录变成工作目录

    4. 将 /etc/X11 复制到本目录

    5. 将 ./X11/xinit 目录删除

    6. 透过 find /etc 搭配管线命令与 grep ,抓出 group 关键词的文件名。

    7. 将上述找到的文件名复制到本目录

    8. 列出本目录底下的所有文件名,并包含权限喔!

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

作业硬盘操作帮助:

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

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

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

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

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

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

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

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


  1. (20%)关于 console, terminal, shell (控制台、终端机、壳程式) 的一些简单认知:

    1. 在 tty1, tty2 等待你登录的环境,这种环境称为什么(写下中文与英文)?

    2. 有一个界面,这个界面可以提供键盘输入/屏幕输出,这种界面称为什么? (写下中文和英语)

    3. 提供用户输入指令,然后将指令带入系统中执行的软件,称为什么? (写下中文和英语)

    4. 一串指令列,分别是:『 cmd --op1="para1" --op2 para2 '这五个组件分别称为什么 (基本上只有 3 种状态)?

    5. 当我执行' localectl list-locales '这个指令的参数意义是什么?

  2. (20%)常用的指令的操作练习:

    1. (a)在 bash shell 的环境下,什么指令可以将输出的语系切换成为 en_US.utf8,并且(b)如何查看语系的设定值;

    2. Linux 的日期设定其实与 Unix 相同,都是从 1970/01/01 开始计算时间而来。 若有一个密码数据,该数据告诉你密码修改的日期是在 16849,请问如何使用 date 这个指令计算出该日期其实是公元年月日? (写下完整命令)

    3. 用 cal 输出 2021/04/29 这一天的月历与直接看到该日为星期几? (写下完整命令)

    4. 承上,当天是这一年当中由1月1日算起来的第几天? (注:该日期称为 julian date),(a)写下完整指令与(b)执行结果显示第几天

    5. (a)先显示出目前的时间 (b)再用 date 这个指令,设定为正确的时间。 写下指令。

  3. (20%)常用的指令的操作练习:

    1. 若为 root 的身份,使用 su - student 切换成为 student 时,需不需要输入密码?

    2. 呼叫出HISTFILESIZE这个变量的完整指令为何?

    3. 使用那一个指令可以查出 /etc/group 这个文件的第三个字段意义为何? (写下指令)

    4. 请查出 /dev/null 这个设备的意义为何? (写下指令和查询的 DESCRIPTION 结果)

    5. 如何利用 student 身份,通过管道命令与 grep 的功能,通过 find /etc 找出文件名含有 shadow 的文件名数据? (a)写下指令与(b)执行结果的文件名有哪几个?

    6. 承上,将一堆错误讯息丢弃,我只需要显示正确的文件名而已。 (写下指令)

  4. (20%)一些基础目录的认知:

    1. 根目录下,那两个目录主要在放置用户与管理员常用的指令?

    2. 根目录下,那两个目录其实是内存内的资料,本身并不占硬盘空间?

    3. 根目录下,那一个目录主要在放置配置文件?

    4. 上网找出, /lib/modules/ 这个目录的内容主要在放置什么东西?

    5. 有个指令名称为 /usr/bin/mount,请使用'绝对路径'与'工作目录下的指令'来执行该指令

  5. (20%)实作题:基本档案管理 (直接在系统上面操作,操作成功即可,无须写下任何答案)

    1. 使用 student 身份,在自己的家目录底下,建立名为 ./20xx/unit02 的目录

    2. 使用 student 身份,将 /etc/X11 这个数据复制到上述的目录内

    3. 使用 root 的身份,删除 /opt/myunit02 档名。

    4. 使用 root 的身份,创建名为 /mnt/myunit02 目录

    5. 使用 root 的身份,通过 find /etc 指令,找出文件名含有 shadow 的文件数据,并将这些档案数据复制到 /mnt/myunit02 去。

作业结果传输:请以 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特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×