常用Linux 命令瞭解

轉自:https://juejin.cn/post/6938385978004340744 

前言

Linux 的學習對於一個程序員的重要性是不言而喻的。前端開發相比後端開發,接觸 Linux 機會相對較少,因此往往容易忽視它。但是學好它卻是程序員必備修養之一。

如果本文對你有所幫助,請點個👍 吧。

作者使用的是阿里雲服務器 ECS (最便宜的那種) CentOS 7.7 64位。當然你也可以在自己的電腦安裝虛擬機,虛擬機中再去安裝 CentOS 系統(這就完全免費了)。至於它的安裝教程可以去谷歌搜索下,相關教程非常多。

Linux 基礎

操作系統

操作系統 Operating System 簡稱 OS ,是軟件的一部分,它是硬件基礎上的第一層軟件,是硬件和其它軟件溝通的橋樑。

操作系統會控制其他程序運行,管理系統資源,提供最基本的計算功能,如管理及配置內存、決定系統資源供需的優先次序等,同時還提供一些基本的服務程序。

image.png

什麼是 Linux

Linux 系統內核與 Linux 發行套件的區別

  • Linux 系統內核指的是由 Linus Torvalds 負責維護,提供硬件抽象層、硬盤及文件系統控制及多任務功能的系統核心程序。
  • Linux 發行套件系統是我們常說的 Linux 操作系統,也即是由 Linux 內核與各種常用軟件的集合產品。

總結:真正的 Linux 指的是系統內核,而我們常說的 Linux 指的是“發行版完整的包含一些基礎軟件的操作系統”。

Linux 對比 Windows

  1. 穩定且有效率;
  2. 免費(或少許費用);
  3. 漏洞少且快速修補;
  4. 多任務多用戶;
  5. 更加安全的用戶與文件權限策略;
  6. 適合小內核程序的嵌入系統;
  7. 相對不耗資源。

Linux 系統種類

  • 紅帽企業版 Linux : RHEL 是全世界內使用最廣泛的 Linux 系統。它具有極強的性能與穩定性,是衆多生成環境中使用的(收費的)系統。
  • Fedora :由紅帽公司發佈的桌面版系統套件,用戶可以免費體驗到最新的技術或工具,這些技術或工具在成熟後會被加入到 RHEL 系統中,因此 Fedora 也成爲 RHEL 系統的試驗版本。
  • CentOS :通過把 RHEL 系統重新編譯併發布給用戶免費使用的 Linux 系統,具有廣泛的使用人羣。
  • Deepin :中國發行,對優秀的開源成品進行集成和配置。
  • Debian :穩定性、安全性強,提供了免費的基礎支持,在國外擁有很高的認可度和使用率。
  • Ubuntu :是一款派生自 Debian 的操作系統,對新款硬件具有極強的兼容能力。 Ubuntu 與 Fedora 都是極其出色的 Linux 桌面系統,而且 Ubuntu 也可用於服務器領域。

終端連接阿里雲服務器

image.png 通過執行 ssh [email protected] 命令,然後輸入服務器連接密碼就可以順利登陸遠程服務器。從現在開始我們就可以在本地電腦操作遠程服務器。

  1. 這個黑色的面板就是終端也就是 Shell (命令行環境)。
  2. ssh root@xxx 這是一條命令,必須要在 Shell 中才能執行。

Shell

Shell 這個單詞的原意是“外殼”,跟 kernel(內核)相對應,比喻內核外面的一層,即用戶跟內核交互的對話界面。

  • Shell 是一個程序,提供一個與用戶對話的環境。這個環境只有一個命令提示符,讓用戶從鍵盤輸入命令,所以又稱爲命令行環境( command line interface ,簡寫爲 CLI )。 Shell 接收到用戶輸入的命令,將命令送入操作系統執行,並將結果返回給用戶。
  • Shell 是一個命令解釋器,解釋用戶輸入的命令。它支持變量、條件判斷、循環操作等語法,所以用戶可以用 Shell 命令寫出各種小程序,又稱爲 Shell 腳本。這些腳本都通過 Shell 的解釋執行,而不通過編譯。
  • Shell 是一個工具箱,提供了各種小工具,供用戶方便地使用操作系統的功能。

Shell 的種類

Shell 有很多種,只要能給用戶提供命令行環境的程序,都可以看作是 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 中的默認 Shell  就是 Bash 。

通過執行 echo $SHELL 命令可以查看到當前正在使用的 Shell 。還可以通過 cat /etc/shells 查看當前系統安裝的所有 Shell  種類。

命令

命令行提示符

進入命令行環境以後,用戶會看到 Shell 的提示符。提示符往往是一串前綴,最後以一個美元符號 $ 結尾,用戶可以在這個符號後面輸入各種命令。

執行一個簡單的命令 pwd :

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

命令解析:

  • root:表示用戶名;

  • iZm5e8dsxce9ufaic7hi3uZ:表示主機名;

  • ~:表示目前所在目錄爲家目錄,其中 root 用戶的家目錄是 /root 普通用戶的家目錄在 /home 下;

  • #:指示你所具有的權限( root 用戶爲 # ,普通用戶爲 $ )。

  • 執行 whoami 命令可以查看當前用戶名;

  • 執行 hostname 命令可以查看當前主機名;

關於如何創建、切換、刪除用戶,在後面的用戶與權限會具體講解,這裏先使用 root 用戶進行演示。

[備註] root  是超級用戶,具備操作系統的一切權限。

命令格式

command parameters(命令 參數)
複製代碼

長短參數

單個參數:ls -aa 是英文 all 的縮寫,表示“全部”)
多個參數:ls -al(全部文件 + 列表形式展示)
單個長參數:ls --all
多個長參數:ls --reverse --all
長短混合參數:ls --all -l
複製代碼

參數值

短參數:command -p 10(例如:ssh [email protected] -p 22)
長參數:command --paramters=10(例如:ssh [email protected] --port=22)
複製代碼

快捷方式

在開始學習 Linux 命令之前,有這麼一些快捷方式,是必須要提前掌握的,它將貫穿整個 Linux 使用生涯。

  • 通過上下方向鍵 ↑ ↓ 來調取過往執行過的 Linux 命令;
  • 命令或參數僅需輸入前幾位就可以用 Tab 鍵補全;
  • Ctrl + R :用於查找使用過的命令(history 命令用於列出之前使用過的所有命令,然後輸入 ! 命令加上編號( !2 )就可以直接執行該歷史命令);
  • Ctrl + L:清除屏幕並將當前行移到頁面頂部;
  • Ctrl + C:中止當前正在執行的命令;
  • Ctrl + U:從光標位置剪切到行首;
  • Ctrl + K:從光標位置剪切到行尾;
  • Ctrl + W:剪切光標左側的一個單詞;
  • Ctrl + Y:粘貼 Ctrl + U | K | Y 剪切的命令;
  • Ctrl + A:光標跳到命令行的開頭;
  • Ctrl + E:光標跳到命令行的結尾;
  • Ctrl + D:關閉 Shell 會話;

文件和目錄

文件的組織

image.png

查看路徑

pwd

顯示當前目錄的路徑

image.png

which

查看命令的可執行文件所在路徑, Linux 下,每一條命令其實都對應一個可執行程序,在終端中輸入命令,按回車的時候,就是執行了對應的那個程序, which 命令本身對應的程序也存在於 Linux 中。

總的來說一個命令就是一個可執行程序。

image.png

瀏覽和切換目錄

ls

列出文件和目錄,它是 Linux 最常用的命令之一。

【常用參數】

  • -a 顯示所有文件和目錄包括隱藏的
  • -l 顯示詳細列表
  • -h 適合人類閱讀的
  • -t 按文件最近一次修改時間排序
  • -i 顯示文件的 inode ( inode 是文件內容的標識)

