看完這篇你一定能掌握Linux(非廣告)
有很多同學微信問我,Linux命令這么多,該怎么從入門到精通?其實,這個事情非常的simple,這篇文章將會帶你飛。文章非常的長,要挑一個陽光明媚的sunshine weekend,耐心去搞定。

本文將由一個Linux命令概覽開始,說明Linux命令的方方面面。如果你讀完這部分還是一頭霧水,那么就證明需要按照下面的小白教程去學習了,內(nèi)容涵蓋了:如何挑選Linux發(fā)行版、如何安裝Linux系統(tǒng),按照主題學習Linux系統(tǒng)的命令等。
入門后的 **學習方式:多敲多打,用條件反射替代大腦記憶--如果你將來或者現(xiàn)在要用它來吃飯的話。**其中,也有一些難啃的骨頭,關注小姐姐味道微信公眾號,我們一起用鋒利的牙齒,來把它嚼碎。
1. Linux命令概覽
這部分是給稍微有點Linux經(jīng)驗的同學準備的,如果你是初學者,請?zhí)^此part直接進入第二部分。

1.1目錄操作
工作中,最常打交道的就是對目錄和文件的操作。linux提供了相應的命令去操作他,并將這些命令抽象、縮寫。
1.1.1 基本操作
可能是這些命令太常用了,多打一個字符都是罪過。所以它們都很短,不用阿拉伯數(shù)字,一個剪刀手就能數(shù)過來。

看命令。
mkdir?創(chuàng)建目錄 ?make dircp?拷貝文件 ?copymv?移動文件 ? moverm??刪除文件 remove
例子:
#?創(chuàng)建目錄和父目錄a,b,c,d
mkdir?-p?a/b/c/d
#?拷貝文件夾a到/tmp目錄
cp?-rvf?a/?/tmp/
#?移動文件a到/tmp目錄,并重命名為b
mv?-vf?a?/tmp/b
#?刪除機器上的所有文件
rm?-rvf?/
1.1.2 漫游
linux上是黑漆漆的命令行,依然要面臨人生三問:我是誰?我在哪?我要去何方?
ls??命令能夠看到當前目錄的所有內(nèi)容。ls -l能夠看到更多信息,判斷你是誰。pwd??命令能夠看到當前終端所在的目錄。告訴你你在哪。cd??假如你去錯了地方,cd命令能夠切換到對的目錄。find? find命令通過篩選一些條件,能夠找到已經(jīng)被遺忘的文件。
至于要去何方,可能就是主宰者的意志了。
1.2 文本處理
這是是非常非常加分的技能。get到之后,也能節(jié)省更多時間來研究面向?qū)ο?。小姐姐味道已?jīng)輸出了“最常用的vim、sed、awk技巧系列”。

1.2.1 查看文件
cat
最常用的就是cat命令了,注意,如果文件很大的話,cat命令的輸出結(jié)果會瘋狂在終端上輸出,可以多次按ctrl+c終止。
#?查看文件大小
du?-h?file
#?查看文件內(nèi)容
cat?file
less
既然cat有這個問題,針對比較大的文件,我們就可以使用less命令打開某個文件。類似vim,less可以在輸入/后進入查找模式,然后按n(N)向下(上)查找。
有許多操作,都和vim類似,你可以類比看下。
tail
大多數(shù)做服務端開發(fā)的同學,都了解這么命令。比如,查看nginx的滾動日志。
tail?-f?access.log
tail命令可以靜態(tài)的查看某個文件的最后n行,與之對應的,head命令查看文件頭n行。但head沒有滾動功能,就像尾巴是往外長的,不會反著往里長。
tail?-n100?access.log
head?-n100?access.log
1.2.1 統(tǒng)計
sort和uniq經(jīng)常配對使用。sort可以使用-t指定分隔符,使用-k指定要排序的列。
下面這個命令輸出nginx日志的ip和每個ip的pv,pv最高的前10
#?2019-06-26T10:01:57+08:00|nginx001.server.ops.pro.dc|100.116.222.80|10.31.150.232:41021|0.014|0.011|0.000|200|200|273|-|/visit|sign=91CD1988CE8B313B8A0454A4BBE930DF|-|-|http|POST|112.4.238.213
awk?-F"|"?'{print?$3}'?access.log?|?sort?|?uniq?-c?|?sort?-nk1?-r?|?head?-n10
1.2.3 其他
grep
grep用來對內(nèi)容進行過濾,帶上--color參數(shù),可以在支持的終端可以打印彩色,參數(shù)n則輸出具體的行數(shù),用來快速定位。
比如:查看nginx日志中的POST請求。
grep?-rn?--color?POST?access.log
推薦每次都使用這樣的參數(shù)。
如果我想要看某個異常前后相關的內(nèi)容,就可以使用ABC參數(shù)。它們是幾個單詞的縮寫,經(jīng)常被使用。A??after ?內(nèi)容后n行B??before ?內(nèi)容前n行C??count? ?內(nèi)容前后n行
就像是這樣:
grep?-rn?--color?Exception?-A10?-B2???error.log
diff
diff命令用來比較兩個文件是否的差異。當然,在ide中都提供了這個功能,diff只是命令行下的原始折衷。對了,diff和patch還是一些平臺源碼的打補丁方式,你要是不用,就pass吧。
1.3壓縮
為了減小傳輸文件的大小,一般都開啟壓縮。linux下常見的壓縮文件有tar、bzip2、zip、rar等,7z這種用的相對較少。

.tar??使用tar命令壓縮或解壓
.bz2?使用bzip2命令操作
.gz?使用gzip命令操作
.zip?使用unzip命令解壓
.rar?使用unrar命令解壓
最常用的就是.tar.gz文件格式了。其實是經(jīng)過了tar打包后,再使用gzip壓縮。
創(chuàng)建壓縮文件
tar?cvfz??archive.tar.gz?dir/
解壓
tar?xvfz.?archive.tar.gz
快去弄清楚它們的關系吧。
1.4 日常運維
開機是按一下啟動按鈕,關機總不至于是長按啟動按鈕吧。對了,是shutdown命令,不過一般也沒權(quán)限-.-!。passwd命令可以用來修改密碼,這個權(quán)限還是可以有的。

mount
mount命令可以掛在一些外接設備,比如u盤,比如iso,比如剛申請的ssd??梢苑判牡目葱‰娪傲恕?br>
mount?/dev/sdb1?/xiaodianying
chownchown?用來改變文件的所屬用戶和所屬組。chmod?用來改變文件的訪問權(quán)限。
這兩個命令,都和linux的文件權(quán)限777有關。
示例:
#?毀滅性的命令
chmod?000?-R?/
#?修改a目錄的用戶和組為?xjj
chown?-R?xjj:xjj?a
#?給a.sh文件增加執(zhí)行權(quán)限(這個太常用了)
chmod?a+x?a.sh
yum
假定你用的是centos,則包管理工具就是yum。如果你的系統(tǒng)沒有wget命令,就可以使用如下命令進行安裝。
yum?install?wget?-y
systemctl
當然,centos管理后臺服務也有一些套路。service命令就是。systemctl兼容了service命令,我們看一下怎么重啟mysql服務。?推薦用下面這個。
service?mysql?restart
systemctl?restart??mysqld?
對于普通的進程,就要使用kill命令進行更加詳細的控制了。kill命令有很多信號,如果你在用kill -9,你一定想要了解kill -15以及kill -3的區(qū)別和用途。
su
su用來切換用戶。比如你現(xiàn)在是root,想要用xjj用戶做一些勾當,就可以使用su切換。
su?xjj
su?-?xjj
-可以讓你干凈純潔的降臨另一個賬號,不出意外,推薦。
1.5 系統(tǒng)狀態(tài)概覽
登陸一臺linux機器,有些命令能夠幫助你快速找到問題。這些命令涵蓋內(nèi)存、cpu、網(wǎng)絡、io、磁盤等。

unameuname命令可以輸出當前的內(nèi)核信息,讓你了解到用的是什么機器。
uname?-a
ps
ps命令能夠看到進程/線程狀態(tài)。和top有些內(nèi)容重疊,常用。
#?找到java進程
ps?-ef|grep?java
top系統(tǒng)狀態(tài)一覽,主要查看。cpu load負載、cpu占用率。使用內(nèi)存或者cpu最高的一些進程。下面這個命令可以查看某個進程中的線程狀態(tài)。
top?-H?-p?pid
free
top也能看內(nèi)存,但不友好,free是專門用來查看內(nèi)存的。包括物理內(nèi)存和虛擬內(nèi)存swap。
df
df命令用來查看系統(tǒng)中磁盤的使用量,用來查看磁盤是否已經(jīng)到達上限。參數(shù)h可以以友好的方式進行展示。
df?-h
ifconfig
查看ip地址,不啰嗦,替代品是ip addr命令。
ping
至于網(wǎng)絡通不通,可以使用ping來探測。(不包括那些禁ping的網(wǎng)站)
netstat雖然ss命令可以替代netstat了,但現(xiàn)實中netstat仍然用的更廣泛一些。比如,查看當前的所有tcp連接。
netstat?-ant
此命令,在找一些本地起了什么端口之類的問題上,作用很大。
1.6 工作常用
還有一些在工作中經(jīng)常會用到的命令,它們的出現(xiàn)頻率是非常高的 ,都是些熟面孔。

export
很多安裝了jdk的同學找不到java命令,export就可以幫你辦到它。export用來設定一些環(huán)境變量,env命令能看到當前系統(tǒng)中所有的環(huán)境變量。比如,下面設置的就是jdk的。
export?PATH=$PATH:/home/xjj/jdk/bin
有時候,你想要知道所執(zhí)行命令的具體路徑。那么就可以使用whereis命令,我是假定了你裝了多個版本的jdk。
crontab
這就是linux本地的job工具。不是分布式的,你要不是運維,就不要用了。比如,每10分鐘提醒喝茶上廁所。
*/10?*?*?*?*?/home/xjj/wc10min
datedate命令用來輸出當前的系統(tǒng)時間,可以使用-s參數(shù)指定輸出格式。但設置時間涉及到設置硬件,所以有另外一個命令叫做hwclock。
xargsxargs讀取輸入源,然后逐行處理。這個命令非常有用。舉個栗子,刪除目錄中的所有class文件。
find?.?|?grep?.class$?|?xargs?rm?-rvf
#把所有的rmvb文件拷貝到目錄
ls?*.rmvb?|?xargs?-n1?-i?cp?{}?/mount/xiaodianying
1.7 網(wǎng)絡
linux是一個多作業(yè)的網(wǎng)絡操作系統(tǒng),所以網(wǎng)絡命令有很多很多。工作中,最常和這些打交道。
ssh
這個,就不啰嗦了。你一定希望了解ssh隧道是什么。你要是想要詳細的輸出過程,記得加參數(shù)-v。
scp
scp用來進行文件傳輸。也可以用來傳輸目錄。也有更高級的sftp命令。
scp?a.txt?192.168.0.12:/tmp/a.txt
scp?-r?a_dir?192.168.0.12:/tmp/
wget
你想要在服務器上安裝jdk,不會先在本地下載下來,然后使用scp傳到服務器上吧(有時候不得不這樣)。wget命令可以讓你直接使用命令行下載文件,并支持斷點續(xù)傳。
wget?-c?http://oracle.fuck/jdk2019.bin
mysql
mysql應用廣泛,并不是每個人都有條件用上navicat的。你需要了解mysql的連接方式和基本的操作,在異常情況下才能游刃有余。
mysql?-u?root?-p?-h?192.168.1.2
不要覺得復雜,命令是有限的,但激情無限;都會也不要驕傲,一個vim就夠折騰一輩子。捷徑就是總結(jié),深入只有探索。白馬過隙,終會行云流水,手到擒來。
物是人非,年華易老。唯有時光,不會辜負。
2. 挑選一個Linux發(fā)行版
和Linux比較像的還有Unix,但如果你是一個二三十歲的小青年,你接觸到可能只有Linux的世界了。從手機,到服務器上廣泛使用的centos,到漂亮的桌面發(fā)行版ubuntu,甚至是風靡全球的樹莓派,到處都是linux的身影。
2.1 你需要知道這些linux歷史
知道一點相關操作系統(tǒng)的歷史,是能夠陶冶情操的。GNU/Linux是為了抵制一些商業(yè)公司的壟斷行為而發(fā)展起來的,凝結(jié)了一代互聯(lián)網(wǎng)人向往自由的心血。
和其他Unix比起來,Linux其實很年輕。直到1991年,一個叫Linus Torvalds的芬蘭年輕人才開始開發(fā)我們現(xiàn)在所知道的Linux內(nèi)核。
Linux的吉祥物是企鵝,這個吉祥物直到1996年才確定,所以你會經(jīng)??吹揭恍└阈Φ膱D片。如果你是90后,那這只小企鵝幾乎和你一般大,還是個年輕的小伙。

