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

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

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

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] 之类的语法

  • 命令运行的注意事项 :
    指令、选项、参数之间都以空格或 [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)
......
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 这三个目录内应该要放置的数据就是了。

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

  • 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 软件相关的数据等等。
  • 【/media,/mnt】/media 主要是系统上临时挂载使用的装置(如即插即用 USB)之惯用目录,/mnt 主要是使用者或管理员自行暂时手动挂载的目录
  • 【/opt】/opt 是 optional 的意思,通常是第三方第三方所开发的软件放置处
  • 【/run】系统进行服务软件运作管理的功能,CentOS 7以后,这个目录也放在内存当中了!
  • 【/srv】通常是给各类服务 (service) 放置数据使用的目录
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)。 这两种文件名/路径的写法依据是这样的:

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/student/.bashrc;
  • 相对路径:相对于目前路径的文件名写法。 例如 ./home/student 或 .. /.. /home/student/ 等等。 开头不是/就属于相对路径的写法
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)。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容