image.png

cd

cd 是英語 change directory 的縮寫,表示切換目錄。

cd /	--> 跳轉到根目錄
cd ~	--> 跳轉到家目錄
cd ..	--> 跳轉到上級目錄
cd ./home	--> 跳轉到當前目錄的home目錄下
cd /home/lion	--> 跳轉到根目錄下的home目錄下的lion目錄
cd	--> 不添加任何參數,也是回到家目錄
複製代碼

[注意] 輸入cd /ho + 單次 tab 鍵會自動補全路徑 + 兩次 tab 鍵會列出所有可能的目錄列表。

du

列舉目錄大小信息。

【常用參數】

  • -h 適合人類閱讀的;
  • -a 同時列舉出目錄下文件的大小信息;
  • -s 只顯示總計大小,不顯示具體信息。

瀏覽和創建文件

cat

一次性顯示文件所有內容,更適合查看小的文件。

cat cloud-init.log
複製代碼

【常用參數】

  • -n 顯示行號。

less

分頁顯示文件內容,更適合查看大的文件。

less cloud-init.log
複製代碼

【快捷操作】

  • 空格鍵:前進一頁(一個屏幕);
  • b 鍵:後退一頁;
  • 回車鍵:前進一行;
  • y 鍵:後退一行;
  • 上下鍵:回退或前進一行;
  • d 鍵:前進半頁;
  • u 鍵:後退半頁;
  • q 鍵:停止讀取文件,中止 less 命令;
  • = 鍵:顯示當前頁面的內容是文件中的第幾行到第幾行以及一些其它關於本頁內容的詳細信息;
  • h 鍵:顯示幫助文檔;
  • / 鍵:進入搜索模式後,按 n 鍵跳到一個符合項目,按 N 鍵跳到上一個符合項目,同時也可以輸入正則表達式匹配。

head

顯示文件的開頭幾行(默認是10行)

head cloud-init.log
複製代碼

【參數】

  • -n 指定行數 head cloud-init.log -n 2 

tail

顯示文件的結尾幾行(默認是10行)

tail cloud-init.log
複製代碼

【參數】

  • -n 指定行數 tail cloud-init.log -n 2
  • -f 會每過1秒檢查下文件是否有更新內容,也可以用 -s 參數指定間隔時間 tail -f -s 4 xxx.log 

touch

創建一個文件

touch new_file
複製代碼

mkdir

創建一個目錄

mkdir new_folder
複製代碼

【常用參數】

  • -p 遞歸的創建目錄結構 mkdir -p one/two/three 

文件的複製和移動

cp

拷貝文件和目錄

cp file file_copy	--> file 是目標文件,file_copy 是拷貝出來的文件
cp file one	--> 把 file 文件拷貝到 one 目錄下,並且文件名依然爲 file
cp file one/file_copy	--> 把 file 文件拷貝到 one 目錄下,文件名爲file_copy
cp *.txt folder	--> 把當前目錄下所有 txt 文件拷貝到 folder 目錄下
複製代碼

【常用參數】

  • -r 遞歸的拷貝,常用來拷貝一整個目錄

mv

移動(重命名)文件或目錄,與cp命令用法相似。

mv file one	--> 將 file 文件移動到 one 目錄下
mv new_folder one	--> 將 new_folder 文件夾移動到one目錄下
mv *.txt folder	--> 把當前目錄下所有 txt 文件移動到 folder 目錄下
mv file new_file	--> file 文件重命名爲 new_file
複製代碼

文件的刪除和鏈接

rm

刪除文件和目錄,由於 Linux 下沒有回收站,一旦刪除非常難恢復,因此需要謹慎操作

rm new_file 	--> 刪除 new_file 文件
rm f1 f2 f3 	--> 同時刪除 f1 f2 f3 3個文件
複製代碼

【常用參數】

  • -i 向用戶確認是否刪除;
  • -f 文件強制刪除;
  • -r 遞歸刪除文件夾,著名的刪除操作 rm -rf 。

ln

英文 Link 的縮寫,表示創建鏈接。

學習創建鏈接之前,首先要理解鏈接是什麼,我們先來看看 Linux 的文件是如何存儲的:

Linux  文件的存儲方式分爲3個部分,文件名、文件內容以及權限,其中文件名的列表是存儲在硬盤的其它地方和文件內容是分開存放的,每個文件名通過 inode 標識綁定到文件內容。

Linux 下有兩種鏈接類型:硬鏈接和軟鏈接。

硬鏈接

使鏈接的兩個文件共享同樣文件內容,就是同樣的 inode ,一旦文件1和文件2之間有了硬鏈接,那麼修改任何一個文件,修改的都是同一塊內容,它的缺點是,只能創建指向文件的硬鏈接,不能創建指向目錄的(其實也可以,但比較複雜)而軟鏈接都可以,因此軟鏈接使用更加廣泛。

ln file1 file2 	--> 創建 file2 爲 file1 的硬鏈接
複製代碼

image.png

如果我們用 rm file1 來刪除 file1 ,對 file2 沒有什麼影響,對於硬鏈接來說,刪除任意一方的文件,共同指向的文件內容並不會從硬盤上刪除。只有同時刪除了 file1 與 file2 後,它們共同指向的文件內容纔會消失。

軟鏈接

軟鏈接就類似 windows 下快捷方式。

ln -s file1 file2
複製代碼

image.png

執行 ls -l 命名查看當前目錄下文件的具體信息

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

其實 file2 只是 file1 的一個快捷方式,它指向的是 file1 ,所以顯示的是 file1 的內容,但其實 file2 的 inode  與 file1 並不相同。如果我們刪除了 file2 的話, file1 是不會受影響的,但如果刪除 file1 的話, file2 就會變成死鏈接,因爲指向的文件不見了。

用戶與權限

用戶

Linux 是一個多用戶的操作系統。在 Linux 中,理論上來說,我們可以創建無數個用戶,但是這些用戶是被劃分到不同的羣組裏面的,有一個用戶,名叫 root ,是一個很特殊的用戶,它是超級用戶,擁有最高權限。

image.png

自己創建的用戶是有限權限的用戶,這樣大大提高了 Linux 系統的安全性,有效防止誤操作或是病毒攻擊,但是我們執行的某些命令需要更高權限時可以使用 sudo 命令。

sudo

root 身份運行命令

sudo date  --> 當然查看日期是不需要sudo的這裏只是演示,sudo 完之後一般還需要輸入用戶密碼的
複製代碼

useradd + passwd

  • useradd 添加新用戶
  • passwd  修改用戶密碼

這兩個命令需要 root 用戶權限

useradd lion	--> 添加一個lion用戶,添加完之後在 /home 路徑下可以查看
passwd lion	--> 修改lion用戶的密碼
複製代碼

userdel

刪除用戶,需要 root 用戶權限

userdel lion	--> 只會刪除用戶名,不會從/home中刪除對應文件夾
userdel lion -r	--> 會同時刪除/home下的對應文件夾
複製代碼

su

切換用戶,需要 root 用戶權限

sudo su	--> 切換爲root用戶(exit 命令或 CTRL + D 快捷鍵都可以使普通用戶切換爲 root 用戶)
su lion	--> 切換爲普通用戶
su -	--> 切換爲root用戶
複製代碼

羣組的管理

Linux 中每個用戶都屬於一個特定的羣組,如果你不設置用戶的羣組,默認會創建一個和它的用戶名一樣的羣組,並且把用戶劃歸到這個羣組。

groupadd

創建羣組,用法和 useradd 類似。

groupadd friends
複製代碼

groupdel

刪除一個已存在的羣組

groupdel foo 	--> 刪除foo羣組
複製代碼

groups

查看用戶所在羣組

groups lion 	--> 查看 lion 用戶所在的羣組
複製代碼

