6w字搞定Linux基本操做,建議收藏

擇一枚非996的週末,搞定Linux。Follow me!

原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。php

這是一份精細的,手把手的教程。html

有不少同窗微信問我,Linux命令這麼多,該怎麼從入門到精通?其實,這個事情很是的simple,這篇文章將會帶你飛。文章很是的長,要挑一個陽光明媚的sunshine weekend,耐心去搞定。java

本文將由一個Linux命令概覽開始,說明Linux命令的方方面面。若是你讀完這部分仍是一頭霧水,那麼就證實須要按照下面的小白教程去學習了,內容涵蓋了:如何挑選Linux發行版、如何安裝Linux系統,按照主題學習Linux系統的命令等。node

入門後的 學習方式:多敲多打,用條件反射替代大腦記憶--若是你未來或者如今要用它來吃飯的話。 其中,也有一些難啃的骨頭,關注小姐姐味道微信公衆號,咱們一塊兒用鋒利的牙齒,來把它嚼碎。python

1. Linux命令概覽

這部分是給稍微有點Linux經驗的同窗準備的,若是你是初學者,請跳過此part直接進入第二部分。mysql

1.1目錄操做

工做中,最常打交道的就是對目錄和文件的操做。linux提供了相應的命令去操做他,並將這些命令抽象、縮寫。linux

1.1.1 基本操做

多是這些命令太經常使用了,多打一個字符都是罪過。因此它們都很短,不用阿拉伯數字,一個剪刀手就能數過來。ios

看命令。
mkdir 建立目錄 make dir cp 拷貝文件 copy mv 移動文件 move rm 刪除文件 removenginx

例子:程序員

# 建立目錄和父目錄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 命令可以看到當前目錄的全部內容。ls -l可以看到更多信息,判斷你是誰。
pwd 命令可以看到當前終端所在的目錄。告訴你你在哪。
cd 假如你去錯了地方,cd命令可以切換到對的目錄。
find find命令經過篩選一些條件,可以找到已經被遺忘的文件。

至於要去何方,可能就是主宰者的意志了。

1.2 文本處理

這是是很是很是加分的技能。get到以後,也能節省更多時間來研究面向對象。小姐姐味道已經輸出了「最經常使用的vim、sed、awk技巧系列」。

1.2.1 查看文件

cat
最經常使用的就是cat命令了,注意,若是文件很大的話,cat命令的輸出結果會瘋狂在終端上輸出,能夠屢次按ctrl+c終止。

# 查看文件大小
du -h file

# 查看文件內容
cat file
複製代碼

less
既然cat有這個問題,針對比較大的文件,咱們就能夠使用less命令打開某個文件。 相似vim,less能夠在輸入/後進入查找模式,而後按n(N)向下(上)查找。
有許多操做,都和vim相似,你能夠類比看下。

tail
大多數作服務端開發的同窗,都瞭解這麼命令。好比,查看nginx的滾動日誌。

tail -f access.log
複製代碼

tail命令能夠靜態的查看某個文件的最後n行,與之對應的,head命令查看文件頭n行。但head沒有滾動功能,就像尾巴是往外長的,不會反着往裏長。

tail -n100 access.log
head -n100 access.log
複製代碼

1.2.1 統計

sort和uniq常常配對使用。 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用來對內容進行過濾,帶上--color參數,能夠在支持的終端能夠打印彩色,參數n則輸出具體的行數,用來快速定位。
好比:查看nginx日誌中的POST請求。

grep -rn --color POST access.log
複製代碼

推薦每次都使用這樣的參數。

若是我想要看某個異常先後相關的內容,就能夠使用ABC參數。它們是幾個單詞的縮寫,常常被使用。 A after 內容後n行 B before 內容前n行 C count? 內容先後n行
就像是這樣:

grep -rn --color Exception -A10 -B2   error.log
複製代碼

diff

diff命令用來比較兩個文件是否的差別。固然,在ide中都提供了這個功能,diff只是命令行下的原始折衷。對了,diff和patch仍是一些平臺源碼的打補丁方式,你要是不用,就pass吧。

1.3壓縮

爲了減少傳輸文件的大小,通常都開啓壓縮。linux下常見的壓縮文件有tar、bzip二、zip、rar等,7z這種用的相對較少。

.tar 使用tar命令壓縮或解壓
.bz2 使用bzip2命令操做
.gz 使用gzip命令操做
.zip 使用unzip命令解壓
.rar 使用unrar命令解壓

最經常使用的就是.tar.gz文件格式了。實際上是通過了tar打包後,再使用gzip壓縮。

建立壓縮文件

tar cvfz  archive.tar.gz dir/
複製代碼

解壓

tar xvfz. archive.tar.gz
複製代碼

快去弄清楚它們的關係吧。

1.4 平常運維

開機是按一下啓動按鈕,關機總不至因而長按啓動按鈕吧。對了,是shutdown命令,不過通常也沒權限-.-!。passwd命令能夠用來修改密碼,這個權限仍是能夠有的。

mount
mount命令能夠掛在一些外接設備,好比u盤,好比iso,好比剛申請的ssd。能夠放心的看小電影了。

mount /dev/sdb1 /xiaodianying
複製代碼

chown
chown 用來改變文件的所屬用戶和所屬組。
chmod 用來改變文件的訪問權限。

這兩個命令,都和linux的文件權限777有關。
示例:

# 毀滅性的命令
chmod 000 -R /

# 修改a目錄的用戶和組爲 xjj
chown -R xjj:xjj a

# 給a.sh文件增長執行權限(這個太經常使用了)
chmod a+x a.sh
複製代碼

yum
假定你用的是centos,則包管理工具就是yum。若是你的系統沒有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的區別和用途。

su
su用來切換用戶。好比你如今是root,想要用xjj用戶作一些勾當,就能夠使用su切換。

su xjj
su - xjj
複製代碼

-可讓你乾淨純潔的降臨另外一個帳號,不出意外,推薦。

1.5 系統狀態概覽

登錄一臺linux機器,有些命令可以幫助你快速找到問題。這些命令涵蓋內存、cpu、網絡、io、磁盤等。

uname uname命令能夠輸出當前的內核信息,讓你瞭解到用的是什麼機器。

uname -a
複製代碼

ps
ps命令可以看到進程/線程狀態。和top有些內容重疊,經常使用。

# 找到java進程
ps -ef|grep java
複製代碼

top 系統狀態一覽,主要查看。cpu load負載、cpu佔用率。使用內存或者cpu最高的一些進程。下面這個命令能夠查看某個進程中的線程狀態。

top -H -p pid
複製代碼

free
top也能看內存,但不友好,free是專門用來查看內存的。包括物理內存和虛擬內存swap。

df
df命令用來查看系統中磁盤的使用量,用來查看磁盤是否已經到達上限。參數h能夠以友好的方式進行展現。

df -h
複製代碼

ifconfig
查看ip地址,不囉嗦,替代品是ip addr命令。

ping
至於網絡通不通,能夠使用ping來探測。(不包括那些禁ping的網站)

netstat 雖然ss命令能夠替代netstat了,但現實中netstat仍然用的更普遍一些。好比,查看當前的全部tcp鏈接。

netstat -ant
複製代碼

此命令,在找一些本地起了什麼端口之類的問題上,做用很大。

1.6 工做經常使用

還有一些在工做中常常會用到的命令,它們的出現頻率是很是高的 ,都是些熟面孔。

export
不少安裝了jdk的同窗找不到java命令,export就能夠幫你辦到它。export用來設定一些環境變量,env命令能看到當前系統中全部的環境變量。好比,下面設置的就是jdk的。

export PATH=$PATH:/home/xjj/jdk/bin
複製代碼

有時候,你想要知道所執行命令的具體路徑。那麼就能夠使用whereis命令,我是假定了你裝了多個版本的jdk。

crontab
這就是linux本地的job工具。不是分佈式的,你要不是運維,就不要用了。好比,每10分鐘提醒喝茶上廁所。

*/10 * * * * /home/xjj/wc10min
複製代碼

date date命令用來輸出當前的系統時間,能夠使用-s參數指定輸出格式。但設置時間涉及到設置硬件,因此有另一個命令叫作hwclock

xargs xargs讀取輸入源,而後逐行處理。這個命令很是有用。舉個栗子,刪除目錄中的全部class文件。

find . | grep .class$ | xargs rm -rvf

#把全部的rmvb文件拷貝到目錄
ls *.rmvb | xargs -n1 -i cp {} /mount/xiaodianying
複製代碼

1.7 網絡

linux是一個多做業的網絡操做系統,因此網絡命令有不少不少。工做中,最常和這些打交道。

