Linux就該這么學》最新正式版已出版上市,同學們可在線上京東網當當網淘寶網亞馬遜等電商平臺購買。

*亦可就近在新華書店購買*

章節簡述:

本章首先介紹系統內核和Shell終端的關系與作用,然后介紹Bash解釋器的4大優勢并學習Linux命令的執行方法。經驗豐富的運維人員可以通過合理地組合適當的命令與參數,來更精準地滿足工作需求,迅速得到自己想要的結果,還可以盡可能地降低系統資源消耗。

本書精挑細選出讀者有必要首先學習的數十個Linux命令,它們與系統工作、系統狀態、工作目錄、文件、目錄、打包壓縮與搜索等主題相關。通過把上述命令歸納到本章中的各個小節,讓您可以分門別類地逐個學習這些最基礎的Linux命令,為今后學習更復雜的命令和服務做好必備知識鋪墊。

2.1 強大好用的SHELL

通常來講,計算機硬件是由運算器、控制器、存儲器、輸入/輸出設備等共同組成的,而讓各種硬件設備各司其職且又能協同運行的東西就是系統內核。Linux系統的內核負責完成對硬件資源的分配、調度等管理任務。由此可見,系統內核對計算機的正常運行來講是太重要了,因此一般不建議直接去編輯內核中的參數,而是讓用戶通過基于系統調用接口開發出的程序或服務來管理計算機,以滿足日常工作的需要,如圖2-1所示。

必須肯定的是,Linux系統中有些圖形化工具(比如邏輯卷管理器[Logical Volume Manager,LVM])確實非常好用,極大地降低了運維人員操作出錯的概率,值得稱贊。但是,很多圖形化工具其實是調用了腳本來完成相應的工作,往往只是為了完成某種工作而設計的,缺乏Linux命令原有的靈活性及可控性。再者,圖形化工具相較于Linux命令行界面會更加消耗系統資源,因此經驗豐富的運維人員甚至都不會給Linux系統安裝圖形界面,需要開始運維工作時直接通過命令行模式遠程連接過去,不得不說這樣做確實挺高效的。

圖2-1? 用戶與Linux系統的交互

Shell就是這樣的一個命令行工具。Shell(也稱為終端或殼)充當的是人與內核(硬件)之間的翻譯官,用戶把一些命令“告訴”終端,它就會調用相應的程序服務去完成某些工作。現在包括紅帽系統在內的許多主流Linux系統默認使用的終端是Bash(Bourne-Again SHell)解釋器。主流Linux系統選擇Bash解釋器作為命令行終端主要有以下4項優勢,讀者可以在今后的學習和生產工作中細細體會Linux系統命令行的美妙之處,真正從心里愛上它們。

1:通過上下方向鍵來調取過往執行過的Linux命令;

2:命令或參數僅需輸入前幾位就可以用Tab鍵補全;

3:具有強大的批處理腳本;

4:具有實用的環境變量功能。

2.2 執行查看幫助命令

既然Linux系統中已經有了Bash這么好用的“翻譯官”,那么接下來就有必要好好學習下怎么跟它溝通了。要想準確、高效地完成各種任務,僅依賴于命令本身是不夠的,還應該根據實際情況來靈活調整各種命令的參數。比如,我們切壽司時盡管可以用菜刀,但米粒一定會撒得滿地都是,因此壽司刀上設計的用于透氣的圓孔就是為了更好地適應場景而額外增加的參數。當您學完本書并具備一定的工作經驗之后,一定能夠領悟Linux命令的奧秘。常見執行Linux命令的格式是這樣的:

命令名稱 [命令參數] [命令對象]

注意,命令名稱、命令參數、命令對象之間請用空格鍵分隔。

命令對象一般是指要處理的文件、目錄、用戶等資源,而命令參數可以用長格式(完整的選項名稱),也可以用短格式(單個字母的縮寫),兩者分別用--與-作為前綴(示例請見表2-1)。Linux新手不會執行命令大多是因為參數比較復雜,參數值需要隨不同的命令和需求情況而發生改變。因此,要想靈活搭配各種參數,執行自己想要的功能,則需要長時間的經驗積累了。

表2-1?????????????????????????????????????????? 命令參數的長格式與短格式示例

長格式 man --help
短格式 man -h

有讀者現在可能會想:“Linux系統中有那么多命令,我怎么知道某個命令是干嘛用的?在日常工作中遇到了一個不熟悉的Linux命令,我又怎樣才能知道它有哪些可用參數呢?”接下來,我們就拿man這個命令作為本書中第一個教給讀者去學習的Linux命令了。對于真正的零基礎讀者,您可以通過圖2-2、圖2-3、圖2-4和圖2-5來學習如何在RHEL 7系統中執行Linux命令。

默認主機登錄界面只有我們剛剛新建的普通用戶,因此在正式進入系統之前,我們還需要先點擊“Not listed”選項來切換至root管理員身份,這是紅帽RHEL7系統為了避免用戶亂使用權限而采取的一項小措施。而如果我們順手使用默認的linuxprobe用戶登錄到主機中,那么接下來本章節中則會出現一部分命令會因權限不足而無法執行,我們需要足夠的權限才能完成接下來的實驗。而至于同學們關心的root管理員和普通用戶之間的區別,生產環境時又該如何選擇的疑問,我們將會在第5章節中慢慢講給大家。登錄界面切換至root管理員身份,如圖2-2所示。

圖2-2 選擇“未列出”選項,切換至root管理員身份。

第1步:在RHEL 7系統的桌面上單擊鼠標右鍵,在彈出的菜單中選擇Open in Terminal命令,這將打開一個Linux系統命令行終端,如圖2-3所示。

運行虛擬機中的RHEL7系統,并在桌面上敲擊右鍵后點擊“Open in Terminal”,這樣就成功的打開了一個終端。

圖2-3 ?在Linux系統上打開命令行終端

第2步:在命令行終端中輸入man man命令來查看man命令自身的幫助信息,如圖2-4所示。

查看man幫助文檔

圖2-4? 查看man命令的幫助信息

第3步:敲擊回車鍵后即可看到如圖2-5所示的幫助信息。man命令的幫助信息界面

圖2-5? man命令的幫助信息

在man命令幫助信息的界面中,所包含的常用操作按鍵及其用途如表2-2所示。

表2-2??????????????????????????????????????????? man命令中常用按鍵以及用途

按鍵 用處
空格鍵 向下翻一頁
PaGe down 向下翻一頁
PaGe up 向上翻一頁
home 直接前往首頁
end 直接前往尾頁
/ 從上至下搜索某個關鍵詞,如“/linux”
? 從下至上搜索某個關鍵詞,如“?linux”
n 定位到下一個搜索到的關鍵詞
N 定位到上一個搜索到的關鍵詞
q 退出幫助文檔

一般來講,使用man命令查看到的幫助內容信息都會很長很多,如果讀者不了解幫助文檔信息的目錄結構和操作方法,乍一看到這么多信息可能會感到相當困惑。man命令的幫助信息的結構如表2-3所示。

表2-3???????????????????????????????????????? man命令幫助信息的結構以及意義

結構名稱 代表意義
NAME 命令的名稱
SYNOPSIS 參數的大致使用方法
DESCRIPTION 介紹說明
EXAMPLES 演示(附帶簡單說明)
OVERVIEW 概述
DEFAULTS 默認的功能
OPTIONS 具體的可用選項(帶介紹)
ENVIRONMENT 環境變量
FILES 用到的文件
SEE ALSO 相關的資料
HISTORY 維護歷史與聯系方式

2.3 常用系統工作命令

您現在閱讀的這本書是劉遄老師在經歷了十多年的運維學習以及數十期的培訓授課后總結而成的,您可能無法在本節中找到某些之前見過的命令。但不用擔心,之所以這樣安排,原因是劉遄老師努力地將Linux命令與實戰相結合,真正讓讀者在實操中理解技術,而不是單純地把命令堆砌到書中讓讀者去硬背。

劉遄老師用了近一年的時間把最常用的Linux命令進行匯總、歸納、整理、分類后,把這些常用的命令合理安排到了后續章節中,然后采用以練代學的方式來加深讀者的理解和掌握。從數年的培訓成果反饋來看,這種方式相當有效,因此也相信這種方式肯定適合您的學習。

