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