原創:小姐姐味道(微信公衆號ID:xjjdog),歡迎分享,轉載請保留出處。php
這是一份精細的,手把手的教程。html
有不少同窗微信問我,Linux命令這麼多,該怎麼從入門到精通?其實,這個事情很是的simple,這篇文章將會帶你飛。文章很是的長,要挑一個陽光明媚的sunshine weekend,耐心去搞定。java
本文將由一個Linux命令概覽開始,說明Linux命令的方方面面。若是你讀完這部分仍是一頭霧水,那麼就證實須要按照下面的小白教程去學習了,內容涵蓋了:如何挑選Linux發行版、如何安裝Linux系統,按照主題學習Linux系統的命令等。node
入門後的 學習方式:多敲多打,用條件反射替代大腦記憶--若是你未來或者如今要用它來吃飯的話。 其中,也有一些難啃的骨頭,關注小姐姐味道微信公衆號,咱們一塊兒用鋒利的牙齒,來把它嚼碎。python
這部分是給稍微有點Linux經驗的同窗準備的,若是你是初學者,請跳過此part直接進入第二部分。mysql
工做中,最常打交道的就是對目錄和文件的操做。linux提供了相應的命令去操做他,並將這些命令抽象、縮寫。linux
多是這些命令太經常使用了,多打一個字符都是罪過。因此它們都很短,不用阿拉伯數字,一個剪刀手就能數過來。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 /
複製代碼
linux上是黑漆漆的命令行,依然要面臨人生三問:我是誰?我在哪?我要去何方?
ls
命令可以看到當前目錄的全部內容。ls -l
可以看到更多信息,判斷你是誰。
pwd
命令可以看到當前終端所在的目錄。告訴你你在哪。
cd
假如你去錯了地方,cd命令可以切換到對的目錄。
find
find命令經過篩選一些條件,可以找到已經被遺忘的文件。
至於要去何方,可能就是主宰者的意志了。
這是是很是很是加分的技能。get到以後,也能節省更多時間來研究面向對象。小姐姐味道已經輸出了「最經常使用的vim、sed、awk技巧系列」。
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
複製代碼
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
複製代碼
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吧。
爲了減少傳輸文件的大小,通常都開啓壓縮。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
複製代碼
快去弄清楚它們的關係吧。
開機是按一下啓動按鈕,關機總不至因而長按啓動按鈕吧。對了,是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
複製代碼
-
可讓你乾淨純潔的降臨另外一個帳號,不出意外,推薦。
登錄一臺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
複製代碼
此命令,在找一些本地起了什麼端口
之類的問題上,做用很大。
還有一些在工做中常常會用到的命令,它們的出現頻率是很是高的 ,都是些熟面孔。
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
複製代碼
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就夠折騰一生。捷徑就是總結,深刻只有探索。白馬過隙,終會行雲流水,手到擒來。
物是人非,年華易老。惟有時光,不會辜負。
和Linux比較像的還有Unix,但若是你是一個二三十歲的小青年,你接觸到可能只有Linux的世界了。從手機,到服務器上普遍使用的centos
,到漂亮的桌面發行版ubuntu
,甚至是風靡全球的樹莓派
,處處都是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歷史,咱們不作過多介紹。下面介紹幾個經典的發行版本。
如今的Linux發行版本,已經有上千個,你要是喜歡、並且多金,你也能夠作一個。如何在這其中,找到最合適的版本,是須要通過一番折騰的。不少發行版本,實際上是很小衆的。
這不像是哲學領域的某些東西,真理掌握在少數人手中。只有得到良好發展,並獲得承認的Linux發行版,纔有它的價值,能夠說是徹頭徹尾的實用主義。
但這東西又像女友,剛開始感受風采迥異,各有千秋,到最後瞭解到是同樣的庸俗不堪。但有人就是喜歡Linux相關的工做,一干就是一生...
我能夠先說一下本身的歷程。剛開始,接觸的是紅帽redhat
,當時尚未分什麼企業版。用了一段時間之後,又切換成更穩定的slackware
。可是slackware上的程序更新實在太慢了,因而又切換成readhat血統的fedora
,這個版本的軟件保鮮度很高。其間,又嘗試了其餘幾個linux版本,最終,在2013年先後,換成了滾動升級的archlinux
,直到如今。
要我我的作個推薦的話:
一、我的用戶(技術),桌面版用ubuntu
=>archlinux
。
二、企業用戶,服務器,使用centos
。
這麼多Linux版本,其實有兩條主線。debian
系列和redhat
系列。不少發行版本,實際上是二次翻新,不少就直接拿這兩個基礎系列進行改造。正所謂:操做系統千千萬,都是帽子和大便。
下面這個屎同樣的圖表,就是debian。呃呃呃,和大便只差一個字母。
Debian計劃
是一個致力於建立一個自由操做系統的合做組織。它的特色是:穩定、安全,到如今爲止,已經發展了20多年了。咱們所熟悉的ubuntu,就是基於debian改進的。
紅帽是一家商業公司,涉足Linux比較早,如今對我的提供一些紅帽認證
之類的證書。如今雲主機使用較多的centos,包括紅帽公司的RHEL
,佔據了大部分服務器市場。近期,centos 8
推出了centos stream
滾動版本,看起來更像是一個正常的操做系統。
咱們看一下處於不一樣層次的幾個典型版本。從應用方面來講,linux有桌面、服務器、研究用等用途。
ubuntu的出現,對Linux的推廣有不可磨滅的貢獻。它是一個易於安裝的桌面版本(也有服務器版本),界面很是漂亮。ubuntu是基於debian系統的unstable分支修改的,包管理軟件是apt-get
。
它的建立者是Mark Shuttleworth
,南非企業家,世界上第二名自資的太空遊客。我想,不管是太空仍是ubuntu,這都是夢想吧。
centos是目前最流行的服務器版本。它是RHEL源代碼再編譯的產物,主要是爲了繞開一些法律問題。在包管理,甚至穩定性上,與紅帽企業版沒什麼差異。
archlinux採用滾動升級
的模式進行發行,盡全力提供最新的穩定版本。剛開始安裝,arch只提供一個基本的系統,甚至連界面都沒有,對初學者不是很友好。
可是,archlinux是很是乾淨的系統。不少軟件,只有你須要的時候纔會安裝。它的軟件和理念一般都是最新的,定製化很是強,深得許多Linux愛好者的喜好。
上面的archlinux,提供了編譯後的軟件包。用戶在安裝軟件時,只須要下載、解壓便可。gentoo將這個過程更近一步,能夠說更加的變態。它下載的是軟件的源代碼,而後在本地進行編譯,而後安裝。
這一般很是的蛋疼,由於下載、編譯會花費很是長的時間,但它有一個很是大的優勢,就是穩定。
這個系統比較底層,對技能要求更多,不太推薦。
LFS的全拼是「linux from scratch」,意思是從零構建一個linux系統。它有一個很是詳細的安裝文檔,教你怎樣編譯內核,編譯引導程序,編譯和配置必要的軟件。
這是一個瘋狂而必要的過程。若是你想要本身的Linux之上更上層樓,跟着文檔作一遍是受益無窮的。你須要通過屢次交叉編譯,最終使用chroot命令切換到新系統進行後續操做。
想作一個本身的發行版麼?從這開始吧。
kali linux是一個很是專業的發行版。若是你在作滲透方面的工做,將是一個很是好的選擇。
發行版的安裝包很是大,包含了常見的破解工具,滲透工具,攻擊工具。這很是的危險,我曾用它暴力破解了很是多的wifi密碼,成功的窺視了鄰居的隱私。仍是很是好用的。
工欲善其事,必先利其器。你可能會想到買一臺雲主機練練手,但那畢竟要花點銀子,咱們能夠本身安裝一個。咱們在上面提到,目前使用最普遍的,就是centos
。不論你是自建機房,仍是使用相似於阿里雲這樣的雲端環境,大多數都會提供centos
的安裝。
你可能會找到多種安裝虛擬機的方式。本小節,將使用虛擬雙網卡
的方式,準備一個純潔的環境。這一小節,圖片不少。
以阿里云爲例,默認第一位就是CentOS,提供了從7.6版本到舊版本的多個鏡像。
下面的文章,咱們就以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
的大小。咱們就用這個減肥版。
要想快速學習、體驗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) 安裝成功
這個時候,咱們安裝的虛擬機,還不能聯網,沒法把本身的意念傳達出去。因爲咱們沒有對虛擬機進行任何設置,因此使用的是默認的NAT
模式。
將光標聚焦到命令行窗口,而後輸入命令dhclient
。等待幾秒鐘,執行ping baidu.com
測試如下網絡,能夠看到可以正常訪問網絡了。
上面黑漆漆的窗口,就是咱們如今的Linux界面。有人以爲很醜,就像是在玩dos,但像我這種不可救藥的人,卻以爲格外的親切。
接下來的命令,咱們不會再截圖,而使用高亮的代碼塊表示。爲了避免至於讓人暈頭轉向,請先看下圖。
因爲NAT
模式的特色,咱們的虛擬機可以訪問外網,但沒法被外部發現。酒香竟怕巷子深。爲了解決這個問題,咱們須要再添加一塊網卡。
在作這些更改以前,須要首先關閉虛擬機。能夠強制關閉機器,也能夠在命令行中輸入:
shutdown -h now
複製代碼
虛擬機關閉後,再次點擊設置,切換到網絡適配器選項卡。如圖,添加一個新的網絡適配器,適配器類型爲Host-only Adapter
。經過這塊網卡,咱們的宿主機就可以訪問它了。
再次啓動虛擬機,執行dhclient
命令後,執行ip addr
查看主機的ip地址。能夠看到,咱們如今有兩塊網卡,兩個ip地址。
記錄下192打頭的網絡地址,咱們會使用外部的程序,好比XShell
、SecureCRT
等,進行鏈接。好比,我這裏的ip地址是:192.168.99.100
。不廢話,看圖。
小提示:關於虛擬網卡的網段,若是有差別。你能夠在全局設置裏,改爲和我同樣的。
你可能已經體驗到,經過虛擬機自帶的命令行界面進行輸入,侷限性很是大。經過遠程鏈接,能夠把終端界面切換到咱們熟悉的操做模式,若是可以顯示彩色的終端,那再好不過了。下面介紹幾個工具,通常的,使用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進行遠程鏈接。對於一些命令拷貝、驗證來講,要方便快捷的多。
萬事開頭難。面對黑漆漆的Linux窗口,要勇敢的走出第一步。不要怕輸錯了什麼,系統健壯的很。命令行一般會擁有比圖形界面更高的效率,更加劇要的是它能夠作自動化之類的小工具,這使得生產力產生質的飛躍。
如今,你已經安裝好了centos,並遠程鏈接上了它。咱們擁有了它,但並不能瞭解它的脾氣。接下來,讓咱們進入Linux命令行的世界。和我簽定契約吧,少年。
本小節會使用很是詳細的演進方式,來看一下一個命令,是怎樣生成和執行的。
好啦,咱們如今就在終端裏了。什麼叫作終端呢?你在不少黑客電影裏,看到的黑漆漆的界面就是,它提供了一個能夠輸入字符串的交互式界面,至於那些閃光的、掃描機同樣的東西,是不存在的。
嘗試輸入些什麼吧。 好比: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 ~]
,這部分叫作提示符,光標會一直跳動,等待你的輸入。這部分是能夠定製的,甚至能夠定製的十分漂亮。
到如今爲止,咱們什麼都沒獲得。按照程序員的想法來講,就要實現一個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目錄中,因此可以被識別到。
接下來,咱們把上面的命令,作成一個腳本。而後將這個腳本,放到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和相對路徑,還有沒有其餘的命令執行方式?
想要了解linux的基本使用方法,就要了解一個基本的事實--linux系統中,一切皆文件。
無論是命令,仍是文檔,甚至設備,目錄,套接字,在linux上對它們的操做都是一致對待的。許多開發驅動程序的小夥伴,會發現使用的一些函數,和讀寫文件的沒什麼兩樣(open、close、read、write、ioctl)。今天咱們所說的基本操做,針對的就是普通文件和目錄,本小節將詳細解釋相關命令。
到如今爲止,咱們還不知道本身在系統的什麼地方。在瀏覽器上,咱們可以經過導航欄上的url,瞭解到本身在互聯網上的具體座標。類似的功能,是由pwd
命令提供的,它可以輸出當前的工做目錄。
pwd
命令是很是很是經常使用的命令,尤爲是在一些命令提示符
設置不太友好的機器上。另外,它也常常用在shell腳本中,用來判斷當前的運行目錄是否符合需求。
有不少線上事故,都是因爲沒有確認當前目錄所引發的。好比rm -rf *
這種危險的命令。在執行一些高危命令時,隨時確認當前目錄,是個好的習慣。
[root@localhost ~]# pwd
/root
複製代碼
咱們使用root用戶默認登錄後,就停留在/root
目錄中。Linux中的目錄層次,是經過/
進行劃分的。
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文件下,是一些能夠執行命令。一般都好記的很。
因此,上面的表格內容,我是怎麼看到的呢,靠記憶麼?ls
命令,可以列出相關目錄的文件信息。能夠被評爲linux下最勤勞的命令標兵。
如今的終端,都可以輸出彩色的信息,很是的直觀。
oh-my-zsh
和oh-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
。
加上參數l
,可以看到文件的一些權限信息已經更新日期等。但咱們還看到了一些更有意思的東西。好比:
lib -> usr/lib
複製代碼
上面表示的,是軟連接信息。
就如同咱們上面表格所展現的同樣,lib
目錄,是/usr/lib
的快捷方式,它們之中的內容,沒有什麼兩樣。
關於ls -l
展現的更加詳細的內容,能夠參照我下面的這張圖。咱們將在瞭解後面小節的內容後,再次對這張圖進行回顧。
直接在你的/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
查看可讀的日期。
執行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後面的大括號{}
,能夠一次性的指定多個目錄進行建立,這一般能節省不少時間。
使用命令行操做文件,是很是方便的。
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
又是幹什麼用的呢?加上它以後,能夠看到命令詳細的執行過程。在日常的操做中,我通常都加上。
你可能已經瞭解到,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
類型的,普通文本文件。接下來,咱們要建立一些文件。而後寫入一些內容到文件裏,以便進行後續的操做。
使用重定向符,可以直接生成文件。下面,我要生成10到20的數字,每個數字單獨一行,寫入一個叫作spring
的文件。巧的很,seq
命令能夠完成這個過程。
seq 10 20 >> spring
複製代碼
咱們在前面提到過>
的意思,是將前面命令的輸出,重定向到其餘地方。在這裏,咱們用了兩個>
,它依然是重定向的意思,但表示的是,在原來文件的基礎上,追加
內容。
也就是編程語言裏的w+
和a+
的意思。
爲了查看文件的生成效果,能夠使用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
來終止它。
既然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
退出lessg
到開頭G
去結尾j
向下滾動k
向上滾動,這兩個按鍵和vim的做用很是像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
沒法監控到這種變化。
考慮下面這個場景。咱們須要找一個叫作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
,會看到不少樣例。不過我以爲仍是上面列出的這些命令更加的適用。
在上圖中,你會看到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) 對每一個文件進行索引,你能夠認爲它是一個文件指針。
關於inode是一個比較大的話題,也是比較重要的知識點,有興趣的能夠自行搜索。咱們只須要知道這些信息是從這裏來的就能夠了。
若是我只想獲取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'
複製代碼
grep用來對內容進行過濾,帶上--color
參數,能夠在支持的終端能夠打印彩色,參數n
則用來輸出具體的行數,用來快速定位。這是一個必需要熟練使用的命令。
好比:查看nginx日誌中的POST請求。
grep -rn --color POST access.log
複製代碼
推薦每次都使用這樣的參數。
若是我想要看某個異常先後相關的內容,就能夠使用ABC參數。它們是幾個單詞的縮寫,常常被使用。
就像是這樣:
# 查看Exception關鍵字的前2行和後10行
grep -rn --color Exception -A10 -B2 error.log
#查找/usr/下全部import關鍵字,已經它們所在的文件和行數
grep -rn --color import /usr/
複製代碼
在上面的命令中,咱們屢次用到了|
,這貌似能夠完成一些神奇的事情。|
是pipe
的意思,它能夠把多個命令聯繫起來。一般,命令有下面的關聯方式:
;
順序執行,如mkdir a;rmdir a
&&
條件執行,如mkdir a && rmdir a
||
條件執行,如mkdir a || rmdir a
,後面的命令將不執行|
管道,前面命令的輸出,將做爲後面命令的輸入前三種的命令關聯,是很是簡單有邏輯的,很是的好理解。而管道,卻有本身的特色。
接觸過編程語言的都知道stdin
、stdout
、stderr
的概念。讓咱們從新組織一下針對於管道的定義:前面命令的輸出(stdin),將做爲後面命令的輸入(stdout)。
咱們拿一行命令來講明。
seq 20 100 | head -n 50 | tail -n 1
複製代碼
上面命令,將輸出69。69是個神奇的數字,它是怎麼辦到的呢?咱們來一張小圖,一切就豁然開朗了。
關於輸入輸出和錯誤,linux使用一個數字
進行縮寫,這在一些腳本中,甚至在一些安裝文件中,會常常用到。
經過相似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
複製代碼
在瞭解管道的工做原理以後,就能夠介紹一下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命令。新手常常會忘記第一步,形成命令不能正常運行。
本部分,咱們從文件的屬性開始提及,瞭解了幾個對文件操做的經常使用命令。並順便介紹了管道的概念。下面,咱們來練習一下。
找到系統中全部的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
複製代碼
一、Linux的終端,是如何實現彩色的文字的?我要如何輸出一個綠色的Hello World
?
二、軟連接與硬連接有什麼區別?
三、瞭解幾個偏門但又不是很是偏的命令。
cut
有了awk,幾乎不怎麼會用cut了你可能遇到一些棘手的問題,經過搜索獲得想要的結果,但下次仍是要經過搜索解決問題,這種低效的手段不是咱們所想要的。典型的就是一個線上運維工程師,當問題來臨時,不會給你留太多的現場學習
時間。
爲了達到更高效的訓練,咱們要作兩件事情:第一,總結概括;第二,舉一反三。Linux的命令也是如此,一個問題,一般會有多種解決方式,要經過變化找出其中的共性。
這涉及到一些設計者對於規範約定俗成的遵照。通常的,你只須要掌握一小部分命令,而後對大批命令達到了解的程度,就能夠在命令行的世界裏遊刃有餘。舉個例子,你知道ls
是列出文件目錄,你就會聯想到lscpu
是列出cpu信息;lsmem
是列出內存信息;lsblk
是磁盤信息等。這種共性不少,好比top
系列,stat
系列。
在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
複製代碼
有一大批針對於行操做的命令,一樣有一批針對於列操做的命令。而後,有兩個集大成者,叫作sed
、awk
。因爲這兩個命令的內容很是多,咱們將其列爲單獨的章節。
一般linux命令都十分簡單,可是有些仍是有些複雜度的。好比find
,ps
這種命令,若是要照顧到全部的場合,可能須要很是巨大的篇幅。可是,萬一用到這種偏門的場合怎麼辦?
全面瞭解一下是很是有必要的,以便在使用的時候可以喚起記憶中最淺顯的印象。而後剩下的,就能夠交給相似於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命令,就能夠看到彩色的信息了。
如今,在終端裏,輸入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
複製代碼
若是你對某個命令,只有模糊的印象,只記得前面的幾個字母,這個功能是極好的,命令範圍會一步步縮減。
爲了開始下面的內容,咱們首先介紹一下正則表達式。在前面的一些命令中,也能夠使用這些正則表達式,好比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命令?
壓縮,是一件很是神奇的事情。
好久好久以前,就接觸過一些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
。但其實,參數v
和z
也是能夠省略的。
[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命令是如何作到強制覆蓋的?
咱們在最最最上面,剛接觸命令行的時候,就使用chmod
命令,給普通文本文件,賦予了執行權限。本小節將看一下用戶權限
和文件權限
這兩個息息相關的概念,
到如今爲止,咱們的系統中,還孤零零的只有這一個用戶,是時候學學女媧,捏幾個小泥人了。
首先建立兩個用戶:張三(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
複製代碼
從上面的命令執行結果中,咱們發現了有兩件很是有意思的東西。添加用戶後,除了在密碼文件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+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下面介紹三個文件權限相關的命令。通常經常使用的,就是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
複製代碼
給文件全部者增長執行權限。而後分別切換到zhang3
,li4
用戶執行一下。
經過
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
複製代碼
能夠看到,第二個命令,使用的是數字樣式的權限位,多了一步人腦轉換過程。這在平常的使用中,是很是不方便的。因此,使用符號法的表示方式,可以更加直觀,很是推薦。
爲了更直觀的表現這個過程,我專門製做了一張圖。
這裏有一個很是有意思的地方。把文件設置成可執行,能夠把普通文件變成腳本,目錄文件的可執行權限是什麼鬼?有什麼意義?對文件夾來講:
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
複製代碼
接下來,咱們介紹一個比較燒腦的粘貼位。
假如你要刪除一個文件,你能夠沒有這個文件的寫權限,可是你必需要擁有這個文件上級目錄的寫權限。如何建立一個目錄,可讓任何人些人文件,可是又不能刪除其餘用戶的文件?這就是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
是什麼意思,這是什麼意思?
三、如何刪除一個用戶的組?
下面的場景很是的恐怖,對有些程序員來講能夠是一場噩夢。
一大早剛剛去上班,煎餅果子剛啃了一半,幾個全副武裝的警察就闖進了公司。二話不說控制住了工做人員,並守株待兔的等着魚兒來上班。
緣由就是:公司涉嫌存儲和擴散非法文件,須要查封全部的服務器進行徹查。
這些文件,有的簡單的放在磁盤上,有的放在文件存儲服務器上,有的,被切成了多片放在了不一樣的廉價機器上。
接下來會發生什麼,要看技術人員的水平,但估計結果並不會太好。
在上一小節,咱們建立了兩個普通用戶,這兩個用戶沒什麼本事,和默認的用戶root
比起來,它們的權限就小得多。除了本身目錄下的文件,其餘的,它幾乎都沒有權限去修改。
這些文件,確定是要存在磁盤上的。對磁盤的管理,有很是多的命令,這一小節的內容,對於系統管理員來講,常用;但對於開發來講,就要求比較低一些。由於開發只須要知道小電影存在什麼地方了,不須要知道小電影是怎麼存的。
那定罪的時候,運維和程序員,究竟是誰的鍋更大一些?實際上是個悖論。運維人員在發呆的時候,腦子裏回憶起了下面的知識。
你要是一個系統管理員,甚至是一個上了雲的系統管理員,如今買了一塊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*)。
在這整塊磁盤可以被使用以前,咱們須要對它進行三次操做。
對磁盤分區依然是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
...
複製代碼
在命令行,輸入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
複製代碼
最後一步,是使用mount
命令掛載磁盤。咱們把它掛載到/data
目錄。
df
命令可以看到系統的磁盤使用情況,參數h
是human
的意思,以比較容易讀的方式展示信息;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
複製代碼
因爲內存的容量有限,如今的操做系統,都會使用磁盤模擬一個虛擬內存
區域,用於緩衝一些數據。因爲磁盤的速度和內存不可同日而語,一般會形成應用程序的卡頓。卡歸卡,應用進程卻能夠所以苟延殘喘,續命。
swap
分區,即交換區,系統在物理內存不夠時,與swap
進行交換。即當系統的物理內存不夠用時,把硬盤中一部分空間釋放出來,以供當前運行的程序使用。當那些程序要運行時,再從swap
分區中恢復保存的數據到內存中。
現代互聯網公司,通常對接口的響應時間有比較高的要求,swap
分區通常是禁用的。關於swap
,有下面幾個相關的命令。
# 製做交換分區
[root@localhost ~]# mkswap /dev/sdb1
# 禁用全部交換分區
[root@localhost ~]# swapoff -a
# 啓用交換分區
[root@localhost ~]# swapon
複製代碼
下面的命令,將直接備份磁盤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
複製代碼
這篇文章有6萬字,經歷了多個版本的整理,有小夥伴已經拿着它做爲了公司的培訓資料。到如今爲止,你已經對Linux的命令行有了比較客觀的瞭解。但我這裏還有不少可讓你更上一層樓的文章,好比vim、sed、awk的使用。下面是幾個擴展閱讀,一樣採用xjjdog專用的命令行三段解析法,但願對你有所幫助。
最經常使用
系列,快速掌握三賤客↓
最經常使用的一套「Vim「技巧
最經常使用的一套「Sed「技巧
最經常使用的一套「AWK「技巧
荒島餘生
系列,快速掌握故障排查↓
Linux之《荒島餘生》(一)準備篇
Linux之《荒島餘生》(二)CPU篇
Linux之《荒島餘生》(三)內存篇
Linux之《荒島餘生》(四)I/O篇
Linux之《荒島餘生》(五)網絡篇
歡迎加個人好友xjjdog0,一塊入羣增長buff值。
做者簡介:小姐姐味道 (xjjdog),一個不容許程序員走彎路的公衆號。聚焦基礎架構和Linux。十年架構,日百億流量,與你探討高併發世界,給你不同的味道。個人我的微信xjjdog0,歡迎添加好友,進一步交流。