1.echo命令

echo命令用于在終端輸出字符串或變量提取后的值,格式為“echo [字符串?|?$變量]”。

例如,把指定字符串“Linuxprobe.com”輸出到終端屏幕的命令為:

[[email protected] ~]# echo Linuxprobe.Com

該命令會在終端屏幕上顯示如下信息:

Linuxprobe.Com

下面,我們使用$變量的方式提取變量SHELL的值,并將其輸出到屏幕上:

[[email protected] ~]# echo $SHELL
/bin/bash

2.date命令

date命令用于顯示及設置系統的時間或日期,格式為“date [選項] [+指定的格式]”。

只需在強大的date命令中輸入以“+”號開頭的參數,即可按照指定格式來輸出系統的時間或日期,這樣在日常工作時便可以把備份數據的命令與指定格式輸出的時間信息結合到一起。例如,把打包后的文件自動按照“年-月-日”的格式打包成“backup-2017-9-1.tar.gz”,用戶只需要看一眼文件名稱就能大概了解到每個文件的備份時間了。date命令中常見的參數格式及作用如表2-4所示。

表2-4????????????????????????????????????????????? date命令中的參數以及作用

參數 作用
%t 跳格[Tab鍵]
%H 小時(00~23)
%I 小時(00~12)
%M 分鐘(00~59)
%S 秒(00~59)
%j 今年中的第幾天

按照默認格式查看當前系統時間的date命令如下所示:

[[email protected] ~]# date
Mon?Aug?24?16:11:23?CST?2017

按照“年-月-日 小時:分鐘:秒”的格式查看當前系統時間的date命令如下所示:

[[email protected] ~]# date "+%Y-%m-%d %H:%M:%S"
2017-08-24 16:29:12

將系統的當前時間設置為2017年9月1日8點30分的date命令如下所示:

[[email protected] ~]# date -s "20170901 8:30:00"
Fri?Sep?1?08:30:00?CST?2017

再次使用date命令并按照默認的格式查看當前的系統時間,如下所示:

[[email protected] ~]# date
Fri?Sep?1?08:30:01?CST?2017

date命令中的參數%j可用來查看今天是當年中的第幾天。這個參數能夠很好地區分備份時間的新舊,即數字越大,越靠近當前時間。該參數的使用方式以及顯示結果如下所示。

[[email protected] ~]# date "+%j"
244

3.reboot命令

reboot命令用于重啟系統,其格式為reboot。

由于重啟計算機這種操作會涉及硬件資源的管理權限,因此默認只能使用root管理員來重啟,其命令如下:

[[email protected] ~]# reboot

4.poweroff命令

poweroff命令用于關閉系統,其格式為poweroff。

該命令與reboot命令相同,都會涉及硬件資源的管理權限,因此默認只有root管理員才可以關閉電腦,其命令如下:

[[email protected] ~]# poweroff

5.wget命令

wget命令用于在終端中下載網絡文件,格式為“wget [參數] 下載地址”。

如果您沒有Linux系統的管理經驗,當前只需了解一下wget命令的參數以及作用,然后看一下下面的演示實驗即可,切記不要急于求成。后面章節將逐步講解Linux系統的配置管理方法,可以等您掌握了網卡的配置方法后再來進行這個實驗操作。表2-5所示為wget命令的參數以及參數的作用。

表2-5??????????????????????????????????????????????? wget命令的參數以及作用

參數 作用
-b 后臺下載模式
-P 下載到指定目錄
-t 最大嘗試次數
-c 斷點續傳
-p 下載頁面內所有資源,包括圖片、視頻等
-r 遞歸下載

嘗試使用wget命令從本書的配套站點中下載本書的最新pdf格式電子文檔,這個文件的完整路徑為http://www.52437949.com/docs/LinuxProbe.pdf,執行該命令后的下載效果如下:

[root@linuxprobe?~]#?wget?http://www.52437949.com/docs/LinuxProbe.pdf
--2017-08-24?19:30:12?--?https://www.52437949.com/docs/LinuxProbe.pdf
Resolving?www.52437949.com?(www.52437949.com)...?220.181.105.185
Connecting?to?www.52437949.com?(www.52437949.com)|220.181.105.185|:80...connected.
HTTP?request?sent,?awaiting?response...?200?OK
Length:?45948568?(44M)?[application/pdf]
Saving?to:?‘LinuxProbe.pdf’
100%[===========================================>]?45,948,568?32.9MB/s?in?1.3s
2017-08-24?19:30:14?(32.9?MB/s)?-?‘LinuxProbe.pdf’?saved?[45948568/45948568]

接下來,我們使用wget命令遞歸下載www.52437949.com網站內的所有頁面數據以及文件,下載完后會自動保存到當前路徑下一個名為www.52437949.com的目錄中。執行該操作的命令為wget -r -p http://www.52437949.com,該命令的執行結果如下。

[[email protected]?~]#?wget?-r?-p?http://www.52437949.com
--2017-08-24?19:31:41--?http://www.52437949.com/
Resolving?www.52437949.com...?106.185.25.197
Connecting?to?www.52437949.com|106.185.25.197|:80...?connected.
HTTP?request?sent,?awaiting?response...?200?OK
Length:?unspecified?[text/html]
Saving?to:?'www.52437949.com/index.html'
………………省略下載過程………………

6.ps命令

ps命令用于查看系統中的進程狀態,格式為“ps [參數]”。

估計讀者在第一次執行這個命令時都要驚呆一下—怎么會有這么多輸出值,這可怎么看得過來?其實,劉遄老師通常會將ps命令與第3章的管道符技術搭配使用,用來抓取與某個指定服務進程相對應的PID號碼。ps命令的常見參數以及作用如表2-6所示。

表2-6????????????????????????????????????????????????? ps命令的參數以及作用

參數 作用
-a 顯示所有進程(包括其他用戶的進程)
-u 用戶以及其他詳細信息
-x 顯示沒有控制終端的進程

Linux系統中時刻運行著許多進程,如果能夠合理地管理它們,則可以優化系統的性能。在Linux系統中,有5種常見的進程狀態,分別為運行、中斷、不可中斷、僵死與停止,其各自含義如下所示。

R(運行):進程正在運行或在運行隊列中等待。

S(中斷):進程處于休眠中,當某個條件形成后或者接收到信號時,則脫離該?? 狀態。

D(不可中斷):進程不響應系統異步信號,即便用kill命令也不能將其中斷。

Z(僵死):進程已經終止,但進程描述符依然存在, 直到父進程調用wait4()系統函數后將進程釋放。

T(停止):進程收到停止信號后停止運行。

當執行ps aux命令后通常會看到如表2-7所示的進程狀態,表2-7中只是列舉了部分輸出值,而且正常的輸出值中不包括中文注釋。

表2-7???????????????????????????????????????????????????????????? 進程狀態

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
進程的所有者 進程ID號 運算器占用率 內存占用率 虛擬內存使用量(單位是KB) 占用的固定內存量(單位是KB) 所在終端 進程狀態 被啟動的時間 實際使用CPU的時間 命令名稱與參數
root 1 0.0 0.4 53684 7628 ? Ss 07:22 0:02 /usr/lib/systemd/systemd
root 2 0.0 0.0 0 0 ? S 07:22 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 07:22 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 07:22 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 07:22 0:00 [migration/0]
……………… 省略部分輸出信息 ………………

如前面所提到的,在Linux系統中的命令參數有長短格式之分,長格式和長格式之間不能合并,長格式和短格式之間也不能合并,但短格式和短格式之間是可以合并的,合并后僅保留一個-(減號)即可。另外ps命令可允許參數不加減號(-),因此可直接寫成ps aux的樣子。

7.top命令

top命令用于動態地監視進程活動與系統負載等信息,其格式為top。

top命令相當強大,能夠動態地查看系統運維狀態,完全將它看作Linux中的“強化版的Windows任務管理器”。top命令的運行界面如圖2-6所示。

top命令

圖2-6? top命令的運行界面