ssh
這個,就不囉嗦了。你必定但願瞭解ssh隧道是什麼。你要是想要詳細的輸出過程,記得加參數-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命令可讓你直接使用命令行下載文件,並支持斷點續傳。

wget -c http://oracle.fuck/jdk2019.bin
複製代碼

mysql
mysql應用普遍,並非每一個人都有條件用上navicat的。你須要瞭解mysql的鏈接方式和基本的操做,在異常狀況下才能遊刃有餘。

mysql -u root -p -h 192.168.1.2
複製代碼

不要以爲複雜,命令是有限的,但激情無限;都會也不要驕傲,一個vim就夠折騰一生。捷徑就是總結,深刻只有探索。白馬過隙,終會行雲流水,手到擒來。
物是人非,年華易老。惟有時光,不會辜負。

2. 挑選一個Linux發行版

和Linux比較像的還有Unix,但若是你是一個二三十歲的小青年,你接觸到可能只有Linux的世界了。從手機,到服務器上普遍使用的centos,到漂亮的桌面發行版ubuntu,甚至是風靡全球的樹莓派,處處都是linux的身影。

2.1 你須要知道這些linux歷史

知道一點相關操做系統的歷史,是可以陶冶情操的。GNU/Linux是爲了抵制一些商業公司的壟斷行爲而發展起來的,凝結了一代互聯網人嚮往自由的心血。

和其餘Unix比起來,Linux其實很年輕。直到1991年,一個叫Linus Torvalds的芬蘭年輕人才開始開發咱們如今所知道的Linux內核

Linux的吉祥物是企鵝,這個吉祥物直到1996年才肯定,因此你會常常看到一些搞笑的圖片。若是你是90後,那這隻小企鵝幾乎和你通常大,仍是個年輕的小夥。

Linux的發展歷程比較的複雜。通過一次次的過關斬將,Linux走到今天確屬不易。關於其發展歷史,你能夠經過下面的連接,查看高清圖片。20年的時間,對軟件行業來講,是一段很是漫長的時光,有多少的風光已經物是人非。

高清見圖片(1t.click/aUnx) 。能夠看到,linux只佔了那可憐的一小塊。這就像人類的出現,在生命的長河中,微不足道,但倒是一個質的飛躍。

你可能注意到,在前面的描述中,說的是GUN/Linux,而不只僅是Linux。Linux自己只是一個內核,做用有限,只有和GNU聯合起來,擁有完整的生態纔會發揮它的做用。

談到上面區別的緣由,是爲了記住Richard Stallman在1983年發起的GNU計劃。他同時是smalltalk語言的發明者,被公認的第二個面向對象的語言。我在早些年,還研究過一段時間。哦,他還編寫了一個巨無霸編輯器,Emacs

只有一我的被捧成神,他纔會有能量折磨你。

針對於Linux歷史,咱們不作過多介紹。下面介紹幾個經典的發行版本。

2.2 精選版本介紹

如今的Linux發行版本,已經有上千個,你要是喜歡、並且多金,你也能夠作一個。如何在這其中,找到最合適的版本,是須要通過一番折騰的。不少發行版本,實際上是很小衆的。

這不像是哲學領域的某些東西,真理掌握在少數人手中。只有得到良好發展,並獲得承認的Linux發行版,纔有它的價值,能夠說是徹頭徹尾的實用主義。

但這東西又像女友,剛開始感受風采迥異,各有千秋,到最後瞭解到是同樣的庸俗不堪。但有人就是喜歡Linux相關的工做,一干就是一生...

我能夠先說一下本身的歷程。剛開始,接觸的是紅帽redhat,當時尚未分什麼企業版。用了一段時間之後,又切換成更穩定的slackware。可是slackware上的程序更新實在太慢了,因而又切換成readhat血統的fedora,這個版本的軟件保鮮度很高。其間,又嘗試了其餘幾個linux版本,最終,在2013年先後,換成了滾動升級的archlinux,直到如今。

要我我的作個推薦的話:
一、我的用戶(技術),桌面版用ubuntu=>archlinux
二、企業用戶,服務器,使用centos

2.3 主要起源

這麼多Linux版本,其實有兩條主線。debian系列和redhat系列。不少發行版本,實際上是二次翻新,不少就直接拿這兩個基礎系列進行改造。正所謂:操做系統千千萬,都是帽子和大便。

debian

下面這個屎同樣的圖表,就是debian。呃呃呃,和大便只差一個字母。

Debian計劃是一個致力於建立一個自由操做系統的合做組織。它的特色是:穩定、安全,到如今爲止,已經發展了20多年了。咱們所熟悉的ubuntu,就是基於debian改進的。

redhat

紅帽是一家商業公司,涉足Linux比較早,如今對我的提供一些紅帽認證之類的證書。如今雲主機使用較多的centos,包括紅帽公司的RHEL,佔據了大部分服務器市場。近期,centos 8推出了centos stream滾動版本,看起來更像是一個正常的操做系統。

2.4 典型版本

咱們看一下處於不一樣層次的幾個典型版本。從應用方面來講,linux有桌面、服務器、研究用等用途。

2.4.一、ubuntu

ubuntu的出現,對Linux的推廣有不可磨滅的貢獻。它是一個易於安裝的桌面版本(也有服務器版本),界面很是漂亮。ubuntu是基於debian系統的unstable分支修改的,包管理軟件是apt-get

它的建立者是Mark Shuttleworth,南非企業家,世界上第二名自資的太空遊客。我想,不管是太空仍是ubuntu,這都是夢想吧。

2.4.二、centos

centos是目前最流行的服務器版本。它是RHEL源代碼再編譯的產物,主要是爲了繞開一些法律問題。在包管理,甚至穩定性上,與紅帽企業版沒什麼差異。

2.4.三、archlinux

archlinux採用滾動升級的模式進行發行,盡全力提供最新的穩定版本。剛開始安裝,arch只提供一個基本的系統,甚至連界面都沒有,對初學者不是很友好。

可是,archlinux是很是乾淨的系統。不少軟件,只有你須要的時候纔會安裝。它的軟件和理念一般都是最新的,定製化很是強,深得許多Linux愛好者的喜好。

2.4.四、gentoo

上面的archlinux,提供了編譯後的軟件包。用戶在安裝軟件時,只須要下載、解壓便可。gentoo將這個過程更近一步,能夠說更加的變態。它下載的是軟件的源代碼,而後在本地進行編譯,而後安裝。

這一般很是的蛋疼,由於下載、編譯會花費很是長的時間,但它有一個很是大的優勢,就是穩定。

這個系統比較底層,對技能要求更多,不太推薦。

2.4.5 、LFS

LFS的全拼是「linux from scratch」,意思是從零構建一個linux系統。它有一個很是詳細的安裝文檔,教你怎樣編譯內核,編譯引導程序,編譯和配置必要的軟件。

這是一個瘋狂而必要的過程。若是你想要本身的Linux之上更上層樓,跟着文檔作一遍是受益無窮的。你須要通過屢次交叉編譯,最終使用chroot命令切換到新系統進行後續操做。

想作一個本身的發行版麼?從這開始吧。

2.4.六、kali

kali linux是一個很是專業的發行版。若是你在作滲透方面的工做,將是一個很是好的選擇。

發行版的安裝包很是大,包含了常見的破解工具,滲透工具,攻擊工具。這很是的危險,我曾用它暴力破解了很是多的wifi密碼,成功的窺視了鄰居的隱私。仍是很是好用的。

3. 安裝一個清爽的Linux系統

工欲善其事,必先利其器。你可能會想到買一臺雲主機練練手,但那畢竟要花點銀子,咱們能夠本身安裝一個。咱們在上面提到,目前使用最普遍的,就是centos。不論你是自建機房,仍是使用相似於阿里雲這樣的雲端環境,大多數都會提供centos的安裝。

你可能會找到多種安裝虛擬機的方式。本小節,將使用虛擬雙網卡的方式,準備一個純潔的環境。這一小節,圖片不少。

以阿里云爲例,默認第一位就是CentOS,提供了從7.6版本到舊版本的多個鏡像。

3.1 下載

下面的文章,咱們就以CentOS 7穩定版本爲基礎環境。centos很流行,因此鏡像也有不少。國內,咱們從上海交大下載,速度應該會快一些。

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
複製代碼

爲了讓你們學到更多的知識,咱們使用最小化的系統ISO。最小化的iso不到1GB,而預裝了不少軟件的dvd有4.3GB的大小。咱們就用這個減肥版。

3.2 安裝Linux

要想快速學習、體驗Linux,最便捷的方式,就是使用虛擬機進行安裝。目前,最流行的虛擬機,一個是VMware,一個是VirtualBox。在MacOS上還有一個Parallels Desktop

