Linux 的學(xué)習(xí)對于一個程序員的重要性是不言而喻的。前端開發(fā)相比后端開發(fā),接觸 Linux 機(jī)會相對較少,因此往往容易忽視它。但是學(xué)好它卻是程序員必備修養(yǎng)之一。
Linux 基礎(chǔ)
操作系統(tǒng)?Operating System?簡稱?OS?,是軟件的一部分,它是硬件基礎(chǔ)上的第一層軟件,是硬件和其它軟件溝通的橋梁。
操作系統(tǒng)會控制其他程序運(yùn)行,管理系統(tǒng)資源,提供最基本的計算功能,如管理及配置內(nèi)存、決定系統(tǒng)資源供需的優(yōu)先次序等,同時還提供一些基本的服務(wù)程序。
什么是Linux
Linux 系統(tǒng)內(nèi)核與 Linux 發(fā)行套件的區(qū)別
Linux?系統(tǒng)內(nèi)核指的是由?Linus Torvalds?負(fù)責(zé)維護(hù),提供硬件抽象層、硬盤及文件系統(tǒng)控制及多任務(wù)功能的系統(tǒng)核心程序。?
Linux?發(fā)行套件系統(tǒng)是我們常說的?Linux?操作系統(tǒng),也即是由 ?Linux?內(nèi)核與各種常用軟件的集合產(chǎn)品。?
總結(jié):真正的?Linux?指的是系統(tǒng)內(nèi)核,而我們常說的?Linux?指的是“發(fā)行版完整的包含一些基礎(chǔ)軟件的操作系統(tǒng)”。
Linux 對比 Windows
穩(wěn)定且有效率;?
免費(fèi)(或少許費(fèi)用);?
漏洞少且快速修補(bǔ);?
多任務(wù)多用戶;?
更加安全的用戶與文件權(quán)限策略;?
適合小內(nèi)核程序的嵌入系統(tǒng);?
相對不耗資源。?
Linux 系統(tǒng)種類
紅帽企業(yè)版?Linux?:RHEL?是全世界內(nèi)使用最廣泛的?Linux?系統(tǒng)。它具有極強(qiáng)的性能與穩(wěn)定性,是眾多生成環(huán)境中使用的(收費(fèi)的)系統(tǒng)。?
Fedora?:由紅帽公司發(fā)布的桌面版系統(tǒng)套件,用戶可以免費(fèi)體驗(yàn)到最新的技術(shù)或工具,這些技術(shù)或工具在成熟后會被加入到?RHEL?系統(tǒng)中,因此??Fedora?也成為?RHEL?系統(tǒng)的試驗(yàn)版本。?
CentOS :通過把RHEL?系統(tǒng)重新編譯并發(fā)布給用戶免費(fèi)使用的?Linux?系統(tǒng),具有廣泛的使用人群。?
Deepin?:中國發(fā)行,對優(yōu)秀的開源成品進(jìn)行集成和配置。?
Debian?:穩(wěn)定性、安全性強(qiáng),提供了免費(fèi)的基礎(chǔ)支持,在國外擁有很高的認(rèn)可度和使用率。?
Ubuntu?:是一款派生自?Debian?的操作系統(tǒng),對新款硬件具有極強(qiáng)的兼容能力。Ubuntu?與?Fedora?都是極其出色的?Linux?桌面系統(tǒng),而且?Ubuntu?也可用于服務(wù)器領(lǐng)域。
終端連接阿里云服務(wù)器
通過執(zhí)行?ssh root@121.42.11.34?命令,然后輸入服務(wù)器連接密碼就可以順利登錄遠(yuǎn)程服務(wù)器。從現(xiàn)在開始我們就可以在本地電腦操作遠(yuǎn)程服務(wù)器。
這個黑色的面板就是終端也就是?Shell?(命令行環(huán)境)。?
ssh root@xxx?這是一條命令,必須要在?Shell?中才能執(zhí)行。?
Shell Shell?這個單詞的原意是“外殼”,跟?kernel(內(nèi)核)相對應(yīng),比喻內(nèi)核外面的一層,即用戶跟內(nèi)核交互的對話界面。
Shell?是一個程序,提供一個與用戶對話的環(huán)境。這個環(huán)境只有一個命令提示符,讓用戶從鍵盤輸入命令,所以又稱為命令行環(huán)境(?command line interface?,簡寫為?CLI?)。Shell??接收到用戶輸入的命令,將命令送入操作系統(tǒng)執(zhí)行,并將結(jié)果返回給用戶。?
Shell?是一個命令解釋器,解釋用戶輸入的命令。它支持變量、條件判斷、循環(huán)操作等語法,所以用戶可以用?Shell?命令寫出各種小程序,又稱為?Shell?腳本。這些腳本都通過?Shell?的解釋執(zhí)行,而不通過編譯。?
Shell?是一個工具箱,提供了各種小工具,供用戶方便地使用操作系統(tǒng)的功能。?
Shell 的種類
Shell?有很多種,只要能給用戶提供命令行環(huán)境的程序,都可以看作是??Shell?。
歷史上,主要的?Shell??有下面這些:
Bourne Shell(sh)?
Bourne Again shell(bash)?
C Shell(csh)?
TENEX C Shell(tcsh)?
Korn shell(ksh)?
Z Shell(zsh)?
Friendly Interactive Shell(fish)?
其中?Bash?是目前最常用的?Shell?。MacOS 中的默認(rèn)?Shell?就是??Bash?。
通過執(zhí)行?echo $SHELL?命令可以查看到當(dāng)前正在使用的?Shell?。還可以通過?cat /etc/shells?查看當(dāng)前系統(tǒng)安裝的所有?Shell?種類。
命令 命令行提示符
進(jìn)入命令行環(huán)境以后,用戶會看到?Shell?的提示符。提示符往往是一串前綴,最后以一個美元符號?$?結(jié)尾,用戶可以在這個符號后面輸入各種命令。
執(zhí)行一個簡單的命令?pwd:
[root@iZm5e8dsxce9ufaic7hi3uZ?~]#?pwd
/root
命令解析:
root?:表示用戶名;
iZm5e8dsxce9ufaic7hi3uZ?:表示主機(jī)名;
~?:表示目前所在目錄為家目錄,其中?root?用戶的家目錄是?/root?普通用戶的家目錄在 /home 下;
#?:指示你所具有的權(quán)限(root?用戶為?#??,普通用戶為?$??)。
執(zhí)行?whoami?命令可以查看當(dāng)前用戶名;
執(zhí)行?hostname?命令可以查看當(dāng)前主機(jī)名;
關(guān)于如何創(chuàng)建、切換、刪除用戶,在后面的用戶與權(quán)限會具體講解,這里先使用?root?用戶進(jìn)行演示。
[備注]?root?是超級用戶,具備操作系統(tǒng)的一切權(quán)限。
命令格式
command?parameters(命令?參數(shù))
長短參數(shù)
單個參數(shù):ls -a(a 是英文 all 的縮寫,表示“全部”) 多個參數(shù):ls -al(全部文件?+?列表形式展示) 單個長參數(shù):ls --all 多個長參數(shù):ls --reverse --all 長短混合參數(shù):ls --all -l
參數(shù)值
短參數(shù):command -p?10(例如:ssh root@121.42.11.34?-p?22) 長參數(shù):command --paramters=10(例如:ssh root@121.42.11.34?--port=22)
快捷方式
在開始學(xué)習(xí)?Linux?命令之前,有這么一些快捷方式,是必須要提前掌握的,它將貫穿整個?Linux?使用生涯。
通過上下方向鍵 ↑ ↓ 來調(diào)取過往執(zhí)行過的?Linux?命令;?
命令或參數(shù)僅需輸入前幾位就可以用 Tab 鍵補(bǔ)全;?
Ctrl + R??:用于查找使用過的命令(history?命令用于列出之前使用過的所有命令,然后輸入?!?命令加上編號(?!2?)就可以直接執(zhí)行該歷史命令);?
Ctrl + L?:清除屏幕并將當(dāng)前行移到頁面頂部;?
Ctrl + C?:中止當(dāng)前正在執(zhí)行的命令;?
Ctrl + U?:從光標(biāo)位置剪切到行首;?
Ctrl + K?:從光標(biāo)位置剪切到行尾;?
Ctrl + W?:剪切光標(biāo)左側(cè)的一個單詞;?
Ctrl + Y?:粘貼?Ctrl + U | K | Y?剪切的命令;?
Ctrl + A?:光標(biāo)跳到命令行的開頭;?
Ctrl + E?:光標(biāo)跳到命令行的結(jié)尾;?
Ctrl + D?:關(guān)閉?Shell?會話;?
文件和目錄 文件的組織
查看路徑 pwd:顯示當(dāng)前目錄的路徑
which:查看命令的可執(zhí)行文件所在路徑,Linux?下,每一條命令其實(shí)都對應(yīng)一個可執(zhí)行程序,在終端中輸入命令,按回車的時候,就是執(zhí)行了對應(yīng)的那個程序,which?命令本身對應(yīng)的程序也存在于?Linux?中。
總的來說一個命令就是一個可執(zhí)行程序。
瀏覽和切換目錄 ls:列出文件和目錄,它是?Linux?最常用的命令之一。 【常用參數(shù)】
-a?顯示所有文件和目錄包括隱藏的?
-l?顯示詳細(xì)列表?
-h?適合人類閱讀的?
-t?按文件最近一次修改時間排序?
-i?顯示文件的?inode(?inode?是文件內(nèi)容的標(biāo)識)
cd:cd?是英語?change directory?的縮寫,表示切換目錄。
cd?/?-->?跳轉(zhuǎn)到根目錄 cd?~?-->?跳轉(zhuǎn)到家目錄 cd?..?-->?跳轉(zhuǎn)到上級目錄 cd?./home?-->?跳轉(zhuǎn)到當(dāng)前目錄的home目錄下 cd?/home/lion?-->?跳轉(zhuǎn)到根目錄下的home目錄下的lion目錄 cd?-->?不添加任何參數(shù),也是回到家目錄
[注意] 輸入?cd /ho?單次?tab?鍵會自動補(bǔ)全路徑 + 兩次?tab?鍵會列出所有可能的目錄列表。
du:列舉目錄大小信息。 【常用參數(shù)】
-h?適合人類閱讀的;?
-a?同時列舉出目錄下文件的大小信息;?
-s?只顯示總計大小,不顯示具體信息。?
瀏覽和創(chuàng)建文件
cat:一次性顯示文件所有內(nèi)容,更適合查看小的文件。
cat?cloud-init.log
【常用參數(shù)】
-n?顯示行號。
less:分頁顯示文件內(nèi)容,更適合查看大的文件。
less?cloud-init.log【快捷操作】
空格鍵:前進(jìn)一頁(一個屏幕);?
b 鍵:后退一頁;?
回車鍵:前進(jìn)一行;?
y 鍵:后退一行;?
上下鍵:回退或前進(jìn)一行;?
d 鍵:前進(jìn)半頁;?
u 鍵:后退半頁;?
q 鍵:停止讀取文件,中止?less?命令;?
= 鍵:顯示當(dāng)前頁面的內(nèi)容是文件中的第幾行到第幾行以及一些其它關(guān)于本頁內(nèi)容的詳細(xì)信息;?
h 鍵:顯示幫助文檔;?
/ 鍵:進(jìn)入搜索模式后,按 n 鍵跳到一個符合項(xiàng)目,按 N 鍵跳到上一個符合項(xiàng)目,同時也可以輸入正則表達(dá)式匹配。?
head:顯示文件的開頭幾行(默認(rèn)是10行)
head?cloud-init.log
【參數(shù)】-n?指定行數(shù)?head cloud-init.log -n 2
tail:顯示文件的結(jié)尾幾行(默認(rèn)是10行)
tail?cloud-init.log
【參數(shù)】
-n?指定行數(shù)?tail cloud-init.log -n 2
-f?會每過1秒檢查下文件是否有更新內(nèi)容,也可以用 -s 參數(shù)指定間隔時間?tail -f -s 4 xxx.log?
touch:創(chuàng)建一個文件
touch?new_file
mkdir:創(chuàng)建一個目錄
mkdir new_folder
【常用參數(shù)】
-p?遞歸的創(chuàng)建目錄結(jié)構(gòu)?mkdir -p one/two/three?
文件的復(fù)制和移動
cp:拷貝文件和目錄
cp?file?file_copy?-->?file?是目標(biāo)文件,file_copy?是拷貝出來的文件 cp?file?one?-->?把?file?文件拷貝到?one?目錄下,并且文件名依然為?file cp?file?one/file_copy?-->?把?file?文件拷貝到?one?目錄下,文件名為file_copy cp?*.txt?folder?-->?把當(dāng)前目錄下所有?txt?文件拷貝到?folder?目錄下
【常用參數(shù)】
-r?遞歸的拷貝,常用來拷貝一整個目錄
mv:移動(重命名)文件或目錄,與cp命令用法相似。
mv?file?one?-->?將?file?文件移動到?one?目錄下 mv?new_folder?one?-->?將?new_folder?文件夾移動到one目錄下 mv?*.txt?folder?-->?把當(dāng)前目錄下所有?txt?文件移動到?folder?目錄下 mv?file?new_file?-->?file?文件重命名為?new_file
文件的刪除和鏈接
rm:刪除文件和目錄,由于 Linux 下沒有回收站,一旦刪除非常難恢復(fù),因此需要謹(jǐn)慎操作
rm?new_file??-->?刪除?new_file?文件 rm?f1?f2?f3??-->?同時刪除?f1?f2?f3?3個文件
【常用參數(shù)】
-i?向用戶確認(rèn)是否刪除;?
-f?文件強(qiáng)制刪除;?
-r?遞歸刪除文件夾,著名的刪除操作?rm -rf?。?
ln:英文 Link 的縮寫,表示創(chuàng)建鏈接。 學(xué)習(xí)創(chuàng)建鏈接之前,首先要理解鏈接是什么,我們先來看看 Linux 的文件是如何存儲的:
Linux ?文件的存儲方式分為3個部分,文件名、文件內(nèi)容以及權(quán)限,其中文件名的列表是存儲在硬盤的其它地方和文件內(nèi)容是分開存放的,每個文件名通過 inode 標(biāo)識綁定到文件內(nèi)容。
Linux 下有兩種鏈接類型:硬鏈接和軟鏈接。
具體可以看文章:徹底明白Linux硬鏈接和軟鏈接
硬鏈接
使鏈接的兩個文件共享同樣文件內(nèi)容,就是同樣的 inode ,一旦文件1和文件2之間有了硬鏈接,那么修改任何一個文件,修改的都是同一塊內(nèi)容,它的缺點(diǎn)是,只能創(chuàng)建指向文件的硬鏈接,不能創(chuàng)建指向目錄的(其實(shí)也可以,但比較復(fù)雜)而軟鏈接都可以,因此軟鏈接使用更加廣泛。
ln?file1?file2??-->?創(chuàng)建?file2?為?file1?的硬鏈接
?
?
如果我們用 rm file1 來刪除 file1 ,對 file2 沒有什么影響,對于硬鏈接來說,刪除任意一方的文件,共同指向的文件內(nèi)容并不會從硬盤上刪除。只有同時刪除了 file1 與 file2 后,它們共同指向的文件內(nèi)容才會消失。
軟鏈接
軟鏈接就類似 windows 下快捷方式。
ln?-s?file1?file2
?
?
執(zhí)行?ls -l?命名查看當(dāng)前目錄下文件的具體信息
total?0 -rw-r--r--?1?root?root?0?Jan?14?06:29?file1 lrwxrwxrwx?1?root?root?5?Jan?14?06:42?file2?->?file1??#?表示file2?指向?file1
其實(shí)?file2?只是?file1?的一個快捷方式,它指向的是?file1?,所以顯示的是 file1 的內(nèi)容,但其實(shí)?file2?的?inode?與?file1?并不相同。如果我們刪除了?file2?的話,file1?是不會受影響的,但如果刪除?file1?的話,?file2?就會變成死鏈接,因?yàn)橹赶虻奈募灰娏恕?/p>
用戶與權(quán)限
用戶
Linux?是一個多用戶的操作系統(tǒng)。在?Linux?中,理論上來說,我們可以創(chuàng)建無數(shù)個用戶,但是這些用戶是被劃分到不同的群組里面的,有一個用戶,名叫?root?,是一個很特殊的用戶,它是超級用戶,擁有最高權(quán)限。
自己創(chuàng)建的用戶是有限權(quán)限的用戶,這樣大大提高了?Linux?系統(tǒng)的安全性,有效防止誤操作或是病毒攻擊,但是我們執(zhí)行的某些命令需要更高權(quán)限時可以使用?sudo?命令。
sudo:以?root?身份運(yùn)行命令
sudo?date??-->?當(dāng)然查看日期是不需要sudo的這里只是演示,sudo?完之后一般還需要輸入用戶密碼的
useradd + passwd
useradd?添加新用戶
passwd? ?修改用戶密碼
這兩個命令需要 root 用戶權(quán)限
useradd?lion?-->?添加一個lion用戶,添加完之后在?/home?路徑下可以查看 passwd?lion?-->?修改lion用戶的密碼
userdel:刪除用戶,需要 root 用戶權(quán)限
userdel?lion?-->?只會刪除用戶名,不會從/home中刪除對應(yīng)文件夾 userdel?lion?-r?-->?會同時刪除/home下的對應(yīng)文件夾
su:切換用戶,需要 root 用戶權(quán)限
sudo?su?-->?切換為root用戶(exit?命令或?CTRL?+?D?快捷鍵都可以使普通用戶切換為?root?用戶) su?lion?-->?切換為普通用戶 su?-?-->?切換為root用戶
群組的管理
Linux 中每個用戶都屬于一個特定的群組,如果你不設(shè)置用戶的群組,默認(rèn)會創(chuàng)建一個和它的用戶名一樣的群組,并且把用戶劃歸到這個群組。
groupadd:創(chuàng)建群組,用法和 useradd 類似。
groupadd?friends
groupdel:刪除一個已存在的群組
groupdel?foo??-->?刪除foo群組
groups:查看用戶所在群組
groups?lion??-->?查看?lion?用戶所在的群組
usermod:用于修改用戶的賬戶。
【常用參數(shù)】
-l?對用戶重命名。需要注意的是?/home?中的用戶家目錄的名字不會改變,需要手動修改。?
-g?修改用戶所在的群組,例如?usermod -g friends lion??修改?lion??用戶的群組為?friends??。?
-G?一次性讓用戶添加多個群組,例如?usermod -G friends,foo,bar lion??。?
-a??-G?會讓你離開原先的群組,如果你不想這樣做的話,就得再添加?-a?參數(shù),意味著?append??追加的意思。?
chgrp:用于修改文件的群組。
chgrp?bar?file.txt?-->?file.txt文件的群組修改為bar
chown:改變文件的所有者,需要 root 身份才能運(yùn)行。
chown?lion?file.txt?-->?把其它用戶創(chuàng)建的file.txt轉(zhuǎn)讓給lion用戶 chown?lion:bar?file.txt?-->?把file.txt的用戶改為lion,群組改為bar
【常用參數(shù)】
-R?遞歸設(shè)置子目錄和子文件,chown -R lion:lion /home/frank?把?frank?文件夾的用戶和群組都改為?lion?。
文件權(quán)限管理
chmod:修改訪問權(quán)限。
chmod?740?file.txt
【常用參數(shù)】
-R?可以遞歸地修改文件訪問權(quán)限,例如?chmod -R 777 /home/lion
修改權(quán)限的確簡單,但是理解其深層次的意義才是更加重要的。下面我們來系統(tǒng)的學(xué)習(xí) Linux 的文件權(quán)限
[root@lion?~]#?ls?-l drwxr-xr-x?5?root?root?4096?Apr?13??2020?climb lrwxrwxrwx?1?root?root????7?Jan?14?06:41?hello2.c?->?hello.c -rw-r--r--?1?root?root??149?Jan?13?06:14?hello.c其中?drwxr-xr-x?表示文件或目錄的權(quán)限。讓我們一起來解讀它具體代表什么?
d?:表示目錄,就是說這是一個目錄,普通文件是 - ,鏈接是 l 。?
r?:read?表示文件可讀。?
w?:write?表示文件可寫,一般有寫的權(quán)限,就有刪除的權(quán)限。?
x?:execute?表示文件可執(zhí)行。?
-?:表示沒有相應(yīng)權(quán)限。?
權(quán)限的整體是按用戶來劃分的,如下圖所示:
現(xiàn)在再來理解這句權(quán)限?drwxr-xr-x?的意思:
它是一個文件夾;?
它的所有者具有:讀、寫、執(zhí)行權(quán)限;?
它的群組用戶具有:讀、執(zhí)行的權(quán)限,沒有寫的權(quán)限;?
它的其它用戶具有:讀、執(zhí)行的權(quán)限,沒有寫的權(quán)限。?
現(xiàn)在理解了權(quán)限,我們使用 chmod 來嘗試修改權(quán)限。chmod 它不需要是 root 用戶才能運(yùn)行的,只要你是此文件所有者,就可以用 chmod 來修改文件的訪問權(quán)限。
數(shù)字分配權(quán)限
權(quán)限 | 數(shù)字 |
---|---|
r | 4 |
w | 2 |
x | 1 |
因此要改變權(quán)限,只要做一些簡單的加法就行:
chmod?640?hello.c? #?分析 6?=?4?+?2?+?0?表示所有者具有?rw?權(quán)限 4?=?4?+?0?+?0?表示群組用戶具有?r?權(quán)限 0?=?0?+?0?+?0?表示其它用戶沒有權(quán)限 對應(yīng)文字權(quán)限為:-rw-r-----
用字母來分配權(quán)限
u?:user 的縮寫,用戶的意思,表示所有者。?
g?:group 的縮寫,群組的意思,表示群組用戶。?
o?:other 的縮寫,其它的意思,表示其它用戶。?
a?:all 的縮寫,所有的意思,表示所有用戶。?
+?:加號,表示添加權(quán)限。?
-?:減號,表示去除權(quán)限。?
=?:等于號,表示分配權(quán)限。
chmod?u+rx?file?-->?文件file的所有者增加讀和運(yùn)行的權(quán)限 chmod?g+r?file?-->?文件file的群組用戶增加讀的權(quán)限 chmod?o-r?file?-->?文件file的其它用戶移除讀的權(quán)限 chmod?g+r?o-r?file?-->?文件file的群組用戶增加讀的權(quán)限,其它用戶移除讀的權(quán)限 chmod?go-r?file?-->?文件file的群組和其他用戶移除讀的權(quán)限 chmod?+x?file?-->?文件file的所有用戶增加運(yùn)行的權(quán)限 chmod?u=rwx,g=r,o=-?file?-->?文件file的所有者分配讀寫和執(zhí)行的權(quán)限,群組其它用戶分配讀的權(quán)限,其他用戶沒有任何權(quán)限
查找文件
locate:搜索包含關(guān)鍵字的所有文件和目錄。后接需要查找的文件名,也可以用正則表達(dá)式。
安裝locate
yum?-y?install?mlocate?-->?安裝包 updatedb?-->?更新數(shù)據(jù)庫
locate?file.txt locate?fil*.txt
[注意] locate 命令會去文件數(shù)據(jù)庫中查找命令,而不是全磁盤查找,因此剛創(chuàng)建的文件并不會更新到數(shù)據(jù)庫中,所以無法被查找到,可以執(zhí)行 updatedb 命令去更新數(shù)據(jù)庫。
find:用于查找文件,它會去遍歷你的實(shí)際硬盤進(jìn)行查找,而且它允許我們對每個找到的文件進(jìn)行后續(xù)操作,功能非常強(qiáng)大。
find?<何處>?<何物>?<做什么>
何處:指定在哪個目錄查找,此目錄的所有子目錄也會被查找。?
何物:查找什么,可以根據(jù)文件的名字來查找,也可以根據(jù)其大小來查找,還可以根據(jù)其最近訪問時間來查找。?
做什么:找到文件后,可以進(jìn)行后續(xù)處理,如果不指定這個參數(shù), find 命令只會顯示找到的文件。?
根據(jù)文件名查找
find?-name?"file.txt"?-->?當(dāng)前目錄以及子目錄下通過名稱查找文件 find?.?-name?"syslog"?-->?當(dāng)前目錄以及子目錄下通過名稱查找文件 find?/?-name?"syslog"?-->?整個硬盤下查找syslog find?/var/log?-name?"syslog"?-->?在指定的目錄/var/log下查找syslog文件 find?/var/log?-name?"syslog*"?-->?查找syslog1、syslog2?...?等文件,通配符表示所有 find?/var/log?-name?"*syslog*"?-->?查找包含syslog的文件?
[注意] find 命令只會查找完全符合 “何物” 字符串的文件,而 locate 會查找所有包含關(guān)鍵字的文件。
根據(jù)文件大小查找
find?/var?-size?+10M?-->?/var?目錄下查找文件大小超過?10M?的文件 find?/var?-size?-50k?-->?/var?目錄下查找文件大小小于?50k?的文件 find?/var?-size?+1G?-->?/var?目錄下查找文件大小查過?1G?的文件 find?/var?-size?1M?-->?/var?目錄下查找文件大小等于?1M?的文件
根據(jù)文件最近訪問時間查找
find?-name?"*.txt"?-atime?-7??-->?近?7天內(nèi)訪問過的.txt結(jié)尾的文件
僅查找目錄或文件
find?.?-name?"file"?-type?f??-->?只查找當(dāng)前目錄下的file文件 find?.?-name?"file"?-type?d??-->?只查找當(dāng)前目錄下的file目錄
操作查找結(jié)果
find?-name?"*.txt"?-printf?"%p?-?%u "?-->?找出所有后綴為txt的文件,并按照?%p?-?%u ?格式打印,其中%p=文件名,%u=文件所有者 find?-name?"*.jpg"?-delete?-->?刪除當(dāng)前目錄以及子目錄下所有.jpg為后綴的文件,不會有刪除提示,因此要慎用 find?-name?"*.c"?-exec?chmod?600?{}?;?-->?對每個.c結(jié)尾的文件,都進(jìn)行?-exec?參數(shù)指定的操作,{}?會被查找到的文件替代,;?是必須的結(jié)尾 find?-name?"*.c"?-ok?chmod?600?{}?;?-->?和上面的功能一直,會多一個確認(rèn)提示
軟件倉庫
Linux 下軟件是以包的形式存在,一個軟件包其實(shí)就是軟件的所有文件的壓縮包,是二進(jìn)制的形式,包含了安裝軟件的所有指令。Red Hat 家族的軟件包后綴名一般為 .rpm , Debian 家族的軟件包后綴是 .deb 。
Linux 的包都存在一個倉庫,叫做軟件倉庫,它可以使用 yum 來管理軟件包, yum 是 CentOS 中默認(rèn)的包管理工具,適用于 Red Hat 一族。可以理解成 Node.js 的 npm 。
yum 常用命令
yum update | yum upgrade?更新軟件包?
yum search xxx?搜索相應(yīng)的軟件包?
yum install xxx?安裝軟件包?
yum remove xxx?刪除軟件包?
切換 CentOS 軟件源
有時候 CentOS 默認(rèn)的 yum 源不一定是國內(nèi)鏡像,導(dǎo)致 yum ?在線安裝及更新速度不是很理想。這時候需要將 yum 源設(shè)置為國內(nèi)鏡像站點(diǎn)。國內(nèi)主要開源的鏡像站點(diǎn)是網(wǎng)易和阿里云。
1、首先備份系統(tǒng)自帶 yum 源配置文件?mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup?
2、下載阿里云的 yum 源配置文件到?/etc/yum.repos.d/CentOS7?
wget?-O?/etc/yum.repos.d/CentOS-Base.repo?http://mirrors.aliyun.com/repo/Centos-7.repo
3、生成緩存
yum?makecache
閱讀手冊
Linux ?命令種類繁雜,我們憑借記憶不可能全部記住,因此學(xué)會查用手冊是非常重要的。
man
安裝更新 man
sudo?yum?install?-y?man-pages?-->?安裝 sudo?mandb?-->?更新
man 手冊種類
可執(zhí)行程序或?Shell?命令;?
系統(tǒng)調(diào)用( Linux 內(nèi)核提供的函數(shù));?
庫調(diào)用(程序庫中的函數(shù));?
文件(例如?/etc/passwd?);?
特殊文件(通常在?/dev?下);?
游戲;?
雜項(xiàng)(man(7)?,groff(7)?);?
系統(tǒng)管理命令(通常只能被?root?用戶使用);?
內(nèi)核子程序。?
man + 數(shù)字 + 命令
輸入 man + 數(shù)字 + 命令/函數(shù),可以查到相關(guān)的命令和函數(shù),若不加數(shù)字, man 默認(rèn)從數(shù)字較小的手冊中尋找相關(guān)命令和函數(shù)
man?3?rand??-->?表示在手冊的第三部分查找?rand?函數(shù) man?ls????-->?查找?ls?用法手冊
man 手冊核心區(qū)域解析:(以?man pwd?為例)
NAME?#?命令名稱和簡單描述 ?????pwd?--?return?working?directory?name SYNOPSIS?#?使用此命令的所有方法 ?????pwd?[-L?|?-P] DESCRIPTION?#?包括所有參數(shù)以及用法 ?????The?pwd?utility?writes?the?absolute?pathname?of?the?current?working?directory?to?the?standard?output. ?????Some?shells?may?provide?a?builtin?pwd?command?which?is?similar?or?identical?to?this?utility.??Consult?the?builtin(1)?manual?page. ?????The?options?are?as?follows: ?????-L??????Display?the?logical?current?working?directory. ?????-P??????Display?the?physical?current?working?directory?(all?symbolic?links?resolved). ?????If?no?options?are?specified,?the?-L?option?is?assumed. SEE?ALSO?#?擴(kuò)展閱讀相關(guān)命令 ?????builtin(1),?cd(1),?csh(1),?sh(1),?getcwd(3)
help
man 命令像新華詞典一樣可以查詢到命令或函數(shù)的詳細(xì)信息,但其實(shí)我們還有更加快捷的方式去查詢,command --help?或?command -h?,它沒有 man 命令顯示的那么詳細(xì),但是它更加易于閱讀。
Linux 進(jìn)階
文本操作 grep
全局搜索一個正則表達(dá)式,并且打印到屏幕。簡單來說就是,在文件中查找關(guān)鍵字,并顯示關(guān)鍵字所在行。
基礎(chǔ)語法
grep?text?file?#?text代表要搜索的文本,file代表供搜索的文件 #?實(shí)例 [root@lion?~]#?grep?path?/etc/profile pathmunge?()?{ ????pathmunge?/usr/sbin ????pathmunge?/usr/local/sbin ????pathmunge?/usr/local/sbin?after ????pathmunge?/usr/sbin?after unset?-f?pathmunge
常用參數(shù)
-i?忽略大小寫,grep -i path /etc/profile?
-n?顯示行號,?grep -i path /etc/profile?
-v?只顯示搜索文本不在的那些行,grep -v path /etc/profile
-r?遞歸查找,grep -r hello /etc?,Linux 中還有一個 rgrep 命令,作用相當(dāng)于?grep -r?
高級用法
grep?可以配合正則表達(dá)式使用。
grep?-E?path?/etc/profile?-->?完全匹配path grep?-E?^path?/etc/profile?-->?匹配path開頭的字符串 grep?-E?[Pp]ath?/etc/profile?-->?匹配path或Path
sort
對文件的行進(jìn)行排序。
基礎(chǔ)語法
sort?name.txt?#?對name.txt文件進(jìn)行排序
實(shí)例用法
為了演示方便,我們首先創(chuàng)建一個文件 name.txt ,放入以下內(nèi)容:
Christopher Shawn Ted Rock Noah Zachary Bella
執(zhí)行?sort name.txt?命令,會對文本內(nèi)容進(jìn)行排序。
常用參數(shù)
-o?將排序后的文件寫入新文件,sort -o name_sorted.txt name.txt?;?
-r?倒序排序,sort -r name.txt??;?
-R?隨機(jī)排序,sort?-R name.txt??;?
-n?對數(shù)字進(jìn)行排序,默認(rèn)是把數(shù)字識別成字符串的,因此 138 會排在 25 前面,如果添加了 -n 數(shù)字排序的話,則 25 會在 138 前面。?
wc
word count?的縮寫,用于文件的統(tǒng)計。它可以統(tǒng)計單詞數(shù)目、行數(shù)、字符數(shù),字節(jié)數(shù)等。
基礎(chǔ)語法
wc?name.txt?#?統(tǒng)計name.txt
實(shí)例用法
[root@lion?~]#?wc?name.txt? 13?13?91?name.txt
第一個13,表示行數(shù);?
第二個13,表示單詞數(shù);?
第三個91,表示字節(jié)數(shù)。?
常用參數(shù)
-l?只統(tǒng)計行數(shù),??wc -l name.txt?;?
-w?只統(tǒng)計單詞數(shù),wc -w name.txt?;?
-c?只統(tǒng)計字節(jié)數(shù),wc -c name.txt?;?
-m?只統(tǒng)計字符數(shù),wc -m name.txt?。?
uniq
刪除文件中的重復(fù)內(nèi)容。
基礎(chǔ)語法
uniq?name.txt?#?去除name.txt重復(fù)的行數(shù),并打印到屏幕上 uniq?name.txt?uniq_name.txt?#?把去除重復(fù)后的文件保存為?uniq_name.txt
【注意】它只能去除連續(xù)重復(fù)的行數(shù)。
常用參數(shù)
-c?統(tǒng)計重復(fù)行數(shù),??uniq -c name.txt;
-d?只顯示重復(fù)的行數(shù),?uniq -d name.txt?。
cut
剪切文件的一部分內(nèi)容。
基礎(chǔ)語法
cut?-c?2-4?name.txt?#?剪切每一行第二到第四個字符
常用參數(shù)
-d?用于指定用什么分隔符(比如逗號、分號、雙引號等等)cut -d , name.txt?;?
-f?表示剪切下用分隔符分割的哪一塊或哪幾塊區(qū)域,cut -d , -f 1 name.txt?。?
重定向 管道 流
在 Linux 中一個命令的去向可以有3個地方:終端、文件、作為另外一個命令的入?yún)ⅰ?/p>
命令一般都是通過鍵盤輸入,然后輸出到終端、文件等地方,它的標(biāo)準(zhǔn)用語是 stdin 、 stdout 以及 stderr 。
標(biāo)準(zhǔn)輸入?stdin?,終端接收鍵盤輸入的命令,會產(chǎn)生兩種輸出;?
標(biāo)準(zhǔn)輸出?stdout?,終端輸出的信息(不包含錯誤信息);?
標(biāo)準(zhǔn)錯誤輸出?stderr?,終端輸出的錯誤信息。
重定向
把本來要顯示在終端的命令結(jié)果,輸送到別的地方(到文件中或者作為其他命令的輸入)。
輸出重定向 >?
>?表示重定向到新的文件,cut -d , -f 1 notes.csv > name.csv?,它表示通過逗號剪切?notes.csv?文件(剪切完有3個部分)獲取第一個部分,重定向到?name.csv?文件。
我們來看一個具體示例,學(xué)習(xí)它的使用,假設(shè)我們有一個文件?notes.csv?,文件內(nèi)容如下:
Mark1,951/100,很不錯1 Mark2,952/100,很不錯2 Mark3,953/100,很不錯3 Mark4,954/100,很不錯4 Mark5,955/100,很不錯5 Mark6,956/100,很不錯6
執(zhí)行命令:cut -d , -f 1 notes.csv > name.csv 最后輸出如下內(nèi)容:
Mark1 Mark2 Mark3 Mark4 Mark5 Mark6【注意】使用?>?要注意,如果輸出的文件不存在它會新建一個,如果輸出的文件已經(jīng)存在,則會覆蓋。因此執(zhí)行這個操作要非常小心,以免覆蓋其它重要文件。
輸出重定向?>>?
表示重定向到文件末尾,因此它不會像 > 命令這么危險,它是追加到文件的末尾(當(dāng)然如果文件不存在,也會被創(chuàng)建)。?
再次執(zhí)行cut -d , -f 1 notes.csv >> name.csv,則會把名字追加到?name.csv?里面。
Mark1 Mark2 Mark3 Mark4 Mark5 Mark6 Mark1 Mark2 Mark3 Mark4 Mark5 Mark6
我們平時讀的 log 日志文件其實(shí)都是用這個命令輸出的。
輸出重定向 2>?
標(biāo)準(zhǔn)錯誤輸出
cat?not_exist_file.csv?>?res.txt?2>?errors.log
當(dāng)我們?cat?一個文件時,會把文件內(nèi)容打印到屏幕上,這個是標(biāo)準(zhǔn)輸出;?
當(dāng)使用了?> res.txt?時,則不會打印到屏幕,會把標(biāo)準(zhǔn)輸出寫入文件??res.txt?文件中;?
2> errors.log?當(dāng)發(fā)生錯誤時會寫入?errors.log?文件中。?
輸出重定向?2>>?
標(biāo)準(zhǔn)錯誤輸出(追加到文件末尾)同 >> 相似。
輸出重定向?2>&1?
標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤輸出都重定向都一個地方
cat?not_exist_file.csv?>?res.txt?2>&1??#?覆蓋輸出 cat?not_exist_file.csv?>>?res.txt?2>&1?#?追加輸出
目前為止,我們接觸的命令的輸入都來自命令的參數(shù),其實(shí)命令的輸入還可以來自文件或者鍵盤的輸入。
輸入重定向?
cat?
雖然它的運(yùn)行結(jié)果與?cat name.csv?一樣,但是它們的原理卻完全不同。cat name.csv?表示?cat?命令接收的輸入是?notes.csv?文件名,那么要先打開這個文件,然后打印出文件內(nèi)容。?
cat?< name.csv??表示?cat?命令接收的輸入直接是?notes.csv?這個文件的內(nèi)容,?cat?命令只負(fù)責(zé)將其內(nèi)容打印,打開文件并將文件內(nèi)容傳遞給??cat?命令的工作則交給終端完成。?
輸入重定向?<
將鍵盤的輸入重定向?yàn)槟硞€命令的輸入。
sort?-n?<管道?|?
把兩個命令連起來使用,一個命令的輸出作為另外一個命令的輸入,英文是??pipeline?,可以想象一個個水管連接起來,管道算是重定向流的一種。
舉幾個實(shí)際用法案例:
cut?-d?,?-f?1?name.csv?|?sort?>?sorted_name.txt? #?第一步獲取到的?name?列表,通過管道符再進(jìn)行排序,最后輸出到sorted_name.txt du?|?sort?-nr?|?head? #?du?表示列舉目錄大小信息 #?sort?進(jìn)行排序,-n?表示按數(shù)字排序,-r?表示倒序 #?head?前10行文件 grep?log?-Ir?/var/log?|?cut?-d?:?-f?1?|?sort?|?uniq #?grep?log?-Ir?/var/log?表示在log文件夾下搜索?/var/log?文本,-r?表示遞歸,-I?用于排除二進(jìn)制文件 #?cut?-d?:?-f?1?表示通過冒號進(jìn)行剪切,獲取剪切的第一部分 #?sort?進(jìn)行排序 #?uniq?進(jìn)行去重流
流并非一個命令,在計算機(jī)科學(xué)中,流 stream 的含義是比較難理解的,記住一點(diǎn)即可:流就是讀一點(diǎn)數(shù)據(jù), 處理一點(diǎn)點(diǎn)數(shù)據(jù)。其中數(shù)據(jù)一般就是二進(jìn)制格式。上面提及的重定向或管道,就是把數(shù)據(jù)當(dāng)做流去運(yùn)轉(zhuǎn)的。
到此我們就接觸了,流、重定向、管道等 Linux 高級概念及指令。其實(shí)你會發(fā)現(xiàn)關(guān)于流和管道在其它語言中也有廣泛的應(yīng)用。Angular 中的模板語法中可以使用管道。Node.js 中也有 stream 流的概念。
查看進(jìn)程
在 Windows 中通過 Ctrl + Alt + Delete 快捷鍵查看軟件進(jìn)程。
w
幫助我們快速了解系統(tǒng)中目前有哪些用戶登錄著,以及他們在干什么。
[root@lion?~]#?w ?06:31:53?up?25?days,??9:53,??1?user,??load?average:?0.00,?0.01,?0.05 USER?????TTY??????FROM?????????????LOGIN@???IDLE???JCPU???PCPU?WHAT root?????pts/0????118.31.243.53????05:56????1.00s??0.02s??0.00s?w ? 06:31:53:表示當(dāng)前時間 up?25?days,?9:53:表示系統(tǒng)已經(jīng)正常運(yùn)行了“25天9小時53分鐘” 1?user:表示一個用戶 load?average:?0.00,?0.01,?0.05:表示系統(tǒng)的負(fù)載,3個值分別表示“1分鐘的平均負(fù)載”,“5分鐘的平均負(fù)載”,“15分鐘的平均負(fù)載” ?USER:表示登錄的用于 ?TTY:登錄的終端名稱為pts/0 ?FROM:連接到服務(wù)器的ip地址 ?LOGIN@:登錄時間 ?IDLE:用戶有多久沒有活躍了 ?JCPU:該終端所有相關(guān)的進(jìn)程使用的 CPU 時間,每當(dāng)進(jìn)程結(jié)束就停止計時,開始新的進(jìn)程則會重新計時 ?PCPU:表示 CPU 執(zhí)行當(dāng)前程序所消耗的時間,當(dāng)前進(jìn)程就是在 WHAT 列里顯示的程序 ?WHAT:表示當(dāng)下用戶正運(yùn)行的程序是什么,這里我運(yùn)行的是 wps
用于顯示當(dāng)前系統(tǒng)中的進(jìn)程, ps 命令顯示的進(jìn)程列表不會隨時間而更新,是靜態(tài)的,是運(yùn)行 ps 命令那個時刻的狀態(tài)或者說是一個進(jìn)程快照。
基礎(chǔ)語法
[root@lion?~]#?ps ??PID?TTY??????????TIME?CMD ?1793?pts/0????00:00:00?bash ?4756?pts/0????00:00:00?ps ? ?PID:進(jìn)程號,每個進(jìn)程都有唯一的進(jìn)程號 ?TTY:進(jìn)程運(yùn)行所在的終端 ?TIME:進(jìn)程運(yùn)行時間 ?CMD:產(chǎn)生這個進(jìn)程的程序名,如果在進(jìn)程列表中看到有好幾行都是同樣的程序名,那么就是同樣的程序產(chǎn)生了不止一個進(jìn)程常用參數(shù)
-ef?列出所有進(jìn)程;?
-efH?以喬木狀列舉出所有進(jìn)程;
-u?列出此用戶運(yùn)行的進(jìn)程;
-aux?通過?CPU?和內(nèi)存使用來過濾進(jìn)程?ps -aux | less?;?
-aux --sort -pcpu?按?CPU?使用降序排列,-aux --sort -pmem?表示按內(nèi)存使用降序排列;?
-axjf?以樹形結(jié)構(gòu)顯示進(jìn)程,?ps -axjf?它和?pstree?效果類似。?
top
獲取進(jìn)程的動態(tài)列表。
top?-?07:20:07?up?25?days,?10:41,??1?user,??load?average:?0.30,?0.10,?0.07 Tasks:??67?total,???1?running,??66?sleeping,???0?stopped,???0?zombie %Cpu(s):??0.7?us,??0.3?sy,??0.0?ni,?99.0?id,??0.0?wa,??0.0?hi,??0.0?si,??0.0?st KiB?Mem?:??1882072?total,???552148?free,???101048?used,??1228876?buff/cache KiB?Swap:????????0?total,????????0?free,????????0?used.??1594080?avail?Mem? ??PID?USER??????PR??NI????VIRT????RES????SHR?S?%CPU?%MEM?????TIME+?COMMAND??????????????????????????????????????????????????????????????????????????????????????????????????????? ??956?root??????10?-10??133964??15848??10240?S??0.7??0.8?263:13.01?AliYunDun????????????????????????????????????????????????????????????????????????????????????????????????????? ????1?root??????20???0???51644???3664???2400?S??0.0??0.2???3:23.63?systemd??????????????????????????????????????????????????????????????????????????????????????????????????????? ????2?root??????20???0???????0??????0??????0?S??0.0??0.0???0:00.05?kthreadd?????????????????????????????????????????????????????????????????????????????????????????????????????? ????4?root???????0?-20???????0??????0??????0?S??0.0??0.0???0:00.00?kworker/0:0Htop - 0707 up 25 days, 10:41, ?1 user, ?load average: 0.30, 0.10, 0.07?相當(dāng)?w?命令的第一行的信息。?
展示的這些進(jìn)程是按照使用處理器?%CPU?的使用率來排序的。?
kill
結(jié)束一個進(jìn)程,kill + PID?。
kill?956?#?結(jié)束進(jìn)程號為956的進(jìn)程 kill?956?957?#?結(jié)束多個進(jìn)程 kill?-9?7291?#?強(qiáng)制結(jié)束進(jìn)程管理進(jìn)程 進(jìn)程狀態(tài) 主要是切換進(jìn)程的狀態(tài)。我們先了解下 Linux 下進(jìn)程的五種狀態(tài):
狀態(tài)碼 R :表示正在運(yùn)行的狀態(tài);?
狀態(tài)碼 S :表示中斷(休眠中,受阻,當(dāng)某個條件形成后或接受到信號時,則脫離該狀態(tài));?
狀態(tài)碼 D :表示不可中斷(進(jìn)程不響應(yīng)系統(tǒng)異步信號,即使用kill命令也不能使其中斷);?
狀態(tài)碼 Z :表示僵死(進(jìn)程已終止,但進(jìn)程描述符依然存在,直到父進(jìn)程調(diào)用 wait4() 系統(tǒng)函數(shù)后將進(jìn)程釋放);?
狀態(tài)碼 T :表示停止(進(jìn)程收到 SIGSTOP 、 SIGSTP 、 SIGTIN 、 SIGTOU 等停止信號后停止運(yùn)行)。?
前臺進(jìn)程 & 后臺進(jìn)程
默認(rèn)情況下,用戶創(chuàng)建的進(jìn)程都是前臺進(jìn)程,前臺進(jìn)程從鍵盤讀取數(shù)據(jù),并把處理結(jié)果輸出到顯示器。例如運(yùn)行 top 命令,這就是一個一直運(yùn)行的前臺進(jìn)程。
后臺進(jìn)程的優(yōu)點(diǎn)是不必等待程序運(yùn)行結(jié)束,就可以輸入其它命令。在需要執(zhí)行的命令后面添加 & 符號,就表示啟動一個后臺進(jìn)程。
&
啟動后臺進(jìn)程,它的缺點(diǎn)是后臺進(jìn)程與終端相關(guān)聯(lián),一旦關(guān)閉終端,進(jìn)程就自動結(jié)束了。
cp?name.csv?name-copy.csv?&
nohup
使進(jìn)程不受掛斷(關(guān)閉終端等動作)的影響。
nohup?cp?name.csv?name-copy.csv
nohup 命令也可以和 & 結(jié)合使用。
nohup?cp?name.csv?name-copy.csv?&
bg
使一個“后臺暫停運(yùn)行”的進(jìn)程,狀態(tài)改為“后臺運(yùn)行”。
bg?%1?#?不加任何參數(shù)的情況下,bg命令會默認(rèn)作用于最近的一個后臺進(jìn)程,如果添加參數(shù)則會作用于指定標(biāo)號的進(jìn)程
實(shí)際案例1:
1.?執(zhí)行?grep?-r?"log"?/?>?grep_log?2>&1?命令啟動一個前臺進(jìn)程,并且忘記添加?&?符號 2.?ctrl?+?z?使進(jìn)程狀態(tài)轉(zhuǎn)為后臺暫停 3.?執(zhí)行?bg?將命令轉(zhuǎn)為后臺運(yùn)行? ? ? ? ? ? ?實(shí)際案例2:
前端開發(fā)時我們經(jīng)常會執(zhí)行?yarn?start?啟動項(xiàng)目 此時我們執(zhí)行?ctrl?+?z?先使其暫停 然后執(zhí)行?bg?使其轉(zhuǎn)為后臺運(yùn)行 這樣當(dāng)前終端就空閑出來可以干其它事情了,如果想要喚醒它就使用?fg?命令即可(后面會講)jobs
顯示當(dāng)前終端后臺進(jìn)程狀態(tài)。
fg
fg 使進(jìn)程轉(zhuǎn)為前臺運(yùn)行,用法和 bg 命令類似。
我們用一張圖來表示前后臺進(jìn)程切換:
我們可以使程序在后臺運(yùn)行,成為后臺進(jìn)程,這樣在當(dāng)前終端中我們就可以做其他事情了,而不必等待此進(jìn)程運(yùn)行結(jié)束。
守護(hù)進(jìn)程
一個運(yùn)行起來的程序被稱為進(jìn)程。在 Linux 中有些進(jìn)程是特殊的,它不與任何進(jìn)程關(guān)聯(lián),不論用戶的身份如何,都在后臺運(yùn)行,這些進(jìn)程的父進(jìn)程是 PID 為1的進(jìn)程, PID 為1的進(jìn)程只在系統(tǒng)關(guān)閉時才會被銷毀。它們會在后臺一直運(yùn)行等待分配工作。我們將這類進(jìn)程稱之為守護(hù)進(jìn)程 daemon 。
守護(hù)進(jìn)程的名字通常會在最后有一個 d ,表示 daemon 守護(hù)的意思,例如 systemd 、httpd 。
systemd
systemd 是一個 Linux 系統(tǒng)基礎(chǔ)組件的集合,提供了一個系統(tǒng)和服務(wù)管理器,運(yùn)行為 PID 1 并負(fù)責(zé)啟動其它程序。
通過命令也可以看到 PID 為1的進(jìn)程就是 systemd 的系統(tǒng)進(jìn)程。
systemd 常用命令(它是一組命令的集合):
systemctl?start?nginx?#?啟動服務(wù) systemctl?stop?nginx?#?停止服務(wù) systemctl?restart?nginx?#?重啟服務(wù) systemctl?status?nginx?#?查看服務(wù)狀態(tài) systemctl?reload?nginx?#?重載配置文件(不停止服務(wù)的情況) systemctl?enable?nginx?#?開機(jī)自動啟動服務(wù) systemctl?disable?nginx?#?開機(jī)不自動啟動服務(wù) systemctl?is-enabled?nginx?#?查看服務(wù)是否開機(jī)自動啟動 systemctl?list-unit-files?--type=service?#?查看各個級別下服務(wù)的啟動和禁用情況文件壓縮解壓
打包:是將多個文件變成一個總的文件,它的學(xué)名叫存檔、歸檔。?
壓縮:是將一個大文件(通常指歸檔)壓縮變成一個小文件。?
我們常常使用 tar 將多個文件歸檔為一個總的文件,稱為 archive 。然后用 gzip 或 bzip2 命令將 archive 壓縮為更小的文件。
tar
創(chuàng)建一個?tar?歸檔。
基礎(chǔ)用法
tar?-cvf?sort.tar?sort/?#?將sort文件夾歸檔為sort.tar tar?-cvf?archive.tar?file1?file2?file3?#?將?file1?file2?file3?歸檔為archive.tar常用參數(shù)
-cvf?表示 create(創(chuàng)建)+ verbose(細(xì)節(jié))+ file(文件),創(chuàng)建歸檔文件并顯示操作細(xì)節(jié);?
-tf??顯示歸檔里的內(nèi)容,并不解開歸檔;?
-rvf?追加文件到歸檔,tar -rvf archive.tar file.txt?;?
-xvf?解開歸檔,tar -xvf archive.tar?。?
gzip / gunzip
“壓縮/解壓”歸檔,默認(rèn)用?gzip?命令,壓縮后的文件后綴名為?.tar.gz?。
tar 歸檔+壓縮
可以用 tar 命令同時完成歸檔和壓縮的操作,就是給 tar 命令多加一個選項(xiàng)參數(shù),使之完成歸檔操作后,還是調(diào)用?gzip?或?bzip2?命令來完成壓縮操作。
zcat、zless、zmore
之前講過使用?cat less more?可以查看文件內(nèi)容,但是壓縮文件的內(nèi)容是不能使用這些命令進(jìn)行查看的,而要使用?zcat、zless、zmore?進(jìn)行查看。
zip/unzip
“壓縮/解壓” zip 文件( zip 壓縮文件一般來自 windows 操作系統(tǒng))。
命令安裝
#?Red?Hat?一族中的安裝方式 yum?install?zip? yum?install?unzip?基礎(chǔ)用法
unzip?archive.zip?#?解壓?.zip?文件 unzip?-l?archive.zip?#?不解開?.zip?文件,只看其中內(nèi)容 zip?-r?sort.zip?sort/?#?將sort文件夾壓縮為?sort.zip,其中-r表示遞歸? ? ? ? ? ? ? ? ? ??編譯安裝軟件
之前我們學(xué)會了使用?yum?命令進(jìn)行軟件安裝,如果碰到?yum?倉庫中沒有的軟件,我們就需要會更高級的軟件安裝“源碼編譯安裝”。
編譯安裝
簡單來說,編譯就是將程序的源代碼轉(zhuǎn)換成可執(zhí)?yum?行文件的過程。大多數(shù) Linux 的程序都是開放源碼的,可以編譯成適合我們的電腦和操縱系統(tǒng)屬性的可執(zhí)行文件。
基本步驟如下:
下載源代碼?
解壓壓縮包?
配置?
編譯?
安裝?
實(shí)際案例 1、下載
我們來編譯安裝 htop 軟件,首先在它的官網(wǎng)下載源碼:https://bintray.com/htop/source/htop#files
下載好的源碼在本機(jī)電腦上使用如下命令同步到服務(wù)器上:
scp?文件名?用戶名@服務(wù)器ip:目標(biāo)路徑 scp?~/Desktop/htop-3.0.0.tar.gz?root@121.42.11.34:.也可以使用 wegt 進(jìn)行下載:
wegt+下載地址 wegt?https://bintray.com/htop/source/download_file?file_path=htop-3.0.0.tar.gz2、解壓文件
tar?-zxvf?htop-3.0.0.tar.gz?#?解壓 cd?htop-3.0.0?#?進(jìn)入目錄3、配置
執(zhí)行?./configure?,它會分析你的電腦去確認(rèn)編譯所需的工具是否都已經(jīng)安裝了。
4、編譯
執(zhí)行?make?命令
5、安裝
執(zhí)行?make install?命令,安裝完成后執(zhí)行?ls /usr/local/bin/?查看是否有??htop?命令。如果有就可以執(zhí)行?htop?命令查看系統(tǒng)進(jìn)程了。
ifconfig
查看 ip 網(wǎng)絡(luò)相關(guān)信息,如果命令不存在的話, 執(zhí)行命令?yum install net-tools?安裝。
參數(shù)解析:
eth0?對應(yīng)有線連接(對應(yīng)你的有線網(wǎng)卡),就是用網(wǎng)線來連接的上網(wǎng)。eth?是 Ethernet 的縮寫,表示“以太網(wǎng)”。有些電腦可能同時有好幾條網(wǎng)線連著,例如服務(wù)器,那么除了eth0?,你還會看到?eth1?、eth2?等。?
lo?表示本地回環(huán)( Local Loopback 的縮寫,對應(yīng)一個虛擬網(wǎng)卡)可以看到它的 ip 地址是 127.0.0.1 。每臺電腦都應(yīng)該有這個接口,因?yàn)樗鼘?yīng)著“連向自己的鏈接”。這也是被稱之為“本地回環(huán)”的原因。所有經(jīng)由這個接口發(fā)送的東西都會回到你自己的電腦。看起來好像并沒有什么用,但有時為了某些緣故,我們需要連接自己。例如用來測試一個網(wǎng)絡(luò)程序,但又不想讓局域網(wǎng)或外網(wǎng)的用戶查看,只能在此臺主機(jī)上運(yùn)行和查看所有的網(wǎng)絡(luò)接口。例如在我們啟動一個前端工程時,在瀏覽器輸入 127.0.0.1:3000 啟動項(xiàng)目就能查看到自己的 web 網(wǎng)站,并且它只有你能看到。?
wlan0?表示無線局域網(wǎng)(上面案例并未展示)。?
host
ip 地址和主機(jī)名的互相轉(zhuǎn)換。
軟件安裝
yum?install?bind-utils
基礎(chǔ)用法
[root@lion?~]#?host?github.com baidu.com?has?address?13.229.188.59 ? [root@lion?~]#?host?13.229.188.59 59.188.229.13.in-addr.arpa?domain?name?pointer?ec2-13-229-188-59.ap-southeast-1.compute.amazonaws.com.ssh 連接遠(yuǎn)程服務(wù)器
通過非對稱加密以及對稱加密的方式(同 HTTPS 安全連接原理相似)連接到遠(yuǎn)端服務(wù)器。
ssh?用戶@ip:port 1、ssh?root@172.20.10.1:22?#?端口號可以省略不寫,默認(rèn)是22端口 2、輸入連接密碼后就可以操作遠(yuǎn)端服務(wù)器了配置 ssh
config?文件可以配置?ssh?,方便批量管理多個?ssh?連接。
配置文件分為以下幾種:
全局?ssh?服務(wù)端的配置:/etc/ssh/sshd_config?;?
全局?ssh?客戶端的配置:?/etc/ssh/ssh_config(很少修改);?
當(dāng)前用戶?ssh?客戶端的配置:~/.ssh/config?。?
【服務(wù)端?config?文件的常用配置參數(shù)】
服務(wù)端 config 參數(shù) | 作用 |
---|---|
Port | sshd 服務(wù)端口號(默認(rèn)是22) |
PermitRootLogin | 是否允許以 root 用戶身份登錄(默認(rèn)是可以) |
PasswordAuthentication | 是否允許密碼驗(yàn)證登錄(默認(rèn)是可以) |
PubkeyAuthentication | 是否允許公鑰驗(yàn)證登錄(默認(rèn)是可以) |
PermitEmptyPasswords | 是否允許空密碼登錄(不安全,默認(rèn)不可以) |
[注意] 修改完服務(wù)端配置文件需要重啟服務(wù)?systemctl restart sshd?
【客戶端?config?文件的常用配置參數(shù)】
客戶端 config 參數(shù) | 作用 |
---|---|
Host | 別名 |
HostName | 遠(yuǎn)程主機(jī)名(或 IP 地址) |
Port | 連接到遠(yuǎn)程主機(jī)的端口 |
User | 用戶名 |
配置當(dāng)前用戶的?config?:
#?創(chuàng)建config vim?~/.ssh/config #?填寫一下內(nèi)容 Host?lion?#?別名 ????HostName?172.x.x.x?#?ip?地址 ??Port?22?#?端口 ??User?root?#?用戶
這樣配置完成后,下次登錄時,可以這樣登錄 ssh lion 會自動識別為 root 用戶。
[注意] 這段配置不是在服務(wù)器上,而是你自己的機(jī)器上,它僅僅是設(shè)置了一個別名。
免密登錄
ssh?登錄分兩種,一種是基于口令(賬號密碼),另外一種是基于密鑰的方式。
基于口令,就是每次登錄輸入賬號和密碼,顯然這樣做是比較麻煩的,今天主要學(xué)習(xí)如何基于密鑰實(shí)現(xiàn)免密登錄。
基于密鑰驗(yàn)證原理
客戶機(jī)生成密鑰對(公鑰和私鑰),把公鑰上傳到服務(wù)器,每次登錄會與服務(wù)器的公鑰進(jìn)行比較,這種驗(yàn)證登錄的方法更加安全,也被稱為“公鑰驗(yàn)證登錄”。
具體實(shí)現(xiàn)步驟 1、在客戶機(jī)中生成密鑰對(公鑰和私鑰)?ssh-keygen(默認(rèn)使用 RSA 非對稱加密算法) 運(yùn)行完?ssh-keygen?會在?~/.ssh/?目錄下,生成兩個文件:
id_rsa.pub?:公鑰?
id_rsa?:私鑰?
2、把客戶機(jī)的公鑰傳送到服務(wù)
執(zhí)行?ssh-copy-id root@172.x.x.x(ssh-copy-id?它會把客戶機(jī)的公鑰追加到服務(wù)器?~/.ssh/authorized_keys?的文件中)。
執(zhí)行完成后,運(yùn)行?ssh root@172.x.x.x?就可以實(shí)現(xiàn)免密登錄服務(wù)器了。
配合上面設(shè)置好的別名,直接執(zhí)行 ssh lion 就可以登錄,是不是非常方便。
wget
可以使我們直接從終端控制臺下載文件,只需要給出文件的HTTP或FTP地址。
wget?[參數(shù)][URL地址] wget?http://www.minjieren.com/wordpress-3.1-zh_CN.zip
wget?非常穩(wěn)定,如果是由于網(wǎng)絡(luò)原因下載失敗,wget?會不斷嘗試,直到整個文件下載完畢。
常用參數(shù)
-c?繼續(xù)中斷的下載。?
備份 scp
它是?Secure Copy?的縮寫,表示安全拷貝。scp?可以使我們通過網(wǎng)絡(luò),把文件從一臺電腦拷貝到另一臺電腦。
scp?是基于?ssh?的原理來運(yùn)作的,ssh?會在兩臺通過網(wǎng)絡(luò)連接的電腦之間創(chuàng)建一條安全通信的管道,scp?就利用這條管道安全地拷貝文件。
其中source_file?和destination_file?都可以這樣表示:user@ip:file_name,user?是登錄名,ip是域名或ip地址。?file_name?是文件路徑。
rsync
rsync?命令主要用于遠(yuǎn)程同步文件。它可以同步兩個目錄,不管它們是否處于同一臺電腦。它應(yīng)該是最常用于“增量備份”的命令了。它就是智能版的?scp?命令。
軟件安裝
yum?install?rsync
基礎(chǔ)用法
rsync?-arv?Images/?backups/?#?將Images?目錄下的所有文件備份到?backups?目錄下 rsync?-arv?Images/?root@192.x.x.x:backups/?#?同步到服務(wù)器的backups目錄下
常用參數(shù)
-a?保留文件的所有信息,包括權(quán)限,修改日期等;?
-r?遞歸調(diào)用,表示子目錄的所有文件也都包括;?
-v?冗余模式,輸出詳細(xì)操作信息。?
默認(rèn)地,rsync?在同步時并不會刪除目標(biāo)目錄的文件,例如你在源目錄中刪除一個文件,但是用?rsync?同步時,它并不會刪除同步目錄中的相同文件。如果向刪除也可以這么做:rsync -arv --delete Images/ backups/?。
系統(tǒng)
halt
關(guān)閉系統(tǒng),需要 root 身份。
halt
reboot
重啟系統(tǒng),需要 root 身份。
reboot
poweroff
直接運(yùn)行即可關(guān)機(jī),不需要?root?身份。
Vim 編譯器
Vim 是什么?
Vim 是從 vi 發(fā)展出來的一個文本編輯器。其代碼補(bǔ)完、編譯及錯誤跳轉(zhuǎn)等方便編程的功能特別豐富,在程序員中被廣泛使用。和 Emacs 并列成為類 Unix 系統(tǒng)用戶最喜歡的編輯器。
Vim 常用模式
交互模式?
插入模式?
命令模式?
可視模式
交互模式
也成為正常模式,這是 Vim 的默認(rèn)模式,每次運(yùn)行 Vim 程序的時候,就會進(jìn)入這個模式。
例如執(zhí)行?vim name.txt?則會進(jìn)入交互模式。
交互模式特征:
在這個模式下,你不能輸入文本;?
它可以讓我們在文本間移動,刪除一行文本,復(fù)制黏貼文本,跳轉(zhuǎn)到指定行,撤銷操作,等等。?
插入模式 這個模式是我們熟悉的文本編輯器的模式,就是可以輸入任何你想輸入的內(nèi)容。進(jìn)入這個模式有幾種方法,最常用的方法是按字母鍵 i (?i、I、a、A、o、O?都可以進(jìn)入插入模式,只是所處的位置不同),退出這種模式,只需要按下 Esc 鍵。
i, I?進(jìn)入輸入模式 Insert mode :i?為“從目前光標(biāo)所在處輸入”,?I?為“在目前所在行的第一個非空格符處開始輸入”;?
a, A?進(jìn)入輸入模式 Insert mode :a?為“從目前光標(biāo)所在的下一個字符處開始輸入”,A?為“從光標(biāo)所在行的最后一個字符處開始輸入”;?
o, O?進(jìn)入輸入模式 Insert mode :o?為“在目前光標(biāo)所在的下一行處輸入新的一行”;O?為在目前光標(biāo)所在處的上一行輸入新的一行。?
命令模式
命令模式也稱為底線命令模式,這個模式下可以運(yùn)行一些命令例如“退出”,“保存”,等動作。
也可以用這個模式來激活一些 Vim 配置,例如語法高亮,顯示行號,等。甚至還可以發(fā)送一些命令給終端命令行,例如?ls?、cp?。
為了進(jìn)入命令模式,首先要進(jìn)入交互模式,再按下冒號鍵。
用一張圖表示三種模式如何切換:
基本操作
打開 Vim
在終端命令行中輸入 vim 回車后 Vim 就會被運(yùn)行起來,也可以用 Vim 來打開一個文件,只需要在 vim 后面再加文件名。如?vim file.name?,如果文件不存在,那么會被創(chuàng)建。
插入
進(jìn)入文件之后,此時處于交互模式,可以通過輸入 i 進(jìn)入插入模式。
移動 在 Vim 的交互模式下,我們可以在文本中移動光標(biāo)。
h 向左移動一個字符?
j 向下移動一個字符?
k 向上移動一個字符?
i 向右移動一個字符?
當(dāng)然也可以使用四個方向鍵進(jìn)行移動,效果是一樣的。
跳至行首和行末
行首:在交互模式下,為了將光標(biāo)定位到一行的開始位置,只需要按下數(shù)字鍵 0 即可,鍵盤上的 Home 鍵也有相同效果。?
行末:在交互模式下,為了將光標(biāo)定位到一行的末尾,只需要按下美元符號鍵?$?即可,鍵盤上的 End 鍵也有相同效果。?
按單詞移動
在交互模式下,按字母鍵?w?可以一個單詞一個單詞的移動。
退出文件
在交互模式下,按下冒號鍵 : 進(jìn)入命令模式,再按下?q?鍵,就可以退出了。
如果在退出之前又修改了文件,就直接想用?:q?退出 Vim ,那么 Vim 會顯示一個紅字標(biāo)明錯誤信息。此時我們有兩個選擇:
保存并退出?:wq??或??:x??;?
不保存且退出 ?:q!??。?
標(biāo)準(zhǔn)操作 刪除字符
在交互模式下,將光標(biāo)定位到一個你想要刪除的字符上,按下字母鍵 x 你會發(fā)現(xiàn)這個字符被刪除了。
也可以一次性刪除多個字符,只需要在按 x 鍵之前輸入數(shù)字即可。
刪除(剪切)單詞,行
刪除一行:連按兩次?d?來刪除光標(biāo)所在的那一行。?
刪除多行:例如先輸入數(shù)字 2 ,再按下?dd?,就會刪除從光標(biāo)所在行開始的兩行。?
刪除一個單詞:將光標(biāo)置于一個單詞的首字母處,然后按下?dw?。?
刪除多個單詞:例如先按數(shù)字鍵 2 再按?dw?就可以刪除兩個單詞了。?
從光標(biāo)所在位置刪除至行首:?d0?。?
從光標(biāo)所在位置刪除至行末:?d$?。?
復(fù)制單詞,行
復(fù)制行:按兩次?y?會把光標(biāo)所在行復(fù)制到內(nèi)存中,和?dd?類似,dd?用于“剪切”光標(biāo)所在行。?
復(fù)制單詞:yw?會復(fù)制一個單詞。?
復(fù)制到行末:y$?是復(fù)制從光標(biāo)所在處到行末的所有字符。?
復(fù)制到行首:y0?是復(fù)制光標(biāo)所在處到行首的所有字符。?
粘貼
如果之前用?dd?或者?yy?剪切復(fù)制過來的,可以使用?p?來粘貼。同樣也可以使用?數(shù)字+p??來表示復(fù)制多次。
替換一個字符
在交互模式下,將光標(biāo)置于想要替換的字符上。按下?r?鍵,接著輸入你要替換的字符即可。
撤銷操作
如果要撤銷最近的修改,只需要按下?u?鍵,如果想要撤銷最近四次修改,可以按下4,再按下?u?。
重做
取消撤銷,也就是重做之前的修改使用?ctrl?+?r??。
跳轉(zhuǎn)到指定行
Vim 編輯的文件中,每一行都有一個行號,行號從1開始,逐一遞增。
行號默認(rèn)是不顯示,如果需要它顯示的話,可以進(jìn)入命令模式,然后輸入?set nu?,如果要隱藏行號的話,使用?set nonu?。
跳轉(zhuǎn)到指定行:數(shù)字+gg?,例如?7gg?,表示跳轉(zhuǎn)到第7行。?
要跳轉(zhuǎn)到最后一行,按下?G?。?
要跳轉(zhuǎn)到第一行,按下?gg?。?
高級操作 查找 處于交互模式下,按下?/?鍵,那么就進(jìn)入查找模式,輸入你要查找的字符串,然后按下回車。光標(biāo)就會跳轉(zhuǎn)到文件中下一個查找到的匹配處。如果字符串不存在,那么會顯示?"pattern not found"?。
n?跳轉(zhuǎn)到下一個匹配項(xiàng);?
N?跳轉(zhuǎn)到上一個匹配項(xiàng)。?
[注意] 用斜杠來進(jìn)行的查找是從當(dāng)前光標(biāo)處開始向文件尾搜索,如果你要從當(dāng)前光標(biāo)處開始,向文件頭搜索則使用???,當(dāng)然也可以先按下?gg?跳轉(zhuǎn)到第一行在進(jìn)行全文搜索。
查找并替換
替換光標(biāo)所在行第一個匹配的字符串:
#?語法 :s/舊字符串/新字符串 #?實(shí)例 :s/one/two
替換光標(biāo)所在行所有舊字符串為新字符串:
#?語法 :s/舊字符串/新字符串/g
替換第幾行到第幾行中所有字符串:
#?語法 :n,m?s/舊字符串/新字符串/g #?實(shí)例 :2,4?s/one/two/g
最常用的就是全文替換了:
#?語法 :%s/舊字符串/新字符串/g
合并文件
可以用冒號?+r?(?:r?) 實(shí)現(xiàn)在光標(biāo)處插入一個文件的內(nèi)容。
:r?filename?#?可以用Tab鍵來自動補(bǔ)全另外一個文件的路徑
分屏 Vim 有一個特別便捷的功能那就是分屏,可以同時打開好幾個文件,分屏之后,屏幕每一塊被稱為一個 viewport ,表示“視口”。
橫向分屏?: sp 文件名?
垂直分屏?: vsp 文件名?
分屏模式下的快捷鍵
Ctrl + w?再加?Ctrl + w?,表示從一個 viewport 移動光標(biāo)到另外一個 viewport ;?
Ctrl + w?再加 “方向鍵”,就可以移動到這個方向所處的下一個視口了;?
Ctrl + w?再加?+?號,表示擴(kuò)大當(dāng)前視口;?
Ctrl + w?再加?-?號,表示縮小當(dāng)前視口;?
Ctrl + w?再加?=?號,表示平均當(dāng)前視口;?
Ctrl + w?再加?r?鍵,會反向調(diào)換視口位置;?
Ctrl + w?再加?q?鍵,會關(guān)閉當(dāng)前視口;?
Ctrl + w?再加?o?鍵,會關(guān)閉除當(dāng)前視口以外的所有視口;?
運(yùn)行外部命令?:!
在 Vim 中可以運(yùn)行一些終端命令,只要先輸入 :! ,然后接命令名稱。
例如:
:!ls?#?在Vim中打開的文件所在的目錄運(yùn)行l(wèi)s命令
可視模式
前面只講了 Vim 的三種模式,其實(shí)還有一種模式叫做可視模式。
進(jìn)入它的三種方式(都是從交互模式開始):
v?字符可視模式,進(jìn)入后配合方向鍵選中字符后,然后再按?d?鍵可以刪除選中。?
V?行可視模式,進(jìn)入后光標(biāo)所在行默認(rèn)被選中,然后再按?d?鍵可以刪除所在行。?
Ctrl + v?塊可視模式,它是可視模式最有用的功能了,配合?d?和?I?鍵可以實(shí)現(xiàn)刪除選中的內(nèi)容和插入內(nèi)容。?
同時選中多行,并在選中行頭部插入內(nèi)容的具體操作步驟:
1.?ctrl?+?v?進(jìn)入塊可視模式 2.?使用方向鍵進(jìn)行選中(上下左右)假設(shè)選中5行 3.?輸入?I?鍵進(jìn)行多行同時插入操作 4.?插入完成后連續(xù)按兩下?esc?鍵,實(shí)現(xiàn)多行同時插入相同字符
進(jìn)入可視模式之后的操作鍵:
d?鍵,表示刪除選中;?
I?鍵,表示在選中之前插入;?
u?鍵,表示選中變?yōu)樾懀?
U?鍵,表示選中變?yōu)榇髮懀?
Vim 配置 選項(xiàng)參數(shù)
在 Vim 被啟動后,可以運(yùn)行一些指令來激活一些選項(xiàng)參數(shù),但是這些選項(xiàng)參數(shù)的配置在退出 Vim 時會被忘記,例如前面講解的激活行號。如果希望所在的配置是永久性的,那么需要在家目錄(?cd ~?)創(chuàng)建一個 Vim 的配置文件?.vimrc?。
.vimrc Vim 配置非常豐富,我們可以通過個性化配置把 Vim 打造成屬于自己的 IDE 等等。在 github 上也可以搜索到一些強(qiáng)大的 Vim 配置文件。
總結(jié)
相信通過本文的學(xué)習(xí),你應(yīng)該會對 Linux 有一個更加全面的認(rèn)識。
編輯:黃飛
?
評論
查看更多