Linux的發(fā)展歷程比較的復雜。經(jīng)過一次次的過關斬將,Linux走到今天確屬不易。關于其發(fā)展歷史,你可以通過下面的鏈接,查看高清圖片。20年的時間,對軟件行業(yè)來說,是一段非常漫長的時光,有多少的風光已經(jīng)物是人非。

高清見圖片(http://1t.click/aUnx) ??梢钥吹剑琹inux只占了那可憐的一小塊。這就像人類的出現(xiàn),在生命的長河中,微不足道,但卻是一個質(zhì)的飛躍。
你可能注意到,在前面的描述中,說的是GUN/Linux,而不僅僅是Linux。Linux本身只是一個內(nèi)核,作用有限,只有和GNU聯(lián)合起來,擁有完整的生態(tài)才會發(fā)揮它的作用。
談到上面區(qū)別的原因,是為了記住Richard Stallman在1983年發(fā)起的GNU計劃。他同時是smalltalk語言的發(fā)明者,被公認的第二個面向?qū)ο蟮恼Z言。我在早些年,還研究過一段時間。哦,他還編寫了一個巨無霸編輯器,Emacs。
只有一個人被捧成神,他才會有能量折磨你。
針對于Linux歷史,我們不做過多介紹。下面介紹幾個經(jīng)典的發(fā)行版本。
2.2 精選版本介紹
現(xiàn)在的Linux發(fā)行版本,已經(jīng)有上千個,你要是喜歡、而且多金,你也可以做一個。如何在這其中,找到最合適的版本,是需要經(jīng)過一番折騰的。很多發(fā)行版本,其實是很小眾的。
這不像是哲學領域的某些東西,真理掌握在少數(shù)人手中。只有獲得良好發(fā)展,并得到認可的Linux發(fā)行版,才有它的價值,可以說是徹頭徹尾的實用主義。
但這東西又像女朋友,剛開始感覺風采迥異,各有千秋,到最后了解到是一樣的庸俗不堪。但有人就是喜歡Linux相關的工作,一干就是一輩子...
我可以先說一下自己的歷程。剛開始,接觸的是紅帽redhat,當時還沒有分什么企業(yè)版。用了一段時間以后,又切換成更穩(wěn)定的slackware。但是slackware上的程序更新實在太慢了,于是又切換成readhat血統(tǒng)的fedora,這個版本的軟件保鮮度很高。其間,又嘗試了其他幾個linux版本,最終,在2013年前后,換成了滾動升級的archlinux,直到現(xiàn)在。
要我個人做個推薦的話:
1、個人用戶(技術(shù)),桌面版用ubuntu=>archlinux。
2、企業(yè)用戶,服務器,使用centos。
2.3 主要起源
這么多Linux版本,其實有兩條主線。debian系列和redhat系列。很多發(fā)行版本,其實是二次翻新,很多就直接拿這兩個基礎系列進行改造。正所謂:操作系統(tǒng)千千萬,都是帽子和大便。
debian
下面這個屎一樣的圖表,就是debian。呃呃呃,和大便只差一個字母。

Debian計劃是一個致力于創(chuàng)建一個自由操作系統(tǒng)的合作組織。它的特點是:穩(wěn)定、安全,到現(xiàn)在為止,已經(jīng)發(fā)展了20多年了。我們所熟悉的ubuntu,就是基于debian改進的。
redhat

紅帽是一家商業(yè)公司,涉足Linux比較早,現(xiàn)在對個人提供一些紅帽認證之類的證書?,F(xiàn)在云主機使用較多的centos,包括紅帽公司的RHEL,占據(jù)了大部分服務器市場。近期,centos 8推出了centos stream滾動版本,看起來更像是一個正常的操作系統(tǒng)。
2.4 典型版本
我們看一下處于不同層次的幾個典型版本。從應用方面來說,linux有桌面、服務器、研究用等用途。
2.4.1、ubuntu

ubuntu的出現(xiàn),對Linux的推廣有不可磨滅的貢獻。它是一個易于安裝的桌面版本(也有服務器版本),界面非常漂亮。ubuntu是基于debian系統(tǒng)的unstable分支修改的,包管理軟件是apt-get。
它的創(chuàng)建者是Mark Shuttleworth,南非企業(yè)家,世界上第二名自資的太空游客。我想,無論是太空還是ubuntu,這都是夢想吧。
2.4.2、centos

centos是目前最流行的服務器版本。它是RHEL源代碼再編譯的產(chǎn)物,主要是為了繞開一些法律問題。在包管理,甚至穩(wěn)定性上,與紅帽企業(yè)版沒什么差別。
2.4.3、archlinux

archlinux采用滾動升級的模式進行發(fā)行,盡全力提供最新的穩(wěn)定版本。剛開始安裝,arch只提供一個基本的系統(tǒng),甚至連界面都沒有,對初學者不是很友好。
但是,archlinux是非常干凈的系統(tǒng)。很多軟件,只有你需要的時候才會安裝。它的軟件和理念通常都是最新的,定制化非常強,深得許多Linux愛好者的喜愛。
2.4.4、gentoo

上面的archlinux,提供了編譯后的軟件包。用戶在安裝軟件時,只需要下載、解壓即可。gentoo將這個過程更近一步,可以說更加的變態(tài)。它下載的是軟件的源代碼,然后在本地進行編譯,然后安裝。
這通常非常的蛋疼,因為下載、編譯會花費非常長的時間,但它有一個非常大的優(yōu)點,就是穩(wěn)定。
這個系統(tǒng)比較底層,對技能要求更多,不太推薦。
2.4.5 、LFS

LFS的全拼是“l(fā)inux from scratch”,意思是從零構(gòu)建一個linux系統(tǒng)。它有一個非常詳細的安裝文檔,教你怎樣編譯內(nèi)核,編譯引導程序,編譯和配置必要的軟件。
這是一個瘋狂而必要的過程。如果你想要自己的Linux之上更上層樓,跟著文檔做一遍是受益無窮的。你需要經(jīng)過多次交叉編譯,最終使用chroot命令切換到新系統(tǒng)進行后續(xù)操作。
想做一個自己的發(fā)行版么?從這開始吧。
2.4.6、kali

kali linux是一個非常專業(yè)的發(fā)行版。如果你在做滲透方面的工作,將是一個非常好的選擇。
發(fā)行版的安裝包非常大,包含了常見的破解工具,滲透工具,攻擊工具。這非常的危險,我曾用它暴力破解了非常多的wifi密碼,成功的窺視了鄰居的隱私。還是非常好用的。
3. 安裝一個清爽的Linux系統(tǒng)
工欲善其事,必先利其器。你可能會想到買一臺云主機練練手,但那畢竟要花點銀子,我們可以自己安裝一個。我們在上面提到,目前使用最廣泛的,就是centos。不論你是自建機房,還是使用類似于阿里云這樣的云端環(huán)境,大多數(shù)都會提供centos的安裝。
你可能會找到多種安裝虛擬機的方式。本小節(jié),將使用虛擬雙網(wǎng)卡的方式,準備一個純潔的環(huán)境。這一小節(jié),圖片很多。
以阿里云為例,默認第一位就是CentOS,提供了從7.6版本到舊版本的多個鏡像。

3.1 下載
下面的文章,我們就以CentOS 7穩(wěn)定版本為基礎環(huán)境。centos很流行,所以鏡像也有很多。國內(nèi),我們從上海交大下載,速度應該會快一些。
http://ftp.sjtu.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
如果交大哪天不維護了。可以從這里找:
http://centos.mirror.ndchost.com/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
為了讓大家學到更多的知識,我們使用最小化的系統(tǒng)ISO。最小化的iso不到1GB,而預裝了很多軟件的dvd有4.3GB的大小。我們就用這個減肥版。
3.2 安裝Linux
要想快速學習、體驗Linux,最便捷的方式,就是使用虛擬機進行安裝。目前,最流行的虛擬機,一個是VMware,一個是VirtualBox。在MacOS上還有一個Parallels Desktop。
其中,VirtualBox免費而且跨平臺,能夠滿足我們的需求。接下來,將一步步引導你進行安裝。
(1) 點擊新建,開啟安裝旅程。

(2) 填寫名稱,版本。然后點擊繼續(xù)。

(3)按照你的機器配置,選擇內(nèi)存
我的機器是8GB內(nèi)存的,就分配給虛擬機2GB,這個已經(jīng)足夠用了。

(4) 創(chuàng)建一個虛擬磁盤

點擊繼續(xù)后,將彈出一個對話框。我們不用多管,一直點繼續(xù),知道對話框消失。這非常的粗暴。
(5) 接下來,點擊設置。

(6) 切換到Storage選項,選擇我們下載的iso

(7) 點擊啟動,開始安裝。

使用方向鍵切換,使得高亮聚焦在Install CentOS 7上。點擊確定,開始安裝。
(8) 彈出一個安裝界面
接下來的步驟有點多,如果我們沒有特別的介紹,那么直接continue就ok了。

(9) 接下來,配置磁盤分區(qū)

依然保持默認,并按按鈕Done退出。
(10) 配置用戶
linux上默認的用戶名為root。接下來我們設置root用戶的密碼為123456。由于這是一個弱密碼,所以需要點擊兩次確定退出。

(11) 等待安裝完畢,進行重啟

(12) 安裝成功

3.3 聯(lián)網(wǎng)
這個時候,我們安裝的虛擬機,還不能聯(lián)網(wǎng),無法把自己的意念傳達出去。由于我們沒有對虛擬機進行任何設置,所以使用的是默認的NAT模式。
將光標聚焦到命令行窗口,然后輸入命令dhclient。等待幾秒鐘,執(zhí)行ping baidu.com測試以下網(wǎng)絡,可以看到能夠正常訪問網(wǎng)絡了。

上面黑漆漆的窗口,就是我們現(xiàn)在的Linux界面。有人覺得很丑,就像是在玩dos,但像我這種不可救藥的人,卻覺得格外的親切。
接下來的命令,我們不會再截圖,而使用高亮的代碼塊表示。為了不至于讓人暈頭轉(zhuǎn)向,請先看下圖。

3.4 外部訪問虛擬機
由于NAT模式的特點,我們的虛擬機能夠訪問外網(wǎng),但無法被外部發(fā)現(xiàn)。酒香竟怕巷子深。為了解決這個問題,我們需要再添加一塊網(wǎng)卡。
在做這些更改之前,需要首先關閉虛擬機。可以強制關閉機器,也可以在命令行中輸入:
shutdown?-h?now
虛擬機關閉后,再次點擊設置,切換到網(wǎng)絡適配器選項卡。如圖,添加一個新的網(wǎng)絡適配器,適配器類型為Host-only Adapter。通過這塊網(wǎng)卡,我們的宿主機就能夠訪問它了。

再次啟動虛擬機,執(zhí)行dhclient命令后,執(zhí)行ip addr查看主機的ip地址??梢钥吹?,我們現(xiàn)在有兩塊網(wǎng)卡,兩個ip地址。
記錄下192打頭的網(wǎng)絡地址,我們會使用外部的程序,比如XShell、SecureCRT等,進行連接。比如,我這里的ip地址是:192.168.99.100。不廢話,看圖。

小提示:關于虛擬網(wǎng)卡的網(wǎng)段,如果有差異。你可以在全局設置里,改成和我一樣的。

3.5 遠程連接
你可能已經(jīng)體驗到,通過虛擬機自帶的命令行界面進行輸入,局限性非常大。通過遠程連接,可以把終端界面切換到我們熟悉的操作模式,如果能夠顯示彩色的終端,那再好不過了。下面介紹幾個工具,一般的,使用xshell的居多。
Windows
XShell?你可能在公司內(nèi),見過你的SRE同事,運指如飛,命令字符如流水一般撒過屏幕。即使非常繁雜,難以記憶的密碼,也能瞬間輸入。他可能用的就是xshell。SecureCRT?比較老的一款產(chǎn)品,使用也較多。MobaXterm?MobaXterm就是一單文件純綠色軟件,下載過來exe包直接運行即可,不需要任何的安裝過程。
它們都有免費版和專業(yè)版之分。無力購買的話,就找找破解版。但是注意,盜版漢化的ssh客戶端,有些別有用心的人會在軟件中植入木馬,竊取你的密碼、證書,這種情況已經(jīng)發(fā)生過很多次。
MacOS
對于macos用戶來說,簡單的很。直接使用iTerm,輸入命令行即可。比如使用下面的命令連接我們的機器。
[email protected]