其中,VirtualBox免費並且跨平臺,可以知足咱們的需求。接下來,將一步步引導你進行安裝。

(1) 點擊新建,開啓安裝旅程。

(2) 填寫名稱,版本。而後點擊繼續。

(3)按照你的機器配置,選擇內存

個人機器是8GB內存的,就分配給虛擬機2GB,這個已經足夠用了。

(4) 建立一個虛擬磁盤

點擊繼續後,將彈出一個對話框。咱們不用多管,一直點繼續,知道對話框消失。這很是的粗暴。

(5) 接下來,點擊設置。

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

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

使用方向鍵切換,使得高亮聚焦在Install CentOS 7上。點擊肯定,開始安裝。

(8) 彈出一個安裝界面

接下來的步驟有點多,若是咱們沒有特別的介紹,那麼直接continue就ok了。

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

依然保持默認,並按按鈕Done退出。

(10) 配置用戶

linux上默認的用戶名爲root。接下來咱們設置root用戶的密碼爲123456。因爲這是一個弱密碼,因此須要點擊兩次肯定退出。

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

(12) 安裝成功

3.3 聯網

這個時候,咱們安裝的虛擬機,還不能聯網,沒法把本身的意念傳達出去。因爲咱們沒有對虛擬機進行任何設置,因此使用的是默認的NAT模式。

將光標聚焦到命令行窗口,而後輸入命令dhclient。等待幾秒鐘,執行ping baidu.com測試如下網絡,能夠看到可以正常訪問網絡了。

上面黑漆漆的窗口,就是咱們如今的Linux界面。有人以爲很醜,就像是在玩dos,但像我這種不可救藥的人,卻以爲格外的親切。

接下來的命令,咱們不會再截圖,而使用高亮的代碼塊表示。爲了避免至於讓人暈頭轉向,請先看下圖。

3.4 外部訪問虛擬機

因爲NAT模式的特色,咱們的虛擬機可以訪問外網,但沒法被外部發現。酒香竟怕巷子深。爲了解決這個問題,咱們須要再添加一塊網卡。

在作這些更改以前,須要首先關閉虛擬機。能夠強制關閉機器,也能夠在命令行中輸入:

shutdown -h now
複製代碼

虛擬機關閉後,再次點擊設置,切換到網絡適配器選項卡。如圖,添加一個新的網絡適配器,適配器類型爲Host-only Adapter。經過這塊網卡,咱們的宿主機就可以訪問它了。

再次啓動虛擬機,執行dhclient命令後,執行ip addr查看主機的ip地址。能夠看到,咱們如今有兩塊網卡,兩個ip地址。

記錄下192打頭的網絡地址,咱們會使用外部的程序,好比XShellSecureCRT等,進行鏈接。好比,我這裏的ip地址是:192.168.99.100。不廢話,看圖。

小提示:關於虛擬網卡的網段,若是有差別。你能夠在全局設置裏,改爲和我同樣的。

3.5 遠程鏈接

你可能已經體驗到,經過虛擬機自帶的命令行界面進行輸入,侷限性很是大。經過遠程鏈接,能夠把終端界面切換到咱們熟悉的操做模式,若是可以顯示彩色的終端,那再好不過了。下面介紹幾個工具,通常的,使用xshell的居多。

Windows

  • XShell 你可能在公司內,見過你的SRE同事,運指如飛,命令字符如流水通常撒過屏幕。即便很是繁雜,難以記憶的密碼,也能瞬間輸入。他可能用的就是xshell。

  • SecureCRT 比較老的一款產品,使用也較多。

  • MobaXterm MobaXterm就是一單文件純綠色軟件,下載過來exe包直接運行便可,不須要任何的安裝過程。

它們都有免費版和專業版之分。無力購買的話,就找找破解版。可是注意,盜版漢化的ssh客戶端,有些別有用心的人會在軟件中植入木馬,竊取你的密碼、證書,這種狀況已經發生過不少次。

MacOS

對於macos用戶來講,簡單的很。直接使用iTerm,輸入命令行便可。好比使用下面的命令鏈接咱們的機器。

ssh root@192.168.99.100
複製代碼

Linux

唔,你都已是Linux環境了,還折騰個啥虛擬機呢?直接用吧。

推薦使用XShell、SecureCRT、iTerm等工具,經過ssh進行遠程鏈接。對於一些命令拷貝、驗證來講,要方便快捷的多。

4. 對Linux命令行有個初步瞭解

萬事開頭難。面對黑漆漆的Linux窗口,要勇敢的走出第一步。不要怕輸錯了什麼,系統健壯的很。命令行一般會擁有比圖形界面更高的效率,更加劇要的是它能夠作自動化之類的小工具,這使得生產力產生質的飛躍。

如今,你已經安裝好了centos,並遠程鏈接上了它。咱們擁有了它,但並不能瞭解它的脾氣。接下來,讓咱們進入Linux命令行的世界。和我簽定契約吧,少年。

本小節會使用很是詳細的演進方式,來看一下一個命令,是怎樣生成和執行的。

4.一、簡單嘗試

好啦,咱們如今就在終端裏了。什麼叫作終端呢?你在不少黑客電影裏,看到的黑漆漆的界面就是,它提供了一個能夠輸入字符串的交互式界面,至於那些閃光的、掃描機同樣的東西,是不存在的。

嘗試輸入些什麼吧。 好比:jdsjf

[root@localhost ~]# jdsjf
-bash: jdsjf: command not found
複製代碼

咱們再次把這張圖貼一下。怎麼回事?命令的輸出翻譯成中文,就是「找不到命令」的意思。什麼叫命令?就是咱們上面隨便輸入的字符串jdsjf

而後,咱們看下提示中其餘一些有用的東西。

↓↓↓↓↓↓

bash 表明的是咱們所使用的shell,shell能夠認爲是一個解釋器,將咱們的輸入解釋成一系列可執行的指令。如今的linux發行版,最流行的就是bash解釋器,幾乎每一個都預裝了它。

命令找不到,證實咱們的字符串bash解釋不了。可是,Linux上一些目錄裏的文件,是能夠被默認找到的,這些目錄的集合,就叫PATH 。PATH仍是一個環境變量,咱們能夠經過命令查看它的尊容。