在圖2-6中,top命令執行結果的前5行為系統整體的統計信息,其所代表的含義如下。

第1行:系統時間、運行時間、登錄終端數、系統負載(三個數值分別為1分鐘、5分鐘、15分鐘內的平均值,數值越小意味著負載越低)。

第2行:進程總數、運行中的進程數、睡眠中的進程數、停止的進程數、僵死的進程數。

第3行:用戶占用資源百分比、系統內核占用資源百分比、改變過優先級的進程資源百分比、空閑的資源百分比等。其中數據均為CPU數據并以百分比格式顯示,例如“97.1 id”意味著有97.1%的CPU處理器資源處于空閑。

第4行:物理內存總量、內存使用量、內存空閑量、作為內核緩存的內存量。

第5行:虛擬內存總量、虛擬內存使用量、虛擬內存空閑量、已被提前加載的內存量。

8.pidof命令

pidof命令用于查詢某個指定服務進程的PID值,格式為“pidof [參數] [服務名稱]”。

每個進程的進程號碼值(PID)是唯一的,因此可以通過PID來區分不同的進程。例如,可以使用如下命令來查詢本機上sshd服務程序的PID:

[[email protected] ~]# pidof sshd
2156

9.kill命令

kill命令用于終止某個指定PID的服務進程,格式為“kill [參數] [進程PID]”。

接下來,我們使用kill命令把上面用pidof命令查詢到的PID所代表的進程終止掉,其命令如下所示。這種操作的效果等同于強制停止sshd服務。

[[email protected] ~]# kill 2156

10.killall命令

killall命令用于終止某個指定名稱的服務所對應的全部進程,格式為:“killall [參數] [服務名稱]”。

通常來講,復雜軟件的服務程序會有多個進程協同為用戶提供服務,如果逐個去結束這些進程會比較麻煩,此時可以使用killall命令來批量結束某個服務程序帶有的全部進程。下面以httpd服務程序為例,來結束其全部進程。由于RHEL7系統默認沒有安裝httpd服務程序,因此大家此時只需看操作過程和輸出結果即可,等學習了相關內容之后再來實踐。

[[email protected] ~]# pidof httpd
13581 13580 13579 13578 13577 13576
[[email protected] ~]# killall httpd
[[email protected] ~]# pidof httpd
[[email protected] ~]# 

如果我們在系統終端中執行一個命令后想立即停止它,可以同時按下Ctrl + C組合鍵(生產環境中比較常用的一個快捷鍵),這樣將立即終止該命令的進程。或者,如果有些命令在執行時不斷地在屏幕上輸出信息,影響到后續命令的輸入,則可以在執行命令時在末尾添加上一個&符號,這樣命令將進入系統后臺來執行。

很多同學在報名劉遄老師培訓課程時會提到自己的英語基礎不好,其實大可不必擔心,因為咱們的書籍、培訓課程甚至紅帽考題都是中文的。而接下來您也就會發現,原來一直使用的是Linux命令,而絕不是純粹的英語單詞,即便它們的拼寫100%相同,最終用處肯定也是不一樣的。因此在學習Linux系統技術的這件事上,您跟英語達人絕對都是站在同一起跑線上的,更何況還正確的選擇了一本適合您的Linux教材,放心開始學習吧!

劉遄老師主講的Linux技術培訓課程介紹:http://www.52437949.com/training

2.4 系統狀態檢測命令

作為一名合格的運維人員,想要更快、更好地了解Linux服務器,必須具備快速查看Linux系統運行狀態的能力,因此接下來會逐個講解與網卡網絡、系統內核、系統負載、內存使用情況、當前啟用終端數量、歷史登錄記錄、命令執行記錄以及救援診斷等相關命令的使用方法。這些命令都超級實用,還請讀者用心學習,加以掌握。

1.ifconfig命令

ifconfig命令用于獲取網卡配置與網絡狀態等信息,格式為“ifconfig [網絡設備] [參數]”。

使用ifconfig命令來查看本機當前的網卡配置與網絡狀態等信息時,其實主要查看的就是網卡名稱、inet參數后面的IP地址、ether參數后面的網卡物理地址(又稱為MAC地址),以及RX、TX的接收數據包與發送數據包的個數及累計流量(即下面加粗的信息內容):

[[email protected] ~]# ifconfig
eno16777728: flags=4163? mtu 1500
??????? inet 192.168.10.10? netmask 255.255.255.0? broadcast 192.168.10.255
??????? inet6 fe80::20c:29ff:fec4:a409? prefixlen 64? scopeid 0x20
??????? ether 00:0c:29:c4:a4:09? txqueuelen 1000? (Ethernet)
??????? RX packets 36? bytes 3176 (3.1 KiB)
??????? RX errors 0? dropped 0? overruns 0? frame 0
??????? TX packets 38? bytes 4757 (4.6 KiB)
??????? TX errors 0? dropped 0 overruns 0? carrier 0? collisions 0

lo: flags=73? mtu 65536
??????? inet 127.0.0.1? netmask 255.0.0.0
??????? inet6 ::1? prefixlen 128? scopeid 0x10
??????? loop? txqueuelen 0? (Local Loopback)
??????? RX packets 386? bytes 32780 (32.0 KiB)
??????? RX errors 0? dropped 0? overruns 0? frame 0
??????? TX packets 386? bytes 32780 (32.0 KiB)
??????? TX errors 0? dropped 0 overruns 0? carrier 0? collisions 0

2.uname命令

uname命令用于查看系統內核與系統版本等信息,格式為“uname [-a]”。

在使用uname命令時,一般會固定搭配上-a參數來完整地查看當前系統的內核名稱、主機名、內核發行版本、節點名、系統時間、硬件名稱、硬件平臺、處理器類型以及操作系統名稱等信息。

[[email protected] ~]# uname -a
Linux linuxprobe.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux

順帶一提,如果要查看當前系統版本的詳細信息,則需要查看redhat-release文件,其命令以及相應的結果如下:

[[email protected] ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.0 (Maipo)

3.uptime命令

uptime用于查看系統的負載信息,格式為uptime。

uptime命令真的很棒,它可以顯示當前系統時間、系統已運行時間、啟用終端數量以及平均負載值等信息。平均負載值指的是系統在最近1分鐘、5分鐘、15分鐘內的壓力情況(下面加粗的信息部分);負載值越低越好,盡量不要長期超過1,在生產環境中不要超過5。

[[email protected] ~]# uptime
22:49:55 up 10 min, 2 users, load average: 0.01, 0.19, 0.18

4.free命令

free用于顯示當前系統中內存的使用量信息,格式為“free [-h]”。

為了保證Linux系統不會因資源耗盡而突然宕機,運維人員需要時刻關注內存的使用量。在使用free命令時,可以結合使用-h參數以更人性化的方式輸出當前內存的實時使用量信息。表2-8所示為在劉遄老師的電腦上執行free -h命令之后的輸出信息。需要注意的是,輸出信息中的中文注釋是作者自行添加的內容,實際輸出時沒有相應的參數解釋。

[[email protected] ~]# free -h

表2-8??????????????????????????????????????????? 執行free -h命令后的輸出信息

內存總量 已用量 可用量 進程共享的內存量 磁盤緩存的內存量 緩存的內存量
total used free shared buffers cached
Mem: 1.8G 1.3G 542M 9.8M 1.6M 413M
-/+ buffers/cache: 869M 957M
Swap: 2.0G 0B 2.0G

5.who命令

who用于查看當前登入主機的用戶終端信息,格式為“who [參數]”。

這三個簡單的字母可以快速顯示出所有正在登錄本機的用戶的名稱以及他們正在開啟的終端信息。表2-9所示為執行who命令后的結果。

[[email protected] ~]# who

表2-9?????????????????????????????????????????????????? 執行who命令的結果

登陸的用戶名 終端設備 登陸到系統的時間
root :0 2017-08-24 17:52 (:0)
root pts/0 2017-08-24 17:52 (:0)

6.last命令

last命令用于查看所有系統的登錄記錄,格式為“last [參數]”。

使用last命令可以查看本機的登錄記錄。但是,由于這些信息都是以日志文件的形式保存在系統中,因此黑客可以很容易地對內容進行篡改。千萬不要單純以該命令的輸出信息而判斷系統有無被惡意入侵!

[[email protected]?~]#?last
root???????pts/0???????:0???????????????Mon?Aug??24?17:52???still??logged?in
root???????:0??????????:0???????????????Mon?Aug??24?17:52???still??logged?in
(unknown???:0??????????:0???????????????Mon?Aug??24?17:50?-?17:52???(00:02)
reboot?????system?boot?3.10.0-123.el7.x?Tue?Aug??25?01:49?-?18:17???(-7:-32)
root???????pts/0???????:0???????????????Mon?Aug??24?15:40?-?08:54???(7+17:14)
root???????pts/0???????:0???????????????Fri?Jul??10?10:49?-?15:37???(45+04:47)
………………省略部分登錄信息………………

7.history命令

history命令用于顯示歷史執行過的命令,格式為“history [-c]”。

history命令應該是作者最喜歡的命令。執行history命令能顯示出當前用戶在本地計算機中執行過的最近1000條命令記錄。如果覺得1000不夠用,還可以自定義/etc/profile文件中的HISTSIZE變量值。在使用history命令時,如果使用-c參數則會清空所有的命令歷史記錄。還可以使用“!編碼數字”的方式來重復執行某一次的命令。總之,history命令有很多有趣的玩法等待您去開發。

[[email protected] ~]# history
1 tar xzvf VMwareTools-9.9.0-2304977.tar.gz
2 cd vmware-tools-distrib/
3 ls
4 ./vmware-install.pl -d
5 reboot
6 df -h
7 cd /run/media/
8 ls
9 cd root/
10 ls
11 cd VMware\ Tools/
12 ls
13 cp VMwareTools-9.9.0-2304977.tar.gz /home
14 cd /home
15 ls
16 tar xzvf VMwareTools-9.9.0-2304977.tar.gz
17 cd vmware-tools-distrib/
18 ls
19 ./vmware-install.pl -d
20 reboot
21 history
[[email protected] ~]# !15
anaconda-ks.cfg? Documents? initial-setup-ks.cfg? Pictures? Templates
Desktop????????? Downloads? Music???????????????? Public??? Videos

歷史命令會被保存到用戶家目錄中的.bash_history文件中。Linux系統中以點(.)開頭的文件均代表隱藏文件,這些文件大多數為系統服務文件,可以用cat命令查看其文件內容。

[[email protected] ~]# cat ~/.bash_history

要清空當前用戶在本機上執行的Linux命令歷史記錄信息,可執行如下命令:

[[email protected] ~]# history -c

8.sosreport命令

sosreport命令用于收集系統配置及架構信息并輸出診斷文檔,格式為sosreport。

當Linux系統出現故障需要聯系技術支持人員時,大多數時候都要先使用這個命令來簡單收集系統的運行狀態和服務配置信息,以便讓技術支持人員能夠遠程解決一些小問題,亦或讓他們能提前了解某些復雜問題。在下面的輸出信息中,加粗的部分是收集好的資料壓縮文件以及校驗碼,將其發送給技術支持人員即可:

[[email protected] ~]# sosreport
sosreport (version 3.0)
This command will collect diagnostic and configuration information from
this Red Hat Enterprise Linux system and installed applications.

An archive containing the collected information will be generated in
/var/tmp and may be provided to a Red Hat support representative.
Any information provided to Red Hat will be treated in accordance with
the published support policies at:

https://access.redhat.com/support/

The generated archive may contain data considered sensitive and its
content should be reviewed by the originating organization before being
passed to any third party.

No changes will be made to system configuration.
Press ENTER to continue, or CTRL-C to quit. 此處敲擊回車來確認收集信息

Please enter your first initial and last name [linuxprobe.com]:此處敲擊回車來確認主機編號
Please enter the case number that you are generating this report for:此處敲擊回車來確認主機編號
Running plugins. Please wait ...
Running 70/70: yum...
Creating compressed archive...
Your sosreport has been generated and saved in:

/var/tmp/sosreport-linuxprobe.com-20170905230631.tar.xz
The checksum is: 79436cdf791327040efde48c452c6322
Please send this file to your support representative.
2.5 工作目錄切換命令

工作目錄指的是用戶當前在系統中所處的位置。由于工作目錄會牽涉系統存儲結構相關的知識,因此第6章將詳細講解這部分內容。讀者只需簡單了解一下這里的操作實驗即可,如果不能完全掌握也沒有關系,畢竟Linux系統的知識體系太過龐大,每一位初學人員都需要經歷這么一段時期。

1.pwd命令

pwd命令用于顯示用戶當前所處的工作目錄,格式為“pwd [選項]”。

[[email protected] etc]# pwd
/etc

2.cd命令

cd命令用于切換工作路徑,格式為“cd [目錄名稱]”。

這個命令應該是最常用的一個Linux命令了。可以通過cd命令迅速、靈活地切換到不同的工作目錄。除了常見的切換目錄方式,還可以使用“cd -”命令返回到上一次所處的目錄,使用“cd..”命令進入上級目錄,以及使用“cd ~”命令切換到當前用戶的家目錄,亦或使用“cd ~username”切換到其他用戶的家目錄。例如,可以使用“cd 路徑”的方式切換進/etc目錄中:

[[email protected] ~]# cd /etc

同樣的道理,可使用下述命令切換到/bin目錄中:

[[email protected] etc]# cd /bin

此時,要返回到上一次的目錄(即/etc目錄),可執行如下命令:

[[email protected] bin]# cd -
/etc
[[email protected]?etc]#

還可以通過下面的命令快速切換到用戶的家目錄:

[[email protected] etc]# cd ~
[[email protected] ~]#

3.ls命令

ls命令用于顯示目錄中的文件信息,格式為“ls [選項] [文件] ”。

所處的工作目錄不同,當前工作目錄下的文件肯定也不同。使用ls命令的“-a”參數看到全部文件(包括隱藏文件),使用“-l”參數可以查看文件的屬性、大小等詳細信息。將這兩個參數整合之后,再執行ls命令即可查看當前目錄中的所有文件并輸出這些文件的屬性信息:

[[email protected] ~]# ls -al
total 60
dr-xr-x---. 14 root root 4096 May? 4 07:56 .
drwxr-xr-x. 17 root root 4096 May? 4 15:55 ..
-rw-------.? 1 root root 1213 May? 4 15:44 anaconda-ks.cfg
-rw-------.? 1 root root? 957 May? 4 07:54 .bash_history
-rw-r--r--.? 1 root root?? 18 Dec 28? 2013 .bash_logout
-rw-r--r--.? 1 root root? 176 Dec 28? 2013 .bash_profile
-rw-r--r--.? 1 root root? 176 Dec 28? 2013 .bashrc
drwx------. 10 root root 4096 May? 4 07:56 .cache
drwx------. 15 root root 4096 May? 4 07:49 .config
-rw-r--r--.? 1 root root? 100 Dec 28? 2013 .cshrc
drwx------.? 3 root root?? 24 May? 4 07:46 .dbus
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Desktop
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Documents
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Downloads
-rw-------.? 1 root root?? 16 May? 4 07:49 .esd_auth
-rw-------.? 1 root root? 628 May? 4 07:56 .ICEauthority
-rw-r--r--.? 1 root root 1264 May? 4 07:48 initial-setup-ks.cfg
drwx------.? 3 root root?? 18 May? 4 07:49 .local
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Music
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Pictures
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Public
-rw-r--r--.? 1 root root? 129 Dec 28? 2013 .tcshrc
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Templates
drwxr-xr-x.? 2 root root??? 6 May? 4 07:49 Videos
-rw-------.? 1 root root 1962 May? 4 07:54 .viminfo

如果想要查看目錄屬性信息,則需要額外添加一個-d參數。例如,可使用如下命令查看/etc目錄的權限與屬性信息:

[[email protected] ~]# ls -ld /etc
drwxr-xr-x. 132 root root 8192 Jul 10 10:48 /etc
2.6?文本文件編輯命令

通過前面幾個小節的學習,讀者應該基本掌握了切換工作目錄及對文件的管理方法。Linux系統中“一切都是文件”,而對服務程序進行配置自然也就是編輯程序的配置文件。如果不能熟練地查閱系統或服務的配置文件,那以后工作時可就真的要尷尬了。本節將講解幾條用于查看文本文件內容的命令。至于編輯器使用起來比較復雜,因此將放到第4章與Shell腳本內容一起講解。

1.cat命令

cat命令用于查看純文本文件(內容較少的),格式為“cat [選項] [文件]”。

Linux系統中有多個用于查看文本內容的命令,每個命令都有自己的特點,比如這個cat命令就是用于查看內容較少的純文本文件的。cat這個命令也很好記,因為cat在英語中是“貓”的意思,小貓咪是不是給您一種嬌小、可愛的感覺呢?

如果在查看文本內容時還想順便顯示行號的話,不妨在cat命令后面追加一個-n參數:

[[email protected] ~]# cat -n initial-setup-ks.cfg 
???? 1?? ?#version=RHEL7
???? 2?? ?# X Window System configuration information
???? 3?? ?xconfig? --startxonboot
???? 4?? ?
???? 5?? ?# License agreement
???? 6?? ?eula --agreed
???? 7?? ?# System authorization information
???? 8?? ?auth --enableshadow --passalgo=sha512
???? 9?? ?# Use CDROM installation media
??? 10?? ?cdrom
??? 11?? ?# Run the Setup Agent on first boot
??? 12?? ?firstboot --enable
??? 13?? ?# Keyboard layouts
??? 14?? ?keyboard --vckeymap=us --xlayouts='us'
??? 15?? ?# System language
??? 16?? ?lang en_US.UTF-8
………………省略部分輸出信息………………

2.more命令

more命令用于查看純文本文件(內容較多的),格式為“more [選項]文件”。

如果需要閱讀長篇小說或者非常長的配置文件,那么“小貓咪”可就真的不適合了。因為一旦使用cat命令閱讀長篇的文本內容,信息就會在屏幕上快速翻滾,導致自己還沒有來得及看到,內容就已經翻篇了。因此對于長篇的文本內容,推薦使用more命令來查看。more命令會在最下面使用百分比的形式來提示您已經閱讀了多少內容。您還可以使用空格鍵或回車鍵向下翻頁:

[[email protected] ~]# more initial-setup-ks.cfg 
#version=RHEL7
# X Window System configuration information
xconfig? --startxonboot

# License agreement
eula --agreed
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Run the Setup Agent on first boot
firstboot --enable
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

ignoredisk --only-use=sda
# Network information
network? --bootproto=dhcp --device=eno16777728 --onboot=off --ipv6=auto
network? --bootproto=dhcp --hostname=linuxprobe.com
--More--(43%)

3.head命令

head命令用于查看純文本文檔的前N行,格式為“head [選項] [文件]”。

在閱讀文本內容時,誰也難以保證會按照從頭到尾的順序往下看完整個文件。如果只想查看文本中前20行的內容,該怎么辦呢?head命令可以派上用場了:

[[email protected] ~]# head -n 20? initial-setup-ks.cfg 
#version=RHEL7
# X Window System configuration information
xconfig? --startxonboot

# License agreement
eula --agreed
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Run the Setup Agent on first boot
firstboot --enable
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='us'
# System language
lang en_US.UTF-8

ignoredisk --only-use=sda
# Network information
network? --bootproto=dhcp --device=eno16777728 --onboot=off --ipv6=auto
[[email protected] ~]#

4.tail命令

tail命令用于查看純文本文檔的后N行或持續刷新內容,格式為“tail [選項] [文件]”。

我們可能還會遇到另外一種情況,比如需要查看文本內容的最后20行,這時就需要用到tail命令了。tail命令的操作方法與head命令非常相似,只需要執行“tail -n 20 文件名”命令就可以達到這樣的效果。tail命令最強悍的功能是可以持續刷新一個文件的內容,當想要實時查看最新日志文件時,這特別有用,此時的命令格式為“tail -f 文件名”:

[root@linuxprobe?~]# tail -f /var/log/messages
May? 4 07:56:38 localhost gnome-session: Window manager warning: Log level 16: STACK_OP_ADD: window 0x1e00001 already in stack
May? 4 07:56:38 localhost gnome-session: Window manager warning: Log level 16: STACK_OP_ADD: window 0x1e00001 already in stack
May? 4 07:56:38 localhost vmusr[12982]: [ warning] [Gtk] gtk_disable_setlocale() must be called before gtk_init()
May? 4 07:56:50 localhost systemd-logind: Removed session c1.
Aug? 1 01:05:31 localhost systemd: Time has been changed
Aug? 1 01:05:31 localhost systemd: Started LSB: Bring up/down networking.
Aug? 1 01:08:56 localhost dbus-daemon: dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper)
Aug? 1 01:08:56 localhost dbus[1124]: [system] Activating service name='com.redhat.SubscriptionManager' (using servicehelper)
Aug? 1 01:08:57 localhost dbus-daemon: dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager'
Aug? 1 01:08:57 localhost dbus[1124]: [system] Successfully activated service 'com.redhat.SubscriptionManager'

5.tr命令

tr命令用于替換文本文件中的字符,格式為“tr [原始字符] [目標字符]”。

在很多時候,我們想要快速地替換文本中的一些詞匯,又或者把整個文本內容都進行替換,如果進行手工替換,難免工作量太大,尤其是需要處理大批量的內容時,進行手工替換更是不現實。這時,就可以先使用cat命令讀取待處理的文本,然后通過管道符(詳見第3章)把這些文本內容傳遞給tr命令進行替換操作即可。例如,把某個文本內容中的英文全部替換為大寫:

[[email protected] ~]# cat anaconda-ks.cfg | tr [a-z] [A-Z]
#VERSION=RHEL7
# SYSTEM AUTHORIZATION INFORMATION
AUTH --ENABLESHADOW --PASSALGO=SHA512

# USE CDROM INSTALLATION MEDIA
CDROM
# RUN THE SETUP AGENT ON FIRST BOOT
FIRSTBOOT --ENABLE
IGNOREDISK --ONLY-USE=SDA
# KEYBOARD LAYOUTS
KEYBOARD --VCKEYMAP=US --XLAYOUTS='US'
# SYSTEM LANGUAGE
LANG EN_US.UTF-8

# NETWORK INFORMATION
NETWORK --BOOTPROTO=DHCP --DEVICE=ENO16777728 --ONBOOT=OFF --IPV6=AUTO
NETWORK --HOSTNAME=LOCALHOST.LOCALDOMAIN
# ROOT PASSWORD
ROOTPW --ISCRYPTED $6$PDJJF42G8C6PL069$II.PX/YFAQPO0ENW2PA7MOMKJLYOAE2ZJMZ2UZJ7BH3UO4OWTR1.WK/HXZ3XIGMZGJPCS/MGPYSSOI8HPCT8B/
# SYSTEM TIMEZONE
TIMEZONE AMERICA/NEW_YORK --ISUTC
USER --NAME=LINUXPROBE --PASSWORD=$6$A9V3INSTNBWEIR7D$JEGFYWBCDOOOKJ9SODECCDO.ZLF4OSH2AZ2SS2R05B6LZ2A0V2K.RJWSBALL2FEKQVGF640OA/TOK6J.7GUTO/ --ISCRYPTED --GECOS="LINUXPROBE"
# X WINDOW SYSTEM CONFIGURATION INFORMATION
XCONFIG --STARTXONBOOT
# SYSTEM BOOTLOADER CONFIGURATION
BOOTLOADER --LOCATION=MBR --BOOT-DRIVE=SDA
AUTOPART --TYPE=LVM
# PARTITION CLEARING INFORMATION
CLEARPART --NONE --INITLABEL 

%PACKAGES
@BASE
@CORE
@DESKTOP-DEBUGGING
@DIAL-UP
@FONTS
@GNOME-DESKTOP
@GUEST-AGENTS
@GUEST-DESKTOP-AGENTS
@INPUT-METHODS
@INTERNET-BROWSER
@MULTIMEDIA
@PRINT-CLIENT
@X11

%END

6.wc命令

wc命令用于統計指定文本的行數、字數、字節數,格式為“wc [參數] 文本”。

每次我在課堂上講到這個命令時,總有同學會聯想到一種公共設施,其實這兩者毫無關聯。Linux系統中的wc命令用于統計文本的行數、字數、字節數等。如果為了方便自己記住這個命令的作用,也可以聯想到上廁所時好無聊,無聊到數完了手中的如廁讀物上有多少行字。wc的參數以及相應的作用如表2-10所示。

表2-10?????????????????????????????????????????????????? wc的參數以及作用

參數 作用
-l 只顯示行數
-w 只顯示單詞數
-c 只顯示字節數

在Linux系統中,passwd是用于保存系統賬戶信息的文件,要統計當前系統中有多少個用戶,可以使用下面的命令來進行查詢,是不是很神奇:

[[email protected] ~]# wc -l /etc/passwd
38 /etc/passwd

7.stat命令

stat命令用于查看文件的具體存儲信息和時間等信息,格式為“stat 文件名稱”。

stat命令可以用于查看文件的存儲信息和時間等信息,命令stat anaconda-ks.cfg會顯示出文件的三種時間狀態(已加粗):Access、Modify、Change。這三種時間的區別將在下面的touch命令中詳細詳解:

[[email protected]?~]# stat anaconda-ks.cfg
File: ‘anaconda-ks.cfg’
Size: 1213 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 68912908 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:admin_home_t:s0
Access: 2017-07-14 01:46:18.721255659 -0400
Modify: 2017-05-04 15:44:36.916027026 -0400
Change: 2017-05-04 15:44:36.916027026 -0400
Birth: -

8.cut命令

cut命令用于按“列”提取文本字符,格式為“cut [參數] 文本”。

在Linux系統中,如何準確地提取出最想要的數據,這也是我們應該重點學習的內容。一般而言,按基于“行”的方式來提取數據是比較簡單的,只需要設置好要搜索的關鍵詞即可。但是如果按列搜索,不僅要使用-f參數來設置需要看的列數,還需要使用-d參數來設置間隔符號。passwd在保存用戶數據信息時,用戶信息的每一項值之間是采用冒號來間隔的,接下來我們使用下述命令嘗試提取出passwd文件中的用戶名信息,即提取以冒號(:)為間隔符號的第一列內容:

[[email protected] ~]# head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[[email protected] ~]# cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
dbus
polkitd
unbound
colord
usbmuxd
avahi
avahi-autoipd
libstoragemgmt
saslauth
qemu
rpc
rpcuser
nfsnobody
rtkit
radvd
ntp
chrony
abrt
pulse
gdm
gnome-initial-setup
postfix
sshd
tcpdump
linuxprobe

9.diff命令

diff命令用于比較多個文本文件的差異,格式為“diff [參數] 文件”。

在使用diff命令時,不僅可以使用--brief參數來確認兩個文件是否不同,還可以使用-c參數來詳細比較出多個文件的差異之處,這絕對是判斷文件是否被篡改的有力神器。例如,先使用cat命令分別查看diff_A.txt和diff_B.txt文件的內容,然后進行比較:

[[email protected] ~]# cat diff_A.txt
Welcome to linuxprobe.com
Red Hat certified
Free Linux Lessons
Professional guidance
Linux Course
[[email protected] ~]# cat diff_B.txt
Welcome tooo linuxprobe.com

Red Hat certified
Free Linux LeSSonS
////////.....////////
Professional guidance
Linux Course

接下來使用diff --brief命令顯示比較后的結果,判斷文件是否相同:

[[email protected] ~]# diff --brief diff_A.txt diff_B.txt
Files diff_A.txt and diff_B.txt differ

最后使用帶有-c參數的diff命令來描述文件內容具體的不同:

[[email protected] ~]# diff -c diff_A.txt diff_B.txt
*** diff_A.txt 2017-08-30 18:07:45.230864626 +0800
--- diff_B.txt 2017-08-30 18:08:52.203860389 +0800
***************
*** 1,5 ****
! Welcome to linuxprobe.com
Red Hat certified
! Free Linux Lessons
Professional guidance
Linux Course
--- 1,7 ----
! Welcome tooo linuxprobe.com
!
Red Hat certified
! Free Linux LeSSonS
! ////////.....////////
Professional guidance
Linux Course
2.7?文件目錄管理命令

目前為止,我們學習Linux命令就像是在夯實地基,雖然表面上暫時還看不到成果,但其實大家的內功已經相當雄厚了。在Linux系統的日常運維工作中,還需要掌握對文件的創建、修改、復制、剪切、更名與刪除等操作。

1.touch命令

touch命令用于創建空白文件或設置文件的時間,格式為“touch [選項] [文件]”。

在創建空白的文本文件方面,這個touch命令相當簡捷,簡捷到沒有必要鋪開去講。比如,touch linuxprobe命令可以創建出一個名為linuxprobe的空白文本文件。對touch命令來講,有難度的操作主要是體現在設置文件內容的修改時間(mtime)、文件權限或屬性的更改時間(ctime)與文件的讀取時間(atime)上面。touch命令的參數及其作用如表2-11所示。

表2-11???????????????????????????????????????????? touch命令的參數及其作用

參數 作用
-a 僅修改“讀取時間”(atime)
-m 僅修改“修改時間”(mtime)
-d 同時修改atime與mtime

接下來,我們先使用ls命令查看一個文件的修改時間,然后修改這個文件,最后再通過touch命令把修改后的文件時間設置成修改之前的時間(很多黑客就是這樣做的呢):

[[email protected] ~]# ls -l anaconda-ks.cfg 
-rw-------. 1 root root 1213 May? 4 15:44 anaconda-ks.cfg
[[email protected]?~]# echo "Visit the LinuxProbe.com to learn linux skills" >> anaconda-ks.cfg
[[email protected]?~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1260 Aug? 2 01:26 anaconda-ks.cfg
[[email protected]?~]# touch -d "2017-05-04 15:44" anaconda-ks.cfg 
[[email protected]?~]# ls -l anaconda-ks.cfg 
-rw-------. 1 root root 1260 May? 4 15:44 anaconda-ks.cfg

2.mkdir命令

mkdir命令用于創建空白的目錄,格式為“mkdir [選項] 目錄”。

在Linux系統中,文件夾是最常見的文件類型之一。除了能創建單個空白目錄外,mkdir命令還可以結合-p參數來遞歸創建出具有嵌套疊層關系的文件目錄。

[[email protected] ~]# mkdir linuxprobe
[[email protected] ~]# cd linuxprobe
[[email protected] linuxprobe]# mkdir -p a/b/c/d/e
[[email protected] linuxprobe]# cd a
[[email protected] a]# cd b
[[email protected] b]#

3.cp命令

cp命令用于復制文件或目錄,格式為“cp [選項] 源文件 目標文件”。大家對文件復制操作應該不陌生,在Linux系統中,復制操作具體分為3種情況:

如果目標文件是目錄,則會把源文件復制到該目錄中;

如果目標文件也是普通文件,則會詢問是否要覆蓋它;

如果目標文件不存在,則執行正常的復制操作。

cp命令的參數及其作用如表2-12所示。

表2-12?????????????????????????????????????????????? cp命令的參數及其作用

參數 作用
-p 保留原始文件的屬性
-d 若對象為“鏈接文件”,則保留該“鏈接文件”的屬性
-r 遞歸持續復制(用于目錄)
-i 若目標文件存在則詢問是否覆蓋
-a 相當于-pdr(p、d、r為上述參數)

接下來,使用touch創建一個名為install.log的普通空白文件,然后將其復制為一份名為x.log的備份文件,最后再使用ls命令查看目錄中的文件:

[[email protected] ~]# touch install.log
[[email protected] ~]# cp install.log x.log
[[email protected] ~]# ls
install.log x.log

4.mv命令

mv命令用于剪切文件或將文件重命名,格式為“mv [選項] 源文件 [目標路徑|目標文件名]”。

剪切操作不同于復制操作,因為它會默認把源文件刪除掉,只保留剪切后的文件。如果在同一個目錄中對一個文件進行剪切操作,其實也就是對其進行重命名:

[[email protected] ~]# mv x.log linux.log
[[email protected]?~]#?ls
install.log?linux.log

5.rm命令

rm命令用于刪除文件或目錄,格式為“rm [選項] 文件”。

在Linux系統中刪除文件時,系統會默認向您詢問是否要執行刪除操作,如果不想總是看到這種反復的確認信息,可在rm命令后跟上-f參數來強制刪除。另外,想要刪除一個目錄,需要在rm命令后面加一個-r參數才可以,否則刪除不掉。我們來嘗試刪除前面創建的install.log和linux.log文件:

[[email protected] ~]# rm install.log
rm: remove regular empty file ‘install.log’? y
[[email protected] ~]# rm -f linux.log
[[email protected] ~]# ls
[[email protected] ~]#

6.dd命令

dd命令用于按照指定大小和個數的數據塊來復制文件或轉換文件,格式為“dd [參數]”。

dd命令是一個比較重要而且比較有特色的一個命令,它能夠讓用戶按照指定大小和個數的數據塊來復制文件的內容。當然如果愿意的話,還可以在復制過程中轉換其中的數據。Linux系統中有一個名為/dev/zero的設備文件,每次在課堂上解釋它時都充滿哲學理論的色彩。因為這個文件不會占用系統存儲空間,但卻可以提供無窮無盡的數據,因此可以使用它作為dd命令的輸入文件,來生成一個指定大小的文件。dd命令的參數及其作用如表2-13所示。

表2-13?????????????????????????????????????????????? dd命令的參數及其作用

參數 作用
if 輸入的文件名稱
of 輸出的文件名稱
bs 設置每個“塊”的大小
count 設置要復制“塊”的個數

例如我們可以用dd命令從/dev/zero設備文件中取出一個大小為560MB的數據塊,然后保存成名為560_file的文件。在理解了這個命令后,以后就能隨意創建任意大小的文件了:

[[email protected] ~]# dd if=/dev/zero of=560_file count=1 bs=560M
1+0 records in
1+0 records out
587202560 bytes (587 MB) copied, 27.1755 s, 21.6 MB/s

dd命令的功能也絕不僅限于復制文件這么簡單。如果您想把光驅設備中的光盤制作成iso格式的鏡像文件,在Windows系統中需要借助于第三方軟件才能做到,但在Linux系統中可以直接使用dd命令來壓制出光盤鏡像文件,將它變成一個可立即使用的iso鏡像:

[[email protected] ~]# dd if=/dev/cdrom of=RHEL-server-7.0-x86_64-LinuxProbe.Com.iso
7311360+0 records in
7311360+0 records out
3743416320 bytes (3.7 GB) copied, 370.758 s, 10.1 MB/s

考慮到有些讀者會糾結bs塊大小與count塊個數的關系,下面舉一個吃貨的例子進行解釋。假設小明的飯量(即需求)是一個固定的值,用來盛飯的勺子的大小即bs塊大小,而用勺子盛飯的次數即count塊個數。小明要想吃飽(滿足需求),則需要在勺子大小(bs塊大小)與用勺子盛飯的次數(count塊個數)之間進行平衡。勺子越大,用勺子盛飯的次數就越少。由上可見,bs與count都是用來指定容量的大小,只要能滿足需求,可隨意組合搭配方式。

7.file命令

file命令用于查看文件的類型,格式為“file 文件名”。

在Linux系統中,由于文本、目錄、設備等所有這些一切都統稱為文件,而我們又不能單憑后綴就知道具體的文件類型,這時就需要使用file命令來查看文件類型了。

[[email protected] ~]# file anaconda-ks.cfg 
anaconda-ks.cfg: ASCII text
[[email protected] ~]# file /dev/sda
/dev/sda: block special

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

2.8 打包壓縮與搜索命令

在網絡上,人們越來越傾向于傳輸壓縮格式的文件,原因是壓縮文件體積小,在網速相同的情況下,傳輸時間短。下面將學習如何在Linux系統中對文件進行打包壓縮與解壓,以及讓用戶基于關鍵詞在文本文件中搜索相匹配的信息、在整個文件系統中基于指定的名稱或屬性搜索特定文件。本節雖然只有3條命令,但是其功能都比較復雜而且參數很多,因此放到了本章最后講解。

1.tar命令

tar命令用于對文件進行打包壓縮或解壓,格式為“tar [選項] [文件]”。

在Linux系統中,常見的文件格式比較多,其中主要使用的是.tar或.tar.gz或.tar.bz2格式,我們不用擔心格式太多而記不住,其實這些格式大部分都是由tar命令來生成的。劉遄老師將講解最重要的幾個參數,以方便大家理解。tar命令的參數及其作用如表2-14所示。

表2-14?????????????????????????????????????????????? tar命令的參數及其作用

參數 作用
-c 創建壓縮文件
-x 解開壓縮文件
-t 查看壓縮包內有哪些文件
-z 用Gzip壓縮或解壓
-j 用bzip2壓縮或解壓
-v 顯示壓縮或解壓的過程
-f 目標文件名
-p 保留原始的權限與屬性
-P 使用絕對路徑來壓縮
-C 指定解壓到的目錄

首先,-c參數用于創建壓縮文件,-x參數用于解壓文件,因此這兩個參數不能同時使用。其次,-z參數指定使用Gzip格式來壓縮或解壓文件,-j參數指定使用bzip2格式來壓縮或解壓文件。用戶使用時則是根據文件的后綴來決定應使用何種格式參數進行解壓。在執行某些壓縮或解壓操作時,可能需要花費數個小時,如果屏幕一直沒有輸出,您一方面不好判斷打包的進度情況,另一方面也會懷疑電腦死機了,因此非常推薦使用-v參數向用戶不斷顯示壓縮或解壓的過程。-C參數用于指定要解壓到哪個指定的目錄。-f參數特別重要,它必須放到參數的最后一位,代表要壓縮或解壓的軟件包名稱。劉遄老師一般使用“tar -czvf 壓縮包名稱.tar.gz 要打包的目錄”命令把指定的文件進行打包壓縮;相應的解壓命令為“tar -xzvf 壓縮包名稱.tar.gz”。下面我們來逐個演示下打包壓縮與解壓的操作。先使用tar命令把/etc目錄通過gzip格式進行打包壓縮,并把文件命名為etc.tar.gz:

[[email protected] ~]# tar czvf etc.tar.gz /etc
tar: Removing leading `/' from member names
/etc/
/etc/fstab
/etc/crypttab
/etc/mtab
/etc/fonts/
/etc/fonts/conf.d/
/etc/fonts/conf.d/65-0-madan.conf
/etc/fonts/conf.d/59-liberation-sans.conf
/etc/fonts/conf.d/90-ttf-arphic-uming-embolden.conf
/etc/fonts/conf.d/59-liberation-mono.conf
/etc/fonts/conf.d/66-sil-nuosu.conf
………………省略部分壓縮過程信息………………

接下來將打包后的壓縮包文件指定解壓到/root/etc目錄中(先使用mkdir命令來創建/root/etc目錄):

[[email protected] ~]# mkdir /root/etc
[[email protected] ~]# tar xzvf etc.tar.gz -C /root/etc
etc/
etc/fstab
etc/crypttab
etc/mtab
etc/fonts/
etc/fonts/conf.d/
etc/fonts/conf.d/65-0-madan.conf
etc/fonts/conf.d/59-liberation-sans.conf
etc/fonts/conf.d/90-ttf-arphic-uming-embolden.conf
etc/fonts/conf.d/59-liberation-mono.conf
etc/fonts/conf.d/66-sil-nuosu.conf
etc/fonts/conf.d/65-1-vlgothic-gothic.conf
etc/fonts/conf.d/65-0-lohit-bengali.conf
etc/fonts/conf.d/20-unhint-small-dejavu-sans.conf
………………省略部分解壓過程信息………………

2.grep命令

grep命令用于在文本中執行關鍵詞搜索,并顯示匹配的結果,格式為“grep [選項] [文件]”。grep命令的參數及其作用如表2-15所示。

表2-15????????????????????????????????????????????? grep命令的參數及其作用

參數 作用
-b 將可執行文件(binary)當作文本文件(text)來搜索
-c 僅顯示找到的行數
-i 忽略大小寫
-n 顯示行號
-v 反向選擇——僅列出沒有“關鍵詞”的行。

grep命令是用途最廣泛的文本搜索匹配工具,雖然有很多參數,但是大多數基本上都用不到。劉遄老師在總結了近10年的運維工作和培訓教學的經驗后,提出的本書的寫作理念“去掉不實用”絕對不是信口開河。如果一名IT培訓講師的水平只能停留在“技術的搬運工”層面,而不能對優質技術知識進行提煉總結,那對他的學生來講絕非好事。我們在這里只講兩個最最常用的參數:-n參數用來顯示搜索到信息的行號;-v參數用于反選信息(即沒有包含關鍵詞的所有信息行)。這兩個參數幾乎能完成您日后80%的工作需要,至于其他上百個參數,即使以后在工作期間遇到了,再使用man grep命令查詢也來得及。

在Linux系統中,/etc/passwd文件是保存著所有的用戶信息,而一旦用戶的登錄終端被設置成/sbin/nologin,則不再允許登錄系統,因此可以使用grep命令來查找出當前系統中不允許登錄系統的所有用戶信息:

[[email protected] ~]# grep /sbin/nologin /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
………………省略部分輸出過程信息………………

3.find命令

find命令用于按照指定條件來查找文件,格式為“find [查找路徑] 尋找條件 操作”。

本書中曾經多次提到“Linux系統中的一切都是文件”,接下來就要見證這句話的分量了。在Linux系統中,搜索工作一般都是通過find命令來完成的,它可以使用不同的文件特性作為尋找條件(如文件名、大小、修改時間、權限等信息),一旦匹配成功則默認將信息顯示到屏幕上。find命令的參數以及作用如表2-16所示。

表2-16???????????????????????????????????????????? find命令中的參數以及作用

參數 作用
-name 匹配名稱
-perm 匹配權限(mode為完全匹配,-mode為包含即可)
-user 匹配所有者
-group 匹配所有組
-mtime -n +n 匹配修改內容的時間(-n指n天以內,+n指n天以前)
-atime -n +n 匹配訪問文件的時間(-n指n天以內,+n指n天以前)
-ctime -n +n 匹配修改文件權限的時間(-n指n天以內,+n指n天以前)
-nouser 匹配無所有者的文件
-nogroup 匹配無所有組的文件
-newer f1 !f2 匹配比文件f1新但比f2舊的文件
--type b/d/c/p/l/f 匹配文件類型(后面的字幕字母依次表示塊設備、目錄、字符設備、管道、鏈接文件、文本文件)
-size 匹配文件的大小(+50KB為查找超過50KB的文件,而-50KB為查找小于50KB的文件)
-prune 忽略某個目錄
-exec …… {}\; 后面可跟用于進一步處理搜索結果的命令(下文會有演示)

這里需要重點講解一下-exec參數重要的作用。這個參數用于把find命令搜索到的結果交由緊隨其后的命令作進一步處理,它十分類似于第3章將要講解的管道符技術,并且由于find命令對參數的特殊要求,因此雖然exec是長格式形式,但依然只需要一個減號(-)。

根據文件系統層次標準(Filesystem Hierarchy Standard)協議,Linux系統中的配置文件會保存到/etc目錄中(詳見第6章)。如果要想獲取到該目錄中所有以host開頭的文件列表,可以執行如下命令:

[[email protected] ~]# find /etc -name "host*" -print
/etc/avahi/hosts
/etc/host.conf
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny
/etc/selinux/targeted/modules/active/modules/hostname.pp
/etc/hostname

如果要在整個系統中搜索權限中包括SUID權限的所有文件(詳見第5章),只需使用-4000即可:

[[email protected] ~]# find / -perm -4000 -print
/usr/bin/fusermount
/usr/bin/su
/usr/bin/umount
/usr/bin/passwd
/usr/sbin/userhelper
/usr/sbin/usernetctl
………………省略部分輸出信息………………

進階實驗:在整個文件系統中找出所有歸屬于linuxprobe用戶的文件并復制到/root/findresults目錄。

該實驗的重點是“-exec {}?? \;”參數,其中的{}表示find命令搜索出的每一個文件,并且命令的結尾必須是“\;”。完成該實驗的具體命令如下:

[[email protected]?~]#?find?/?-user?linuxprobe?-exec?cp?-a?{}?/root/findresults/?\;

在本章最后,劉遄老師再多提幾句:很多讀者初次接觸到本書時都擔心因為自己的英語基礎不好而導致學不會Linux系統,其實大可不必擔心,因為我們的圖書、培訓課程甚至紅帽考題都是中文的。而在學習完本章后您也一定發現了,我們以后要使用的是Linux命令,而絕不是純粹的英語單詞,即便它們的拼寫100%相同,最終用處肯定也是不一樣的。因此就學習Linux系統技術來講,您跟英語達人絕對都是站在同一起跑線上的,更何況還正確地選擇了一本適合您的Linux教材。休息一下,然后開始學習第3章吧!

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

1.在RHEL 7系統及眾多的Linux系統中,最常使用的Shell終端是什么?

答:Bash(Bourne-Again SHell)解釋器。

2.執行Linux系統命令時,添加參數的目的是什么?

答:為了讓Linux系統命令能夠更貼合用戶的實際需求進行工作。

3.Linux系統命令、命令參數及命令對象之間,普遍應該使用什么來間隔?

答:應該使用一個或多個空格進行間隔。

4.請寫出用echo命令把SHELL變量值輸出到屏幕終端的命令。

答:echo $SHELL。

5.簡述Linux系統中5種進程的名稱及含義。

答:在Linux系統中,有下面5種進程名稱。

R(運行):進程正在運行或在運行隊列中等待。

S(中斷):進程處于休眠中,當某個條件形成后或者接收到信號時,則脫離該狀態。

D(不可中斷):進程不響應系統異步信號,即便用kill命令也不能將其中斷。

Z(僵死):進程已經終止,但進程描述符依然存在, 直到父進程調用wait4()系統函數后將進程釋放。

T(停止):進程收到停止信號后停止運行。

6.請嘗試使用Linux系統命令關閉PID為5529的服務進程。

答:執行kill 5529命令即可;若知道服務的名稱,則可以使用killall命令進行關閉。

7.使用ifconfig命令查看網絡狀態信息時,需要重點查看的4項信息分別是什么?

答:這4項重要信息分別是網卡名稱、IP地址、網卡物理地址以及RX/TX的收發流量數據大小。

8.使用uptime命令查看系統負載時,對應的負載數值如果是0.91、0.56、0.32,那么最近15分鐘內負載壓力最大的是哪個時間段?

答:通過負載數值可以看出,最近1分鐘內的負載壓力是最大的。

9.使用history命令查看歷史命令的執行記錄時,命令前面的數字除了排序外還有什么用處?

答:還可以用“!數字”的命令格式重復執行某一次的命令記錄,從而避免了重復輸入較長命令的麻煩。

10.若想查看的文件具有較長的內容,那么使用cat、more、head、tail中的哪個命令最合適?

答:文件內容較長,使用more命令;反之使用cat命令。

11.在使用mkdir命令創建有嵌套關系的目錄時,應該加上什么參數呢?

?答:應該加上-p遞歸迭代參數,從而自動化創建有嵌套關系的目錄。

12.在使用rm命令刪除文件或目錄時,可使用哪個參數來避免二次確認呢?

?答:可使用-f參數,這樣即可無需二次確認。

13.若有一個名為backup.tar.gz的壓縮包文件,那么解壓的命令應該是什么?

?答:應該用tar命令進行解壓,執行tar -xzvf backup.tar.gz命令即可。

14.使用grep命令對某個文件進行關鍵詞搜索時,若想要進行文件內容反選,應使用什么參數?

答:可使用-v參數來進行匹配內容的反向選擇,即顯示出不包含某個關鍵詞的行。

本文原創地址:http://www.52437949.com/chapter-02.html編輯:劉遄,審核員:暫無