Linux
唔,你都已經(jīng)是Linux環(huán)境了,還折騰個啥虛擬機呢?直接用吧。
推薦使用XShell、SecureCRT、iTerm等工具,通過ssh進行遠程連接。對于一些命令拷貝、驗證來說,要方便快捷的多。

4. 對Linux命令行有個初步了解
萬事開頭難。面對黑漆漆的Linux窗口,要勇敢的走出第一步。不要怕輸錯了什么,系統(tǒng)健壯的很。命令行通常會擁有比圖形界面更高的效率,更加重要的是它可以做自動化之類的小工具,這使得生產(chǎn)力產(chǎn)生質(zhì)的飛躍。
現(xiàn)在,你已經(jīng)安裝好了centos,并遠程連接上了它。我們擁有了它,但并不能了解它的脾氣。接下來,讓我們進入Linux命令行的世界。和我簽訂契約吧,少年。
本小節(jié)會使用非常詳細的演進方式,來看一下一個命令,是怎樣生成和執(zhí)行的。
4.1、簡單嘗試
好啦,我們現(xiàn)在就在終端里了。什么叫做終端呢?你在很多黑客電影里,看到的黑漆漆的界面就是,它提供了一個可以輸入字符串的交互式界面,至于那些閃光的、掃描機一樣的東西,是不存在的。
嘗試輸入些什么吧。?比如:jdsjf。
[root@localhost?~]#?jdsjf
-bash:?jdsjf:?command?not?found

我們再次把這張圖貼一下。怎么回事?命令的輸出翻譯成中文,就是“找不到命令”的意思。什么叫命令?就是我們上面隨便輸入的字符串jdsjf。
然后,我們看下提示中其他一些有用的東西。
↓↓↓↓↓↓
bash??代表的是我們所使用的shell,shell可以認為是一個解釋器,將我們的輸入解釋成一系列可執(zhí)行的指令?,F(xiàn)在的linux發(fā)行版,最流行的就是bash解釋器,幾乎每個都預裝了它。
命令找不到,證明我們的字符串bash解釋不了。但是,Linux上一些目錄里的文件,是可以被默認找到的,這些目錄的集合,就叫PATH?。PATH還是一個環(huán)境變量,我們可以通過命令查看它的尊容。
[root@localhost?~]#?echo?$PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
想要知道系統(tǒng)中有哪些命令,就可以看下上面這些文件夾中,都有哪些文件。文件非常非常之多,但是大部分我們不會接觸。所以,xjjdog才會寫這么個東西--聚焦那些最常用,最有用的命令,最常用的參數(shù),最有用的場景。
命令輸出后,還有一些額外的東西,比如[root@localhost ~],這部分叫做提示符,光標會一直跳動,等待你的輸入。這部分是可以定制的,甚至可以定制的十分漂亮。
4.2、Hello World
到現(xiàn)在為止,我們什么都沒得到。按照程序員的想法來說,就要實現(xiàn)一個hello world的程序。在終端shell里,這個過程變得簡單,遠比寫一個java程序簡單。
[root@localhost?~]#?echo?"Hello?World"
Hello?World
如上所示,echo的意思就是輸出一些內(nèi)容。后面的Hello World,就叫做參數(shù),它們之間以空格分隔,可以接受多個參數(shù)。
[root@localhost?~]#?echo?"Hello?World"?,?"Fuck?996"
Hello?World?,?Fuck?996
以上命令能夠正常運行,證明echo是我們的終端能夠認識的一個命令。那到底這個命令是在什么地方呢?可以使用whereis命令進行查找。
[root@localhost?~]#?whereis?echo
echo:?/usr/bin/echo?/usr/share/man/man1/echo.1.gz
命令顯示。我們的echo命令全路徑,是/usr/bin/echo,由于它處于PATH目錄中,所以能夠被識別到。
4.3、將命令加入PATH
接下來,我們把上面的命令,做成一個腳本。然后將這個腳本,放到PATH目錄中。不過先等等,我們要先給命令起個名字。
首先需要創(chuàng)建一個文件。在Linux上,創(chuàng)建文件使用touch命令。
[root@localhost?~]#?touch?jdsjf
命令執(zhí)行后,什么都沒發(fā)生,它只是創(chuàng)建了一個空文件。接下來,我們向其中添加一些內(nèi)容。
[root@localhost?~]#?echo?"echo?'Hello?World'"?>?jdsjf
注意符號>,它的意思是,將前面的輸出,重定向到后面的文件中。執(zhí)行完上面的命令,jdsjf?中的內(nèi)容,就變成了echo 'Hello World。
接下來,我們嘗試著去執(zhí)行剛才生成的命令。
[root@localhost?~]#?./jdsjf
-bash:?./jdsjf?:?Permission?denied
我們通過相對路徑的方式,來執(zhí)行剛剛生成的命令。結(jié)果,終端顯示我們并沒有這個命令的執(zhí)行權(quán)限。
其實,Linux在權(quán)限控制這一方面,非常的詳細。一個文件,有可讀、可寫、可執(zhí)行三種屬性。如果想要一個文件能夠執(zhí)行,需要給它添加執(zhí)行權(quán)限,這個過程是由命令chmod完成的。
[root@localhost?~]#?chmod?u+x?jdsjf
[root@localhost?~]#?./jdsjf
Hello?World
我們將在后面的章節(jié),來詳細介紹權(quán)限方面的知識。如上所示,命令已經(jīng)能正常輸出,接下來,我們把命令移動到PATH中的一個目錄。
[root@localhost?~]#?mv?jdsjf?/usr/local/bin/
[root@localhost?~]#?jdsjf
Hello?World
不需要加任何的相對路徑,現(xiàn)在,只需要輸入jdsjf,就可以正常輸出一串數(shù)字。我們成功的讓一個沒有任何意義的字符串,表達了它的想法。雖然我們依然是它的主宰。
你可以想一下下面這三個問題:
1、我可以自定義一個目錄,比如/root/mybin,把它加入到PATH么?
2、我可以省略上面的touch命令,直接使用重定向生成文件么?
3、除了放到PATH和相對路徑,還有沒有其他的命令執(zhí)行方式?

5. ?Linux漫游方式
想要了解linux的基本使用方法,就要了解一個基本的事實--linux系統(tǒng)中,一切皆文件。
不管是命令,還是文檔,甚至設備,目錄,套接字,在linux上對它們的操作都是一致對待的。許多開發(fā)驅(qū)動程序的小伙伴,會發(fā)現(xiàn)使用的一些函數(shù),和讀寫文件的沒什么兩樣(open、close、read、write、ioctl)。今天我們所說的基本操作,針對的就是普通文件和目錄,本小節(jié)將詳細解釋相關命令。

5.1、當前路徑