usermod

用於修改用戶的賬戶。

【常用參數】

  • -l 對用戶重命名。需要注意的是 /home 中的用戶家目錄的名字不會改變,需要手動修改。
  • -g 修改用戶所在的羣組,例如 usermod -g friends lion 修改 lion 用戶的羣組爲 friends 。
  • -G 一次性讓用戶添加多個羣組,例如 usermod -G friends,foo,bar lion
  • -a -G 會讓你離開原先的羣組,如果你不想這樣做的話,就得再添加 -a 參數,意味着 append 追加的意思。

chgrp

用於修改文件的羣組。

chgrp bar file.txt	--> file.txt文件的羣組修改爲bar
複製代碼

chown

改變文件的所有者,需要 root 身份才能運行。

chown lion file.txt	--> 把其它用戶創建的file.txt轉讓給lion用戶
chown lion:bar file.txt	--> 把file.txt的用戶改爲lion,羣組改爲bar
複製代碼

【常用參數】

  • -R 遞歸設置子目錄和子文件, chown -R lion:lion /home/frankfrank 文件夾的用戶和羣組都改爲 lion 。

文件權限管理

chmod

修改訪問權限。

chmod 740 file.txt
複製代碼

【常用參數】

  • -R 可以遞歸地修改文件訪問權限,例如 chmod -R 777 /home/lion

修改權限的確簡單,但是理解其深層次的意義纔是更加重要的。下面我們來系統的學習 Linux 的文件權限。

