2.指令下达行为与基础文档管理

2023-07-06  本文已影响0人  是周大侠啊

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

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

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

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

[student@localhost ~]$ command  [-options]  [parameter1...]
用 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)
......
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.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  <==輸出就變成英文了!

我们操作终端机 (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
2.1.4:常见的热键与组合按键

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

[tab]:可以是命令补齐,可以是文件名补齐,也能是变数名称补齐
[ctrl]+c:中断一个运作中的指令
[shift]+[PageUp], [shift]+[PageDown]:上下移动屏幕画面
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 指令为 Linux 纯文字界面下的小算盘,你可以使用 bc --help 查询到相关的选项资料,但是如上所示,加减乘除的符号, 还有小数点位数数据,以及离开(quit)等信息,则没有显示于htcpp的输出画面中。

[enter]:向文件后面移动一行
[PageUp]/[PageDown]:向文件前/后移动一页
方向键上/下:向文件前/后移动一行
g:移动到整份文件的第一行
G:移动到整份文件的最后一行
q:离开 man page
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; 4a(1)“',就可以发现从屏幕上输出『 scale=10; 4a (1) '的字样,echo 这个指令很单纯的将后续的数据当成文本消息输出到屏幕上。 这些数据之后被带入到 bc 指令中,亦即直接在 bc 的环境中进行 scale=10; 4*a(1) 的运算之意。

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

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

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

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

[student@localhost ~]$ ll /etc/ | grep 'passwd'
2.2.1:Linux 目录树系统简介

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

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

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

应放置文件内容(一定要知道的内容)
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

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

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

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

2.2.3:简易档案管理练习

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

  1. 先前往 /dev/shm 这个内存模拟的目录来操作后续指令:
[student@localhost ~]$ cd /dev/shm
[student@localhost shm]$ pwd
/dev/shm
  1. 创建一个名为 backup 的目录,等待备份数据 :
[student@localhost shm]$ mkdir backup
[student@localhost shm]$ ll
總計 0
drwxrwxr-x. 2 student student 40  3月  4 13:14 backup
  1. 进入 backup 目录当中:
[student@localhost shm]$ cd backup
[student@localhost backup]$ pwd
/dev/shm/backup
  1. 将 /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'
  1. 开始复制目录 (-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
  1. 再次复制文件,同时将错误消息发送到垃圾桶,不要显示在屏幕上:
[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)。

上一篇 下一篇

猜你喜欢

热点阅读