[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
複製代碼

想要知道系統中有哪些命令,就能夠看下上面這些文件夾中,都有哪些文件。文件很是很是之多,可是大部分咱們不會接觸。因此,xjjdog纔會寫這麼個東西--聚焦那些最經常使用,最有用的命令,最經常使用的參數,最有用的場景。

命令輸出後,還有一些額外的東西,好比[root@localhost ~],這部分叫作提示符,光標會一直跳動,等待你的輸入。這部分是能夠定製的,甚至能夠定製的十分漂亮。

4.二、Hello World

到如今爲止,咱們什麼都沒獲得。按照程序員的想法來講,就要實現一個hello world的程序。在終端shell裏,這個過程變得簡單,遠比寫一個java程序簡單。

[root@localhost ~]# echo "Hello World"
Hello World
複製代碼

如上所示,echo的意思就是輸出一些內容。後面的Hello World,就叫作參數,它們之間以空格分隔,能夠接受多個參數。

[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.三、將命令加入PATH

接下來,咱們把上面的命令,作成一個腳本。而後將這個腳本,放到PATH目錄中。不過先等等,咱們要先給命令起個名字。

首先須要建立一個文件。在Linux上,建立文件使用touch命令。

[root@localhost ~]# touch jdsjf
複製代碼

命令執行後,什麼都沒發生,它只是建立了一個空文件。接下來,咱們向其中添加一些內容。

[root@localhost ~]# echo "echo 'Hello World'" > jdsjf
複製代碼

注意符號>,它的意思是,將前面的輸出,重定向到後面的文件中。執行完上面的命令,jdsjf 中的內容,就變成了echo 'Hello World

接下來,咱們嘗試着去執行剛纔生成的命令。

[root@localhost ~]# ./jdsjf
-bash: ./jdsjf : Permission denied
複製代碼

咱們經過相對路徑的方式,來執行剛剛生成的命令。結果,終端顯示咱們並無這個命令的執行權限。

其實,Linux在權限控制這一方面,很是的詳細。一個文件,有可讀、可寫、可執行三種屬性。若是想要一個文件可以執行,須要給它添加執行權限,這個過程是由命令chmod完成的。

[root@localhost ~]# chmod u+x jdsjf
[root@localhost ~]# ./jdsjf
Hello World
複製代碼

咱們將在後面的章節,來詳細介紹權限方面的知識。如上所示,命令已經能正常輸出,接下來,咱們把命令移動到PATH中的一個目錄。

[root@localhost ~]# mv jdsjf /usr/local/bin/
[root@localhost ~]# jdsjf
Hello World
複製代碼

不須要加任何的相對路徑,如今,只須要輸入jdsjf,就能夠正常輸出一串數字。咱們成功的讓一個沒有任何意義的字符串,表達了它的想法。雖然咱們依然是它的主宰。

你能夠想一下下面這三個問題:

一、我能夠自定義一個目錄,好比/root/mybin,把它加入到PATH麼?

二、我能夠省略上面的touch命令,直接使用重定向生成文件麼?

三、除了放到PATH和相對路徑,還有沒有其餘的命令執行方式?

5. Linux漫遊方式

想要了解linux的基本使用方法,就要了解一個基本的事實--linux系統中,一切皆文件。

無論是命令,仍是文檔,甚至設備,目錄,套接字,在linux上對它們的操做都是一致對待的。許多開發驅動程序的小夥伴,會發現使用的一些函數,和讀寫文件的沒什麼兩樣(open、close、read、write、ioctl)。今天咱們所說的基本操做,針對的就是普通文件和目錄,本小節將詳細解釋相關命令。

5.一、當前路徑

到如今爲止,咱們還不知道本身在系統的什麼地方。在瀏覽器上,咱們可以經過導航欄上的url,瞭解到本身在互聯網上的具體座標。類似的功能,是由pwd命令提供的,它可以輸出當前的工做目錄。

pwd命令是很是很是經常使用的命令,尤爲是在一些命令提示符設置不太友好的機器上。另外,它也常常用在shell腳本中,用來判斷當前的運行目錄是否符合需求。

有不少線上事故,都是因爲沒有確認當前目錄所引發的。好比rm -rf *這種危險的命令。在執行一些高危命令時,隨時確認當前目錄,是個好的習慣。

[root@localhost ~]# pwd
/root
複製代碼

咱們使用root用戶默認登錄後,就停留在/root目錄中。Linux中的目錄層次,是經過/進行劃分的。

5.二、文件系統用戶標準

Linux的文件系統,從一開始就有一個規範標準。它還有一個專有縮寫名詞,叫作FHS (Filesystem Hierarchy Standard)。FHS通過多年的演進,目錄結構也愈來愈清晰。除了一些標準的要求,還有一些使用者之間的約定。

接下來,咱們大致看一下linux上的默認目錄,對其有一個基本的感受。

第1層 第二層 介紹
/bin 目錄/usr/bin的軟連接
/sbin 目錄/usr/sbin的軟連接
/lib 目錄/usr/lib的軟連接
/usr /bin 存放一些經常使用的命令
/usr /sbin 存放一些管理員經常使用的命令
/usr /lib 用來存放動態庫和一些模塊文件
/sys 內核中的數據結構的可視化接口
/proc 內存映像
/run 內存映像
/boot 存放引導程序,內核相關文件
/dev 存放一些設備文件,好比光盤
/etc 用於存儲一些全局的、應用的配置文件
/var 與/var/run同樣,存放的是系統運行時須要的文件,好比mysql的pid等
/tmp 很是特殊的臨時文件夾,斷電丟失
/home /** 用戶目錄,好比個人目錄是/home/xjjdog
/root root用戶的home目錄
  • home 日常,咱們打交道最多的目錄,就集中在本身的用戶目錄,咱們能夠在裏面作任何操做,好比咱們如今root用戶的/root目錄。一些本身的資料,好比視頻、音頻、下載的文件,或者作測試用的一些數據資料,就能夠自行在這些目錄下規劃。root用戶比較特殊,普通用戶的私人目錄都是在/home下的。

  • /etc etc目錄是常常要打交道的目錄,存放了一些全局的系統配置文件和應用配置文件。好比你安裝了php,或者nginx,它們的配置文件就躺在/etc目錄下的某個文件夾裏。

  • /var var目錄存放一些運行中的數據,有必須的,也有非必須的。一些黑客入侵以後,會在這裏面的某些文件中留下痕跡,他們會着重進行清理。var目錄仍是一些應用程序的默認數據存放之地,好比mysql的數據文件。

  • /tmp 目錄是一個特殊的臨時目錄,文件在斷電之後就消失了。但這個目錄,全部的用戶,都有寫入權限,一般用來作文件交換用。

  • /proc/sys目錄,是兩個神奇的目錄。它們兩個是一種僞文件系統,能夠經過修改其中一些文件的狀態和內容,來控制程序的行爲(修改後會直接刷到內存上,太酷了)。剛開始的時候,只有proc目錄,因爲裏面內容有多又亂,後面又規劃出sys目錄,用來控制內核的一些行爲。若是你在調優一些系統參數,和這些文件打交道的時間比較多。

  • 還有幾個空的目錄,咱們沒有列在上面的表格上。好比/srv目錄,一般會把一些web服務的資料,好比nginx的,放在這裏面。可是,這並非強制要求的,因此我見過的/srv目錄,一般會一直是空的。一樣的,/opt目錄也是這樣一個存在,你就當它不存在就行。這都屬於使用者規劃的範疇,自定義性很是強。

  • 在使用Linux系統的時候,也能夠建立本身的目錄。好比,我就喜歡本身建立一個叫作/data的目錄,用來存放一些數據庫相關的內容。舉個例子,/data/mysql存放mariadb的數據,而/data/es/存放elasticsearch的索引內容。

linux上的文件類型有不少,它們大部分都分門別類的存放在相應的目錄中,好比/dev目錄下,就是一些設備文件;/bin文件下,是一些能夠執行命令。一般都好記的很。

5.三、查看文件列表

因此,上面的表格內容,我是怎麼看到的呢,靠記憶麼?ls命令,可以列出相關目錄的文件信息。能夠被評爲linux下最勤勞的命令標兵。

如今的終端,都可以輸出彩色的信息,很是的直觀。oh-my-zshoh-my-bash等項目,可讓你的終端更加的漂亮。把它加入到你的研究清單裏吧。

[root@localhost /]# ls /
# 注意:ls能夠接受路徑參數,你不用先跳轉,就能夠輸出相關信息
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@localhost /]# ls -l /
# 帶上 -l參數,能夠查看一些更加詳細的信息。
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最經常使用的,就是加參數l或者參數a

5.3.一、詳細信息

加上參數l,可以看到文件的一些權限信息已經更新日期等。但咱們還看到了一些更有意思的東西。好比:

lib -> usr/lib
複製代碼

上面表示的,是軟連接信息。

就如同咱們上面表格所展現的同樣,lib目錄,是/usr/lib的快捷方式,它們之中的內容,沒有什麼兩樣。

關於ls -l展現的更加詳細的內容,能夠參照我下面的這張圖。咱們將在瞭解後面小節的內容後,再次對這張圖進行回顧。

5.3.2 隱藏文件

直接在你的/root目錄裏,執行ls -al,你會看到更多東西。這些額外的隱藏文件,都是以.開頭,以配置文件居多。這就是參數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.四、切換目錄

執行cd命令,能夠將工做目錄切換到目標文件夾。爲了展現cd命令的效果。請在root用戶下,執行下面的命令,這將建立一個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層目錄,只需使用多層級的../便可。有幾個特殊的變量,須要說明一下。

  • ../ 指的是上層目錄
  • ../../ 指的是上兩層目錄
  • ./ 指的是當前目錄
  • ~ 指的是當前的用戶目錄,這是一個縮寫符號
  • - 使用它,能夠在最近兩次的目錄中來回切換

咱們來使用命令把上面這些特殊變量驗證一下。

# 跳轉到用戶根目錄
[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命令的經常使用用法。如今,咱們返回頭來看一下mkdir。顧名思義,就是建立目錄的意思,但通常在工做中,都會加上-p參數,這樣就能夠一次性建立多層目錄。注意mkdir後面的大括號{},能夠一次性的指定多個目錄進行建立,這一般能節省不少時間。

5.五、文件操做

使用命令行操做文件,是很是方便的。

  • touch 新建文件
  • cp 複製文件
  • mv 移動文件
  • rm 刪除文件

這四個風騷的命令,主宰着文件資料的去向。咱們依然使用上面建立的目錄,進行接下來的操做。

# 建立三個文件
[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: ‘a1/b2/c3/d4/e5/f6/g7’
removed directory: ‘a1/b2/c3/d4/e5/f6/g8’
removed directory: ‘a1/b2/c3/d4/e5/f6/g9’
removed directory: ‘a1/b2/c3/d4/e5/f6/g10’
removed directory: ‘a1/b2/c3/d4/e5/f6’
removed directory: ‘a1/b2/c3/d4/e5’
removed directory: ‘a1/b2/c3/d4’
removed directory: ‘a1/b2/c3’
removed ‘a1/b2/icu.txt’
removed directory: ‘a1/b2’
removed ‘a1/996.txt’
removed directory: ‘a1/’

[root@localhost ~]# ls
007.txt   anaconda-ks.cfg
複製代碼

通過一番操做之後,只剩下了007了。除了上面基本的操做,接下來我要介紹一些更加劇要的功能。

能夠看到在使用rm刪除文件的時候,進行了一次提示。這是爲了不誤刪除一些東西,但有時候,你須要不顯示這種提示,就能夠加-f參數。f參數對於cp、mv等命令來講,一樣適用,它是force的意思。

rm -f file
cp -f file1 file2
mv -f file1 file2
複製代碼

另外,還有一個參數-r,這是遞歸的意思。咱們的目錄和文件,一般有多個層次,遞歸能夠把操做所有做用於上面,好比上面的遞歸刪除a1目錄。

# 警告:如下命令會形成嚴重後果
rm -rf /
複製代碼

上面的這個命令,你必定常常看到。這不是笑話,已經有不少用戶所以丟失了數據,這就是傳說中的刪根,最終你將一無全部。那參數v又是幹什麼用的呢?加上它以後,能夠看到命令詳細的執行過程。在日常的操做中,我通常都加上。

6.開始操做文件

你可能已經瞭解到,ll -l命令的第一列,可以顯示linux的文件類型。請對此有一個大致的印象,由於後面的不少命令,會用到這些知識。

  • - 表示普通文件
  • d 表示目錄文件
  • l 表示連接文件,好比快捷方式
  • s 套接字文件
  • c 字符設備文件,好比/dev/中的不少文件
  • b 表示塊設備文件,好比一些磁盤
  • p 管道文件

Linux上的文件能夠沒有後綴,並且能夠建立一些違背直覺的文件。好比後綴是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類型的,普通文本文件。接下來,咱們要建立一些文件。而後寫入一些內容到文件裏,以便進行後續的操做。

6.一、建立一個文件

6.1.一、數字序列

使用重定向符,可以直接生成文件。下面,我要生成10到20的數字,每個數字單獨一行,寫入一個叫作spring的文件。巧的很,seq命令能夠完成這個過程。

seq 10 20 >> spring
複製代碼

咱們在前面提到過>的意思,是將前面命令的輸出,重定向到其餘地方。在這裏,咱們用了兩個>,它依然是重定向的意思,但表示的是,在原來文件的基礎上,追加內容。

也就是編程語言裏的w+a+的意思。

6.1.二、查看內容

爲了查看文件的生成效果,能夠使用cat命令檢測。cat命令將會把文件的內容,輸出打印到終端上。若是加上參數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
複製代碼

除了查看文件內容,cat命令一般用在更多的地方。只有和其餘命令聯合起來,它纔會以爲生活有意義。

# 合併a文件和b文件到c文件
cat a  b>> c

# 把a文件的內容做爲輸入,使用管道處理。咱們在後面介紹
cat a | cmd

# 寫入內容到指定文件。在shell腳本中很是經常使用。咱們在後面會屢次用到這種寫法
cat > index.html <<EOF <html> <head><title></title></head> <body></body> </html> EOF
複製代碼

因爲咱們的文件不大,cat命令沒有什麼危害。但假如文件有幾個GB,使用cat就危險的多,這隻叫作的小命令,會在終端上瘋狂的進行輸出,你能夠經過屢次按ctrl+c來終止它。

6.二、平和的查看文件

既然cat命令不適合操做大文件,那必定有替換的方案。less和more就是。因爲less的加載速度比more快一些,因此如今通常都使用less。它最主要的用途,是用來分頁瀏覽文件內容,並提供一些快速查找的方式。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 退出less
  • g 到開頭
  • G 去結尾
  • j 向下滾動
  • k 向上滾動,這兩個按鍵和vim的做用很是像

6.三、文件頭尾

head能夠顯示文件頭,tail能夠顯示文件尾。它們均可以經過參數-n,來指定相應的行數。

[root@localhost ~]# head -n 3 spring
1
2
3
[root@localhost ~]# tail -n 3 spring
9999998
9999999
10000000
複製代碼

對於部分程序員來講,tail -f或許是最經常使用的命令之一。它能夠在控制終端,實時監控文件的變化,來看一些滾動日誌。好比查看nginx或者tomcat日誌等等。一般狀況下,日誌滾動的過快,依然會形成一些困擾,須要配合grep命令達到過濾效果。

# 滾動查看系統日誌
tail -f /var/log/messages

# 滾動查看包含info字樣的日誌信息
tail -f /var/log/messages | grep info
複製代碼

對於tail命令來講,還有一個大寫的參數F。這個參數,可以監控到從新建立的文件。好比像一些log4j等日誌是按天滾動的,tail -f沒法監控到這種變化。

6.四、查找文件

考慮下面這個場景。咱們須要找一個叫作decorator.py的文件,這個文件是個幽靈,可能存在於系統的任何地方。find命令,可以勝任此次捉鬼行動。

咱們使用find命令,從根目錄找起,因爲系統的文件過多,下面的命令可能會花費一段時間。

[root@localhost site-packages]# find / -name decorator.py -type f
/usr/lib/python2.7/site-packages/decorator.py
複製代碼

使用time命令,能夠看到具體的執行時間。執行仍是挺快的麼!秒出!

[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參數?忘了它吧,很差用!

# 刪除當前目錄中的全部class文件
find . | grep .class$ | xargs rm -rvf

# 找到/root下一天前訪問的文件,type後面的類型參見文章開頭
find /root  -atime 1 -type f

# 查找10分鐘內更新過的文件
find /root  -cmin  -10

# 找到歸屬於root用戶的文件
find /root -user root

# 找到大於1MB的文件,進行清理
find /root -size  +1024k  -type f | xargs rm -f
複製代碼

find的參數很是很是多,記不住怎麼辦?除了經常使用的,其實均可以經過man命令查看。man的操做也和vi很是的相似,輸入/EXAMPLES,會看到不少樣例。不過我以爲仍是上面列出的這些命令更加的適用。

6.4.一、數據來源

在上圖中,你會看到mtime,ctime,atime相似的字樣,它們的數據來自於何處呢?接下來咱們瓜熟蒂落的看一下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文件系統以塊爲單位存儲信息,爲了找到某一個文件所在存儲空間的位置,會用i節點(inode) 對每一個文件進行索引,你能夠認爲它是一個文件指針。

  • 文件的字節數
  • 文件擁有者user
  • 文件所屬組group
  • 文件的讀、寫、執行權限
  • 文件的時間戳
    • ctime指inode上一次變更的時間
    • mtime指文件內容上一次變更的時間
    • atime指文件上一次打開的時間。
  • 連接數,即有多少文件名指向這個inode (ln命令)
  • 文件數據block的位置(具體的數據位置)

關於inode是一個比較大的話題,也是比較重要的知識點,有興趣的能夠自行搜索。咱們只須要知道這些信息是從這裏來的就能夠了。

6.4.二、小練習

若是我只想獲取Modify這個數值,能夠組合使用一下上面學到的命令。首先獲取最後三行,而後獲取首行。效果以下:

[root@localhost ~]# stat spring | tail -n 3 | head -n 1
Modify: 2019-11-04 17:59:38.823458157 -0500
複製代碼

下面幾個命令,效果是與上面等價的,輸出結果也是如出一轍。正所謂條條大路通羅馬,接下來,咱們首先介紹一下出現頻率較高的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.五、字符串匹配

grep用來對內容進行過濾,帶上--color參數,能夠在支持的終端能夠打印彩色,參數n則用來輸出具體的行數,用來快速定位。這是一個必需要熟練使用的命令。

好比:查看nginx日誌中的POST請求。

grep -rn --color POST access.log
複製代碼

推薦每次都使用這樣的參數。

若是我想要看某個異常先後相關的內容,就能夠使用ABC參數。它們是幾個單詞的縮寫,常常被使用。

  • A after 內容後n行
  • B before 內容前n行
  • C 內容先後n行

就像是這樣:

# 查看Exception關鍵字的前2行和後10行
grep -rn --color Exception -A10 -B2   error.log

#查找/usr/下全部import關鍵字,已經它們所在的文件和行數
grep -rn --color import /usr/
複製代碼

6.六、管道

在上面的命令中,咱們屢次用到了|,這貌似能夠完成一些神奇的事情。|pipe的意思,它能夠把多個命令聯繫起來。一般,命令有下面的關聯方式:

  • ; 順序執行,如mkdir a;rmdir a
  • && 條件執行,如mkdir a && rmdir a
  • || 條件執行,如mkdir a || rmdir a,後面的命令將不執行
  • | 管道,前面命令的輸出,將做爲後面命令的輸入

前三種的命令關聯,是很是簡單有邏輯的,很是的好理解。而管道,卻有本身的特色。

接觸過編程語言的都知道stdinstdoutstderr的概念。讓咱們從新組織一下針對於管道的定義:前面命令的輸出(stdin),將做爲後面命令的輸入(stdout)。

咱們拿一行命令來講明。

seq 20 100 | head -n 50 | tail -n 1
複製代碼

上面命令,將輸出69。69是個神奇的數字,它是怎麼辦到的呢?咱們來一張小圖,一切就豁然開朗了。

關於輸入輸出和錯誤,linux使用一個數字進行縮寫,這在一些腳本中,甚至在一些安裝文件中,會常常用到。

  • 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.七、排序

在瞭解管道的工做原理以後,就能夠介紹一下sort命令了。它一般能夠和uniq(去重)命令聯合,完成一些排序、去重的操做。首先使用cat命令,生成以下內容的文件。

cat > sort.txt <<EOF 1 11 3 22 2 44 4 33 5 55 6 66 6 66 EOF
```bash
接下來讓這兩個命令上臺表演一下。 sort能夠使用-t指定分隔符,使用-k指定要排序的列。可是空格,是不須要作這些多此一舉的指定的。
```bash
# 根據第一列倒序排序
[root@localhost ~]# cat sort.txt | sort -n -k1 -r
6 66
6 66
5 55
4 33
3 22
2 44
1 11

# 統計每一行出現的次數,並根據出現次數倒序排序
# 此時,行數由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命令,通常用在已經通過排序的結果集上。因此,不少狀況須要首先使用sort命令進行排序後,再使用uniq命令。新手常常會忘記第一步,形成命令不能正常運行。

6.八、小練習

本部分,咱們從文件的屬性開始提及,瞭解了幾個對文件操做的經常使用命令。並順便介紹了管道的概念。下面,咱們來練習一下。

找到系統中全部的grub.cfg文件,並輸出它的行數。

分析:首先須要使用find命令,找到這些文件。而後使用xargs逐行處理。最後,使用wc命令,統計確切的行數。

[root@localhost grub2]# find / | grep grub.cfg | xargs wc -l
141 /boot/grub2/grub.cfg
複製代碼

輸出系統的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.九、思考&擴展

一、Linux的終端,是如何實現彩色的文字的?我要如何輸出一個綠色的Hello World?

二、軟連接與硬連接有什麼區別?

三、瞭解幾個偏門但又不是很是偏的命令。

  • cut 有了awk,幾乎不怎麼會用cut了
  • tr
  • col
  • paste
  • join
  • split

7. 正則和高級用法

你可能遇到一些棘手的問題,經過搜索獲得想要的結果,但下次仍是要經過搜索解決問題,這種低效的手段不是咱們所想要的。典型的就是一個線上運維工程師,當問題來臨時,不會給你留太多的現場學習時間。

爲了達到更高效的訓練,咱們要作兩件事情:第一,總結概括;第二,舉一反三。Linux的命令也是如此,一個問題,一般會有多種解決方式,要經過變化找出其中的共性。

這涉及到一些設計者對於規範約定俗成的遵照。通常的,你只須要掌握一小部分命令,而後對大批命令達到了解的程度,就能夠在命令行的世界裏遊刃有餘。舉個例子,你知道ls是列出文件目錄,你就會聯想到lscpu是列出cpu信息;lsmem是列出內存信息;lsblk是磁盤信息等。這種共性不少,好比top系列,stat系列。

7.一、輔助信息

7.1.一、Linux文件格式

在Linux上工做,是很是很是排斥二進制這種格式的,幾乎什麼都是能夠讀寫的文本內容。大多數命令生成的結果,也都是文本文件。這些文件有一些特色,一般列與列都是經過空格或者<TAB>鍵分隔的。好比下面lsmem的結果,這種有規律的,有章可循的文件,是很是容易被處理的。

[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
複製代碼

有一大批針對於行操做的命令,一樣有一批針對於列操做的命令。而後,有兩個集大成者,叫作sedawk。因爲這兩個命令的內容很是多,咱們將其列爲單獨的章節。

7.1.二、命令記不住怎麼辦?

一般linux命令都十分簡單,可是有些仍是有些複雜度的。好比findps這種命令,若是要照顧到全部的場合,可能須要很是巨大的篇幅。可是,萬一用到這種偏門的場合怎麼辦?

全面瞭解一下是很是有必要的,以便在使用的時候可以喚起記憶中最淺顯的印象。而後剩下的,就能夠交給相似於man 的這種命令了。Linux上的每個命令,都會有配套的幫助文件,這遠比網絡上那些轉來轉去的信息,正確的多。

正式介紹一下下面的兩個命令:

  • man 用來顯示某個命令的文檔信息。好比:man ls
  • info 你能夠認爲和man是同樣的,雖然有一些可以互補的內容。它們會在內容中進行提示的
  • --help 不少命令經過參數--help提供很是簡短的幫助信息。這一般是最有用最快捷的用例展現。若是你根本就記不住一個很是拗口的單詞,那就找找這些地方吧

注意:這些幫助信息,僅集中在命令的做用域自己。對於它的組合使用場景,並無過多信息。也就是說,它教會了你怎麼用,但並無告訴你用它可以來作什麼。

這些幫助命令,通常會經過高亮關鍵字,增長閱讀的體驗。但咱們能夠更近一步,把幫助文件變成彩色的。在root用戶下,執行下面的命令。而後,從新登陸虛擬機

cat >> ~/.bashrc <<EOF 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
複製代碼

再次執行man命令,就能夠看到彩色的信息了。

1.三、TAB補全

如今,在終端裏,輸入ca,而後快速按2次<TAB>鍵盤,命令行會進入補全模式,顯示以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.二、正則表達式

爲了開始下面的內容,咱們首先介紹一下正則表達式。在前面的一些命令中,也能夠使用這些正則表達式,好比less、grep等。

有些書籍,可以把正則表達式寫成一本書,咱們這裏僅做簡單的介紹,但足夠用了。通常的,正則表達式能用在匹配上,還可以把匹配的內容拿來作二次利用。關於後者,咱們在sed命令中介紹。

標誌 意義
^ 行首
$ 行尾
. 任意單個字符
* 匹配0個或者多個前面的字符
+ 1個或者多個匹配
? 0個或者1個匹配
{m} 前面的匹配重複m次
{m,n} 前面的匹配重複m到n次
[] 匹配一個指定範圍內的字符
[^] 匹配指定範圍外的任意單個字符
\ 轉義字符
[0-9] 匹配括號中的任何一個字符,or的做用
` `
\b 匹配一個單詞。好比\blucky\b 只匹配單詞lucky

使用下面的命令建立一個文件,咱們練習一下grep命令加上E參數後的正則表現。

cat > 996 <<EOF 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
複製代碼

在終端執行下面命令,注意高亮的部分即爲匹配到的字符串。

# 匹配996開頭的行
[root@localhost ~]# cat 996 | grep -E ^996
996: 996 is a funcking thing . which make woman as man , man as ass .

# 匹配996結尾的行
[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編輯器中,都會簡化你的操做。以上內容應該熟記,達到不須要查找文檔的地步。

下面有6個小問題,能夠思考一下。

一、回過頭去,執行一下man cat,是否發現了一個叫作tac的命令?它是幹什麼的?

二、上面提到的stat系列,你能想象iostat大致是幹什麼用的麼?

三、grep -v是什麼意思?

四、瞭解一下和mv很是像的rename命令來批量修改文件,看可否使用上面的正則。

五、有些命令若是拼寫錯誤,如何快速修正?靠搜索麼?瞭解一下fuck命令。我沒有說錯。

六、下面哪一種寫法表示若是cmd1成功執行,則執行cmd2命令?

  • A. cmd1&&cmd2
  • B. cmd1|cmd2
  • C. cmd1;cmd2
  • D. cmd1||cmd2

8. Linux下的壓縮

壓縮,是一件很是神奇的事情。

好久好久以前,就接觸過一些64KB大小的電影,你花半小時都看不完。事實上,這些動畫的真實容量是15GB,Warez組織把它壓縮了25萬倍

你要是Windows系統,能夠在這裏下載體驗一下。但咱們如今講的是Linux,很打臉是否是?

連接: https://pan.baidu.com/s/12YJQ4jsbtRr7RxoLpARTyQ 
提取碼: r7sp
複製代碼

壓縮是件神奇的事。它能大能小,能伸能縮,在現實中很難找到這樣的東西。

爲了減少傳輸文件的大小,或者爲了傳輸方便,通常都會開啓壓縮。linux下常見的壓縮文件有tar、bzip二、zip、rar等,7z這種用的相對較少。壓縮以後的文件,很是適合在網絡環境上傳輸。甚至,你能夠認爲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,就能夠看到咱們剛纔建立的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通常是聯合使用的。tar命令提供了一種特殊的功能,就是能夠在打包解包的同時調用其餘的壓縮程序,好比:gzip,bzip2等。

下面的命令,與上面執行兩次命令後是等同的。因此,通常使用下面的方式進行操做。

[root@localhost ~]# tar cvfz files2.tar.gz files
[root@localhost ~]# du -h files2.tar.gz
12K	files2.tar.gz
複製代碼

與之對應的,就是解壓操做。咱們只須要改動命令行中的一個字母便可:c->x。但其實,參數vz也是能夠省略的。

[root@localhost ~]# tar xvfz files2.tar.gz
複製代碼

咱們更加經常使用的方式,是加上參數C,指定一個要解壓的目錄。好比下面的命令,把壓縮內容解壓到/opt目錄中。

[root@localhost ~]# tar xvfz files2.tar.gz -C /opt/
複製代碼

那若是我僅僅想要看下壓縮文件中包含哪些文件呢?這就要使用參數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)
複製代碼

因此,咱們的系統並無安裝這兩個應用。那我就使用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文件並不能被解壓。不要緊,咱們在後面的章節把它安裝上。

如今,你會在Linux安裝tomcat了麼?

接下來,咱們思考一下:

一、 通過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
複製代碼

二、若是已經有了文件,tar命令是如何作到強制覆蓋的?

9. Linux的權限體系

咱們在最最最上面,剛接觸命令行的時候,就使用chmod命令,給普通文本文件,賦予了執行權限。本小節將看一下用戶權限文件權限這兩個息息相關的概念,

9.一、添加用戶

到如今爲止,咱們的系統中,還孤零零的只有這一個用戶,是時候學學女媧,捏幾個小泥人了。

首先建立兩個用戶:張三(zhang3)、李四(li4)。

[root@localhost ~]# useradd zhang3
複製代碼

查看下面命令的三個輸出結果。

# 系統中多了一個叫作zhang3的組,group文件保存了系統的組信息
[root@localhost ~]# tail -n1 /etc/group
zhang3:x:1000:

# 系統中多了一個叫作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.
複製代碼

那麼如何刪除一個現有的用戶呢?這是經過userdel命令實現的。加上參數f,會在其餘用戶使用系統的時候,強制退出。

userdel -f zhang3
複製代碼

9.二、文件權限說明

從上面的命令執行結果中,咱們發現了有兩件很是有意思的東西。添加用戶後,除了在密碼文件shadow中增長了一些內容,同時還在group文件中添加了信息。這涉及到用戶的兩個屬性:用戶名,組名。

一個用戶只有一個名稱代號,可是能夠有多個組。下面命令建立一個密碼爲123的用戶li4,並給它追加一個叫作zhang3的組。能夠看到/etc/group文件中的信息變動。

[root@localhost ~]# useradd -G zhang3 -p 123 li4
[root@localhost ~]# tail -n 2 /etc/group
zhang3:x:1000:li4
li4:x:1001:
複製代碼

好啦,接下來切換到咱們的文件權限上面。爲了進行下面命令的驗證,咱們首先建立一個名字叫confirm777.sh的腳本文件。爲了讓腳本對全部用戶可見,咱們把它建立在/tmp目錄下。

cat > /tmp/confirm777.sh <<EOF 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組,它的權限是rw-r--r--。文件權限分爲三部分。

  • 全部者權限,縮寫爲u。文件的全部者所擁有的權限。也就是root用戶的權限,是rw-
  • 組用戶權限,縮寫爲g。文件所屬組內全部用戶的權限。由於root組內只有root一個用戶,因此組用戶權限是r--
  • 其餘用戶權限,縮寫爲o。其餘不相關用戶的權限,好比咱們剛建立的zhang三、li4用戶,對文件的權限就是r--
  • 所有,縮寫爲a,表示對上面三類用戶集體操做。

那rw-這些東西是什麼意思呢?

  • r 表示可讀權限。read。
  • w 表示可寫權限。write。
  • x 表示可執行權限。execute。
  • - 權限佔位符,表示沒有當前權限。

注意:一個用戶擁有文件的w權限,並不表明就能夠刪除文件。w僅僅針對於文件內容來講的。

一個文件,有3類用戶,每類用戶,有3種權限。使用最簡單的小學乘法,咱們可以得出,一個文件的權限位,須要3x3=9個標誌位表示。

咱們的文件名稱,叫作confirm777.sh,這個名字是隨便起的麼?固然不是,777在linux表明特殊的含義,它表明文件對全部用戶具備可讀、可寫、可執行的權限。能夠想象,若是每一個文件都有這樣的權限,系統將無安全可言。那這一串數字是怎麼來的呢?能夠看下面的對照表。

  • r 4
  • w 2
  • x 1 執行

對以上三個屬性進行任意組合,能夠獲得:

  • 4 r-- 4+0+0
  • 6 rw- 4+2+0
  • 5 r-x 4+0+1
  • 2 -w- 0+2+0
  • 3 -wx 0+2+1
  • 1 --x 0+0+1
  • 7 rwx 4+2+1

9.三、文件權限更改

下面介紹三個文件權限相關的命令。通常經常使用的,就是chown和chmod。

chown 更改文件的全部者。 chgrp 更改文件的組。 chmod 更改文件權限。

接下來,咱們把confirm777.sh的全部者和組,修改爲剛剛建立的用戶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
複製代碼

給文件全部者增長執行權限。而後分別切換到zhang3li4用戶執行一下。

經過su 命令,能夠切換到其餘用戶,通常使用su -進行環境變量的清理;而命令id,可以看到當前正在執行的用戶信息。

[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能夠執行文件,但不相關的li4,提示沒有權限。接下來,咱們驗證用戶組相關的權限位。

# 去掉zhang3的執行權限
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組的執行權限,因爲li4在zhang3組裏,它擁有權限
[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進行執行
[root@localhost tmp]# su - zhang3
[zhang3@localhost tmp]$ ./confirm777.sh
bash: ./confirm777.sh: Permission denied
[zhang3@localhost tmp]$ exit
exit

# 切換到li4進行執行
[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
複製代碼

從命令的執行結果能夠看出。此次,li4可以執行文件,相反的,zhang3卻不能。

咱們使用chmod命令來修改文件權限,使用的是相似於a+x這樣的英文字母。拿第一個腳原本說,初始的權限是rw-r--r--,也就是644,在這種狀況下,下面的兩個腳本等效。

chmod u+x confirm777.sh
chmod 744 confirm777.sh
複製代碼

能夠看到,第二個命令,使用的是數字樣式的權限位,多了一步人腦轉換過程。這在平常的使用中,是很是不方便的。因此,使用符號法的表示方式,可以更加直觀,很是推薦。

爲了更直觀的表現這個過程,我專門製做了一張圖。

9.四、目錄權限

這裏有一個很是有意思的地方。把文件設置成可執行,能夠把普通文件變成腳本,目錄文件的可執行權限是什麼鬼?有什麼意義?對文件夾來講:

  • r 表示容許讀取目錄中的文件名,但不能進入該目錄
  • w 表示容許用戶修改目錄,能夠建立、遷移、刪除、改名目錄下的文件
  • x 能夠得到目錄下文件的列表,以及進入目錄,執行cd命令

關於r和x的區別,能夠看下面的命令結果,仔細感覺一下它們的區別。通常的,幾乎全部的目錄,都擁有執行權限,不要隨意對其進行設置。

[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.五、sticky bit

接下來,咱們介紹一個比較燒腦的粘貼位。

假如你要刪除一個文件,你能夠沒有這個文件的寫權限,可是你必需要擁有這個文件上級目錄的寫權限。如何建立一個目錄,可讓任何人些人文件,可是又不能刪除其餘用戶的文件?這就是stick bit的做用。粘貼位通常只用於目錄上,對文件來講並無什麼用處。粘貼位通常使用t表示。

咱們能夠看一個典型的目錄/tmp

[root@localhost tmp]# ls -dl /tmp
drwxrwxrwt. 9 root root 4096 Nov  7 06:27 /tmp
複製代碼

能夠看到,最後一位,顯示的是t,而不是x,意思是普通用戶不能刪除其餘用戶的文件。全部用戶在/tmp目錄中,均可以隨意建立文件,可是卻刪除不了其餘人的文件,即便文件的權限是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
複製代碼

咱們在上面建立了兩個用戶zhang3和li4,並拿它們測試了chown和chmod命令,最後介紹了粘貼位。linux比較安全的緣由,就是由於有比較詳盡的權限劃分。但權限是枚雙刃劍,超權用戶一個命令就能夠搞垮系統,許多隱藏的木馬,經過提權運行在鮮爲人知的地方。

權限相關的幾個命令會常常被使用,下面舉幾個例子。

# 設置/var/lib/mysql的用戶和組爲mysql
chown -R mysql:mysql /var/lib/mysql

# 設置目錄可讀可寫,可以上傳文件
chmod  777 /var/www/uploads

# 增長本目錄下全部sh的執行權限
chomd a+x *.sh

# 變動file爲可讀可寫可執行
chmod u=rwx,g=rwx,o=rwx file
複製代碼

下面依然是思考時間:

一、下面這個命令,執行之後,會發生什麼狀況?警告:不要執行,哪怕把000改爲其餘數字。

# R遍歷子目錄的意思
chmod -R 000 /
複製代碼

二、有一天,我看到一個命令chmod u+s file,文中並無介紹s是什麼意思,這是什麼意思?

三、如何刪除一個用戶的組?

10. 如何對磁盤進行操做?

下面的場景很是的恐怖,對有些程序員來講能夠是一場噩夢。

一大早剛剛去上班,煎餅果子剛啃了一半,幾個全副武裝的警察就闖進了公司。二話不說控制住了工做人員,並守株待兔的等着魚兒來上班。

緣由就是:公司涉嫌存儲和擴散非法文件,須要查封全部的服務器進行徹查。

這些文件,有的簡單的放在磁盤上,有的放在文件存儲服務器上,有的,被切成了多片放在了不一樣的廉價機器上。

接下來會發生什麼,要看技術人員的水平,但估計結果並不會太好。

在上一小節,咱們建立了兩個普通用戶,這兩個用戶沒什麼本事,和默認的用戶root比起來,它們的權限就小得多。除了本身目錄下的文件,其餘的,它幾乎都沒有權限去修改。

這些文件,確定是要存在磁盤上的。對磁盤的管理,有很是多的命令,這一小節的內容,對於系統管理員來講,常用;但對於開發來講,就要求比較低一些。由於開發只須要知道小電影存在什麼地方了,不須要知道小電影是怎麼存的。

那定罪的時候,運維和程序員,究竟是誰的鍋更大一些?實際上是個悖論。運維人員在發呆的時候,腦子裏回憶起了下面的知識。

10.1.添加新硬盤

你要是一個系統管理員,甚至是一個上了雲的系統管理員,如今買了一塊aws的擴展盤,它是不能被使用的。須要通過格式化掛載之後,才能投入生產。

還記得在安裝系統的時候麼?其中有一步,須要對虛擬機的磁盤,進行劃分,咱們直接採用默認的方式。不過如今已經改不了了,它已是過去式了。

爲了模擬對磁盤的管理,咱們須要首先給虛擬機新加一塊虛擬磁盤。首先,使用shutdown -h now命令關閉機器,進行下面的操做。

一、 進入settings選項,而後切換到storage,添加磁盤

二、 點擊建立一塊磁盤

三、 選擇VDI

四、 動態擴容,用多少擴多少

五、 咱們建立一塊2GB大的,叫作disk2的磁盤

啓動機器。遠程鏈接192的ip,別忘了執行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
複製代碼

從命令的結果,咱們看到了有兩塊磁盤。/dev/sda/dev/sdb,其中sda已經被分配,已經被咱們的文件系統所佔用。如今,回憶一下/dev目錄的用途,在這個目錄下,存放了一些設備文件,假如咱們再添加一塊磁盤,它的句柄就應該是sdc (sd*)。

在這整塊磁盤可以被使用以前,咱們須要對它進行三次操做。

  1. 磁盤分區
  2. 磁盤格式化
  3. 磁盤掛載

10.2.分區

對磁盤分區依然是fdisk命令,如下命令,將進入交互模式。在交互模式中,輸入n新建分區。因爲咱們的磁盤只有2GB,因此只建立一個分區就好。根據嚮導,一路肯定向下,最後,輸入w肯定寫入分區表,同時退出命令交互。

再次執行fdisk -l,能夠看到已經多了一塊2gb大小的分區。

[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,而後按<TAB>進行補全,將會顯示一批命令。

[root@localhost ~]# mkfs.
mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs
複製代碼

這批命令,均可以對磁盤進行格式化。目前,最經常使用的磁盤格式是ext4。但咱們並無找到windows操做系統的FAT以及NTFS等格式,但它們在概念上是等同的。

下面介紹一下Linux下經常使用的磁盤格式。

  • btrfs GPL受權。是爲了替換ext系統而發起的。不熟悉,不過多評價。
  • cramfs 門針對閃存設計的只讀壓縮的文件系統,其容量上限爲256M,採用zlib壓縮,不多用
  • ext2 ext的早先版本。
  • ext3 ext2的改進。
  • ext4 使用最多。若是對其餘的不熟悉,老老實實用ext4吧。
  • minix 比較古老,也不經常使用。
  • xfs XFS 文件系統是擴展文件系統的一個擴展,是 64 位高性能日誌文件系統。centos7.0開始的默認文件系統。

咱們就錄鄉隨俗,將磁盤給格式化成xfs。

[root@localhost ~]# mkfs.xfs /dev/sdb1
複製代碼

注意:若是想要把磁盤格式化成fat32的格式,須要安裝一個軟件。

yum install dosfstools -y
複製代碼

10.4.掛載

最後一步,是使用mount命令掛載磁盤。咱們把它掛載到/data目錄。

df命令可以看到系統的磁盤使用情況,參數hhuman的意思,以比較容易讀的方式展示信息;lsblk則以另外一個角度查看系統磁盤掛載狀況。

[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文件。這種文件修改的時候必定要當心,不然會形成系統沒法啓動。

[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.交換分區

因爲內存的容量有限,如今的操做系統,都會使用磁盤模擬一個虛擬內存區域,用於緩衝一些數據。因爲磁盤的速度和內存不可同日而語,一般會形成應用程序的卡頓。卡歸卡,應用進程卻能夠所以苟延殘喘,續命。

swap分區,即交換區,系統在物理內存不夠時,與swap進行交換。即當系統的物理內存不夠用時,把硬盤中一部分空間釋放出來,以供當前運行的程序使用。當那些程序要運行時,再從swap分區中恢復保存的數據到內存中。

現代互聯網公司,通常對接口的響應時間有比較高的要求,swap分區通常是禁用的。關於swap,有下面幾個相關的命令。

# 製做交換分區
[root@localhost ~]# mkswap /dev/sdb1

# 禁用全部交換分區
[root@localhost ~]# swapoff -a

# 啓用交換分區
[root@localhost ~]# swapon
複製代碼

10.6 使用dd命令進行備份

下面的命令,將直接備份磁盤A到磁盤B。

# dd if=/dev/sda of=/dev/sdb
複製代碼

在上面的命令中,if表明輸入的文件,of表明輸出的文件。根據Linux下一切皆文件的原理,這裏的文件指的就是設備。

dd命令還能夠將整個磁盤打包成一個鏡像文件。好比下面的命令。

# dd if=/dev/hda of=~/hdadisk.img
複製代碼

固然,恢復磁盤的時候,也是至關簡單的,咱們只須要逆向操做就能夠了。

# dd if=hdadisk.img of=/dev/hda
複製代碼

End

這篇文章有6萬字,經歷了多個版本的整理,有小夥伴已經拿着它做爲了公司的培訓資料。到如今爲止,你已經對Linux的命令行有了比較客觀的瞭解。但我這裏還有不少可讓你更上一層樓的文章,好比vim、sed、awk的使用。下面是幾個擴展閱讀,一樣採用xjjdog專用的命令行三段解析法,但願對你有所幫助。

最經常使用系列,快速掌握三賤客↓

最經常使用的一套「Vim「技巧
最經常使用的一套「Sed「技巧
最經常使用的一套「AWK「技巧

荒島餘生系列

荒島餘生系列,快速掌握故障排查↓

Linux之《荒島餘生》(一)準備篇
Linux之《荒島餘生》(二)CPU篇
Linux之《荒島餘生》(三)內存篇
Linux之《荒島餘生》(四)I/O篇
Linux之《荒島餘生》(五)網絡篇

歡迎加個人好友xjjdog0,一塊入羣增長buff值。

做者簡介:小姐姐味道 (xjjdog),一個不容許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不同的味道。個人我的微信xjjdog0,歡迎添加好友,​進一步交流。​

相關文章
相關標籤/搜索