[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 表示文件或目錄的權限。讓我們一起來解讀它具體代表什麼?

  • d :表示目錄,就是說這是一個目錄,普通文件是 - ,鏈接是 l
  • r : read 表示文件可讀。
  • w : write 表示文件可寫,一般有寫的權限,就有刪除的權限。
  • x : execute 表示文件可執行。
  • - :表示沒有相應權限。

權限的整體是按用戶來劃分的,如下圖所示:

image.png

現在再來理解這句權限 drwxr-xr-x 的意思:

  • 它是一個文件夾;
  • 它的所有者具有:讀、寫、執行權限;
  • 它的羣組用戶具有:讀、執行的權限,沒有寫的權限;
  • 它的其它用戶具有:讀、執行的權限,沒有寫的權限。

現在理解了權限,我們使用 chmod 來嘗試修改權限。 chmod 它不需要是 root 用戶才能運行的,只要你是此文件所有者,就可以用 chmod 來修改文件的訪問權限。

數字分配權限

權限 數字
r 4
w 2
x 1

因此要改變權限,只要做一些簡單的加法就行:

chmod 640 hello.c 

# 分析
6 = 4 + 2 + 0 表示所有者具有 rw 權限
4 = 4 + 0 + 0 表示羣組用戶具有 r 權限
0 = 0 + 0 + 0 表示其它用戶沒有權限

對應文字權限爲:-rw-r-----
複製代碼

用字母來分配權限

  • u : user 的縮寫,用戶的意思,表示所有者。
  • g : group 的縮寫,羣組的意思,表示羣組用戶。
  • o : other 的縮寫,其它的意思,表示其它用戶。
  • a : all 的縮寫,所有的意思,表示所有用戶。
  • + :加號,表示添加權限。
  • - :減號,表示去除權限。
  • = :等於號,表示分配權限。
chmod u+rx file	--> 文件file的所有者增加讀和運行的權限
chmod g+r file	--> 文件file的羣組用戶增加讀的權限
chmod o-r file	--> 文件file的其它用戶移除讀的權限
chmod g+r o-r file	--> 文件file的羣組用戶增加讀的權限,其它用戶移除讀的權限
chmod go-r file	--> 文件file的羣組和其他用戶移除讀的權限
chmod +x file	--> 文件file的所有用戶增加運行的權限
chmod u=rwx,g=r,o=- file	--> 文件file的所有者分配讀寫和執行的權限,羣組其它用戶分配讀的權限,其他用戶沒有任何權限
複製代碼

查找文件

locate

搜索包含關鍵字的所有文件和目錄。後接需要查找的文件名,也可以用正則表達式。

安裝 locate

yum -y install mlocate	--> 安裝包
updatedb	--> 更新數據庫
複製代碼
locate file.txt
locate fil*.txt
複製代碼

[注意] locate 命令會去文件數據庫中查找命令,而不是全磁盤查找,因此剛創建的文件並不會更新到數據庫中,所以無法被查找到,可以執行 updatedb 命令去更新數據庫。

find

用於查找文件,它會去遍歷你的實際硬盤進行查找,而且它允許我們對每個找到的文件進行後續操作,功能非常強大。

find <何處> <何物> <做什麼>
複製代碼
  • 何處:指定在哪個目錄查找,此目錄的所有子目錄也會被查找。
  • 何物:查找什麼,可以根據文件的名字來查找,也可以根據其大小來查找,還可以根據其最近訪問時間來查找。
  • 做什麼:找到文件後,可以進行後續處理,如果不指定這個參數, find 命令只會顯示找到的文件。

根據文件名查找

find -name "file.txt"	--> 當前目錄以及子目錄下通過名稱查找文件
find . -name "syslog"	--> 當前目錄以及子目錄下通過名稱查找文件
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 會查找所有包含關鍵字的文件。

根據文件大小查找

find /var -size +10M	--> /var 目錄下查找文件大小超過 10M 的文件
find /var -size -50k	--> /var 目錄下查找文件大小小於 50k 的文件
find /var -size +1G	--> /var 目錄下查找文件大小查過 1G 的文件
find /var -size 1M	--> /var 目錄下查找文件大小等於 1M 的文件
複製代碼

根據文件最近訪問時間查找

find -name "*.txt" -atime -7 	--> 近 7天內訪問過的.txt結尾的文件
複製代碼

僅查找目錄或文件

find . -name "file" -type f 	--> 只查找當前目錄下的file文件
find . -name "file" -type d 	--> 只查找當前目錄下的file目錄
複製代碼

操作查找結果

find -name "*.txt" -printf "%p - %u\n"	--> 找出所有後綴爲txt的文件,並按照 %p - %u\n 格式打印,其中%p=文件名,%u=文件所有者
find -name "*.jpg" -delete	--> 刪除當前目錄以及子目錄下所有.jpg爲後綴的文件,不會有刪除提示,因此要慎用
find -name "*.c" -exec chmod 600 {} \;	--> 對每個.c結尾的文件,都進行 -exec 參數指定的操作,{} 會被查找到的文件替代,\; 是必須的結尾
find -name "*.c" -ok chmod 600 {} \;	--> 和上面的功能一直,會多一個確認提示
複製代碼

軟件倉庫

Linux 下軟件是以包的形式存在,一個軟件包其實就是軟件的所有文件的壓縮包,是二進制的形式,包含了安裝軟件的所有指令。 Red Hat 家族的軟件包後綴名一般爲 .rpm , Debian 家族的軟件包後綴是 .deb 。

Linux 的包都存在一個倉庫,叫做軟件倉庫,它可以使用 yum 來管理軟件包, yum 是 CentOS 中默認的包管理工具,適用於 Red Hat 一族。可以理解成 Node.js 的 npm 。

yum 常用命令

  • yum update | yum upgrade  更新軟件包
  • yum search xxx 搜索相應的軟件包
  • yum install xxx 安裝軟件包
  • yum remove xxx 刪除軟件包

切換 CentOS 軟件源

有時候 CentOS 默認的 yum 源不一定是國內鏡像,導致 yum  在線安裝及更新速度不是很理想。這時候需要將 yum 源設置爲國內鏡像站點。國內主要開源的鏡像站點是網易和阿里雲。

1、首先備份系統自帶 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  命令種類繁雜,我們憑藉記憶不可能全部記住,因此學會查用手冊是非常重要的。

man

安裝更新 man

sudo yum install -y man-pages	--> 安裝
sudo mandb	--> 更新
複製代碼

man 手冊種類

  1. 可執行程序或 Shell 命令;
  2. 系統調用( Linux 內核提供的函數);
  3. 庫調用(程序庫中的函數);
  4. 文件(例如 /etc/passwd );
  5. 特殊文件(通常在 /dev 下);
  6. 遊戲;
  7. 雜項( man(7) ,groff(7) );
  8. 系統管理命令(通常只能被 root 用戶使用);
  9. 內核子程序。

man + 數字 + 命令

輸入 man + 數字 + 命令/函數,可以查到相關的命令和函數,若不加數字, man 默認從數字較小的手冊中尋找相關命令和函數

man 3 rand 	--> 表示在手冊的第三部分查找 rand 函數
man ls 			--> 查找 ls 用法手冊
複製代碼

man 手冊核心區域解析:(以 man pwd  爲例)

NAME # 命令名稱和簡單描述
     pwd -- return working directory name

SYNOPSIS # 使用此命令的所有方法
     pwd [-L | -P]

DESCRIPTION # 包括所有參數以及用法
     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 # 擴展閱讀相關命令
     builtin(1), cd(1), csh(1), sh(1), getcwd(3)
複製代碼

help

man 命令像新華詞典一樣可以查詢到命令或函數的詳細信息,但其實我們還有更加快捷的方式去查詢, command --help 或 command -h ,它沒有 man 命令顯示的那麼詳細,但是它更加易於閱讀。

Linux 進階

文本操作

grep

全局搜索一個正則表達式,並且打印到屏幕。簡單來說就是,在文件中查找關鍵字,並顯示關鍵字所在行。

基礎語法

grep text file # text代表要搜索的文本,file代表供搜索的文件

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

常用參數

  • -i 忽略大小寫, grep -i path /etc/profile 
  • -n 顯示行號,grep -n path /etc/profile
  • -v 只顯示搜索文本不在的那些行,grep -v path /etc/profile
  • -r 遞歸查找, grep -r hello /etc ,Linux 中還有一個 rgrep 命令,作用相當於 grep -r 

高級用法

grep 可以配合正則表達式使用。

grep -E path /etc/profile --> 完全匹配path
grep -E ^path /etc/profile --> 匹配path開頭的字符串
grep -E [Pp]ath /etc/profile --> 匹配path或Path
複製代碼

sort

對文件的行進行排序。

基礎語法

sort name.txt # 對name.txt文件進行排序
複製代碼

實例用法

爲了演示方便,我們首先創建一個文件 name.txt ,放入以下內容:

Christopher
Shawn
Ted
Rock
Noah
Zachary
Bella
複製代碼

執行 sort name.txt 命令,會對文本內容進行排序。

常用參數

  • -o 將排序後的文件寫入新文件, sort -o name_sorted.txt name.txt ;
  • -r 倒序排序, sort -r name.txt ;
  • -R 隨機排序, sort -R name.txt ;
  • -n 對數字進行排序,默認是把數字識別成字符串的,因此 138 會排在 25 前面,如果添加了 -n 數字排序的話,則 25 會在 138 前面。

wc

word count 的縮寫,用於文件的統計。它可以統計單詞數目、行數、字符數,字節數等。

基礎語法

wc name.txt # 統計name.txt
複製代碼

實例用法

[root@lion ~]# wc name.txt 
13 13 91 name.txt
複製代碼
  • 第一個13,表示行數;
  • 第二個13,表示單詞數;
  • 第三個91,表示字節數。

常用參數

  • -l 只統計行數, wc -l name.txt ;
  • -w 只統計單詞數, wc -w name.txt ;
  • -c 只統計字節數, wc -c name.txt ;
  • -m 只統計字符數, wc -m name.txt 。

uniq

刪除文件中的重複內容。

基礎語法

uniq name.txt # 去除name.txt重複的行數,並打印到屏幕上
uniq name.txt uniq_name.txt # 把去除重複後的文件保存爲 uniq_name.txt
複製代碼

【注意】它只能去除連續重複的行數。

常用參數

  • -c 統計重複行數, uniq -c name.txt ;
  • -d 只顯示重複的行數, uniq -d name.txt 。

cut

剪切文件的一部分內容。

基礎語法

cut -c 2-4 name.txt # 剪切每一行第二到第四個字符
複製代碼

常用參數

  • -d 用於指定用什麼分隔符(比如逗號、分號、雙引號等等) cut -d , name.txt ;
  • -f 表示剪切下用分隔符分割的哪一塊或哪幾塊區域, cut -d , -f 1 name.txt 。

重定向 管道 流

Linux 中一個命令的去向可以有3個地方:終端、文件、作爲另外一個命令的入參。
未命名文件 (4).png
命令一般都是通過鍵盤輸入,然後輸出到終端、文件等地方,它的標準用語是 stdin 、 stdout 以及 stderr 。

  • 標準輸入 stdin ,終端接收鍵盤輸入的命令,會產生兩種輸出;
  • 標準輸出 stdout ,終端輸出的信息(不包含錯誤信息);
  • 標準錯誤輸出 stderr ,終端輸出的錯誤信息。


image.png

重定向

把本來要顯示在終端的命令結果,輸送到別的地方(到文件中或者作爲其他命令的輸入)。

輸出重定向 > 

> 表示重定向到新的文件, cut -d , -f 1 notes.csv > name.csv ,它表示通過逗號剪切 notes.csv 文件(剪切完有3個部分)獲取第一個部分,重定向到 name.csv 文件。

我們來看一個具體示例,學習它的使用,假設我們有一個文件 notes.csv  ,文件內容如下:

Mark1,951/100,很不錯1
Mark2,952/100,很不錯2
Mark3,953/100,很不錯3
Mark4,954/100,很不錯4
Mark5,955/100,很不錯5
Mark6,956/100,很不錯6
複製代碼

執行命令: cut -d , -f 1 notes.csv > name.csv 最後輸出如下內容:

Mark1
Mark2
Mark3
Mark4
Mark5
Mark6
複製代碼

【注意】使用 > 要注意,如果輸出的文件不存在它會新建一個,如果輸出的文件已經存在,則會覆蓋。因此執行這個操作要非常小心,以免覆蓋其它重要文件。

輸出重定向 >> 

表示重定向到文件末尾,因此它不會像 > 命令這麼危險,它是追加到文件的末尾(當然如果文件不存在,也會被創建)。

再次執行 cut -d , -f 1 notes.csv >> name.csv ,則會把名字追加到 name.csv 裏面。

Mark1
Mark2
Mark3
Mark4
Mark5
Mark6
Mark1
Mark2
Mark3
Mark4
Mark5
Mark6
複製代碼

我們平時讀的 log 日誌文件其實都是用這個命令輸出的。

輸出重定向 2> 

標準錯誤輸出

cat not_exist_file.csv > res.txt 2> errors.log
複製代碼
  • 當我們 cat 一個文件時,會把文件內容打印到屏幕上,這個是標準輸出;
  • 當使用了 > res.txt 時,則不會打印到屏幕,會把標準輸出寫入文件 res.txt 文件中;
  • 2> errors.log 當發生錯誤時會寫入 errors.log 文件中。

輸出重定向 2>> 

標準錯誤輸出(追加到文件末尾)同 >> 相似。

輸出重定向 2>&1 

標準輸出和標準錯誤輸出都重定向都一個地方

cat not_exist_file.csv > res.txt 2>&1  # 覆蓋輸出
cat not_exist_file.csv >> res.txt 2>&1 # 追加輸出
複製代碼


目前爲止,我們接觸的命令的輸入都來自命令的參數,其實命令的輸入還可以來自文件或者鍵盤的輸入。

未命名文件 (2).png

輸入重定向 < 

< 符號用於指定命令的輸入。

cat < name.csv # 指定命令的輸入爲 name.csv
複製代碼

雖然它的運行結果與 cat name.csv 一樣,但是它們的原理卻完全不同。

  • cat name.csv 表示 cat 命令接收的輸入是 notes.csv 文件名,那麼要先打開這個文件,然後打印出文件內容。
  • cat < name.csv 表示 cat 命令接收的輸入直接是 notes.csv 這個文件的內容, cat 命令只負責將其內容打印,打開文件並將文件內容傳遞給 cat 命令的工作則交給終端完成。

輸入重定向 << 

將鍵盤的輸入重定向爲某個命令的輸入。

sort -n << END # 輸入這個命令之後,按下回車,終端就進入鍵盤輸入模式,其中END爲結束命令(這個可以自定義)

wc -m << END # 統計輸入的單詞
複製代碼

管道 | 

把兩個命令連起來使用,一個命令的輸出作爲另外一個命令的輸入,英文是 pipeline ,可以想象一個個水管連接起來,管道算是重定向流的一種。

未命名文件 (1).png

舉幾個實際用法案例:

cut -d , -f 1 name.csv | sort > sorted_name.txt 
# 第一步獲取到的 name 列表,通過管道符再進行排序,最後輸出到sorted_name.txt

du | sort -nr | head 
# du 表示列舉目錄大小信息
# sort 進行排序,-n 表示按數字排序,-r 表示倒序
# head 前10行文件

grep log -Ir /var/log | cut -d : -f 1 | sort | uniq
# grep log -Ir /var/log 表示在log文件夾下搜索 /var/log 文本,-r 表示遞歸,-I 用於排除二進制文件
# cut -d : -f 1 表示通過冒號進行剪切,獲取剪切的第一部分
# sort 進行排序
# uniq 進行去重
複製代碼

流並非一個命令,在計算機科學中,流 stream 的含義是比較難理解的,記住一點即可:流就是讀一點數據, 處理一點點數據。其中數據一般就是二進制格式。 上面提及的重定向或管道,就是把數據當做流去運轉的。

到此我們就接觸了,流、重定向、管道等 Linux 高級概念及指令。其實你會發現關於流和管道在其它語言中也有廣泛的應用。 Angular 中的模板語法中可以使用管道。 Node.js 中也有 stream 流的概念。

查看進程

Windows 中通過 Ctrl + Alt + Delete 快捷鍵查看軟件進程。

w

幫助我們快速瞭解系統中目前有哪些用戶登錄着,以及他們在幹什麼。

[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:表示當前時間
up 25 days, 9:53:表示系統已經正常運行了“259小時53分鐘”
1 user:表示一個用戶
load average: 0.00, 0.01, 0.05:表示系統的負載,3個值分別表示“1分鐘的平均負載”,“5分鐘的平均負載”,“15分鐘的平均負載”

 USER:表示登錄的用於
 TTY:登錄的終端名稱爲pts/0
 FROM:連接到服務器的ip地址
 LOGIN@:登錄時間
 IDLE:用戶有多久沒有活躍了
 JCPU:該終端所有相關的進程使用的 CPU 時間,每當進程結束就停止計時,開始新的進程則會重新計時
 PCPU:表示 CPU 執行當前程序所消耗的時間,當前進程就是在 WHAT 列裏顯示的程序
 WHAT:表示當下用戶正運行的程序是什麼,這裏我運行的是 w
複製代碼

ps

用於顯示當前系統中的進程, ps 命令顯示的進程列表不會隨時間而更新,是靜態的,是運行 ps 命令那個時刻的狀態或者說是一個進程快照。

基礎語法

[root@lion ~]# ps
  PID TTY          TIME CMD
 1793 pts/0    00:00:00 bash
 4756 pts/0    00:00:00 ps
 
 PID:進程號,每個進程都有唯一的進程號
 TTY:進程運行所在的終端
 TIME:進程運行時間
 CMD:產生這個進程的程序名,如果在進程列表中看到有好幾行都是同樣的程序名,那麼就是同樣的程序產生了不止一個進程
複製代碼

常用參數

  • -ef 列出所有進程;
  • -efH 以喬木狀列舉出所有進程;
  • -u 列出此用戶運行的進程;
  • -aux 通過 CPU 和內存使用來過濾進程 ps -aux | less ;
  • -aux --sort -pcpu 按 CPU 使用降序排列, -aux --sort -pmem 表示按內存使用降序排列;
  • -axjf 以樹形結構顯示進程, ps -axjf 它和 pstree 效果類似。

top

獲取進程的動態列表。

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:0H    
複製代碼
  • top - 07:20:07 up 25 days, 10:41,  1 user,  load average: 0.30, 0.10, 0.07 相當 w 命令的第一行的信息。
  • 展示的這些進程是按照使用處理器 %CPU 的使用率來排序的。

kill

結束一個進程, kill + PID 。

kill 956 # 結束進程號爲956的進程
kill 956 957 # 結束多個進程
kill -9 7291 # 強制結束進程
複製代碼

管理進程

進程狀態

主要是切換進程的狀態。我們先了解下 Linux 下進程的五種狀態:

  1. 狀態碼 R :表示正在運行的狀態;
  2. 狀態碼 S :表示中斷(休眠中,受阻,當某個條件形成後或接受到信號時,則脫離該狀態);
  3. 狀態碼 D :表示不可中斷(進程不響應系統異步信號,即使用kill命令也不能使其中斷);
  4. 狀態碼 Z :表示僵死(進程已終止,但進程描述符依然存在,直到父進程調用 wait4() 系統函數後將進程釋放);
  5. 狀態碼 T :表示停止(進程收到 SIGSTOP 、 SIGSTP 、 SIGTIN 、 SIGTOU 等停止信號後停止運行)。

前臺進程 & 後臺進程

默認情況下,用戶創建的進程都是前臺進程,前臺進程從鍵盤讀取數據,並把處理結果輸出到顯示器。例如運行 top 命令,這就是一個一直運行的前臺進程。

後臺進程的優點是不必等待程序運行結束,就可以輸入其它命令。在需要執行的命令後面添加 & 符號,就表示啓動一個後臺進程。

&

啓動後臺進程,它的缺點是後臺進程與終端相關聯,一旦關閉終端,進程就自動結束了。

cp name.csv name-copy.csv &
複製代碼

nohup

使進程不受掛斷(關閉終端等動作)的影響。

nohup cp name.csv name-copy.csv
複製代碼

nohup 命令也可以和 & 結合使用。

nohup cp name.csv name-copy.csv &
複製代碼

bg

使一個“後臺暫停運行”的進程,狀態改爲“後臺運行”。

bg %1 # 不加任何參數的情況下,bg命令會默認作用於最近的一個後臺進程,如果添加參數則會作用於指定標號的進程
複製代碼

實際案例1:

1. 執行 grep -r "log" / > grep_log 2>&1 命令啓動一個前臺進程,並且忘記添加 & 符號
2. ctrl + z 使進程狀態轉爲後臺暫停
3. 執行 bg 將命令轉爲後臺運行
複製代碼

實際案例2:

前端開發時我們經常會執行 yarn start 啓動項目
此時我們執行 ctrl + z 先使其暫停
然後執行 bg 使其轉爲後臺運行
這樣當前終端就空閒出來可以幹其它事情了,如果想要喚醒它就使用 fg 命令即可(後面會講)
複製代碼

jobs

顯示當前終端後臺進程狀態。

[root@lion ~]# jobs
[1]+  Stopped                 top
[2]-  Running                 grep --color=auto -r "log" / > grep_log 2>&1 &
複製代碼

fg

fg 使進程轉爲前臺運行,用法和 bg 命令類似。

我們用一張圖來表示前後臺進程切換:

image.png

我們可以使程序在後臺運行,成爲後臺進程,這樣在當前終端中我們就可以做其他事情了,而不必等待此進程運行結束。

守護進程

一個運行起來的程序被稱爲進程。在 Linux 中有些進程是特殊的,它不與任何進程關聯,不論用戶的身份如何,都在後臺運行,這些進程的父進程是 PID 爲1的進程, PID 爲1的進程只在系統關閉時纔會被銷燬。它們會在後臺一直運行等待分配工作。我們將這類進程稱之爲守護進程 daemon 。

守護進程的名字通常會在最後有一個 d ,表示 daemon 守護的意思,例如 systemd 、httpd 。

systemd

systemd 是一個 Linux 系統基礎組件的集合,提供了一個系統和服務管理器,運行爲 PID 1 並負責啓動其它程序。

[root@lion ~]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  51648  3852 ?        Ss   Feb01   1:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
複製代碼

通過命令也可以看到 PID 爲1的進程就是 systemd 的系統進程。

systemd 常用命令(它是一組命令的集合):

systemctl start nginx # 啓動服務
systemctl stop nginx # 停止服務
systemctl restart nginx # 重啓服務
systemctl status nginx # 查看服務狀態
systemctl reload nginx # 重載配置文件(不停止服務的情況)
systemctl enable nginx # 開機自動啓動服務
systemctl disable nginx # 開機不自動啓動服務
systemctl is-enabled nginx # 查看服務是否開機自動啓動
systemctl list-unit-files --type=service # 查看各個級別下服務的啓動和禁用情況
複製代碼

文件壓縮解壓

  • 打包:是將多個文件變成一個總的文件,它的學名叫存檔、歸檔。
  • 壓縮:是將一個大文件(通常指歸檔)壓縮變成一個小文件。


我們常常使用 tar 將多個文件歸檔爲一個總的文件,稱爲 archive 。 然後用 gzip 或 bzip2 命令將 archive 壓縮爲更小的文件。

未命名文件.png

tar

創建一個 tar 歸檔。

基礎用法

tar -cvf sort.tar sort/ # 將sort文件夾歸檔爲sort.tar
tar -cvf archive.tar file1 file2 file3 # 將 file1 file2 file3 歸檔爲archive.tar
複製代碼

常用參數

  • -cvf 表示 create(創建)+ verbose(細節)+ file(文件),創建歸檔文件並顯示操作細節;
  • -tf 顯示歸檔裏的內容,並不解開歸檔;
  • -rvf 追加文件到歸檔, tar -rvf archive.tar file.txt ;
  • -xvf 解開歸檔, tar -xvf archive.tar 。

gzip / gunzip

“壓縮/解壓”歸檔,默認用 gzip 命令,壓縮後的文件後綴名爲 .tar.gz 。

gzip archive.tar # 壓縮
gunzip archive.tar.gz # 解壓
複製代碼

tar 歸檔+壓縮

可以用 tar 命令同時完成歸檔和壓縮的操作,就是給 tar 命令多加一個選項參數,使之完成歸檔操作後,還是調用 gzip 或 bzip2 命令來完成壓縮操作。

tar -zcvf archive.tar.gz archive/ # 將archive文件夾歸檔並壓縮
tar -zxvf archive.tar.gz # 將archive.tar.gz歸檔壓縮文件解壓
複製代碼

zcat、zless、zmore

之前講過使用 cat less more 可以查看文件內容,但是壓縮文件的內容是不能使用這些命令進行查看的,而要使用 zcat、zless、zmore 進行查看。

zcat archive.tar.gz
複製代碼

zip/unzip

“壓縮/解壓” zip 文件( zip 壓縮文件一般來自 windows 操作系統)。

命令安裝

# Red Hat 一族中的安裝方式
yum install zip 
yum install unzip 
複製代碼

基礎用法

unzip archive.zip # 解壓 .zip 文件
unzip -l archive.zip # 不解開 .zip 文件,只看其中內容

zip -r sort.zip sort/ # 將sort文件夾壓縮爲 sort.zip,其中-r表示遞歸
複製代碼

編譯安裝軟件

之前我們學會了使用 yum 命令進行軟件安裝,如果碰到 yum 倉庫中沒有的軟件,我們就需要會更高級的軟件安裝“源碼編譯安裝”。

編譯安裝

簡單來說,編譯就是將程序的源代碼轉換成可執行文件的過程。大多數 Linux 的程序都是開放源碼的,可以編譯成適合我們的電腦和操縱系統屬性的可執行文件。

基本步驟如下:

  1. 下載源代碼
  2. 解壓壓縮包
  3. 配置
  4. 編譯
  5. 安裝

實際案例

1、下載

我們來編譯安裝 htop 軟件,首先在它的官網下載源碼:bintray.com/htop/source…

下載好的源碼在本機電腦上使用如下命令同步到服務器上:

scp 文件名 用戶名@服務器ip:目標路徑

scp ~/Desktop/htop-3.0.0.tar.gz root@121.42.11.34:.
複製代碼

也可以使用 wegt 進行下載:

wegt+下載地址

wegt https://bintray.com/htop/source/download_file?file_path=htop-3.0.0.tar.gz
複製代碼

2、解壓文件

tar -zxvf htop-3.0.0.tar.gz # 解壓

cd htop-3.0.0 # 進入目錄
複製代碼

3、配置

執行 ./configure ,它會分析你的電腦去確認編譯所需的工具是否都已經安裝了。

4、編譯

執行 make 命令

5、安裝

執行 make install 命令,安裝完成後執行 ls /usr/local/bin/ 查看是否有 htop 命令。如果有就可以執行 htop 命令查看系統進程了。

網絡

ifconfig

查看 ip 網絡相關信息,如果命令不存在的話, 執行命令 yum install net-tools 安裝。

[root@lion ~]# ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.31.24.78  netmask 255.255.240.0  broadcast 172.31.31.255
        ether 00:16:3e:04:9c:cd  txqueuelen 1000  (Ethernet)
        RX packets 1592318  bytes 183722250 (175.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1539361  bytes 154044090 (146.9 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
複製代碼

參數解析:

  • eth0 對應有線連接(對應你的有線網卡),就是用網線來連接的上網。 eth 是 Ethernet 的縮寫,表示“以太網”。有些電腦可能同時有好幾條網線連着,例如服務器,那麼除了 eht0 ,你還會看到 eth1 、 eth2 等。
  • lo 表示本地迴環( Local Loopback 的縮寫,對應一個虛擬網卡)可以看到它的 ip 地址是 127.0.0.1 。每臺電腦都應該有這個接口,因爲它對應着“連向自己的鏈接”。這也是被稱之爲“本地迴環”的原因。所有經由這個接口發送的東西都會回到你自己的電腦。看起來好像並沒有什麼用,但有時爲了某些緣故,我們需要連接自己。例如用來測試一個網絡程序,但又不想讓局域網或外網的用戶查看,只能在此臺主機上運行和查看所有的網絡接口。例如在我們啓動一個前端工程時,在瀏覽器輸入 127.0.0.1:3000 啓動項目就能查看到自己的 web 網站,並且它只有你能看到。
  • wlan0 表示無線局域網(上面案例並未展示)。

host

ip 地址和主機名的互相轉換。

軟件安裝

yum install bind-utils
複製代碼

基礎用法

[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 連接遠程服務器

通過非對稱加密以及對稱加密的方式(同 HTTPS 安全連接原理相似)連接到遠端服務器。

ssh 用戶@ip:port

1、ssh root@172.20.10.1:22 # 端口號可以省略不寫,默認是22端口
2、輸入連接密碼後就可以操作遠端服務器了
複製代碼

配置 ssh

config 文件可以配置 ssh ,方便批量管理多個 ssh 連接。

配置文件分爲以下幾種:

  • 全局 ssh 服務端的配置: /etc/ssh/sshd_config ;
  • 全局 ssh 客戶端的配置: /etc/ssh/ssh_config(很少修改);
  • 當前用戶 ssh 客戶端的配置: ~/.ssh/config 。


【服務端 config 文件的常用配置參數】

服務端 config 參數 作用
Port sshd 服務端口號(默認是22)
PermitRootLogin 是否允許以 root 用戶身份登錄(默認是可以)
PasswordAuthentication 是否允許密碼驗證登錄(默認是可以)
PubkeyAuthentication 是否允許公鑰驗證登錄(默認是可以)
PermitEmptyPasswords 是否允許空密碼登錄(不安全,默認不可以)

[注意] 修改完服務端配置文件需要重啓服務 systemctl restart sshd 

【客戶端 config 文件的常用配置參數】

客戶端 config 參數 作用
Host 別名
HostName 遠程主機名(或 IP 地址)
Port 連接到遠程主機的端口
User 用戶名


配置當前用戶的 config :

# 創建config
vim ~/.ssh/config

# 填寫一下內容
Host lion # 別名
	HostName 172.x.x.x # ip 地址
  Port 22 # 端口
  User root # 用戶
複製代碼

這樣配置完成後,下次登錄時,可以這樣登錄 ssh lion 會自動識別爲 root 用戶。

[注意] 這段配置不是在服務器上,而是你自己的機器上,它僅僅是設置了一個別名。

免密登錄

ssh 登錄分兩種,一種是基於口令(賬號密碼),另外一種是基於密鑰的方式。

基於口令,就是每次登錄輸入賬號和密碼,顯然這樣做是比較麻煩的,今天主要學習如何基於密鑰實現免密登錄。

基於密鑰驗證原理

客戶機生成密鑰對(公鑰和私鑰),把公鑰上傳到服務器,每次登錄會與服務器的公鑰進行比較,這種驗證登錄的方法更加安全,也被稱爲“公鑰驗證登錄”。

具體實現步驟

1、在客戶機中生成密鑰對(公鑰和私鑰) ssh-keygen(默認使用 RSA 非對稱加密算法)

運行完 ssh-keygen 會在 ~/.ssh/ 目錄下,生成兩個文件:

  • id_rsa.pub :公鑰
  • id_rsa :私鑰


2、把客戶機的公鑰傳送到服務

執行 ssh-copy-id [email protected]ssh-copy-id 它會把客戶機的公鑰追加到服務器 ~/.ssh/authorized_keys 的文件中)。

執行完成後,運行 ssh [email protected] 就可以實現免密登錄服務器了。

配合上面設置好的別名,直接執行 ssh lion 就可以登錄,是不是非常方便。

wget

可以使我們直接從終端控制檯下載文件,只需要給出文件的HTTP或FTP地址。

wget [參數][URL地址]

wget http://www.minjieren.com/wordpress-3.1-zh_CN.zip
複製代碼

wget 非常穩定,如果是由於網絡原因下載失敗, wget 會不斷嘗試,直到整個文件下載完畢。

常用參數

  • -c 繼續中斷的下載。

備份

scp

它是 Secure Copy 的縮寫,表示安全拷貝。 scp 可以使我們通過網絡,把文件從一臺電腦拷貝到另一臺電腦。

scp 是基於 ssh 的原理來運作的, ssh 會在兩臺通過網絡連接的電腦之間創建一條安全通信的管道, scp 就利用這條管道安全地拷貝文件。

scp source_file destination_file # source_file 表示源文件,destination_file 表示目標文件
複製代碼

其中 source_file 和 destination_file 都可以這樣表示: user@ip:file_name , user 是登錄名, ip 是域名或 ip 地址。 file_name 是文件路徑。

scp file.txt root@192.168.1.5:/root # 表示把我的電腦中當前文件夾下的 file.txt 文件拷貝到遠程電腦
scp root@192.168.1.5:/root/file.txt file.txt # 表示把遠程電腦上的 file.txt 文件拷貝到本機
複製代碼

rsync

rsync 命令主要用於遠程同步文件。它可以同步兩個目錄,不管它們是否處於同一臺電腦。它應該是最常用於“增量備份”的命令了。它就是智能版的 scp 命令。

軟件安裝

yum install rsync
複製代碼

基礎用法

rsync -arv Images/ backups/ # 將Images 目錄下的所有文件備份到 backups 目錄下
rsync -arv Images/ root@192.x.x.x:backups/ # 同步到服務器的backups目錄下
複製代碼

常用參數

  • -a 保留文件的所有信息,包括權限,修改日期等;
  • -r 遞歸調用,表示子目錄的所有文件也都包括;
  • -v 冗餘模式,輸出詳細操作信息。


默認地, rsync 在同步時並不會刪除目標目錄的文件,例如你在源目錄中刪除一個文件,但是用 rsync 同步時,它並不會刪除同步目錄中的相同文件。如果向刪除也可以這麼做: rsync -arv --delete Images/ backups/ 。

系統

halt

關閉系統,需要 root 身份。

halt
複製代碼

reboot

重啓系統,需要 root 身份。

reboot
複製代碼

poweroff

直接運行即可關機,不需要 root 身份。

Vim 編輯器

Vim 是什麼?

Vim 是從 vi 發展出來的一個文本編輯器。其代碼補完、編譯及錯誤跳轉等方便編程的功能特別豐富,在程序員中被廣泛使用。和 Emacs 並列成爲類 Unix 系統用戶最喜歡的編輯器。

Vim 常用模式

  • 交互模式
  • 插入模式
  • 命令模式
  • 可視模式

交互模式

也成爲正常模式,這是 Vim 的默認模式,每次運行 Vim 程序的時候,就會進入這個模式。

例如執行 vim name.txt 則會進入交互模式。

交互模式特徵:

  • 在這個模式下,你不能輸入文本;
  • 它可以讓我們在文本間移動,刪除一行文本,複製黏貼文本,跳轉到指定行,撤銷操作,等等。

插入模式

這個模式是我們熟悉的文本編輯器的模式,就是可以輸入任何你想輸入的內容。進入這個模式有幾種方法,最常用的方法是按字母鍵 ii、I、a、A、o、O 都可以進入插入模式,只是所處的位置不同),退出這種模式,只需要按下 Esc 鍵。

  • i, I 進入輸入模式 Insert mode : i 爲“從目前光標所在處輸入”, I 爲“在目前所在行的第一個非空格符處開始輸入”;
  • a, A 進入輸入模式 Insert mode : a 爲“從目前光標所在的下一個字符處開始輸入”, A 爲“從光標所在行的最後一個字符處開始輸入”;
  • o, O 進入輸入模式 Insert mode : o 爲“在目前光標所在的下一行處輸入新的一行”; O 爲在目前光標所在處的上一行輸入新的一行。

命令模式

命令模式也稱爲底線命令模式,這個模式下可以運行一些命令例如“退出”,“保存”,等動作。

也可以用這個模式來激活一些 Vim 配置,例如語法高亮,顯示行號,等。甚至還可以發送一些命令給終端命令行,例如 ls、cp 。

爲了進入命令模式,首先要進入交互模式,再按下冒號鍵。

用一張圖表示三種模式如何切換:
image.png

基本操作

打開 Vim

在終端命令行中輸入 vim 回車後 Vim 就會被運行起來,也可以用 Vim 來打開一個文件,只需要在 vim 後面再加文件名。如 vim file.name ,如果文件不存在,那麼會被創建。

插入

進入文件之後,此時處於交互模式,可以通過輸入 i 進入插入模式。

移動

Vim 的交互模式下,我們可以在文本中移動光標。

  • h 向左移動一個字符
  • j 向下移動一個字符
  • k 向上移動一個字符
  • i 向右移動一個字符


當然也可以使用四個方向鍵進行移動,效果是一樣的。

跳至行首和行末

  • 行首:在交互模式下,爲了將光標定位到一行的開始位置,只需要按下數字鍵 0 即可,鍵盤上的 Home 鍵也有相同效果。
  • 行末:在交互模式下,爲了將光標定位到一行的末尾,只需要按下美元符號鍵 $ 即可,鍵盤上的 End 鍵也有相同效果。

按單詞移動

在交互模式下,按字母鍵 w 可以一個單詞一個單詞的移動。

退出文件

在交互模式下,按下冒號鍵 : 進入命令模式,再按下 q 鍵,就可以退出了。

如果在退出之前又修改了文件,就直接想用 :q 退出 Vim ,那麼 Vim 會顯示一個紅字標明錯誤信息。此時我們有兩個選擇:

  1. 保存並退出 :wq  或 :x
  2. 不保存且退出 :q!

標準操作

刪除字符

在交互模式下,將光標定位到一個你想要刪除的字符上,按下字母鍵 x 你會發現這個字符被刪除了。

也可以一次性刪除多個字符,只需要在按 x 鍵之前輸入數字即可。

刪除(剪切)單詞,行

  • 刪除一行:連按兩次 d 來刪除光標所在的那一行。
  • 刪除多行:例如先輸入數字 2 ,再按下 dd ,就會刪除從光標所在行開始的兩行。
  • 刪除一個單詞:將光標置於一個單詞的首字母處,然後按下 dw 。
  • 刪除多個單詞:例如先按數字鍵 2 再按 dw 就可以刪除兩個單詞了。
  • 從光標所在位置刪除至行首: d0 。
  • 從光標所在位置刪除至行末: d$ 。

複製單詞,行

  • 複製行:按兩次 y 會把光標所在行復制到內存中,和 dd 類似, dd 用於“剪切”光標所在行。
  • 複製單詞: yw 會複製一個單詞。
  • 複製到行末: y$ 是複製從光標所在處到行末的所有字符。
  • 複製到行首: y0  是複製光標所在處到行首的所有字符。

粘貼

如果之前用 dd 或者 yy 剪切複製過來的,可以使用 p 來粘貼。同樣也可以使用 數字+p 來表示複製多次。

替換一個字符

在交互模式下,將光標置於想要替換的字符上。按下 r 鍵,接着輸入你要替換的字符即可。

撤銷操作

如果要撤銷最近的修改,只需要按下 u 鍵,如果想要撤銷最近四次修改,可以按下4,再按下 u 。

重做

取消撤銷,也就是重做之前的修改使用 ctrl + r

跳轉到指定行

Vim 編輯的文件中,每一行都有一個行號,行號從1開始,逐一遞增。

行號默認是不顯示,如果需要它顯示的話,可以進入命令模式,然後輸入 set nu ,如果要隱藏行號的話,使用 set nonu

  • 跳轉到指定行: 數字+gg ,例如 7gg ,表示跳轉到第7行。
  • 要跳轉到最後一行,按下 G 。
  • 要跳轉到第一行,按下 gg 。

高級操作

查找

處於交互模式下,按下 / 鍵,那麼就進入查找模式,輸入你要查找的字符串,然後按下回車。光標就會跳轉到文件中下一個查找到的匹配處。如果字符串不存在,那麼會顯示 "pattern not found" 。

  • n 跳轉到下一個匹配項;
  • N 跳轉到上一個匹配項。


[注意] 用斜槓來進行的查找是從當前光標處開始向文件尾搜索,如果你要從當前光標處開始,向文件頭搜索則使用 ? ,當然也可以先按下 gg 跳轉到第一行在進行全文搜索。

查找並替換

 
替換光標所在行第一個匹配的字符串:

# 語法
:s/舊字符串/新字符串

# 實例
:s/one/two
複製代碼

替換光標所在行所有舊字符串爲新字符串:

# 語法
:s/舊字符串/新字符串/g
複製代碼

替換第幾行到第幾行中所有字符串:

# 語法
:n,m s/舊字符串/新字符串/g

# 實例
:2,4 s/one/two/g
複製代碼

最常用的就是全文替換了:

# 語法
:%s/舊字符串/新字符串/g
複製代碼

合併文件

可以用冒號 +r  ( :r ) 實現在光標處插入一個文件的內容。

:r filename # 可以用Tab鍵來自動補全另外一個文件的路徑
複製代碼

分屏

Vim 有一個特別便捷的功能那就是分屏,可以同時打開好幾個文件,分屏之後,屏幕每一塊被稱爲一個 viewport ,表示“視口”。

  • 橫向分屏 :sp 文件名
  • 垂直分屏 :vsp 文件名

分屏模式下的快捷鍵

  • Ctrl + w 再加 Ctrl + w ,表示從一個 viewport 移動光標到另外一個 viewport ;
  • Ctrl + w 再加 “方向鍵”,就可以移動到這個方向所處的下一個視口了;
  • Ctrl + w 再加 + 號,表示擴大當前視口;
  • Ctrl + w 再加 - 號,表示縮小當前視口;
  • Ctrl + w 再加 = 號,表示平均當前視口;
  • Ctrl + w 再加 r 鍵,會反向調換視口位置;
  • Ctrl + w 再加 q 鍵,會關閉當前視口;
  • Ctrl + w 再加 o 鍵,會關閉除當前視口以外的所有視口;

運行外部命令 :!

Vim 中可以運行一些終端命令,只要先輸入 :! ,然後接命令名稱。

例如:

:!ls # 在Vim中打開的文件所在的目錄運行ls命令
複製代碼

可視模式

前面只講了 Vim 的三種模式,其實還有一種模式叫做可視模式。

進入它的三種方式(都是從交互模式開始):

  • v 字符可視模式,進入後配合方向鍵選中字符後,然後再按 d 鍵可以刪除選中。
  • V 行可視模式,進入後光標所在行默認被選中,然後再按 d 鍵可以刪除所在行。
  • Ctrl + v 塊可視模式,它是可視模式最有用的功能了,配合 d  和 I 鍵可以實現刪除選中的內容和插入內容。


同時選中多行,並在選中行頭部插入內容的具體操作步驟:

1. ctrl + v 進入塊可視模式
2. 使用方向鍵進行選中(上下左右)假設選中53. 輸入 I 鍵進行多行同時插入操作
4. 插入完成後連續按兩下 esc 鍵,實現多行同時插入相同字符
複製代碼

進入可視模式之後的操作鍵:

  • d 鍵,表示刪除選中;
  • I 鍵,表示在選中之前插入;
  • u 鍵,表示選中變爲小寫;
  • U 鍵,表示選中變爲大寫;

Vim 配置

選項參數

Vim 被啓動後,可以運行一些指令來激活一些選項參數,但是這些選項參數的配置在退出 Vim 時會被忘記,例如前面講解的激活行號。如果希望所在的配置是永久性的,那麼需要在家目錄( cd ~ )創建一個 Vim 的配置文件 .vimrc 。

.vimrc

set number " 顯示行號
syntax on " 激活語法高亮
set showcmd " 實時看到輸入的命令
set ignorecase " 搜索時不區分大小寫
set mouse=a " 激活鼠標,用鼠標選中時相當於進入可視模式
複製代碼

Vim 配置非常豐富,我們可以通過個性化配置把 Vim 打造成屬於自己的 IDE 等等。在 github 上也可以搜索到一些強大的 Vim 配置文件。

總結

相信通過本文的學習,你應該會對 Linux 有一個更加全面的認識。

都看到這裏了,就點個👍 👍 👍 吧。

 
作者:Lion
鏈接:https://juejin.cn/post/6938385978004340744
來源:稀土掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章