到現(xiàn)在為止,我們還不知道自己在系統(tǒng)的什么地方。在瀏覽器上,我們能夠通過導航欄上的url,了解到自己在互聯(lián)網(wǎng)上的具體坐標。相似的功能,是由pwd命令提供的,它能夠輸出當前的工作目錄。
pwd命令是非常非常常用的命令,尤其是在一些命令提示符設置不太友好的機器上。另外,它也經(jīng)常用在shell腳本中,用來判斷當前的運行目錄是否符合需求。
有很多線上事故,都是由于沒有確認當前目錄所引起的。比如rm -rf *這種危險的命令。在執(zhí)行一些高危命令時,隨時確認當前目錄,是個好的習慣。
[root@localhost?~]#?pwd
/root
我們使用root用戶默認登陸后,就停留在/root目錄中。Linux中的目錄層次,是通過/進行劃分的。
5.2、文件系統(tǒng)用戶標準
Linux的文件系統(tǒng),從一開始就有一個規(guī)范標準。它還有一個專有縮寫名詞,叫做FHS?(Filesystem Hierarchy Standard)。FHS經(jīng)過多年的演進,目錄結(jié)構(gòu)也越來越清晰。除了一些標準的要求,還有一些使用者之間的約定。
接下來,我們大體看一下linux上的默認目錄,對其有一個基本的感覺。
| 第1層 | 第二層 | 介紹 |
|---|---|---|
| /bin | 目錄/usr/bin的軟鏈接 | |
| /sbin | 目錄/usr/sbin的軟鏈接 | |
| /lib | 目錄/usr/lib的軟鏈接 | |
| /usr | /bin | 存放一些常用的命令 |
| /usr | /sbin | 存放一些管理員常用的命令 |
| /usr | /lib | 用來存放動態(tài)庫和一些模塊文件 |
| /sys | 內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)的可視化接口 | |
| /proc | 內(nèi)存映像 | |
| /run | 內(nèi)存映像 | |
| /boot | 存放引導程序,內(nèi)核相關文件 | |
| /dev | 存放一些設備文件,比如光盤 | |
| /etc | 用于存儲一些全局的、應用的配置文件 | |
| /var | 與/var/run一樣,存放的是系統(tǒng)運行時需要的文件,比如mysql的pid等 | |
| /tmp | 非常特殊的臨時文件夾,斷電丟失 | |
| /home | /** | 用戶目錄,比如我的目錄是/home/xjjdog |
| /root | root用戶的home目錄 |
home?平常,我們打交道最多的目錄,就集中在自己的用戶目錄,我們可以在里面做任何操作,比如我們現(xiàn)在root用戶的/root目錄。一些自己的資料,比如視頻、音頻、下載的文件,或者做測試用的一些數(shù)據(jù)資料,就可以自行在這些目錄下規(guī)劃。root用戶比較特殊,普通用戶的私人目錄都是在/home下的。/etc?etc目錄是經(jīng)常要打交道的目錄,存放了一些全局的系統(tǒng)配置文件和應用配置文件。比如你安裝了php,或者nginx,它們的配置文件就躺在/etc目錄下的某個文件夾里。/var?var目錄存放一些運行中的數(shù)據(jù),有必須的,也有非必須的。一些黑客入侵之后,會在這里面的某些文件中留下痕跡,他們會著重進行清理。var目錄還是一些應用程序的默認數(shù)據(jù)存放之地,比如mysql的數(shù)據(jù)文件。/tmp?目錄是一個特殊的臨時目錄,文件在斷電以后就消失了。但這個目錄,所有的用戶,都有寫入權(quán)限,通常用來做文件交換用。/proc和/sys目錄,是兩個神奇的目錄。它們兩個是一種偽文件系統(tǒng),可以通過修改其中一些文件的狀態(tài)和內(nèi)容,來控制程序的行為(修改后會直接刷到內(nèi)存上,太酷了)。剛開始的時候,只有proc目錄,由于里面內(nèi)容有多又亂,后面又規(guī)劃出sys目錄,用來控制內(nèi)核的一些行為。如果你在調(diào)優(yōu)一些系統(tǒng)參數(shù),和這些文件打交道的時間比較多。還有幾個空的目錄,我們沒有列在上面的表格上。比如
/srv目錄,通常會把一些web服務的資料,比如nginx的,放在這里面。但是,這并不是強制要求的,所以我見過的/srv目錄,通常會一直是空的。同樣的,/opt目錄也是這樣一個存在,你就當它不存在就行。這都屬于使用者規(guī)劃的范疇,自定義性非常強。在使用Linux系統(tǒng)的時候,也可以創(chuàng)建自己的目錄。比如,我就喜歡自己創(chuàng)建一個叫做
/data的目錄,用來存放一些數(shù)據(jù)庫相關的內(nèi)容。舉個例子,/data/mysql存放mariadb的數(shù)據(jù),而/data/es/存放elasticsearch的索引內(nèi)容。
linux上的文件類型有很多,它們大部分都分門別類的存放在相應的目錄中,比如/dev目錄下,就是一些設備文件;/bin文件下,是一些可以執(zhí)行命令。通常都好記的很。
5.3、查看文件列表
所以,上面的表格內(nèi)容,我是怎么看到的呢,靠記憶么?ls命令,能夠列出相關目錄的文件信息??梢员辉u為linux下最勤勞的命令標兵。

現(xiàn)在的終端,都能夠輸出彩色的信息,非常的直觀。
oh-my-zsh和oh-my-bash等項目,可以讓你的終端更加的漂亮。把它加入到你的研究清單里吧。
[root@localhost?/]#?ls?/
#?注意:ls可以接受路徑參數(shù),你不用先跳轉(zhuǎn),就可以輸出相關信息
bin??boot??dev??etc??home??lib??lib64??media??mnt??opt??proc??root??run??sbin??srv??sys??tmp??usr??var
[root@localhost?/]#?ls?-l?/
#?帶上?-l參數(shù),可以查看一些更加詳細的信息。
total?20
lrwxrwxrwx.???1?root?root????7?Nov??3?20:24?bin?->?usr/bin
dr-xr-xr-x.???5?root?root?4096?Nov??3?20:34?boot
drwxr-xr-x.??19?root?root?3080?Nov??3?21:19?dev
drwxr-xr-x.??74?root?root?8192?Nov??3?20:34?etc
drwxr-xr-x.???2?root?root????6?Apr?11??2018?home
lrwxrwxrwx.???1?root?root????7?Nov??3?20:24?lib?->?usr/lib
lrwxrwxrwx.???1?root?root????9?Nov??3?20:24?lib64?->?usr/lib64
drwxr-xr-x.???2?root?root????6?Apr?11??2018?media
drwxr-xr-x.???2?root?root????6?Apr?11??2018?mnt
drwxr-xr-x.???2?root?root????6?Apr?11??2018?opt
dr-xr-xr-x.?108?root?root????0?Nov??3?21:19?proc
dr-xr-x---.???2?root?root??135?Nov??4?07:53?root
drwxr-xr-x.??24?root?root??740?Nov??3?21:20?run
lrwxrwxrwx.???1?root?root????8?Nov??3?20:24?sbin?->?usr/sbin
drwxr-xr-x.???2?root?root????6?Apr?11??2018?srv
dr-xr-xr-x.??13?root?root????0?Nov??3?21:19?sys
drwxrwxrwt.???9?root?root?4096?Nov??4?03:40?tmp
drwxr-xr-x.??13?root?root??155?Nov??3?20:24?usr
drwxr-xr-x.??19?root?root??267?Nov??3?20:34?var
ls最常用的,就是加參數(shù)l或者參數(shù)a。
5.3.1、詳細信息

加上參數(shù)l,能夠看到文件的一些權(quán)限信息已經(jīng)更新日期等。但我們還看到了一些更有意思的東西。比如:
lib?->?usr/lib
上面表示的,是軟鏈接信息。
就如同我們上面表格所展示的一樣,lib目錄,是/usr/lib的快捷方式,它們之中的內(nèi)容,沒有什么兩樣。
關于ls -l展示的更加詳細的內(nèi)容,可以參照我下面的這張圖。我們將在了解后面小節(jié)的內(nèi)容后,再次對這張圖進行回顧。

5.3.2 隱藏文件
直接在你的/root目錄里,執(zhí)行ls -al,你會看到更多東西。這些額外的隱藏文件,都是以.開頭,以配置文件居多。這就是參數(shù)a的作用。
[root@localhost?~]#?ls?-al
total?28
dr-xr-x---.??2?root?root??135?Nov??4?07:53?.
dr-xr-xr-x.?17?root?root??224?Nov??3?20:28?..
-rw-------.??1?root?root?1273?Nov??3?20:28?anaconda-ks.cfg
-rw-------.??1?root?root??246?Nov??4?11:41?.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
-rw-r--r--.??1?root?root??100?Dec?28??2013?.cshrc
-rw-r--r--.??1?root?root??129?Dec?28??2013?.tcshrc
細心的同學,應該會注意到兩個特殊的目錄。.和..。前者表示的是當前目錄,而后者表示的是上層目錄。
使用cd命令,將在這些目錄中,自由穿梭。
小技巧:如果你對英文日期閱讀困難,可以使用
ls -al --full-time查看可讀的日期。
5.4、切換目錄

執(zhí)行cd命令,可以將工作目錄切換到目標文件夾。為了展示cd命令的效果。請在root用戶下,執(zhí)行下面的命令,這將創(chuàng)建一個7層的目錄。
cd
mkdir?-p?a1/b2/c3/d4/e5/f6/{g7,g8,g9,g10}
我們使用cd命令,切換到最后一層。然后,我們使用..切換到上層目錄。
[root@localhost?~]#?cd?a1/b2/c3/d4/e5/f6/g7
[root@localhost?g7]#?pwd
/root/a1/b2/c3/d4/e5/f6/g7
[root@localhost?g7]#?cd?..
[root@localhost?f6]#?pwd
/root/a1/b2/c3/d4/e5/f6
所以,切換到上面n層目錄,只需使用多層級的../即可。有幾個特殊的變量,需要說明一下。
../?指的是上層目錄../../?指的是上兩層目錄./?指的是當前目錄~?指的是當前的用戶目錄,這是一個縮寫符號-?使用它,可以在最近兩次的目錄中來回切換
我們來使用命令把上面這些特殊變量驗證一下。
#?跳轉(zhuǎn)到用戶根目錄
[root@localhost?tmp]#?cd?~
[root@localhost?~]#?pwd
/root
#?進入到第三層目錄
[root@localhost?~]#?cd?a1/b2/c3/
[root@localhost?c3]#?pwd
/root/a1/b2/c3
#?跳回到前三層目錄
[root@localhost?c3]#?cd?../../..
[root@localhost?~]#?pwd
/root
#?跳到上次訪問的目錄
[root@localhost?~]#?cd?-
/root/a1/b2/c3
[root@localhost?c3]#?pwd
/root/a1/b2/c3
#?進入當前目錄:等于什么都沒干
[root@localhost?c3]#?cd?./
[root@localhost?c3]#?pwd
/root/a1/b2/c3
以上就是cd命令的常用用法?,F(xiàn)在,我們返回頭來看一下mkdir。顧名思義,就是創(chuàng)建目錄的意思,但一般在工作中,都會加上-p參數(shù),這樣就可以一次性創(chuàng)建多層目錄。注意mkdir后面的大括號{},可以一次性的指定多個目錄進行創(chuàng)建,這通常能節(jié)省很多時間。
5.5、文件操作

使用命令行操作文件,是非常方便的。
touch?新建文件cp?復制文件mv?移動文件rm?刪除文件
這四個風騷的命令,主宰著文件資料的去向。我們依然使用上面創(chuàng)建的目錄,進行接下來的操作。
#?創(chuàng)建三個文件
[root@localhost?~]#?touch?long-long-long.txt
[root@localhost?~]#?touch?996.txt
[root@localhost?~]#?touch?icu.txt
[root@localhost?~]#?ls
996.txt??a1??anaconda-ks.cfg??icu.txt??long-long-long.txt
#?復制一個文件
[root@localhost?~]#?cp?996.txt?007.txt
[root@localhost?~]#?mv?long-long-long.txt?short.txt
[root@localhost?~]#?ls
007.txt??996.txt??a1??anaconda-ks.cfg??icu.txt??short.txt
#?移動996.txt到a1目錄,icu.txt到a1/b2目錄
#?刪除short.txt
[root@localhost?~]#?mv?996.txt?a1/
[root@localhost?~]#?mv?icu.txt?a1/b2/
[root@localhost?~]#?rm?short.txt
rm:?remove?regular?empty?file?‘short.txt’??y
#?遞歸刪除a1目錄
[root@localhost?~]#?rm?-rvf?a1/
removed?directory:?‘a(chǎn)1/b2/c3/d4/e5/f6/g7’
removed?directory:?‘a(chǎn)1/b2/c3/d4/e5/f6/g8’
removed?directory:?‘a(chǎn)1/b2/c3/d4/e5/f6/g9’
removed?directory:?‘a(chǎn)1/b2/c3/d4/e5/f6/g10’
removed?directory:?‘a(chǎn)1/b2/c3/d4/e5/f6’
removed?directory:?‘a(chǎn)1/b2/c3/d4/e5’
removed?directory:?‘a(chǎn)1/b2/c3/d4’
removed?directory:?‘a(chǎn)1/b2/c3’
removed?‘a(chǎn)1/b2/icu.txt’
removed?directory:?‘a(chǎn)1/b2’
removed?‘a(chǎn)1/996.txt’
removed?directory:?‘a(chǎn)1/’
[root@localhost?~]#?ls
007.txt???anaconda-ks.cfg

經(jīng)過一番操作以后,只剩下了007了。除了上面基本的操作,接下來我要介紹一些更加重要的功能。
可以看到在使用rm刪除文件的時候,進行了一次提示。這是為了避免誤刪除一些東西,但有時候,你需要不顯示這種提示,就可以加-f參數(shù)。f參數(shù)對于cp、mv等命令來說,同樣適用,它是force的意思。
rm?-f?file
cp?-f?file1?file2
mv?-f?file1?file2
另外,還有一個參數(shù)-r,這是遞歸的意思。我們的目錄和文件,通常有多個層次,遞歸可以把操作全部作用于上面,比如上面的遞歸刪除a1目錄。
#?警告:以下命令會造成嚴重后果
rm?-rf?/
上面的這個命令,你一定經(jīng)常看到。這不是笑話,已經(jīng)有很多用戶因此丟失了數(shù)據(jù),這就是傳說中的刪根,最終你將一無所有。那參數(shù)v又是干什么用的呢?加上它之后,可以看到命令詳細的執(zhí)行過程。在平常的操作中,我一般都加上。

6.開始操作文件

你可能已經(jīng)了解到,ll -l命令的第一列,能夠顯示linux的文件類型。請對此有一個大體的印象,因為后面的很多命令,會用到這些知識。
-?表示普通文件d?表示目錄文件l?表示鏈接文件,比如快捷方式s?套接字文件c?字符設備文件,比如/dev/中的很多文件b?表示塊設備文件,比如一些磁盤p?管道文件
Linux上的文件可以沒有后綴,而且可以創(chuàng)建一些違背直覺的文件。比如后綴是png,但它卻是一個壓縮文件(通常不會這么做)。大學時,就有聰明的同學這樣藏小電影,效果很好。
查看文件的具體類型,可以使用file命令,它很聰明,能夠識別很多文件格式。
[root@localhost?~]#?file?/etc
/etc:?directory
[root@localhost?~]#?file?/etc/group
/etc/group:?ASCII?text
[root@localhost?~]#?file?/dev/log
/dev/log:?socket
[root@localhost?~]#?file?/dev/log
/dev/log:?socket
[root@localhost?~]#?file?/bin
/bin:?symbolic?link?to?`usr/bin'
本部分的操作,面向的就是ASCII text類型的,普通文本文件。接下來,我們要創(chuàng)建一些文件。然后寫入一些內(nèi)容到文件里,以便進行后續(xù)的操作。
6.1、創(chuàng)建一個文件
6.1.1、數(shù)字序列

使用重定向符,能夠直接生成文件。下面,我要生成10到20的數(shù)字,每一個數(shù)字單獨一行,寫入一個叫做spring的文件。巧的很,seq命令可以完成這個過程。
seq?10?20?>>?spring
我們在前面提到過>的意思,是將前面命令的輸出,重定向到其他地方。在這里,我們用了兩個>,它依然是重定向的意思,但表示的是,在原來文件的基礎上,追加內(nèi)容。
也就是編程語言里的w+和a+的意思。
6.1.2、查看內(nèi)容

為了查看文件的生成效果,可以使用cat命令檢測。cat命令將會把文件的內(nèi)容,輸出打印到終端上。如果加上參數(shù)n,甚至可以打印行號。效果如下:
[root@localhost?~]#?cat?spring
10
11
12
13
14
15
16
17
18
19
20
[root@localhost?~]#?cat?-n?spring
1?10
2?11
3?12
4?13
5?14
6?15
7?16
8?17
9?18
10?19
11?20
除了查看文件內(nèi)容,cat命令通常用在更多的地方。只有和其他命令聯(lián)合起來,它才會覺得生活有意義。
#?合并a文件和b文件到c文件
cat?a??b>>?c
#?把a文件的內(nèi)容作為輸入,使用管道處理。我們在后面介紹
cat?a?|?cmd
#?寫入內(nèi)容到指定文件。在shell腳本中非常常用。我們在后面會多次用到這種寫法
cat?>?index.html?<
????
????
EOF
由于我們的文件不大,cat命令沒有什么危害。但假如文件有幾個GB,使用cat就危險的多,這只叫做貓的小命令,會在終端上瘋狂的進行輸出,你可以通過多次按ctrl+c來終止它。
6.2、平和的查看文件

既然cat命令不適合操作大文件,那一定有替換的方案。less和more就是。由于less的加載速度比more快一些,所以現(xiàn)在一般都使用less。它最主要的用途,是用來分頁瀏覽文件內(nèi)容,并提供一些快速查找的方式。less是一個交互式的命令,你需要使用一些快捷鍵來控制它。
這次我們使用seq生成一千萬行記錄,足足有76MB大小,然后用less打開它。
[root@localhost?~]#?seq?10000000?>?spring
[root@localhost?~]#?du?-h?spring
76M?spring
[root@localhost?~]#?less?spring
關于less,一般操作如下:
空格?向下滾屏翻頁b?向上滾屏翻頁/?進入查找模式,比如/1111將查找1111字樣q?退出lessg?到開頭G?去結(jié)尾j?向下滾動k?向上滾動,這兩個按鍵和vim的作用非常像
6.3、文件頭尾

head可以顯示文件頭,tail可以顯示文件尾。它們都可以通過參數(shù)-n,來指定相應的行數(shù)。
[root@localhost?~]#?head?-n?3?spring
1
2
3
[root@localhost?~]#?tail?-n?3?spring
9999998
9999999
10000000
對于部分程序員來說,tail -f或許是最常用的命令之一。它可以在控制終端,實時監(jiān)控文件的變化,來看一些滾動日志。比如查看nginx或者tomcat日志等等。通常情況下,日志滾動的過快,依然會造成一些困擾,需要配合grep命令達到過濾效果。
#?滾動查看系統(tǒng)日志
tail?-f?/var/log/messages
#?滾動查看包含info字樣的日志信息
tail?-f?/var/log/messages?|?grep?info
對于tail命令來說,還有一個大寫的參數(shù)
F。這個參數(shù),能夠監(jiān)控到重新創(chuàng)建的文件。比如像一些log4j等日志是按天滾動的,tail -f無法監(jiān)控到這種變化。
6.4、查找文件

考慮下面這個場景。我們需要找一個叫做decorator.py的文件,這個文件是個幽靈,可能存在于系統(tǒng)的任何地方。find命令,能夠勝任這次捉鬼行動。
我們使用find命令,從根目錄找起,由于系統(tǒng)的文件過多,下面的命令可能會花費一段時間。
[root@localhost?site-packages]#?find?/?-name?decorator.py??-type?f
/usr/lib/python2.7/site-packages/decorator.py
使用time命令,可以看到具體的執(zhí)行時間。執(zhí)行還是挺快的么!秒出!
[root@localhost?site-packages]#?time?find?/?-name?decorator.py??-type?f
/usr/lib/python2.7/site-packages/decorator.py
real?0m0.228s
user?0m0.098s
sys?0m0.111s
find命令會查出一個路徑的集合。通常是查詢出來之后,進行額外的處理操作,一般配合xargs命令使用(xargs讀取輸入,然后逐行處理),至于find的exec參數(shù)?忘了它吧,不好用!
#?刪除當前目錄中的所有class文件
find?.?|?grep?.class$?|?xargs?rm?-rvf
#?找到/root下一天前訪問的文件,type后面的類型參見文章開頭
find?/root??-atime?1?-type?f
#?查找10分鐘內(nèi)更新過的文件
find?/root??-cmin??-10
#?找到歸屬于root用戶的文件
find?/root?-user?root
#?找到大于1MB的文件,進行清理
find?/root?-size??+1024k??-type?f?|?xargs?rm?-f
find的參數(shù)非常非常多,記不住怎么辦?除了常用的,其實都可以通過man命令查看。man的操作也和vi非常的類似,輸入/EXAMPLES,會看到很多樣例。不過我覺得還是上面列出的這些命令更加的適用。
6.4.1、數(shù)據(jù)來源
在上圖中,你會看到mtime,ctime,atime類似的字樣,它們的數(shù)據(jù)來自于何處呢?接下來我們順理成章的看一下stat命令。
[root@localhost?~]#?stat?spring
??File:?‘spring’
??Size:?78888897???Blocks:?154080?????IO?Block:?4096???regular?file
Device:?fd00h/64768d?Inode:?8409203?????Links:?1
Access:?(0644/-rw-r--r--)??Uid:?(????0/????root)???Gid:?(????0/????root)
Context:?unconfined_u:object_r:admin_home_t:s0
Access:?2019-11-04?18:01:46.698635718?-0500
Modify:?2019-11-04?17:59:38.823458157?-0500
Change:?2019-11-04?17:59:38.823458157?-0500
?Birth:?-
這不就是文件屬性么?從文件大小,到文件類型,甚至到最后修改、訪問時間,都可以從這里獲取。Linux文件系統(tǒng)以塊為單位存儲信息,為了找到某一個文件所在存儲空間的位置,會用i節(jié)點(inode) 對每個文件進行索引,你可以認為它是一個文件指針。
文件的字節(jié)數(shù) 文件擁有者user 文件所屬組group 文件的讀、寫、執(zhí)行權(quán)限 文件的時間戳 ctime指inode上一次變動的時間 mtime指文件內(nèi)容上一次變動的時間 atime指文件上一次打開的時間。 鏈接數(shù),即有多少文件名指向這個inode (ln命令) 文件數(shù)據(jù)block的位置(具體的數(shù)據(jù)位置)
關于inode是一個比較大的話題,也是比較重要的知識點,有興趣的可以自行搜索。我們只需要知道這些信息是從這里來的就可以了。
6.4.2、小練習
如果我只想獲取Modify這個數(shù)值,可以組合使用一下上面學到的命令。首先獲取最后三行,然后獲取首行。效果如下:
[root@localhost?~]#?stat?spring?|?tail?-n?3?|?head?-n?1
Modify:?2019-11-04?17:59:38.823458157?-0500
下面幾個命令,效果是與上面等價的,輸出結(jié)果也是一模一樣。正所謂條條大路通羅馬,接下來,我們首先介紹一下出現(xiàn)頻率較高的grep。另外,我們在上面的這些命令中,多次使用了|,這是Linux中非常重要的管道概念,下面也會著重介紹。
stat?spring?|?head?-n?7?|?tail?-n?1
stat?spring?|?grep?Modify
stat?spring?|?sed?-n?'7p'
stat?spring?|?awk?'NR==7'
6.5、字符串匹配

grep用來對內(nèi)容進行過濾,帶上--color參數(shù),可以在支持的終端可以打印彩色,參數(shù)n則用來輸出具體的行數(shù),用來快速定位。這是一個必須要熟練使用的命令。
比如:查看nginx日志中的POST請求。
grep?-rn?--color?POST?access.log
推薦每次都使用這樣的參數(shù)。
如果我想要看某個異常前后相關的內(nèi)容,就可以使用ABC參數(shù)。它們是幾個單詞的縮寫,經(jīng)常被使用。
A ?after ?內(nèi)容后n行 B ?before ?內(nèi)容前n行 C ?內(nèi)容前后n行
就像是這樣:
#?查看Exception關鍵字的前2行和后10行
grep?-rn?--color?Exception?-A10?-B2???error.log
#查找/usr/下所有import關鍵字,已經(jīng)它們所在的文件和行數(shù)
grep?-rn?--color?import?/usr/

6.6、管道
在上面的命令中,我們多次用到了|,這貌似可以完成一些神奇的事情。|是pipe的意思,它可以把多個命令聯(lián)系起來。通常,命令有下面的關聯(lián)方式:
;?順序執(zhí)行,如mkdir a;rmdir a&&?條件執(zhí)行,如mkdir a && rmdir a||?條件執(zhí)行,如mkdir a || rmdir a,后面的命令將不執(zhí)行|?管道,前面命令的輸出,將作為后面命令的輸入
前三種的命令關聯(lián),是非常簡單有邏輯的,非常的好理解。而管道,卻有自己的特點。
接觸過編程語言的都知道stdin、stdout、stderr的概念。讓我們重新組織一下針對于管道的定義:前面命令的輸出(stdin),將作為后面命令的輸入(stdout)。
我們拿一行命令來說明。
seq?20?100?|?head?-n?50?|?tail?-n?1
上面命令,將輸出69。69是個神奇的數(shù)字,它是怎么辦到的呢?我們來一張小圖,一切就豁然開朗了。

關于輸入輸出和錯誤,linux使用一個數(shù)字進行縮寫,這在一些腳本中,甚至在一些安裝文件中,會經(jīng)常用到。
0 表示stdin標準輸入 1 表示stdout標準輸出 2 表示stderr標準錯誤
通過類似2>&1的語法,可以把錯誤信息定向到標準輸出。我們用命令來證明一下。
#?錯誤信息無法輸出到文件
[root@localhost?~]#?cat?aaaaaaaaa?>?b
cat:?aaaaaaaaa:?No?such?file?or?directory
[root@localhost?~]#?cat?b
#?錯誤信息被重定向了
[root@localhost?~]#?cat?aaaaaaaaa?>?b?2>&1
[root@localhost?~]#?cat?b
cat:?aaaaaaaaa:?No?such?file?or?directory
6.7、排序

在了解管道的工作原理之后,就可以介紹一下sort命令了。它通??梢院蛈niq(去重)命令聯(lián)合,完成一些排序、去重的操作。首先使用cat命令,生成如下內(nèi)容的文件。
cat?>?sort.txt?<1?11
3?22
2?44
4?33
5?55
6?66
6?66
EOF
```bash
接下來讓這兩個命令上臺表演一下。sort可以使用-t指定分隔符,使用-k指定要排序的列。但是空格,是不需要做這些畫蛇添足的指定的。
```bash
#?根據(jù)第一列倒序排序
[root@localhost?~]#?cat?sort.txt?|?sort??-n?-k1?-r
6?66
6?66
5?55
4?33
3?22
2?44
1?11
#?統(tǒng)計每一行出現(xiàn)的次數(shù),并根據(jù)出現(xiàn)次數(shù)倒序排序
#?此時,行數(shù)由7變成了6
[root@localhost?~]#?cat?sort.txt?|?sort??|?uniq?-c??|?sort?-n?-k1?-r
2?6?66
1?5?55
1?4?33
1?3?22
1?2?44
1?1?11
注意:uniq命令,一般用在已經(jīng)經(jīng)過排序的結(jié)果集上。所以,很多情況需要首先使用sort命令進行排序后,再使用uniq命令。新手經(jīng)常會忘記第一步,造成命令不能正常運行。
6.8、小練習
本部分,我們從文件的屬性開始說起,了解了幾個對文件操作的常用命令。并順便介紹了管道的概念。下面,我們來練習一下。
找到系統(tǒng)中所有的grub.cfg文件,并輸出它的行數(shù)。
分析:首先需要使用find命令,找到這些文件。然后使用xargs逐行處理。最后,使用wc命令,統(tǒng)計確切的行數(shù)。
[root@localhost?grub2]#?find?/?|?grep?grub.cfg?|?xargs?wc?-l
141?/boot/grub2/grub.cfg
輸出系統(tǒng)的group列表
cat?/etc/group?|?awk?-F?':'?'{print?$1}'
下面這個命令輸出nginx日志的ip和每個ip的pv,pv最高的前10
#?2019-06-26T10:01:57+08:00|nginx001.server.ops.pro.dc|100.116.222.80|10.31.150.232:41021|0.014|0.011|0.000|200|200|273|-|/visit|sign=91CD1988CE8B313B8A0454A4BBE930DF|-|-|http|POST|112.4.238.213
awk?-F"|"?'{print?$3}'?access.log?|?sort?|?uniq?-c?|?sort?-nk1?-r?|?head?-n10
6.9、思考&擴展
1、Linux的終端,是如何實現(xiàn)彩色的文字的?我要如何輸出一個綠色的Hello World?
2、軟鏈接與硬鏈接有什么區(qū)別?
3、了解幾個偏門但又不是非常偏的命令。
cut?有了awk,幾乎不怎么會用cut了tr col paste join split
7. 正則和高級用法
你可能遇到一些棘手的問題,通過搜索得到想要的結(jié)果,但下次還是要通過搜索解決問題,這種低效的手段不是我們所想要的。典型的就是一個線上運維工程師,當問題來臨時,不會給你留太多的現(xiàn)場學習時間。
為了達到更高效的訓練,我們要做兩件事情:第一,總結(jié)歸納;第二,觸類旁通。Linux的命令也是如此,一個問題,通常會有多種解決方式,要通過變化找出其中的共性。
這涉及到一些設計者對于規(guī)范約定俗成的遵守。一般的,你只需要掌握一小部分命令,然后對大批命令達到了解的程度,就可以在命令行的世界里游刃有余。舉個例子,你知道ls是列出文件目錄,你就會聯(lián)想到lscpu是列出cpu信息;lsmem是列出內(nèi)存信息;lsblk是磁盤信息等。這種共性很多,比如top系列,stat系列。

7.1、輔助信息
7.1.1、Linux文件格式
在Linux上工作,是非常非常排斥二進制這種格式的,幾乎什么都是可以讀寫的文本內(nèi)容。大多數(shù)命令生成的結(jié)果,也都是文本文件。這些文件有一些特點,通常列與列都是通過空格或者鍵分隔的。比如下面lsmem的結(jié)果,這種有規(guī)律的,有章可循的文件,是非常容易被處理的。
[root@localhost?~]#?lsmem??
RANGE??????????????????????????????????SIZE??STATE?REMOVABLE?BLOCK
0x0000000000000000-0x0000000007ffffff??128M?online????????no?????0
0x0000000008000000-0x000000000fffffff??128M?online???????yes?????1
0x0000000010000000-0x0000000017ffffff??128M?online????????no?????2
0x0000000018000000-0x0000000027ffffff??256M?online???????yes???3-4
0x0000000028000000-0x000000004fffffff??640M?online????????no???5-9
0x0000000050000000-0x000000005fffffff??256M?online???????yes?10-11
0x0000000060000000-0x000000007fffffff??512M?online????????no?12-15
Memory?block?size:???????128M
Total?online?memory:???????2G
Total?offline?memory:??????0B
有一大批針對于行操作的命令,同樣有一批針對于列操作的命令。然后,有兩個集大成者,叫做sed、awk。由于這兩個命令的內(nèi)容非常多,我們將其列為單獨的章節(jié)。
7.1.2、命令記不住怎么辦?
通常linux命令都十分簡單,但是有些還是有些復雜度的。比如find,ps這種命令,如果要照顧到所有的場合,可能需要非常巨大的篇幅。但是,萬一用到這種偏門的場合怎么辦?
全面了解一下是非常有必要的,以便在使用的時候能夠喚起記憶中最淺顯的印象。然后剩下的,就可以交給類似于man的這種命令了。Linux上的每一個命令,都會有配套的幫助文件,這遠比網(wǎng)絡上那些轉(zhuǎn)來轉(zhuǎn)去的信息,正確的多。
正式介紹一下下面的兩個命令:
man?用來顯示某個命令的文檔信息。比如:man lsinfo?你可以認為和man是一樣的,雖然有一些能夠互補的內(nèi)容。它們會在內(nèi)容中進行提示的--help?很多命令通過參數(shù)--help提供非常簡短的幫助信息。這通常是最有用最快捷的用例展示。如果你根本就記不住一個非常拗口的單詞,那就找找這些地方吧
注意:這些幫助信息,僅集中在命令的作用域本身。對于它的組合使用場景,并沒有過多信息。也就是說,它教會了你怎么用,但并沒有告訴你用它能夠來做什么。
這些幫助命令,一般會通過高亮關鍵字,增加閱讀的體驗。但我們可以更近一步,把幫助文件變成彩色的。在root用戶下,執(zhí)行下面的命令。然后,重新登錄虛擬機。
cat?>>?~/.bashrc?<function?man()
{
????env?\\
????LESS_TERMCAP_mb=\$(printf?"\e[1;31m")?\\
????LESS_TERMCAP_md=\$(printf?"\e[1;31m")?\\
????LESS_TERMCAP_me=\$(printf?"\e[0m")?\\
????LESS_TERMCAP_se=\$(printf?"\e[0m")?\\
????LESS_TERMCAP_so=\$(printf?"\e[1;44;33m")?\\
????LESS_TERMCAP_ue=\$(printf?"\e[0m")?\\
????LESS_TERMCAP_us=\$(printf?"\e[1;32m")?\\
????man?"\$@"
}
EOF
再次執(zhí)行man命令,就可以看到彩色的信息了。

7.1.3、TAB補全
現(xiàn)在,在終端里,輸入ca,然后快速按2次鍵盤,命令行會進入補全模式,顯示以ca打頭的所有命令。
[root@localhost?~]#?ca
cacertdir_rehash?????cache_dump???????????cache_repair?????????cache_writeback??????ca-legacy????????????capsh????????????????case?????????????????catchsegv
cache_check??????????cache_metadata_size??cache_restore????????cal??????????????????caller???????????????captoinfo????????????cat??????????????????catman
如果你對某個命令,只有模糊的印象,只記得前面的幾個字母,這個功能是極好的,命令范圍會一步步縮減。
7.2、正則表達式
為了開始下面的內(nèi)容,我們首先介紹一下正則表達式。在前面的一些命令中,也可以使用這些正則表達式,比如less、grep等。
有些書籍,能夠把正則表達式寫成一本書,我們這里僅作簡單的介紹,但足夠用了。一般的,正則表達式能用在匹配上,還能夠把匹配的內(nèi)容拿來做二次利用。關于后者,我們在sed命令中介紹。
| 標志 | 意義 |
|---|---|
^ | 行首 |
$ | 行尾 |
. | 任意單個字符 |
* | 匹配0個或者多個前面的字符 |
+ | 1個或者多個匹配 |
? | 0個或者1個匹配 |
{m} | 前面的匹配重復m次 |
{m,n} | 前面的匹配重復m到n次 |
[] | 匹配一個指定范圍內(nèi)的字符 |
[^] | 匹配指定范圍外的任意單個字符 |
\ | 轉(zhuǎn)義字符 |
[0-9] | 匹配括號中的任何一個字符,or的作用 |
| | or,或者 |
\b | 匹配一個單詞。比如\blucky\b?只匹配單詞lucky |
使用下面的命令創(chuàng)建一個文件,我們練習一下grep命令加上E參數(shù)后的正則表現(xiàn)。
cat?>?996?<996:?996?is?a?funcking?thing?.?which?make?woman?as?man?,?man?as?ass?.
we?all?on?the?bus?,?bus?bus?on?the?way?.?996
way?to?icu.?icuuuuuu......
The?greedy?green?boss?rides?on?the?pity?programmer
EOF
在終端執(zhí)行下面命令,注意高亮的部分即為匹配到的字符串。
#?匹配996開頭的行
[root@localhost?~]#?cat?996?|?grep?-E?^996
996:?996?is?a?funcking?thing?.?which?make?woman?as?man?,?man?as?ass?.
#?匹配996結(jié)尾的行
[root@localhost?~]#?cat?996?|?grep?-E?996$
we?all?on?the?bus?,?bus?bus?on?the?way?.?996
#?匹配到icu和icuuuuuu
[root@localhost?~]#?cat?996?|?grep?-E?icu+
way?to?icu.?icuuuuuu......
#?再次匹配到996
[root@localhost?~]#?cat?996?|?grep?-E?[0-9]
996:?996?is?a?funcking?thing?.?which?make?woman?as?man?,?man?as?ass?.
we?all?on?the?bus?,?bus?bus?on?the?way?.?996
[root@localhost?~]#?cat?996?|?grep?-E?^[\^0-9]
we?all?on?the?bus?,?bus?bus?on?the?way?.?996
way?to?icu.?icuuuuuu......
The?greedy?green?boss?rides?on?the?pity?programmer
#?匹配所有不包含996的行,良心命令,淚奔
[root@localhost?~]#?cat?996?|?grep?-E?-v?[0-9]{3}
way?to?icu.?icuuuuuu......
The?greedy?green?boss?rides?on?the?pity?programmer
#?匹配boss和icu
[root@localhost?~]#?cat?996?|?grep?-E?boss\|icu
way?to?icu.?icuuuuuu......
The?greedy?green?boss?rides?on?the?pity?programmer
#?匹配所有行
[root@localhost?~]#?cat?996?|?grep?-E?.
996:?996?is?a?funcking?thing?.?which?make?woman?as?man?,?man?as?ass?.
we?all?on?the?bus?,?bus?bus?on?the?way?.?996
way?to?icu.?icuuuuuu......
The?greedy?green?boss?rides?on?the?pity?programmer
正則表達式非常的重要,在一些sed腳本中,awk腳本中,甚至是vim編輯器中,都會簡化你的操作。以上內(nèi)容應該熟記,達到不需要查找文檔的地步。
下面有6個小問題,可以思考一下。
1、回過頭去,執(zhí)行一下man cat,是否發(fā)現(xiàn)了一個叫做tac的命令?它是干什么的?
2、上面提到的stat系列,你能想象iostat大體是干什么用的么?
3、grep -v是什么意思?
4、了解一下和mv非常像的rename命令來批量修改文件,看能否使用上面的正則。
5、有些命令如果拼寫錯誤,如何快速修正?靠搜索么?了解一下fuck命令。我沒有說錯。
6、下面哪種寫法表示如果cmd1成功執(zhí)行,則執(zhí)行cmd2命令?
A. cmd1&&cmd2 B. cmd1|cmd2 C. cmd1;cmd2 D. cmd1||cmd2
8. Linux下的壓縮
壓縮,是一件非常神奇的事情。
很久很久之前,就接觸過一些64KB大小的電影,你花半小時都看不完。事實上,這些動畫的真實容量是15GB,Warez組織把它壓縮了25萬倍。
你要是Windows系統(tǒng),可以在這里下載體驗一下。但我們現(xiàn)在講的是Linux,很打臉是不是?
鏈接:?https://pan.baidu.com/s/12YJQ4jsbtRr7RxoLpARTyQ?
提取碼:?r7sp
壓縮是件神奇的事。它能大能小,能伸能縮,在現(xiàn)實中很難找到這樣的東西。

為了減小傳輸文件的大小,或者為了傳輸方便,一般都會開啟壓縮。linux下常見的壓縮文件有tar、bzip2、zip、rar等,7z這種用的相對較少。壓縮之后的文件,非常適合在網(wǎng)絡環(huán)境上傳輸。甚至,你可以認為iso文件為一種特殊的壓縮方式。
.tar?使用tar命令壓縮或解壓.bz2?使用bzip2命令操作.gz?使用gzip命令操作.zip?使用unzip命令解壓.rar?使用unrar命令解壓.Z??使用compress,uncompress

準備工作:使用下面的命令,復制1000個文件。
cd?~
mkdir?files
cd?files
seq?1000?|?xargs?-I?{}?cp??/etc/group??{}
使用ls,就可以看到我們剛才創(chuàng)建的1000個文件。接下來,我們使用壓縮命令將它打包成一個。
#?查看1000個文件的總大小
[root@localhost?files]#?du?-h?.
4.0M?.
#?切換到root目錄
cd?~
#?使用tar進行壓縮,壓縮后的文件不到1MB
[root@localhost?~]#?tar?cvf?files.tar?files
[root@localhost?~]#?du?-h?files.tar
1012K?files.tar
#?使用gizp提高壓縮比,壓縮后的文件只有12KB
[root@localhost?~]#?gzip?files.tar
[root@localhost?~]#?du?-h?files.tar.gz
12K?files.tar.gz
tar和gzip一般是聯(lián)合使用的。tar命令提供了一種特殊的功能,就是可以在打包解包的同時調(diào)用其他的壓縮程序,比如:gzip,bzip2等。
下面的命令,與上面執(zhí)行兩次命令后是等同的。所以,一般使用下面的方式進行操作。
[root@localhost?~]#?tar?cvfz?files2.tar.gz?files
[root@localhost?~]#?du?-h?files2.tar.gz
12K?files2.tar.gz
與之對應的,就是解壓操作。我們只需要改動命令行中的一個字母即可:c->x。但其實,參數(shù)v和z也是可以省略的。
[root@localhost?~]#?tar?xvfz?files2.tar.gz
我們更加常用的方式,是加上參數(shù)C,指定一個要解壓的目錄。比如下面的命令,把壓縮內(nèi)容解壓到/opt目錄中。
[root@localhost?~]#?tar?xvfz?files2.tar.gz?-C?/opt/
那如果我僅僅想要看下壓縮文件中包含哪些文件呢?這就要使用參數(shù)t。
c?壓縮x?解壓t?查看列表
安裝其他的
我們來看一下常用的zip和rar解壓程序有沒有安裝。
[root@localhost?~]#?which?unzip
/usr/bin/which:?no?unzip?in?(/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@localhost?~]#?which?unrar
/usr/bin/which:?no?unrar?in?(/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
所以,我們的系統(tǒng)并沒有安裝這兩個應用。那我就使用centos的包管理工具yum安裝一下。java中的jar命令也是與zip類似的,可自行探索。
[root@localhost?~]#?yum?install?-y?zip?unzip?rar?unrar
Loaded?plugins:?fastestmirror
Loading?mirror?speeds?from?cached?hostfile
?*?base:?mirrors.aliyun.com
?*?extras:?mirrors.tuna.tsinghua.edu.cn
?*?updates:?mirrors.aliyun.com
...
rar不能安裝成功,所以rar文件并不能被解壓。沒關系,我們在后面的章節(jié)把它安裝上。
現(xiàn)在,你會在Linux安裝tomcat了么?
接下來,我們思考一下:
1、 經(jīng)過zip壓縮的文件,再使用gzip壓縮,容量還會減少么?
為了驗證這個過程,可以使用dd命令,生成一個69MB大小的隨機文件。dd命令也是個神奇哦。
[root@localhost?~]#?dd?if=/dev/urandom??of=test?bs=1M?count=69
69+0?records?in
69+0?records?out
72351744?bytes?(72?MB)?copied,?0.446161?s,?162?MB/s
[root@localhost?~]#?du?-h?test
69M?test
所以,回到文章最上面,我們可以隨機生成一批文件,讓壓縮效果更有意義一點。
seq?1000?|?xargs?-i?dd?if=/dev/zero?of={}.xjj?bs=1k?count=256
2、如果已經(jīng)有了文件,tar命令是如何做到強制覆蓋的?
9. Linux的權(quán)限體系

我們在最最最上面,剛接觸命令行的時候,就使用chmod命令,給普通文本文件,賦予了執(zhí)行權(quán)限。本小節(jié)將看一下用戶權(quán)限和文件權(quán)限這兩個息息相關的概念,
9.1、添加用戶
到現(xiàn)在為止,我們的系統(tǒng)中,還孤零零的只有這一個用戶,是時候?qū)W學女媧,捏幾個小泥人了。
首先創(chuàng)建兩個用戶:張三(zhang3)、李四(li4)。
[root@localhost?~]#?useradd?zhang3
查看下面命令的三個輸出結(jié)果。
#?系統(tǒng)中多了一個叫做zhang3的組,group文件保存了系統(tǒng)的組信息
[root@localhost?~]#?tail?-n1?/etc/group
zhang3:x:1000:
#?系統(tǒng)中多了一個叫做zhang3的用戶,shadow文件保存了它們的密碼。很多安全滲透就是為了拿到它進行暴力破解
[root@localhost?~]#?tail?-n1?/etc/shadow
zhang3:!!:18207:0:99999:7:::
#?home目錄中,多了一個叫做zhang3的目錄
[root@localhost?~]#?ll?/home?--full-time
total?0
drwx------.?2?zhang3?zhang3?83?2019-11-06?22:09:33.357165082?-0500?zhang3
接下來,給我們剛剛建立的用戶,使用passwd設置一個密碼。密碼需要輸入兩次進行確認。如果想要更改密碼,可以使用chpasswd命令。
[root@localhost?~]#?passwd?zhang3
Changing?password?for?user?zhang3.
New?password:
BAD?PASSWORD:?The?password?is?shorter?than?8?characters
Retype?new?password:
passwd:?all?authentication?tokens?updated?successfully.
那么如何刪除一個現(xiàn)有的用戶呢?這是通過userdel命令實現(xiàn)的。加上參數(shù)f,會在其他用戶使用系統(tǒng)的時候,強制退出。
userdel?-f?zhang3
9.2、文件權(quán)限說明
從上面的命令執(zhí)行結(jié)果中,我們發(fā)現(xiàn)了有兩件非常有意思的東西。添加用戶后,除了在密碼文件shadow中增加了一些內(nèi)容,同時還在group文件中添加了信息。這涉及到用戶的兩個屬性:用戶名,組名。
一個用戶只有一個名稱代號,但是可以有多個組。下面命令創(chuàng)建一個密碼為123的用戶li4,并給它追加一個叫做zhang3的組??梢钥吹?code style="">/etc/group文件中的信息變更。
[root@localhost?~]#?useradd??-G?zhang3?-p?123?li4
[root@localhost?~]#?tail?-n?2?/etc/group
zhang3:x:1000:li4
li4:x:1001:
好啦,接下來切換到我們的文件權(quán)限上面。為了進行下面命令的驗證,我們首先創(chuàng)建一個名字叫confirm777.sh的腳本文件。為了讓腳本對所有用戶可見,我們把它創(chuàng)建在/tmp目錄下。
cat?>?/tmp/confirm777.sh?<echo?$USER
id
EOF
使用ll命令查看文件信息。
[root@localhost?~]#?ll?/tmp/confirm777.sh?--full-time
-rw-r--r--.?1?root?root?13?2019-11-07?04:25:55.418254935?-0500?confirm777.sh

從ll的命令可以看出,文件的所有者是root用戶,文件所屬的組,也是root組,它的權(quán)限是rw-r--r--。文件權(quán)限分為三部分。
所有者權(quán)限,縮寫為u。文件的所有者所擁有的權(quán)限。也就是root用戶的權(quán)限,是rw-組用戶權(quán)限,縮寫為g。文件所屬組內(nèi)所有用戶的權(quán)限。因為root組內(nèi)只有root一個用戶,所以組用戶權(quán)限是r--。其他用戶權(quán)限,縮寫為o。其他不相關用戶的權(quán)限,比如我們剛創(chuàng)建的zhang3、li4用戶,對文件的權(quán)限就是r--。全部,縮寫為a,表示對上面三類用戶集體操作。
那rw-這些東西是什么意思呢?
r??表示可讀權(quán)限。read。w?表示可寫權(quán)限。write。x?表示可執(zhí)行權(quán)限。execute。-??權(quán)限占位符,表示沒有當前權(quán)限。
注意:一個用戶擁有文件的w權(quán)限,并不代表就可以刪除文件。w僅僅針對于文件內(nèi)容來說的。
一個文件,有3類用戶,每類用戶,有3種權(quán)限。使用最簡單的小學乘法,我們能夠得出,一個文件的權(quán)限位,需要3x3=9個標志位表示。
我們的文件名稱,叫做confirm777.sh,這個名字是隨便起的么?當然不是,777在linux代表特殊的含義,它代表文件對所有用戶具有可讀、可寫、可執(zhí)行的權(quán)限??梢韵胂螅绻總€文件都有這樣的權(quán)限,系統(tǒng)將無安全可言。那這一串數(shù)字是怎么來的呢?可以看下面的對照表。
r?4?讀w?2?寫x?1?執(zhí)行
對以上三個屬性進行任意組合,可以得到:
4?r--?4+0+06?rw-?4+2+05?r-x??4+0+12?-w-?0+2+03?-wx?0+2+11?--x?0+0+17?rwx?4+2+1
9.3、文件權(quán)限更改
下面介紹三個文件權(quán)限相關的命令。一般常用的,就是chown和chmod。
chown?更改文件的所有者。chgrp?更改文件的組。chmod?更改文件權(quán)限。
接下來,我們把confirm777.sh的所有者和組,修改成剛剛創(chuàng)建的用戶zhang3。
cd?/tmp
[root@localhost?tmp]#?chown?zhang3:zhang3?confirm777.sh
[root@localhost?tmp]#?ll?confirm777.sh
-rw-r--r--.?1?zhang3?zhang3?13?Nov??7?04:25?confirm777.sh
給文件所有者增加執(zhí)行權(quán)限。然后分別切換到zhang3,li4用戶執(zhí)行一下。
通過
su?命令,可以切換到其他用戶,一般使用su -進行環(huán)境變量的清理;而命令id,能夠看到當前正在執(zhí)行的用戶信息。
[root@localhost?tmp]#?chmod?u+x?confirm777.sh
[root@localhost?tmp]#?su?li4
[li4@localhost?tmp]$?./confirm777.sh
bash:?./confirm777.sh:?Permission?denied
[li4@localhost?tmp]$?exit
exit
[root@localhost?tmp]#?su?zhang3
[zhang3@localhost?tmp]$?./confirm777.sh
root
uid=1000(zhang3)?gid=1000(zhang3)?groups=1000(zhang3)?context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
可以看到,文件所有者zhang3可以執(zhí)行文件,但不相關的li4,提示沒有權(quán)限。接下來,我們驗證用戶組相關的權(quán)限位。
#?去掉zhang3的執(zhí)行權(quán)限
root@localhost?tmp]#?chmod?u-x?confirm777.sh
[root@localhost?tmp]#?ll?confirm777.sh
-rw-r--r--.?1?zhang3?zhang3?13?Nov??7?04:25?confirm777.sh
#?增加zhang3組的執(zhí)行權(quán)限,由于li4在zhang3組里,它擁有權(quán)限
[root@localhost?tmp]#?chmod?g+x?confirm777.sh
[root@localhost?tmp]#?ll?confirm777.sh
-rw-r-xr--.?1?zhang3?zhang3?13?Nov??7?04:25?confirm777.sh
#?切換到zhang3進行執(zhí)行
[root@localhost?tmp]#?su?-?zhang3
[zhang3@localhost?tmp]$?./confirm777.sh
bash:?./confirm777.sh:?Permission?denied
[zhang3@localhost?tmp]$?exit
exit
#?切換到li4進行執(zhí)行
[root@localhost?tmp]#?su?-?li4
[li4@localhost?tmp]$?./confirm777.sh
root
uid=1001(li4)?gid=1001(li4)?groups=1001(li4),1000(zhang3)?context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
從命令的執(zhí)行結(jié)果可以看出。這次,li4能夠執(zhí)行文件,相反的,zhang3卻不能。
我們使用chmod命令來修改文件權(quán)限,使用的是類似于a+x這樣的英文字母。拿第一個腳本來說,初始的權(quán)限是rw-r--r--,也就是644,在這種情況下,下面的兩個腳本等效。
chmod?u+x?confirm777.sh
chmod?744?confirm777.sh
可以看到,第二個命令,使用的是數(shù)字樣式的權(quán)限位,多了一步人腦轉(zhuǎn)換過程。這在日常的使用中,是非常不方便的。所以,使用符號法的表示方式,能夠更加直觀,非常推薦。
為了更直觀的表現(xiàn)這個過程,我專門制作了一張圖。

9.4、目錄權(quán)限
這里有一個非常有意思的地方。把文件設置成可執(zhí)行,可以把普通文件變成腳本,目錄文件的可執(zhí)行權(quán)限是什么鬼?有什么意義?對文件夾來說:
r?表示允許讀取目錄中的文件名,但不能進入該目錄w?表示允許用戶修改目錄,可以創(chuàng)建、遷移、刪除、更名目錄下的文件x?可以獲得目錄下文件的列表,以及進入目錄,執(zhí)行cd命令
關于r和x的區(qū)別,可以看下面的命令結(jié)果,仔細感受一下它們的區(qū)別。一般的,幾乎所有的目錄,都擁有執(zhí)行權(quán)限,不要隨意對其進行設置。
[root@localhost?tmp]#?su?-?li4
[li4@localhost?~]$?cd?/tmp
[li4@localhost?tmp]$?mkdir?nox
[li4@localhost?tmp]$?touch?nox/{a,b,c,d}
[li4@localhost?tmp]$?chmod?a-x?nox
[li4@localhost?tmp]$?ls?nox
ls:?cannot?access?nox/a:?Permission?denied
ls:?cannot?access?nox/b:?Permission?denied
ls:?cannot?access?nox/c:?Permission?denied
ls:?cannot?access?nox/d:?Permission?denied
a??b??c??d
[li4@localhost?tmp]$?cat?nox/a
cat:?nox/a:?Permission?denied
[li4@localhost?tmp]$?chmod?a+x?nox
[li4@localhost?tmp]$?chmod?a-r?nox
[li4@localhost?tmp]$?ls?nox
ls:?cannot?open?directory?nox:?Permission?denied
9.5、sticky bit
接下來,我們介紹一個比較燒腦的粘貼位。
假如你要刪除一個文件,你可以沒有這個文件的寫權(quán)限,但是你必須要擁有這個文件上級目錄的寫權(quán)限。如何創(chuàng)建一個目錄,可以讓任何人些人文件,但是又不能刪除其他用戶的文件?這就是stick bit的作用。粘貼位一般只用于目錄上,對文件來說并沒有什么用處。粘貼位一般使用t表示。
我們可以看一個典型的目錄/tmp
[root@localhost?tmp]#??ls?-dl?/tmp
drwxrwxrwt.?9?root?root?4096?Nov??7?06:27?/tmp

可以看到,最后一位,顯示的是t,而不是x,意思是普通用戶不能刪除其他用戶的文件。所有用戶在/tmp目錄中,都可以隨意創(chuàng)建文件,但是卻刪除不了其他人的文件,即使文件的權(quán)限是777。
[root@localhost?tmp]#?touch?/tmp/stick
[root@localhost?tmp]#?chown?li4:li4?/tmp/stick
[root@localhost?tmp]#?chmod?777?/tmp/stick
[root@localhost?tmp]#?su?-?zhang3
[zhang3@localhost?~]$?rm?/tmp/stick
rm:?cannot?remove?‘/tmp/stick’:?Operation?not?permitted
我們在上面創(chuàng)建了兩個用戶zhang3和li4,并拿它們測試了chown和chmod命令,最后介紹了粘貼位。linux比較安全的原因,就是因為有比較詳盡的權(quán)限劃分。但權(quán)限是枚雙刃劍,超權(quán)用戶一個命令就可以搞垮系統(tǒng),許多隱藏的木馬,通過提權(quán)運行在不為人知的地方。
權(quán)限相關的幾個命令會經(jīng)常被使用,下面舉幾個例子。
#?設置/var/lib/mysql的用戶和組為mysql
chown?-R?mysql:mysql?/var/lib/mysql
#?設置目錄可讀可寫,能夠上傳文件
chmod??777?/var/www/uploads
#?增加本目錄下所有sh的執(zhí)行權(quán)限
chomd?a+x?*.sh
#?變更file為可讀可寫可執(zhí)行
chmod?u=rwx,g=rwx,o=rwx?file
下面依然是思考時間:
1、下面這個命令,執(zhí)行以后,會發(fā)生什么情況?警告:不要執(zhí)行,哪怕把000改成其他數(shù)字。
#?R遍歷子目錄的意思
chmod?-R?000?/
2、有一天,我看到一個命令chmod u+s file,文中并沒有介紹s是什么意思,這是什么意思?
3、如何刪除一個用戶的組?
10. 如何對磁盤進行操作?
下面的場景非常的恐怖,對有些程序員來說可以是一場噩夢。
一大早剛剛?cè)ド习?,煎餅果子剛啃了一半,幾個全副武裝的警察就闖進了公司。二話不說控制住了工作人員,并守株待兔的等著魚兒來上班。
原因就是:公司涉嫌存儲和擴散非法文件,需要查封所有的服務器進行徹查。
這些文件,有的簡單的放在磁盤上,有的放在文件存儲服務器上,有的,被切成了多片放在了不同的廉價機器上。
接下來會發(fā)生什么,要看技術(shù)人員的水平,但估計結(jié)果并不會太好。

在上一小節(jié),我們創(chuàng)建了兩個普通用戶,這兩個用戶沒什么本事,和默認的用戶root比起來,它們的權(quán)限就小得多。除了自己目錄下的文件,其他的,它幾乎都沒有權(quán)限去修改。
這些文件,肯定是要存在磁盤上的。對磁盤的管理,有非常多的命令,這一小節(jié)的內(nèi)容,對于系統(tǒng)管理員來說,經(jīng)常使用;但對于開發(fā)來說,就要求比較低一些。因為開發(fā)只需要知道小電影存在什么地方了,不需要知道小電影是怎么存的。
那定罪的時候,運維和程序員,到底是誰的鍋更大一些?其實是個悖論。運維人員在發(fā)呆的時候,腦子里回憶起了下面的知識。
10.1.添加新硬盤
你要是一個系統(tǒng)管理員,甚至是一個上了云的系統(tǒng)管理員,現(xiàn)在買了一塊aws的擴展盤,它是不能被使用的。需要經(jīng)過格式化掛載以后,才能投入生產(chǎn)。
還記得在安裝系統(tǒng)的時候么?其中有一步,需要對虛擬機的磁盤,進行劃分,我們直接采用默認的方式。不過現(xiàn)在已經(jīng)改不了了,它已經(jīng)是過去式了。
為了模擬對磁盤的管理,我們需要首先給虛擬機新加一塊虛擬磁盤。首先,使用shutdown -h now命令關閉機器,進行下面的操作。
1、?進入settings選項,然后切換到storage,添加磁盤

2、?點擊創(chuàng)建一塊磁盤

3、?選擇VDI

4、?動態(tài)擴容,用多少擴多少

5、?我們創(chuàng)建一塊2GB大的,叫做disk2的磁盤

啟動機器。遠程連接192的ip,別忘了執(zhí)行dhclient命令。
首先使用fdisk看一下目前的磁盤狀況。
root@localhost?~]#?fdisk?-l
Disk?/dev/sda:?8589?MB,?8589934592?bytes,?16777216?sectors
Units?=?sectors?of?1?*?512?=?512?bytes
Sector?size?(logical/physical):?512?bytes?/?512?bytes
I/O?size?(minimum/optimal):?512?bytes?/?512?bytes
Disk?label?type:?dos
Disk?identifier:?0x000c2410
???Device?Boot??????Start?????????End??????Blocks???Id??System
/dev/sda1???*????????2048?????2099199?????1048576???83??Linux
/dev/sda2?????????2099200????16777215?????7339008???8e??Linux?LVM
Disk?/dev/sdb:?2147?MB,?2147483648?bytes,?4194304?sectors
Units?=?sectors?of?1?*?512?=?512?bytes
Sector?size?(logical/physical):?512?bytes?/?512?bytes
I/O?size?(minimum/optimal):?512?bytes?/?512?bytes
Disk?/dev/mapper/centos-root:?6652?MB,?6652166144?bytes,?12992512?sectors
Units?=?sectors?of?1?*?512?=?512?bytes
Sector?size?(logical/physical):?512?bytes?/?512?bytes
I/O?size?(minimum/optimal):?512?bytes?/?512?bytes
Disk?/dev/mapper/centos-swap:?859?MB,?859832320?bytes,?1679360?sectors
Units?=?sectors?of?1?*?512?=?512?bytes
Sector?size?(logical/physical):?512?bytes?/?512?bytes
I/O?size?(minimum/optimal):?512?bytes?/?512?bytes
從命令的結(jié)果,我們看到了有兩塊磁盤。/dev/sda和/dev/sdb,其中sda已經(jīng)被分配,已經(jīng)被我們的文件系統(tǒng)所占用。現(xiàn)在,回憶一下/dev目錄的用途,在這個目錄下,存放了一些設備文件,假如我們再添加一塊磁盤,它的句柄就應該是sdc?(sd*)。
在這整塊磁盤能夠被使用之前,我們需要對它進行三次操作。
磁盤分區(qū) 磁盤格式化 磁盤掛載
10.2.分區(qū)
對磁盤分區(qū)依然是fdisk命令,以下命令,將進入交互模式。在交互模式中,輸入n新建分區(qū)。由于我們的磁盤只有2GB,所以只創(chuàng)建一個分區(qū)就好。根據(jù)向?qū)?,一路確定向下,最后,輸入w確定寫入分區(qū)表,同時退出命令交互。
再次執(zhí)行fdisk -l,可以看到已經(jīng)多了一塊2gb大小的分區(qū)。
[root@localhost?~]#?fdisk?/dev/sdb
...
[root@localhost?~]#?fdisk?-l
...
???Device?Boot??????Start?????????End??????Blocks???Id??System
/dev/sdb1????????????2048?????4194303?????2096128???83??Linux
...
10.3.格式化
在命令行,輸入mkfs,然后按進行補全,將會顯示一批命令。
[root@localhost?~]#?mkfs.
mkfs.btrfs???mkfs.cramfs??mkfs.ext2????mkfs.ext3????mkfs.ext4????mkfs.minix???mkfs.xfs
這批命令,都可以對磁盤進行格式化。目前,最常用的磁盤格式是ext4。但我們并沒有找到windows操作系統(tǒng)的FAT以及NTFS等格式,但它們在概念上是等同的。

下面介紹一下Linux下常用的磁盤格式。
btrfs?GPL授權(quán)。是為了替換ext系統(tǒng)而發(fā)起的。不熟悉,不過多評價。cramfs?門針對閃存設計的只讀壓縮的文件系統(tǒng),其容量上限為256M,采用zlib壓縮,很少用ext2?ext的早先版本。ext3?ext2的改進。ext4?使用最多。如果對其他的不熟悉,老老實實用ext4吧。minix?比較古老,也不常用。xfs?XFS 文件系統(tǒng)是擴展文件系統(tǒng)的一個擴展,是 64 位高性能日志文件系統(tǒng)。centos7.0開始的默認文件系統(tǒng)。
我們就錄鄉(xiāng)隨俗,將磁盤給格式化成xfs。
[root@localhost?~]#?mkfs.xfs?/dev/sdb1
注意:如果想要把磁盤格式化成
fat32的格式,需要安裝一個軟件。
?yum?install?dosfstools?-y
10.4.掛載
最后一步,是使用mount命令掛載磁盤。我們把它掛載到/data目錄。
df命令能夠看到系統(tǒng)的磁盤使用狀況,參數(shù)h是human的意思,以比較容易讀的方式展現(xiàn)信息;lsblk則以另一個角度查看系統(tǒng)磁盤掛載情況。
[root@localhost?~]#?mkdir?/data
[root@localhost?~]#?mount?/dev/sdb1?/data
[root@localhost?~]#?df?-h
Filesystem???????????????Size??Used?Avail?Use%?Mounted?on
devtmpfs?????????????????908M?????0??908M???0%?/dev
tmpfs????????????????????920M?????0??920M???0%?/dev/shm
tmpfs????????????????????920M??8.6M??911M???1%?/run
tmpfs????????????????????920M?????0??920M???0%?/sys/fs/cgroup
/dev/mapper/centos-root??6.2G??1.4G??4.9G??22%?/
/dev/sda1???????????????1014M??149M??866M??15%?/boot
tmpfs????????????????????184M?????0??184M???0%?/run/user/0
/dev/sdb1????????????????2.0G???33M??2.0G???2%?/data
root@localhost?~]#?lsblk??-f
NAME????????????FSTYPE??????LABEL?UUID???????????????????????????????????MOUNTPOINT
sda
├─sda1??????????xfs???????????????ac3a3ce8-6ab1-4c0b-91c8-b4e617f0dfb4???/boot
└─sda2??????????LVM2_member???????3GzmOd-TUc1-p2ZN-wT5q-ttky-to9l-PF495o
??├─centos-root?xfs???????????????9f86f663-060a-4450-90f9-3005ad9c5d92???/
??└─centos-swap?swap??????????????cf8709b0-b0ab-4d44-a23e-ad76f85efad6???[SWAP]
sdb
└─sdb1??????????xfs???????????????0a7c861c-1a31-45b3-bf37-c72229f35704???/data
為了能夠在開機的時候加載磁盤,我們需要修改/etc/fstab文件。這種文件修改的時候一定要小心,否則會造成系統(tǒng)無法啟動。
[root@localhost?~]#?echo?"/dev/sdb1??xfs?defaults?0?0"?>>?/etc/fstab
[root@localhost?~]#?cat?/etc/fstab
/dev/mapper/centos-root?/?xfs?defaults????????0?0
UUID=ac3a3ce8-6ab1-4c0b-91c8-b4e617f0dfb4?/boot??xfs?????defaults????????0?0
/dev/mapper/centos-swap?swap????swap????defaults????????0?0
/dev/sdb1???????????????????????xfs?????defaults????????0?0
10.5.交換分區(qū)
由于內(nèi)存的容量有限,現(xiàn)在的操作系統(tǒng),都會使用磁盤模擬一個虛擬內(nèi)存區(qū)域,用于緩沖一些數(shù)據(jù)。由于磁盤的速度和內(nèi)存不可同日而語,通常會造成應用程序的卡頓??w卡,應用進程卻可以因此茍延殘喘,續(xù)命。
swap分區(qū),即交換區(qū),系統(tǒng)在物理內(nèi)存不夠時,與swap進行交換。即當系統(tǒng)的物理內(nèi)存不夠用時,把硬盤中一部分空間釋放出來,以供當前運行的程序使用。當那些程序要運行時,再從swap分區(qū)中恢復保存的數(shù)據(jù)到內(nèi)存中。
現(xiàn)代互聯(lián)網(wǎng)公司,一般對接口的響應時間有比較高的要求,swap分區(qū)一般是禁用的。關于swap,有下面幾個相關的命令。
#?制作交換分區(qū)
[root@localhost?~]#?mkswap?/dev/sdb1
#?禁用所有交換分區(qū)
[root@localhost?~]#?swapoff?-a
#?啟用交換分區(qū)
[root@localhost?~]#?swapon
10.6 使用dd命令進行備份
下面的命令,將直接備份磁盤A到磁盤B。
#?dd?if=/dev/sda?of=/dev/sdb
在上面的命令中,if代表輸入的文件,of代表輸出的文件。根據(jù)Linux下一切皆文件的原理,這里的文件指的就是設備。
dd命令還可以將整個磁盤打包成一個鏡像文件。比如下面的命令。
#?dd?if=/dev/hda?of=~/hdadisk.img
當然,恢復磁盤的時候,也是相當簡單的,我們只需要逆向操作就可以了。
#?dd?if=hdadisk.img?of=/dev/hda
推薦閱讀:
致 Linux 運維:當你的服務器被黑了,一定要看是不是犯了這 5 點錯誤
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內(nèi)回復「1024」,即可免費獲取??!


