學習 Linux 是技術行業中最有價值的技能之一。它能夠幫助你更快、更有效率地完成工作。世界上許多強大的伺服器和超级電腦都是運行在 Linux 上面。
同時,學習 Linux 能夠助你者在當前角色中增強能力,還能幫助你转型為其他技術職業,如 DevOps、網絡安全及雲計算等。
在這個指南中,你將學習 Linux 命令行的基礎知識,然後再转到更進階的课题,如 shell 腳本和系統管理。無論你是 Linux 的新手還是已經使用多年的老手,這本書都有適合你的內容。
重要提示:本书中的所有示例都是使用 Ubuntu 22.04.2 LTS (Jammy Jellyfish) 演示的。大多数命令行工具在其他 Linux 分發版中都是差不多相同的。然而,一些 GUI 應用程序和命令如果你在其他 Linux 分發版上工作可能會有所不同。
目錄
第 1 部分:Linux 简介
1.1. 開始學習 Linux
什麼是 Linux?
Linux 是一個開源操作系統,基於 Unix 操作系統建造。它是由林纳斯·Torvalds (Linus Torvalds)於 1991 年創建的。
開源意味著操作系統的源代碼對公眾開放。這讓任何人都能夠修改原始代碼、客製化並將新的操作系統分發給潛在用戶。
你為什麼應該學習Linux?
在當今數據中心的地貌中,Linux和Microsoft Windows是主要的競爭對手,而Linux拥有主導地位。
以下是學習Linux的几個強有力理由:
-
由於Linux托管的普及,你的應用程序很有可能托管在Linux上。因此,作為開發者學習Linux的價值日益增加。
-
隨著云计算成為常态,你的云實例很可能依賴於Linux。
-
Linux為許多互聯網物联网(IoT)和移動應用操作系統的基礎。
-
在IT界,對於精通Linux的人来说,有很多機遇。
Linux是一個開源操作系統,這意味著什麼?
开源是什麼?開源軟體是指其源代碼是自由取得的,讓任何人都可以使用、修改和 分發。
每当創建源代碼時,它 naturally considered copyrighted, and its distribution is governed by the copyright holder through software licenses.
與開源相比,專有或不开源軟體限制了對源代碼的訪問。只有創作者可以查看、修改或 分發。
Linux 主要是開源的,這意味著其源代碼是自由的。任何人都可以查看、修改和 分發。來自世界任何地方開發者可以为其改進做出貢獻。這為合作奠定基礎,這是開源軟體的一個重要 特點。
這種合作方式使得 Linux 在服務器、桌面、嵌入式系統和移動設備上得到廣泛的應用。
Linux 作為開源最有趣的特點是,任何人都可以根据自己的特定需求定制操作系統,而不會受到 不开源的限制。
Chrome OS,用於 Chromebooks,基於 Linux。全球許多智慧手機的運行系統 Android 也是基於 Linux。
Linux cores 是什麼?
核心是操作系統的中央部件,負責管理计算机及其硬件操作。它處理記憶體操作和 CPU 时间。
核心作為應用程序和硬體级别數據處理之間的橋樑,使用进程中通信和系統呼叫。
當操作系统啟動時,核心首先載入記憶體中,直到系統關閉才会被卸除。它負責诸如磁碟管理、任務管理以及記憶體管理等任務。
如果你好奇Linux核心的样子,這裡是GitHub的链接。
Linux 分發是什麼?
到此階段,你知道可以重用 Linux 核心程式碼、修改它並創建新的核心。你还可以将进一步結合不同的公用程式和軟體來創建完全新的作業系統。
Linux 分發,或稱為 Distro,是 Linux 作業系統的一个版本,它包括了 Linux 核心、系統公用程式以及其他軟體。由於是開源的, Linux 分發是多個獨立開源開發社區的共同努力。
分發被稱為「派生」是什麼意思?當你說一個分发是「從」另一個分发「派生」出來時,新的分发是建立於原始分发的基礎或框架上。這種派生可以包括使用同樣的套件管理系統(稍後再談這個)、核心版本,有时甚至是同樣的設定工具。
如今,有数千個 Linux 分發可供選擇,它們提供不同的目標和標準來選擇和支持其分發提供的軟體。
分發之間雖然有所不同,但它們通常有一些共通的特點:
- 分發包括一個 Linux 核心。
-
它支援用戶空間的程式。
-
一個分發體可能會很小且具有單一用途,或者包括数千個開源程式。
-
應提供一些方式來安裝和更新分發體及其組件。
如果你查看Linux 分發體時間軸,你會看到兩個主要的分發體:Slackware 和 Debian。有几个分发体从它们派生出来。例如,Ubuntu 和 Kali 是从 Debian 派生出来的。
派生的优势是什么?派生有许多优势。派生分發體可以利用父分發體的穩定性、安全性以及大的軟件庫。
在已有的基础上构建时,开发者可以将全部的焦点和精力放在新分發體的專業功能上。派生分發體的用户可以從父分發體已經有的文件、社區支持和資源中受益。
一些流行的 Linux 分發體包括:
-
Ubuntu
:最廣泛使用和最受欢迎的Linux發行版之一。它对学生友好,建議初學者使用。在此了解更多关于Ubuntu的信息。
-
Linux Mint:基於Ubuntu,Linux Mint提供了一个对学生友好的體驗,並集中于多媒体支持。在此了解更多关于Linux Mint的信息。
-
Arch Linux:在有經驗的使用者中广受欢迎,Arch是一個輕量级和靈活的發而行版,旨在為偏好DIY方法的用戶提供服务。在此了解更多关于Arch Linux的信息。
-
Manjaro:基於 Arch Linux 的 Manjaro 提供了一個用戶友好的體驗,预裝了軟體和簡單的系統管理工具。在此了解 Manjaro 的更多信息。
-
Kali Linux:Kali Linux 提供了 Comprehensive 安全的工具套件,主要集中在网络安全和破解上。在此了解 Kali Linux 的更多信息。
如何在 Linux 安装和访问
最佳的学习方法是把概念应用到实践中。在本节中,我们将学习如何在您的计算机上安装 Linux,这样您就可以跟随学习了。您还将学习如何在 Windows 计算机上访问 Linux。
我建议您跟随本节中提到的任何一种方法来获取对 Linux 的访问权限,以便您可以跟随学习。
将 Linux 作为主操作系统安装
将 Linux 作为主操作系统安装是使用 Linux 最有效的方法,因为您可以使用机器的全部力量。
在這一節中,你將學習如何安裝Ubuntu,這是最受欢迎的Linux發行版之一。我現在暂时不介绍其他发行版,因為我想保持事情的簡單。你可以在熟悉Ubuntu之后随时探索其他发行版。
-
步驟1 – 下载 Ubuntu iso 文件: 前往官方網站並下載 iso 文件。請確保選擇一個被打上「LTS」標签的穩定版本。LTS 代表長時間支援,意味著你可以長時間(通常為5年)獲得免费的保安和維護更新。
-
步驟2 – 创建可启动的U盘: 有許多軟件可以创建可启动的U盘。我建議使用 Rufus,因為它非常易用。你可以從這裡下載它。
-
步驟 3 – 从U盘启动:一旦您的可启动U盘准备就绪,请插入U盘并从U盘启动。启动菜单取决于您的笔记本电脑。您可以为您的笔记本型号谷歌搜索启动菜单。
-
步驟 4 – 按照提示操作。一旦启动过程开始,选择
尝试或安装 Ubuntu
。该过程需要一些时间。一旦GUI出现,您可以选择语言,以及键盘布局并继续。输入您的登录名和名称。记住凭据,因为您需要它们以登录到您的系统并访问完全权限。等待安装完成。
-
步驟 5 – 重新启动:点击现在重新启动,并移除U盘。
-
步驟 6 – 登入: 使用你之前輸入的帳號密碼登入。
就這樣!現在你可以安裝應用程式並自訂你的桌面。
對於進階安裝,你可以探索以下主題:
-
硬盘分区。
-
為启用休眠設定交换内存。
進入終端機
這本手冊的重要一部分是學習關於終端機,你將在此執行所有命令並看到魔法發生。你可以按住”windows”鍵並輸入”terminal”來尋找終端機。你可以將終端機釘在Dock中,方便易達。
💡 開啟終端機的捷徑是
ctrl+alt+t
你也可以從文件夾內開啟終端機。在你要的位置右鍵點擊,然後點選”在終端機中開啟”。這會讓終端機在同一路徑中開啟。
如何在Windows電腦上使用Linux
有時你可能会需要同時運行Linux和Windows。幸運的是,有幾種方法可以讓你在不獲得不同電腦的情況下,同時享用兩個系統的优点。
在這一節中,你將探索几种在Windows電腦上使用Linux的方法。它們中的一些是基於瀏覽器或基於雲的,使用前不需要進行任何系統安裝。
選項1:”雙重開機” Linux + Windows透過雙重開機,你可以在電腦上同時安裝Linux和Windows,讓你在開機時選擇要使用哪個作業系統。
這需要對你的硬碟進行分區,並在另一個分區上安裝Linux。這種方法讓你一次只能使用一個作業系統。
選項2:使用Windows Subsystem for Linux (WSL)Windows Subsystem for Linux提供了一個兼容層,讓你可以在Windows上原生運行Linux的二進制執行檔。
使用WSL有一些優點。WSL的設置簡單且不耗時間。與VMs相比,它輕量級,不需要從主機分配資源。你不需要安裝任何ISO或虛擬光碟映像給Linux機器,這些通常都是大檔案。你可以同時使用Windows和Linux。
如何安裝WSL2
首先,在設定中啟用Windows Subsystem for Linux選項。
-
前往「開始」功能表,搜尋”開啟或關閉Windows功能”。
-
如果還沒有的話,勾選”Windows Subsystem for Linux”選項。
-
接著,打開你的命令提示字元並提供安裝命令。
-
以管理员身份打开命令提示符:
-
运行以下命令:
wsl --install
這是安裝過程的輸出:
注意:預設情況下,將安裝 Ubuntu。
- 安裝完成後,您需要重新啟動您的 Windows 電腦。因此,請重新啟動您的 Windows 電腦。
重新啟動後,您可能會看到類似於以下的窗口:
Ubuntu installation is complete, you will be prompted to enter your username and password.
至此顺利完成!您已經可以使用 Ubuntu 了。
從開始菜單中搜索以啟動 Ubuntu。
Ubuntu 實例已經成功啟動。
步驟 3:使用虛擬機(VM)
虛擬機(VM)是 Software emulation of a physical computer system. 它允許您在單一物理機器上同時運行多個作業系統和應用程序。
您可以使用如 Oracle VirtualBox 或 VMware 之類的虛擬化軟體,在您的 Windows 環境中建立運行 Linux 的虛擬機。這讓您能够在 Windows 旁边運行 Linux 作為訪客作業系統。
虚拟化軟件提供分配和管理每個虛擬機的硬件資源的選項,包括CPU核心、記憶體、磁碟空間和網絡带宽。您可以根據來賓操作系統和應用程序的需求調整這些分配。
以下是一些常見的虛擬化選項:
選項 4:使用基於瀏覽器的解決方案
基於浏览器的解決方案特別適合於快速測試、學習或從未安裝Linux的設備访问Linux環境。
您可以使用在线代码编辑器或基於web的終端機來訪問Linux。注意在這些情況下您通常沒有完整的管理权限。
在線程式編輯器
在線程式編輯器提供內建的Linux終端機。雖然它們的主要用途是程式設計,但您可以還利用Linux終端機來執行命令和執行工作。
Replit是一個在線程式編輯器的例子,您可以在這裡寫程式同時存取Linux Shell。
基於網頁的Linux終端機:
基於網頁的Linux終端機讓您可以直接從您的瀏覽器存取Linux命令行界面。這些終端機提供基於網頁的接口到Linux Shell,讓您可以執行命令和工作於Linux工具。
其中一个例子是JSLinux。下面的截圖展示了一個即可使用的Linux環境:
選項 5:使用基於雲的解決方案
不必直接在您的Windows電腦上運行Linux,您可以考慮使用基於雲的Linux環境或虛擬私人伺服器(VPS)來遠程存取和工作於Linux。
像Amazon EC2、Microsoft Azure 或 DigitalOcean 這些服務提供您可以從您的Windows電腦連接的Linux實例。注意這些服務中有些提供免費層次,但長遠來看他們通常不是免费的。
第2部分:Bash Shell 和系統命令简介
2.1. Bash shell 入门
Bash shell 简介
Linux 的命令列是由一個稱為 shell 的程式提供的。多年的發展過程中,shell 程式已經演變出來以迎合各種選項。
不同的使用者可以配置使用不同的 shell。但是,大多數使用者還是偏好使用目前的預設 shell。許多 Linux 發行版的預設 shell 是 GNU Bourne-Again Shell (bash
)。Bash 是繼承自 Bourne shell (sh
) 的。
要找出你當前的 shell,打開你的終端機並輸入以下命令:
echo $SHELL
命令解釋:
-
echo
命令用於在終端機上列印。 -
$SHELL
是一個特殊的變量,它儲存了當前 shell 的名稱。
在我的設定中,輸出是 /bin/bash
。這意味著我正在使用 bash shell。
# 輸出
echo $SHELL
/bin/bash
Bash 非常強大,因為它可以簡化某些透過 GUI(或圖形使用者介面)高效完成起來相對困難的操作。請記住,大多數伺服器沒有 GUI,學習使用命令列介面(CLI)的力量是最好的。
終端機與 Shell
“終端機” 和 “shell” 這兩個詞經常被交替使用,但它們指的是命令列介面的不同部分。
終端機是您用來與 shell 互動的介面。Shell 是處理和執行您命令的命令解釋器。您將在手冊的第6部分中了解更多有關 shell 的知識。
提示是什麼?
當 shell 以互動方式使用時,當它等待用戶輸入命令時會顯示一個 $
。這被稱為 shell 提示。
[username@host ~]$
如果 shell 以 root
身份運行(您稍後將了解更多有關 root 用戶的知識),提示會更改為 #
。
[root@host ~]#
2.2. 命令結構
命令是執行特定操作的程序。一旦您可以訪問 shell,您可以在 $
符號後輸入任何命令並在終端機上查看輸出。
通常,Linux 命令遵循此語法:
command [options] [arguments]
這是上述語法的分解:
-
command
:這是您要執行的命令的名稱。ls
(列出)、cp
(複製)和rm
(刪除)是常見的 Linux 命令。 -
[選項]
:選項,或 flags,通常前面會有一個連字符(-)或雙連字符(–),會改變命令的行為。它們可以改變命令的運行方式。例如,ls -a
使用-a
選項來在當前目錄中顯示隱藏文件。 -
[參數]
:參數是命令需要的輸入。這些可能是文件名、用戶名或其他命令將要对之進行操作的數據。例如,在命令cat access.log
中,cat
是命令,access.log
是輸入。因此,cat
命令會顯示access.log
文件的內容。
不是所有命令都需要選項和參數。一些命令可以沒有任何選項或參數就能運行,而其他命令可能需要一個或兩個才能正確运作。您總是可以查看命令的手册來确认它支持哪些選項和參數。
💡提示:你可以使用man
命令來查看命令的手冊。
你可以透過man ls
來訪問ls
的手冊頁,它會像是這樣:
手冊頁是快速訪問文件說明的一個很棒的方式。我強烈建議查看你最常使用的命令的手冊頁。
2.3. Bash命令與快捷鍵
當你在終端機中時,你可以使用快捷鍵來加速你的任務。
以下是一些最常用的終端機快捷鍵:
操作 | 快捷鍵 |
尋找前一條命令 | 上箭頭 |
跳轉到前一個單詞的開頭 | Ctrl+左箭頭 |
清除從游標到命令行結尾的字符 | Ctrl+K |
完成命令、文件名和選項 | 按下Tab鍵 |
跳轉到命令行的開頭 | Ctrl+A |
顯示前一條命令的列表 | history |
2.4. 識別自己:whoami
命令
你可以使用whoami
命令來獲得你登錄的用戶名。當你在不同的用戶之間切換並想要確認當前用戶時,這個命令很有用。
在$
符號後面,輸入whoami
並按下Enter鍵。
whoami
這是我得到的輸出。
zaira@zaira-ThinkPad:~$ whoami
zaira
第3部分:了解您的Linux系統
3.1. 發現您的OS和规格
使用uname
命令打印系統信息
您可以從uname
命令中获得詳細的系統信息。
當您提供-a
選項時,它會打印所有的系統信息。
uname -a
# 输出版本
Linux zaira 6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 9 13:32:52 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
在上述輸出中,
-
Linux
:表示操作系统。 -
zaira
:表示機器的主機名稱。 6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 9 13:32:52 UTC 2
:提供有關 kernel 版本、建造日期和一些其他詳細信息。-
x86_64 x86_64 x86_64
:表示系統的架構。 -
GNU/Linux
:表示操作系統類型。
使用 lscpu
命令尋找 CPU 結構的詳細信息
Linux 中的 lscpu
命令用來顯示 CPU 結構的相關信息。當你年在終端機中運行 lscpu
命令時,它會提供如下的詳細信息:
-
CPU 的結構(例如,x86_64)
-
CPU 的運行模式(例如,32 位元,64 位元)
-
字節順序(例如,小端序)
-
CPU 数目(例如,CPU 總數)等
讓我們來试试:
lscpu
# 命令输出行
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 48 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 12
On-line CPU(s) list: 0-11
Vendor ID: AuthenticAMD
Model name: AMD Ryzen 5 5500U with Radeon Graphics
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 1
Stepping: 1
CPU max MHz: 4056.0000
CPU min MHz: 400.0000
那真是很多信息,但也很有用!記得你可以 Always use specific flags to skim relevant information. Check the manual with man lscpu
for more details.
第 4 部分:從命令行管理文件
4.1. Linux 文件系統樹狀結構
Linux 中的所有文件都被存儲在文件系統中。該文件系統遵循一个倒置的樹狀結構,因為根目錄在頂部。
`/` 是根目錄,也是文件系統的起始點。根目錄包含系統上的所有其他目錄和文件。`/` 字符也作為路徑名稱之間的目錄分隔符。例如,`/home/alice` 形成一個完整的路徑。
以下圖示為完整的檔案系統阶层。每個目錄都有其特定的用途。
注意這不是一份详盡的清單,不同的 分發版可能會有不同的配置。
以下是一個表,展示了每個目錄的用途:
位置 | 用途 |
/bin | 基本命令的可执行档 |
/boot | 引导程式所需的靜態文件。 |
/etc | 特定於主機的系統設定 |
/home | 用戶的家目錄 |
/root | 管理員root用戶的家目錄 |
/lib | 基本的共享庫和核心模組 |
/mnt | temporarily 挂载文件系统的挂载点 |
/opt | 附加的应用程序软件包 |
/usr | 已安装的软件和共享庫 |
/var | 在重啟之間持久的變量數據 |
/tmp | 所有用戶可訪問的临时文件 |
💡 提示:您可以使用 man hier
命令來了解更多關於文件系統的資訊。
您可以使用 tree -d -L 1
命令來查看您的文件系統。您可以修改 -L
标志來更改树的深度。
tree -d -L 1
# 输出
.
├── bin -> usr/bin
├── boot
├── cdrom
├── data
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── snap
├── srv
├── sys
├── tmp
├── usr
└── var
25 directories
此列表非完整,不同的發行版和系統可能配置方式不同。
4.2. 导航 Linux 文件系統
絕對路徑與相對路徑
絕對路徑是由根目錄到文件或目錄的完整路徑。它總是從一個 `/` 開始。例如,`/home/john/documents`。
相對路徑,另一方面,是由當前目錄到目標文件或目錄的路徑。它不會從 `/` 開始。例如,`documents/work/project`。
使用 `pwd` 命令定位當前目錄
在 Linux 文件系統中迷路是一件很簡單的事情,特別是對於命令行新手來說。你可以使用 `pwd` 命令來定位你的當前目錄。
以下是一個例子:
pwd
# 輸出
/home/zaira/scripts/python/free-mem.py
使用 `cd` 命令更改目錄
更改目錄的命令是 `cd`,它代表 “change directory”(更改目錄)。你可以使用 `cd` 命令來導航到不同的目錄。
你可以使用相對路徑或絕對路徑。
例如,如果你想導航以下文件結構(遵循紅色線條):
而且你站在 “home” 目錄,命令將是这样的:
cd home/bob/documents/work/project
一些其他常用 `cd` 快捷方式如下:
命令 | 描述 |
cd .. |
返回上一層目錄 |
cd ../.. |
返回兩層目錄 |
cd 或 cd ~ |
转到主目录 |
cd - |
前往上一个路径 |
4.3. 管理文件和目录
在处理文件和目录时,您可能需要复制、移动、删除和创建新的文件和目录。以下是一些可以帮助您完成这些任务的命令。
💡提示:您可以通过查看ls -l
输出的第一封信来区分文件和文件夹。'-'
代表文件,'d'
代表文件夹。
使用mkdir
命令创建新目录
您可以使用mkdir
命令创建一个空目录。
# 在当前文件夹中创建一个名为"foo"的空目录
mkdir foo
您还可以使用-p
选项递归创建目录。
mkdir -p tools/index/helper-scripts
# tree命令的输出
.
└── tools
└── index
└── helper-scripts
3 directories, 0 files
使用touch
命令创建新文件
touch
命令用于创建一个空文件。您可以这样做:
# 在当前文件夹中创建一个名为"file.txt"的空文件
touch file.txt
如果您想一次性创建多个文件,可以将文件名链接在一起。
# 在當前文件夾中建立空白的 "file1.txt"、"file2.txt" 和 "file3.txt" 文件
touch file1.txt file2.txt file3.txt
使用 `rm` 和 `rmdir` 命令移除文件和目錄
您可以使用 `rm` 命令來移除文件和非空文件夾。
命令 | 描述 |
rm file.txt |
移除文件 `file.txt` |
rm -r directory |
移除文件夾 `directory` 及其內容 |
rm -f file.txt |
無提示的情況下移除文件 `file.txt` |
rmdir directory |
移除空文件夾 |
🛑 注意您應該謹慎使用 `-f` 旗帜,因為在刪除文件之前您不會被提示。此外,當在 `root` 文件夾中運行 `rm` 命令時也要小心,因為這可能會導致刪除重要的系統文件。
使用 `cp` 命令複製文件
要在 Linux 中複製文件,請使用 `cp` 命令。
- 複製文件的語法:
cp source_file destination_of_file
這個命令將命名為 `file1.txt` 的文件複製到新的文件位置 `/home/adam/logs`。
cp file1.txt /home/adam/logs
`cp` 命令也会创建一个以其提供的名称命名的文件副本。
這個命令將一個名為file1.txt
的文件 copied 到另一個同一個目錄中的file2.txt
文件。
cp file1.txt file2.txt
使用mv
命令來移動和重命名文件和文件夾
mv
命令用於將文件和文件夾從一個目錄移到另一個目錄。
移動文件的語法:mv source_file destination_directory
示例:將一個名為file1.txt
的文件移到一個名為backup
的目錄中:
mv file1.txt backup/
要移動一個目錄及其內容:
mv dir1/ backup/
在Linux中重命名文件和文件夾也是使用mv
命令完成的。
重命名文件的語法:mv old_name new_name
示例:將文件從file1.txt
重命名為file2.txt
:
mv file1.txt file2.txt
將目錄從dir1
重命名為dir2
:
mv dir1 dir2
4.4. 使用find
命令尋找文件和文件夾
find
命令讓您有效率地尋找文件、文件夾以及字符和块設備。
以下是find
命令的基本語法:
find /path/ -type f -name file-to-search
其中,
-
/path
是要找到文件的路径。這是尋找文件的起點。路徑也可以是/
或.
,分別代表根目錄和當前目錄。) -type
表示文件描述符。它們可以是以下任何一個:
f
– 一般檔案,如文字檔、圖檔和隱藏檔。
d
– 目錄。這些是考慮中的文件夾。
l
– 符號链接。符號链接指向文件,類似於快捷方式。
c
– 字符設備。用於存取字符設備的文件稱為字符設備文件。驅動程式通過傳送和接收單個字符(字節、八位元組)與字符設備進行通信。例如,包括鍵盤、音效卡和滑鼠。
b
– 區塊設備。用於存取區塊設備的文件稱為區塊設備文件。驅動程式通過傳送和接收整個區塊的数据與區塊設備進行通信。例如,包括 USB 和 CD-ROM。-name
是要搜索的文件類型的名稱。
如何按名稱或擴展名搜索文件
假設我們需要找到名稱為中包含 “style” 的文件。我們將使用此命令:
find . -type f -name "style*"
#output
./style.css
./styles.css
現在說我們想找到具有特定擴展名如 .html
的文件。我們將修改命令如下:
find . -type f -name "*.html"
# output
./services.html
./blob.html
./index.html
如何搜索隱藏文件
文件名開頭的點代表隱藏文件。它們通常是隱藏的,但可以用ls -a
在當前目錄中查看。
我們可以修改以下find
命令來尋找隱藏文件:
find . -type f -name ".*"
列印並尋找隱藏文件
ls -la
# 文件夾內容
total 5
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:17 .
drwxr-x--- 61 zaira zaira 4096 Mar 26 14:12 ..
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:17 .bash_history
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:17 .bash_logout
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:17 .bashrc
find . -type f -name ".*"
# find 輸出
./.bash_logout
./.bashrc
./.bash_history
如你所見,這是我家目錄中的隱藏文件列表。
如何尋找日誌文件和配置文件
日誌文件通常有.log
擴展名,我們可以这样查找它们:
find . -type f -name "*.log"
同理,我們可以这样查找配置文件:
find . -type f -name "*.conf"
如何根據类型搜索其他文件
我们可以通过向-type
提供c
来搜索字符块文件:
find / -type c
同样,我们可以通过使用b
来查找设备块文件:
find / -type b
如何搜索目录
在下面的例子中,我们使用-type d
标志来查找文件夹。
ls -l
# 列出文件夹內容
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 hosts
-rw-rw-r-- 1 zaira zaira 0 Mar 26 14:23 hosts.txt
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 images
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:23 style
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 webp
find . -type d
# find 目录输出
.
./webp
./images
./style
./hosts
如何根据大小搜索文件
find
命令的一个非常实用的功能是基于特定大小列出文件。
find / -size +250M
这里,我们列出大小超过250MB
的文件。
其他单位包括:
-
G
: GigaBytes. -
M
: 兆咖Byte。 -
K
: 千咖Byte -
c
: Byte。
只需替換相關單位。
find <directory> -type f -size +N<Unit Type>
如何根據修改時間搜索文件
使用-mtime
旗帜,您可以根據修改時間過濾文件和文件夾。
find /path -name "*.txt" -mtime -10
例如,
-
-mtime +10 意思是你正在尋找10天前修改的文件。
-
-mtime -10 表示不到10天。
-
-mtime 10 如果你略過+或–,意思是正好10天。
4.5. 基礎命令查看文件
使用cat
命令串接和顯示文件
Linux中的cat
命令用來顯示文件內容。它也可以用於串接文件和創建新文件。
以下是cat
命令的基本語法:
cat [options] [file]
使用cat
的最簡單方式是不使用任何選項或参数。這將將文件內容在終端機上顯示。
例如,如果你想查看一個名叫 file.txt
的文件內容,你可以使用以下的命令:
cat file.txt
這會一次性在終端機上顯示文件的全部內容。
使用 less
和 more
interactively 顯示文字文件
cat
命令會一次性顯示整個文件,但 less
和 more
命令讓你可以交互式地查看文件內容。當你想滚动查看大文件或尋找特定內容時,這很有用。
less
命令的語法如下:
less [options] [file]
more
命令與 less
類似,但功能較少。它用於一次性顯示文件的全部內容。
more
命令的語法如下:
more [options] [file]
對於這兩個命令,你可以使用空格鍵逐頁向下滾動,使用 Enter 鍵逐行向下滾動,以及使用字母 q 退出查看器。
要向後移動,可以使用字母 b;要向前移動,可以使用字母 f。
使用 tail
命令顯示文件的最後一部分
有時候你可能只需要查看文件的最後幾行而不是全部內容。Linux 中的 tail
命令用於顯示文件的最後一部分。
例如,tail file.txt
命令會 default 默認顯示文件 file.txt
的最後 10 行。
如果您想要顯示不同數量的行,您可以使用 `-n` 選項,後面跟上您想要顯示的行數。
# 顯示文件 file.txt 的最後 50 行
tail -n 50 file.txt
💡提示: `tail` 的另一個用途是它的跟隨 (`-f`) 選項。這個選項讓您能夠在文件正在寫入時查看其內容。這是一個有用的工具,用於實時查看和監控日誌文件。
使用 `head` 命令顯示文件的開頭
就像 `tail` 顯示文件的最後部分一樣,您可以在 Linux 中使用 `head` 命令來顯示文件的開頭。
例如,`head file.txt` 會默認顯示文件 `file.txt` 的前 10 行。
要更改顯示的行數,您可以使用 `-n` 選項,後面跟上您想要顯示的行數。
使用 `wc` 命令計算詞彙、行數和字符
您可以使用 `wc` 命令在文件中計算詞彙、行數和字符。
例如,運行 `wc syslog.log` 給我以下的輸出:
1669 9623 64367 syslog.log
在上面的工作中,
-
1669
代表文件 `syslog.log` 的行數。 -
9623
代表文件 `syslog.log` 的詞彙數。 -
64367
代表文件syslog.log
中的字符数目。
因此,命令 wc syslog.log
统计了文件 syslog.log
中的 1669
行、9623
单词和 64367
字符。
使用 diff
命令逐行比较文件
在 Linux 中,比较两个文件并找出它们之间的差异是一个常见的任务。您可以在命令行中直接使用 diff
命令来比较两个文件。
diff
命令的基本语法是:
diff [options] file1 file2
以下是我们要使用 diff
命令比较的两个文件:hello.py
和 also-hello.py
。
# hello.py 的内容
def greet(name):
return f"Hello, {name}!"
user = input("Enter your name: ")
print(greet(user))
# also-hello.py 的内容
more also-hello.py
def greet(name):
return fHello, {name}!
user = input(Enter your name: )
print(greet(user))
print("Nice to meet you")
- 检查文件是否相同或不同
diff -q hello.py also-hello.py
# 输出
Files hello.py and also-hello.py differ
- 看看文件之间有何差异。为此,您可以使用
-u
标志以统一格式查看输出:
diff -u hello.py also-hello.py
--- hello.py 2024-05-24 18:31:29.891690478 +0500
+++ also-hello.py 2024-05-24 18:32:17.207921795 +0500
@@ -3,4 +3,5 @@
user = input(Enter your name: )
print(greet(user))
+print("Nice to meet you")
— hello.py 2024-05-24 18:31:29.891690478 +0500
- 在上面的输出中:
--- hello.py 2024-05-24 18:31:29.891690478 +0500
表示比較中の檔案及其時間戳記。+++ also-hello.py 2024-05-24 18:32:17.207921795 +0500
表示另一個比較中の檔案及其時間戳記。@@ -3,4 +3,5 @@
顯示變更發生之行的號碼。在此例中,它表示原始檔案中的第3行至第4行已更改為修改過之檔案中的第3行至第5行。user = input(Enter your name: )
是原始檔案中的一行。print(greet(user))
是原始檔案中的另一行。
+print("Nice to meet you")
是修改過之檔案中的新增一行。
diff -y hello.py also-hello.py
要看差異的并列格式,您可以使用 -y
旗帜:
def greet(name): def greet(name):
return fHello, {name}! return fHello, {name}!
user = input(Enter your name: ) user = input(Enter your name: )
print(greet(user)) print(greet(user))
> print("Nice to meet you")
# 輸出
- 在輸出中:
- 兩個文件中相同的部分會並排顯示。
不同的行會用 >
符號顯示,表示該行只存在於其中一個文件中。
第5部分:Linux 中文字編輯的要點
在 Linux 中使用命令行進行文字編輯是不可或缺的技能之一。在本節中,您將學習如何在 Linux 中使用兩種流行的文字編輯器:Vim 和 Nano。
我建議您精通任一字Editor,並持續使用。這會節省您的时间並提高您的生產力。Vim 和 nano 是安全的選擇,因為它們most Linux distributions。
5.1. 精通 Vim:完整指南
Vim 介紹
- Vim 是一款受歡迎的命令行文字編輯工具。Vim 具有它們的优势:它強大、可自訂且快速。以下是一些为什么您應該學習 Vim 的原因:
- 大多數服務器都是通過 CLI 訪問,因此在系統管理中,您不一定有 GUI 的奢華。但 Vim 將永遠在您身邊。
- Vim使用鍵盤為中心的方法,它設計成可以在沒有滑鼠的情況下使用,一旦你學會了鍵盤快捷鍵,可以顯著加快編輯任務的速度。這也使它比GUI工具更快。
- 一些Linux工具(例如編輯cron作業)使用與Vim相同的編輯格式。
Vim適合所有人-初學者和高級用戶。Vim支持複雜的字符串搜索、突出顯示搜索等等。通過插件,Vim為開發人員和系統管理員提供了擴展功能,包括代碼自動完成、語法高亮、文件管理、版本控制等等。
Vim有兩個變體:Vim(vim
)和Vim tiny(vi
)。Vim tiny是Vim的縮小版本,缺少一些功能。
如何開始使用vim
vim your-file.txt
使用以下命令開始使用Vim:
your-file.txt
可以是一個新文件,也可以是要編輯的現有文件。
Vim 操控:精通移動和指令模式
在 CLI 的早期日子,鍵盤並未orse arrow keys. 因此,移動是通過使用一組可用的按鍵來完成的,hjkl
就是其中之一。
由於 Vim 是以鍵盤为中心的,使用 hjkl
按鍵可以大大加快文字編輯任務的速度。
注意:雖然方向鍵也可以正常工作,但您仍然可以嘗試使用 hjkl
按鍵來移動。有些人發現這種移動方式很有效。
💡小貼士: 要記住 hjkl
序列,可以使用這個方法:hang back, jump down, kick up, leap forward.
Vim 的三種模式
- 您需要了解 Vim 的三種操作模式以及如何之間進行切換。在每個命令模式中,按键行為都不同。這三种模式如下:
- 指令模式。
- 编辑模式。
視覺模式。
指令模式。當您開始 Vim 時,您會 default 默認 landed in the command mode. 此模式 allow you to access 其他模式。
⚠ 要切換到其他模式,您需要先 present 在命令模式中
编辑模式
此模式 allow you to 修改文件。要 enter edit mode, press I
while in command mode. Note the '-- INSERT'
switch at the end of the screen.
視覺模式
- 此模式讓您能夠對單個字符、一段文字或文字行進行工作。讓我們分解為簡單的步驟。記住,在命令模式下使用以下組合。
Shift + V
→ 選擇多行。Ctrl + V
→ 區塊模式
V
→ 字符模式
視覺模式在需要大量複製粘貼或编辑行時非常有用。
擴展命令模式。
擴展命令模式讓您能夠執行像是搜索、設置行號和標記文字等進階操作。我們在下一節中介绍擴展模式。
如何保持在香港?如果您忘記當前模式,只需按下 ESC
兩次,您將回到命令模式。
在 Vim 中有效地進行編輯:複製/貼上和搜索
1.如何在 Vim 中複製和貼上
- 複製和貼上在 Linux 語境中稱為 ‘yank’ 和 ‘put’。要複製和貼上,請按照以下步驟操作:
- 在視覺模式下選擇文字。
- 按
'y'
複製/吸取。
Move您的游標至所需位置並按下 'p'
。
2. 在 Vim 中如何搜尋文字
在 Vim 的命令模式下,可以使用 /
來搜尋任何一系列的字串。要進行搜尋,輸入 /要匹配的字串
。
在命令模式下,輸入 :set hls
並按下 enter
。使用 /要匹配的字串
進行搜尋。這將會突出顯示搜尋結果。
讓我們搜尋幾個字串:
3. 如何退出 Vim
- 首先,移動到命令模式(通過連按兩次 Esc 鍵)然後使用以下命令:
- 不保存退出 →
:q!
保存並退出 → :wq!
Vim 中的快捷鍵:讓編輯更快
- 注意:這些快捷鍵只在命令模式下有效。
Ctrl+u
: 向上半个页面移动P
:粘貼在游標上方:%s/old/new/g
: 在文件中將所有old
出現的內容替換為new
:q!
:不保存退出
Ctrl+w 隨後 h/j/k/l
:在分割視窗間導航
5.2. 精通 Nano
Nano 入門:使用者友好的文字編輯器
Nano 是一個使用者友好的文字編輯器,簡單易用,非常適合初學者。它預裝在大多數 Linux 發行版中。
nano
使用 Nano 創建新文件,請使用以下命令:
nano filename
使用 Nano 編輯現有文件,請使用以下命令:
Nano 中的快捷鍵列表
讓我們學習 Nano 中最重要的快捷鍵。你將使用這些快捷鍵來執行各種操作,如保存、退出、復制、粘貼等。
寫入文件並保存
一旦你使用 `nano` 命令打開 Nano,你就可以開始寫文字。要把文件保存起來,按 `Ctrl+O`。你會被提示輸入文件名稱。按 `Enter` 來保存文件。
離開 nano
你可以通過按 `Ctrl+X` 來退出 Nano。如果你有未保存的更改,Nano 會提示你在退出之前保存更改。
複製和貼上
要選擇一個區域,使用 `ALT+A`。一個標記會顯示出來。使用箭頭來選擇文字。一旦選擇,使用 `ALT+^` 退出標記。
要複製選擇的文字,按 `Ctrl+K`。要把複製的文字貼上,按 `Ctrl+U`。
剪切和貼上
選擇一個區域使用 `ALT+A`。一旦選擇,用 `Ctrl+K` 剪切文字。要把剪切的文字貼上,按 `Ctrl+U`。
導航
使用 `Alt \` 移到文件的開頭。
使用 `Alt /` 移到文件的結尾。
查看行號
當你用 `nano -l filename` 打開文件時,你可以在文件的左側查看行號。
搜索
你可以使用 `ALt + G` 尋找特定的行號。輸入提示中的行號並按 `Enter`。
您也可以用 CTRL + W
Initiate 搜索並按 Enter 鍵。如果您想反向搜索,可以在使用 Ctrl+W
发起搜索後按 Alt+W
。
- Nano 的快捷鍵概要
Ctrl+G
: 显示帮助文本Ctrl+J
: 對齊當前段落Ctrl+V
: 向下滚動一頁Ctrl+\
: 搜索並替換
Alt+E
:重做最後一次撤消的操作
第6章:Bash scripting
6.1. Bash scripting的定義
Bash script是一個包含由Bash程式一行一行執行的命令序列的檔案。它讓你能執行一系列的操作,例如转到特定的目錄、創建一個文件夾,以及使用命令行啟動一個进程。
通过將命令儲存在腳本中,您可以重複執行相同的步驟序列,並通過運行腳本來執行它們。
6.2. Bash 腳本編程的優點
Bash 腳本是一種強大且多功能的工具,可用於自動化系統管理任務、管理系統資源,以及在 Unix/Linux 系統中執行其他日常工作。
- 腳本的一些優點包括:
- 自動化:腳本允許您自動化重複的任務和過程,節省時間並減少手動執行時可能发生的錯誤風險。
- 移植性:腳本可以在各種平台和作業系統上運行,包括 Unix、Linux、macOS,甚至是透過仿真器或虛擬機在 Windows 上運行。
- 靈活性: Shell 腳本具有高度的自訂性,並可以輕鬆修改以符合特定的需求。它們也可以與其他程式語言或公用程式結合,以創造更強大的腳本。
- 易用性: Shell 腳本很容易撰寫,不需要任何特殊的工具或軟體。它們可以用任何文字編輯器編輯,大多數操作系統都有內建的 Shell 解讀器。
- 整合性: Shell 腳本可以與其他工具和應用程式整合,例如數據庫、網頁伺服器和的雲服務,讓複雜的自動化和系統管理任務成為可能。
除錯: Shell 腳本很容易除錯,大多数 Shell 都有內建的除錯和錯誤報告工具,可以幫助快速識別和解決問題。
6.3 Bash Shell 與命令行介面概览
shell 和 bash 這兩個詞彙常被交替使用。但這兩者之間存在微細的差異。
「shell」一詞指的是提供命令行界面以與操作系统互動的程序。Bash (Bourne-Again SHell) 是 Unix/Linux 中最常使用的 shell 之一,也是許多 Linux 分發套件的預設 shell。
至今,您輸入的命令基本上都是 entered in a “shell”。
雖然 Bash 是一種 shell,但也還有其他可用的 shell,如 Korn shell (ksh)、C shell (csh) 和 Z shell (zsh)。每個 shell 都有自己的語法和功能集合,但它們都共有提供命令行界面以與操作系统互動的共通目標。
ps
# output:
PID TTY TIME CMD
20506 pts/0 00:00:00 bash <--- the shell type
20931 pts/0 00:00:00 ps
您可以使用 ps
命令來確定您的 shell 類型:
總結來說,雖然「shell」這個詞是指任一種提供命令行界面的程序,但「Bash」是一個在 Unix/Linux 系統中廣泛使用的特定類型的 shell。
注意:在這一節中,我們將使用 “bash” shell。
6.4. 如何創建和執行 Bash 腳本
腳本命名規則
按照命名規則,Bash 腳本应以 .sh
結尾。然而,Bash 腳本完全可以沒有 sh
擴展名而正常運行。
添加 Shebang
Bash 腳本從一個 `shebang` 開始。Shebang 是由 `bash #` 和 `bang !` 組成,後面跟着 Bash shells 的路徑。這是腳本的第一行。Shebang 告訴 shell 通過 Bash shells 執行它。Shebang 只是到 Bash 解讀器的絕對路徑。
#!/bin/bash
以下是一個 shebang 声明的示例。
which bash
您可以使用以下命令找到您的 Bash shell 路徑(可能與上面不同):
創建您的第一個 Bash 腳本
我們的第一个腳本能提示用戶輸入一個路徑。作為回饋,它將列出路徑的內容。
vim run_all.sh
使用您選擇的任何編輯器創建一個命名為 `run_all.sh` 的文件。
#!/bin/bash
echo "Today is " `date`
echo -e "\nenter the path to directory"
read the_path
echo -e "\n you path has the following files and folders: "
ls $the_path
在您的文件中添加以下命令並保存它:
1 讓我們更深入地查看腳本逐行。我再次顯示相同的腳本,但這次带有行號。
2 echo "Today is " `date`
3
4 echo -e "\nenter the path to directory"
5 read the_path
6
7 echo -e "\n you path has the following files and folders: "
8 ls $the_path
- #!/bin/bash
- 行 #1: shebang (`#!/bin/bash`)指向 Bash shell 路徑。
- 行 #2: `echo` 命令在控制台南显示当前日期和时间。注意 `date` 在反引號中。
- 行 #4: 我们希望用户输入一个有效的路径。
- 行 #5:`read` 命令將輸入的內容存儲在變量 `the_path` 中。
行 #8:`ls` 命令取用存儲路徑的變量並顯示當前的文件和文件夾。
執行 bash 腳本
chmod u+x run_all.sh
要使腳本可執行,請使用以下命令為您的用戶分配執行權限:
- 在此,
chmod
命令為當前用戶更改文件的所有權:u
。+x
命令為當前用戶添加執行權限。這意味著作為所有人的用戶現在可以運行腳本。
run_all.sh
是我們希望運行的文件。
- 您可以使用上面提到的任何方法運行腳本:
sh run_all.sh
bash run_all.sh
./run_all.sh
Let’s see it running in action 🚀
6.5. Bash 脚本基本語法
Bash 腳本中的註釋
在 Bash 腳本中,註釋以 #
開始。這意味著任何以 #
開頭的行都是註釋,將被 interpreter 忽略。
註釋對於程式碼的記錄非常有幫助,並且添加註釋是一種良好的做法,以幫助他人理解程式碼。
以下是一些註釋的例子:
# This is an example comment
# Both of these lines will be ignored by the interpreter
Bash 中的變量和數據類型
變量讓您能夠儲存數據。您可以在腳本中使用變量來讀取、訪問和操作數據。
在 Bash 中沒有數據類型。在 Bash 中,變量能夠儲存數字值、单个字符或字符串。
- 在 Bash 中,您可以使用和設定變量值以下方式:
country=Netherlands
直接賦值:
same_country=$country
2. 根据從程序或命令獲得的輸出使用命令替換來賦值。注意需要使用 $
來訪問已存在變量的值。
這將 country
的值賦給新的變量 same_country
。
country=Netherlands
echo $country
要访问變量的值,请在變量名後添加 $
。
Netherlands
new_country=$country
echo $new_country
# 輸出
Netherlands
# 輸出
上面,您可以看到一個分配和打印變量值的示例。
變量命名規則
- 在Bash腳本中,以下是她變量命名規則:
- 變量名稱應從字母或下劃線(
_
)開始。 - 變量名稱可以包含字母、數字和下劃線(
_
)。 - 變量名稱是區分大小寫的。
- 變量名稱不應該含有空格或特殊字符。
- 使用反映變量用途的描述性名稱。
避免使用保留的关键詞,如 if
, then
, else
, fi
等等作為變量名稱。
name
count
_var
myVar
MY_VAR
以下是一些Bash中有效的變量名稱示例:
以下是一些無效的變量名稱示例:
2ndvar (variable name starts with a number)
my var (variable name contains a space)
my-var (variable name contains a hyphen)
# 無效的變量名稱
遵循這些命名惯例有助於使Bash腳本更具可讀性且更容易維護。
Bash腳本中的輸入和輸出
輸入 gathering input
- 在這一節中,我們將讨论一些向腳本提供輸入的方法。
使用read
命令讀取使用者輸入並將其存儲在變量中
#!/bin/bash
echo "What's your name?"
read entered_name
echo -e "\nWelcome to bash tutorial" $entered_name
我們可以使用read
命令來讀取使用者輸入。
2.從文件中讀取
while read line
do
echo $line
done < input.txt
此代碼從名為input.txt
的文件中讀取每一行,並將其打印到終端。我們在本節後面將研究while循環。
3.命令行參數
在Bash腳本或函數中,$1
表示傳遞的最初參數,$2
表示傳遞的第二個參數,依此类推。
#!/bin/bash
echo "Hello, $1!"
此腳本接受一個作為命令行參數的名字並打印一個个性化問候。
我們為腳本提供了Zaira
作為我們的參數。
輸出:
顯示輸出
- 在這裡,我們將討論一些從腳本接收輸出的方法。
echo "Hello, World!"
打印到終端:
這將”Hello, World!”文本打印到終端。
echo "This is some text." > output.txt
2.寫入文件:
這將文本”This is some text.”寫入名稱為output.txt
的文件。注意>
運算符如果文件已經有內容,則覆蓋文件。
echo "More text." >> output.txt
3.追加到文件:
此應用將文字”更多文字。”新增至文件output.txt
的末端。
ls > files.txt
4. 重定向輸出:
此命令會列出當前目錄下的文件,並將輸出寫入命名為files.txt
的文件中。您可以以这种方式將任何命令的輸出重定向到文件。
您在8.5節將详细了解輸出重定向。
條件語句(if/else)
產生布林結果(真或假)的表達式稱為條件。評估條件有許多方法,包括if
、if-else
、if-elif-else
及嵌套條件語句。
if [[ condition ]];
then
statement
elif [[ condition ]]; then
statement
else
do this by default
fi
語法:
Bash條件語句的語法
if [ $a -gt 60 -a $b -lt 100 ]
我們可以使用如AND -a
和 OR -o
的邏輯運算符來進行更有意义的比較。
此語句檢查兩個條件是否都為true
:a
比 60
大 AND b
比 100
小。
#!/bin/bash
讓我們看看一個使用if
、if-else
和if-elif-else
語句的Bash腳本,以判定使用者輸入的數字是正數、負數還是零:
echo "Please enter a number: "
read num
if [ $num -gt 0 ]; then
echo "$num is positive"
elif [ $num -lt 0 ]; then
echo "$num is negative"
else
echo "$num is zero"
fi
# 判定數字是否為正數、負數或零的腳本
脚本首先提示用户输入一個數字。然後,它使用 `if` 語句來檢查這個數字是否大於 `0`。如果是,則腳本輸出該數字是正數。如果數字不大於 `0`,腳本则会進行下一個語句,即 `if-elif` 語句。
在此處,腳本檢查數字是否小於 `0`。如果是,則腳本輸出該數字是負數。
最後,如果數字既不大於 `0` 也不小於 `0`,則腳本使用 `else` 語句來輸出該數字是零。
來看一下實際應用 🚀
Bash 中的循環和分支
While 循環
While 循環檢查一個條件,並在條件為 `true` 時持續循環。我們需要提供一个计数器语句来递增计数器以控制循环执行。
#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
echo "$i"
(( i += 1 ))
done
在下面的例子中,`(( i += 1 ))` 是递增计数器的语句,它将增加 `i` 的值。循环将正好运行 10 次。
For 循環
`for` 循环,与 `while` 循环类似,允许你执行特定次数的语句。每个循环在语法和使用上都有所不同。
#!/bin/bash
for i in {1..5}
do
echo $i
done
在下面的例子中,循环将迭代 5 次。
情形語句
case expression in
pattern1)
在Bash中,case語句用於將給定的值與一串模式進行比較,並根據第一個匹配的模式執行一块代碼。Bash中的case語句語法如下:
;;
pattern2)
# 如果表達式與模式1匹配,則執行此代碼块
;;
pattern3)
# 如果表達式與模式2匹配,則執行此代碼块
;;
*)
# 如果表達式與模式3匹配,則執行此代碼块
;;
esac
# 如果以上模式皆不匹配表達式,則執行此代碼块
“表達式”是我們想要比較的值,”模式1″、”模式2″、”模式3″等是我們想要比較的的模式。
在此,雙分號”;;”用來分隔每個模式对应的代碼块。星號”*”代表默認案例,如果沒有任何指定模式與表達式匹配,則執行此案例。
fruit="apple"
case $fruit in
"apple")
echo "This is a red fruit."
;;
"banana")
echo "This is a yellow fruit."
;;
"orange")
echo "This is an orange fruit."
;;
*)
echo "Unknown fruit."
;;
esac
讓我們看一個例子:
在這個例子中,由於fruit
的值是apple
,所以第一個模式匹配,並執行回顯This is a red fruit.
的代碼块。如果fruit
的值是banana
,那麼第二個模式將匹配,並執行回顯This is a yellow fruit.
的代碼块,依此类推。
如果fruit
的值與所有指定的模式都不匹配,則執行默認案例,回顯Unknown fruit.
第七部分:在Linux中管理軟體包
Linux 搭載了數個內置程序。但你可能需要根據需求安裝新的程序。你也可能需要升級现有的應用程序。
7.1. 套件和套件管理
什麼是套件?
套件是一組集中的文件。這些文件對於特定程序的運行是必要的。這些文件包含了程式的可執行文件、庫和其他資源。
除了程序運行所需的文件外,套件還包含安裝脚本,這些脚本將文件複製到需要的地方。一個程序可能包含許多文件和依賴。透過套件,可以更輕鬆地一次性管理所有文件和依賴。
源代码和二進制代码有何不同?
程序員用程式語言寫源代码。這段源代码然後被翻譯成電腦能理解的機器代碼。這種翻譯過的代碼稱為二進制代碼。
當你下載一個套件時,你可以獲得源代码或二進制代码。 源代码是人類可閱讀的代碼,可以翻譯成二進制代碼。二進制代碼是翻譯過的代碼,電腦能理解。
如果源代碼正確地被翻譯,源代碼可以與任何類型的機器配合使用。相對地,二進制代碼是特定於某種類型的機器或結構的翻譯代碼。
uname -m
你可以使用 uname -m
命令來找出你的機器的結構。
x86_64
# 输出版本
套件相依性
程式經常共享文件。為了避免將這些文件 Include 在每個套件中,可以有一個分離的套件來為所有程式提供這些文件。
要安裝需要這些文件的程式,您也必須安裝含有這些文件的套件。這稱為套件相依性。通過指定相依性,可以通過減少重複來使套件更小、更簡單。
當您安裝一個程式時,其相依性也必須被安裝。大多數必要的相依性通常已經被安裝,但是可能還需要一些額外的相依性。所以,如果您选择的套件 Along with install several other packages, don’t be surprised. 這些是必要的相依性。
套件管理器
Linux 提供了全面的套件管理系統,用於安裝、升級、配置和移除軟體。
透過套件管理,您可以访问三千個以上的軟體包的有序基础,並具有解決相依性和檢查軟體更新的能力。
套件可以使用命令行工具来管理,这些工具可以很容易地被系统管理员自动化,或者通过图形界面进行管理。
軟體管道/仓库
⚠️ 套件管理因不同的发行版而异。在此,我们使用的是 Ubuntu。
与 Windows 和 Mac 相比,Linux 中安装软件的方式略有不同。
Linux 使用仓库来存储软件包。仓库是一个集合,包含可通过套件管理器安装的软件包。
套件管理员亦儲存來自儲庫的所有套件的索引。有時會重新建立索引,以确保它是最新的,並知道自上次檢查以来哪些套件已被升级或新增至通道。
從儲庫下載軟件的通用過程類似於以下這樣:
- 如果我們specifically談論Ubuntu,
- 使用
apt update
取得索引。(apt
在下一節中有解釋)。 - 根據索引使用
apt install
索取所需的文件/依賴關係 - 本地下載套件及依賴關係。
在需要時使用apt update
和apt upgrade
更新依賴關係和套件
在Debian基礎的發行版上,你可以在/etc/apt/sources.list
中儲存儲庫(repositories)的列表。
7.2. 通過命令行安裝套件
apt
命令是一個強大的命令行工具,它與Ubuntu的”Advanced Packaging Tool (APT)”一起工作。
apt
配上其內建的命令,提供了安装新軟體包、更新既有軟體包、更新軟體包清單索引,甚至是整個 Ubuntu 系統更新的手段。
要查看使用 apt
進行安裝的日志,你可以查看 /var/log/dpkg.log
文件。
以下是用於 apt
命令的用途:
安装軟體包
sudo apt install htop
例如,要安装 htop
軟體包,你可以使用以下命令:
更新軟體包清單索引
sudo apt update
軟體包清單索引是所有在倉庫中可用的軟體包的列表。要更新本地軟體包清單索引,你可以使用以下命令:
升級軟體包
系統上已安裝的軟體包可以收到包含錯誤修復、安全性补丁和新功能的更新。
sudo apt upgrade
要升級軟體包,你可以使用以下命令:
移除軟體包
sudo apt remove htop
要移除一個軟體包,比如 htop
,你可以使用以下命令:
7.3. 使用進階圖形方法安裝軟體包 – Synaptic
如果你不习惯於命令行,你可以使用 GUI 應用程式來安裝軟體包。你可以達到與命令行相同的效果,但是透過圖形介面。
Synaptic 是一個 GUI 軟體包管理應用程式,幫助列出已安裝的軟體包、它們的狀態、待处理的更新等等。它提供自訂過濾器來幫助你縮小搜索結果。
你也可以右擊一個套件並查看進一步的詳細信息,如依賴性、維護者、大小和已安裝的文件。
7.4. 從網站上安裝下載的套件
你可能会想要從網站上下載並安裝一個套件,而不是從軟體庫中安裝。這些套件稱為.deb
文件。
cd directory
sudo dpkg -i package_name.deb
使用dpkg
安装套件:dpkg
是一個用於安裝套件的命令行工具。要使用dpkg安装套件,請打開終端並輸入以下命令:
注意:將”directory”替換為存儲套件的目錄,將”package_name”替換為套件的文件名。
或者,你可以右擊,選擇”用其他應用程序打開”,然後選擇你喜歡的GUI應用程序。
💡 提示:在Ubuntu中,你可以使用dpkg --list
查看已安裝的套件列表。
第8部分:進階Linux主題
8.1. 用戶管理
系統中可以有多個用戶,其訪問權限各不相同。在Linux中,根用戶擁有最高權限,可以執行系統上的任何操作。一般用戶權限有限,只能執行他們獲得允許執行的操作。
什麼是用戶?
用戶帳戶為不同的人和程序提供分隔,使其能夠執行命令。
人類通過名稱識別用戶,因為名稱容易使用。但系統通過稱為用戶ID(UID)的唯一數字來識別用戶。
當人類用戶使用提供的用戶名登錄時,他們必須使用密碼來授權自己。
用戶账号是系統安全的基礎。文件所有权也与用戶账号相關聯,並對文件施行訪問控制。每個进程都有一個相應的用戶账号,為管理員提供了一層控制的手段。
- 主要有三種用戶账号:
- 超級用戶:超級用戶對系統擁有完全的訪問權限。超級用戶的名稱是
root
。它的UID
為0。 - 系統用戶:系統用戶有用戶帳號用於運行系統服務。這些帳號用於運行系統服務,並不適合人類互動。
一般用戶:一般用戶是擁有系統訪問權限的人類用戶。
id
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),24(cdrom),27(sudo),30(dip)... output truncated
命令id
顯示當前用戶的用戶ID和組ID。
id username
要查看另一個用戶的基本信息,將用戶名作為參數傳遞給id
命令。
ps -u
要查看與使用者相關的进程信息,請使用 ps
命令並加上 -u
旗標。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 16968 3920 ? Ss 18:45 0:00 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 18:45 0:00 [kthreadd]
# 輸出
系統預設會使用 /etc/passwd
檔案來儲存使用者資訊。
root:x:0:0:root:/root:/bin/bash
以下是 /etc/passwd
檔案中的一行:
/etc/passwd
檔案包含以下關於每位使用者的資訊:- 用戶名:
root
– 使用者帳戶的名稱。 - 密碼:
x
– 使用者帳戶的加密格式密碼,為了安全起見,該密碼儲存在/etc/shadow
檔案中。 - 用戶ID (UID):
0
– 使用者帳戶的唯一數字識別符。 - 群組ID (GID):
0
– 使用者帳戶的主要群組識別符。 - 使用者資訊:
root
– 使用者帳戶的真實名稱。 - 家目錄:
/root
– 用戶帳號的家目錄。
shell: /bin/bash
– 用戶帳號的預設shell。若該用戶不允许互動式登入,系統用戶可能會使用/sbin/nologin
。
什麼是群組?
群組是共享存取和資源的用戶帳號集合。群組有群組名稱以作為識別。系統通過稱為群組識別號(GID)的唯一數字來識別群組。
預設情況下,關於群組的信息存儲在/etc/group
文件中。
adm:x:4:syslog,john
以下是/etc/group
文件中的一個条目:
- 以下是給定條目中的字段分解:
- 群組名稱:
adm
– 群組的名稱。 - 密碼:
x
– 為了安全起見,群組的密碼存儲在/etc/gshadow
文件中。密碼是可选的,如果未設定則 appear empty。 - 組ID (GID):
4
– 該組的唯一數字标识符。
在這個特定的条目中,組名稱為 adm
,組ID 是 4
,並且該組有两个成員:syslog
和 john
。密碼字段通常設置為 x
,以指示組密碼存储在 /etc/gshadow
文件中。
- 主要附加
附加群組:這些是用戶可以屬於其主要群組之外的额外群組。用戶可以成為多個補充群組的成員。這些群組讓用戶能夠獲得這些群組共享的資源的權限。它們有助於提供對共享資源的訪問,而不影響系統的文件權限,同時保持安全性。雖然用戶必須屬於一個主要群組,但成為補充群組的成員是可选的。
訪問控制:尋找並了解文件權限
可以使用 ls -l
命令查看文件所有權。ls -l
命令的輸出中的第一列顯示文件的權限。其他列顯示文件的所有者和文件所属的群組。
讓我們更近一步查看 mode
列:
- 模式 定義了兩件事:
- 文件類型: 文件類型定義了文件的種類。對於包含簡單數據的普通文件,它是空白的
-
。對於其他特殊文件類型,符號不同。對於一個目錄這種特殊文件,它是d
。特殊文件在作業系統中會有不同的處理方式。
權限類別: 接下來的字符集分别定义了用戶、群組和他人各自的權限。
– 用戶: 这是文件的所有者,文件的所有者属于这个类别。
– 群組: 文件所属组的成员属于这个类别
– 其他人: 任何不属于用戶或群組类别的用户属于这个类别。
💡提示: 目录所有权可以通过使用 ls -ld
命令来查看。
如何阅读象征性权限或 rwx
权限
-
rwx
表示被称为权限的象征性表示。在权限集合中, r
代表 讀取。它在三個字符的第一个字符中表示。w
代表 寫入。它在三個字符的第二个字符中表示。
x
代表 執行。它在三個字符的第三個字符中表示。
讀取:
對於一般文件,讀取权限只允許打開和讀取文件,但不能修改文件。
對於目錄同理,讀取权限只允許列印目錄內容,但不能修改目錄。
寫入:
當文件具有寫入权限時,用戶可以修改(編輯、刪除)文件並保存。
對於文件夾,寫入權限允許用戶修改其內容(在文件夾內創建、刪除和重命名文件),以及修改用戶具有寫入權限的文件內容。
Linux 權限示例
- 既然我們已經知道如何讀取權限,讓我們看一下一些示例。
-
-rw-rw-r--
: 文件其所有者和群組可以修改,但其他人不可以。
drwxrwx---
: 目錄可以被其所有者和群組修改。
執行:
對於文件,執行權限允許用戶運行可執行的腳本。對於目錄,用戶可以訪問它們,以及訪問目錄中的文件詳細信息。
如何在Linux中使用chmod
和chown
更改文件權限和所有者
既然我們已經了解了所有者和權限的基本知識,讓我們看看我們如何可以使用chmod
命令修改權限。
chmod permissions filename
chmod
語法:
- 何時,
權限
可以是被讀取,寫入,執行或它們的組合。
filename
是需要更改權限的文件的名稱。這個參數也可以是一個文件列表,如果要在一批中更改權限。
- 我們可以使用兩種模式來更改權限:
- 符號模式:此模式使用如
u
、g
、o
等符號來代表用戶、組群及其他。權限則以r, w, x
來表示讀取、寫入及執行,分別來說。您可以用+、-和=來修改權限。
絕對模式:此模式將權限表示為從0到7的3位八進制數字。
讓我們具體来看看它們。
使用符號模式更改權限的方法
下面的表格總結了用戶的表示方法: | 用戶表示 |
u | 描述 |
g | 用戶/所有者 |
o | 組群 |
其他人
我們可以用算術運算符來添加、移除和指派權限。下面的表格展示了總結: | 運算符 |
描述 | + |
向文件或目錄添加權限 | – |
移除權限 | \= |
如果不存在則設定權限,如果已設定則覆蓋權限。
範例:
假設我有一個腳本,我想要讓該文件的擁有者zaira
能夠執行它。
目前的文件權限如下:
讓我們這樣分割權限:
chmod u+x mymotd.sh
為了向擁有者zaira
添加執行權限(x
),我們可以使用以下命令:
輸出:
現在,我們可以看到對於擁有者zaira
已經添加了執行權限。
- 使用符號方法更改權限的額外範例:
- 移除
read
和write
權限對於group
和others
:chmod go-rw
。 - 移除
read
權限對於others
:chmod o-r
。
指派write
權限給group
並且覆蓋既有的權限:chmod g=w
。
如何使用絕對模式更改權限
絕對模式使用數字來表示權限,並用數學運算子來修改它們。
以下表格展示了我們如何分配相關的權限: | 權限 |
提供權限 | 讀取 |
加 4 | 寫入 |
加 2 | 執行 |
加 1
權限可以用減法取消。以下表格展示了您可以如何移除相关的權限。 | 權限 |
取消權限 | 讀取 |
減 4 | 寫入 |
減 2 | 執行 |
減 1
- 示例:
為 user
設定 讀取
(加 4),為群組設定 讀取
(加 4) 和 執行
(加 1),為其他人只設定 執行
(加 1)。
chmod 451 file-name
這是我們進行計算的方式:
- 注意這與
r--r-x--x
相同。
移除 other
和 group
的執行權限。
- 要移除
other
和group
的執行權限,將最後兩個字节的執行部分減 1。
將read
, write
和 execute
權限授給user
, read
和 execute
權限授給group
, 只授給others
read
權限。
這會與rwxr-xr--
相同。
如何使用chown
命令更改所有權
接下來,我們將學習如何更改文件的所有權。您可以使用chown
命令來更改文件或文件夾的所有權。在某些情況下,更改所有權需要sudo
權限。
chown user filename
chown
命令的語法
如何使用chown
更改用戶所有權
讓我們將所有權從用戶zaira
轉移給用戶news
。
chown news mymotd.sh
更改所有權的命令:sudo chown news mymotd.sh
。
輸出:
如何同時更改用戶和組所有權
chown user:group filename
我們也可以使用chown
同時更改用戶和組所有權。
如何更改目錄所有權
chown -R admin /opt/script
您可以為目錄中的內容遞归地更改所有權。以下示例將/opt/script
文件夾的所有權更改為允許用戶admin
。
如何更改組所有權
chown :admins /opt/script
如果我們只需要更改組所有者,我們可以使用chown
,通過在組名稱前加上冒號:
來實現。
如何之間的用戶切換
[user01@host ~]$ su user02
Password:
[user02@host ~]$
您可以使用 `su` 命令來切換用戶。
如何獲得超級用戶訪問
超級用戶或根用戶在 Linux 系統上擁有最高的訪問權限。根用戶可以對系統執行任何操作。根用戶可以訪問所有文件和目錄、安裝和移除軟體,以及修改或覆寫系統配置。
能力越大,責任越大。如果根用戶被攻陷,别人可以完全控制系統。建議只在必要時使用根用戶帳號。
[user01@host ~]$ su
Password:
[root@host ~]如果您省略用戶名,`su` 命令會默認切換到根用戶帳號。
#
`su` 命令的另一個變體是 `su -`。`su` 命令切換到根用戶帳號但不會更改環境變量。`su -` 命令切換到根用戶帳號並將環境變量更改为目标用戶的環境變量。
使用 `sudo` 命令執行命令
要作為 `root` 用戶執行命令而不切換到 `root` 用戶帳號,您可以使用 `sudo` 命令。`sudo` 命令讓您能夠以提升的權限執行命令。
使用 `sudo` 命令執行命令是一個更安全的選擇,而不是作為 `root` 用戶執行命令。这是因为,只有特定的用戶集被授予了使用 `sudo` 命令的權限。這在 `/etc/sudoers` 文件中定義。
亦 Concurrently, sudo
會記錄所有以它執行的命令,提供一個审计踪跡,記錄谁運行了哪些命令以及何時運行。
cat /var/log/auth.log | grep sudo
在 Ubuntu 中,您可以在以下位置找到审计日志:
user01 is not in the sudoers file. This incident will be reported.
對於沒有訪問 sudo
權限的使用者,它在日志中標記並顯示如下信息:
管理本地用戶帳號
從命令行創建用戶
sudo useradd username
用於新增用戶的命令是:
此命令會設定用戶的家目錄並創建一個私有的群組,該群組由用戶的名稱指定。目前,該賬戶缺乏有效的密碼,直到創建密碼為止,用戶無法登錄。
修改现有用戶
usermod
命令用於修改现有用戶。以下是與 usermod
命令一起使用的一些常見選項:
- 以下是一些 Linux 中的
usermod
命令示例: - 更改用戶的登錄名:
- 更改用戶的家目錄:
- 將用戶加入到附屬群組:
- 更改用戶的 shells:
- 鎖定用戶的帳號:
- 為用戶賬戶設定到期日期:
- 為用戶賬戶設定到期日期:
- 更改用戶的用戶 ID (UID):
- 更改用戶的主要組件:
移除用戶自副組:
刪除用戶
- 系統中使用
userdel
命令來刪除用戶帳號及相關文件。 sudo userdel 用戶名
: 從/etc/passwd
中移除用戶资料,但保留用戶的家目錄。
命令sudo userdel -r 用戶名
從/etc/passwd
中移除用戶資料,並刪除用戶的家目錄。
更改用戶密碼
- 使用
passwd
命令來更改用戶的密碼。
sudo passwd 用戶名
: 設定用戶名的初始密碼或更改现有密碼。它也被用來更改當前登錄用戶的密碼。
8.2 透過SSH連接远程伺服器
連接到遠端伺服器是系統管理員的必要任務之一。您可以使用本地機器連接到不同的伺服器,或存取數據庫,並透過 SSH 執行命令。
SSH協議是什麼?
SSH 為 Secure Shell 的縮寫。它是一種加密網絡協議,允許兩個系統之間的安全通信。
SSH 的預設埠號為 22
。
- 通過 SSH 進行通信時的兩個參與者為:
- 伺服器:您想要存取的機器。
客戶端:您從中存取伺服器的系統。
- 連接到伺服器遵循以下步驟:
- 初始化連接:客戶端向伺服器發送連接請求。
- 交換金鑰:伺服器將其公鑰發送給客戶端。雙方同意使用哪些加密方法。
- 會話金鑰生成:客戶端和伺服器使用 Diffie-Hellman 金鑰交換來創建共享會話金鑰。
- 客戶認證:客戶使用密碼、私钥或其他方法登錄伺服器。
安全通訊:認證後,客戶與伺服器以加密方式安全通訊。
如何使用SSH連接遠端伺服器?
SSH命令是Linux內建的工具,也是預設命令。它讓訪問伺服器變得簡單且安全。
這裡,我們谈论的是客戶端如何與伺服器建立連接。
- 在連接到伺服器之前,你需要以下信息:
- 伺服器的IP地址或域名。
- 伺服器的用戶名和密碼。
你在伺服器中可用的端口号。
ssh username@server_ip
SSH命令的基本語法是:
ssh [email protected]
例如,如果你的用戶名是john
,伺服器IP是192.168.1.10
,命令將是:
[email protected]'s password:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-70-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Fri Jun 5 10:17:32 UTC 2024
System load: 0.08 Processes: 122
Usage of /: 12.3% of 19.56GB Users logged in: 1
Memory usage: 53% IP address for eth0: 192.168.1.10
Swap usage: 0%
Last login: Fri Jun 5 09:34:56 2024 from 192.168.1.2
john@hostname:~$ 之後,你将被提示輸入秘密密碼。你的屏幕上将 resemble這個样子:
# 開始輸入命令
現在您可以於服務器 192.168.1.10
上執行相關命令。
ssh -p port_number username@server_ip
⚠️ ssh 的預設端口是 22
,但它也容易受到攻擊,因為黑客很可能首先嘗試這裡。您的服務器可以暴露另一個端口並與您分享訪問權。要連接到不同的端口,請使用 -p
旗帜。
8.3. 進階日誌解析和分析
當系統正確配置時,日誌文件會由您的系統生成的,有各種有用原因。它們可以用來追蹤系統事件、監控系統性能和解決問題。它們對系統管理員特別有用,他們可以追蹤應用程序錯誤、網絡事件和用戶活動。
以下是一個日誌文件的示例:
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 DEBUG Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 WARN Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 DEBUG API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
# 示例日誌文件
- 日誌文件通常包含以下列:
- 時間戳:事件發生的日期和時間。
- 日誌等級:事件的嚴重性(INFO、DEBUG、WARN、ERROR)。
- 部件:生成人 trajectry 的系統部件(Startup、Config、Database、User、Security、Network、Email、API、Session、Shutdown)。
- 發生事件之描述。
相關事件之附加資訊。
在实时系统中,日志文件通常长达数千行,并且每秒都会生成。它们的内容会根据配置的不同而变得非常冗长。日志文件中的每一列都是可以用来追踪问题的信息片段。这使得手动阅读和理解日志文件变得困难。
这就是日志解析发挥作用的地方。日志解析是从日志文件中提取有用信息的过程。它涉及将日志文件分解成更小、更易于管理的片段,并提取相关信息。
筛选后的信息也可以用于创建警报、报告和仪表板。
在本节中,您将探索一些在Linux中解析日志文件的技术。
使用 grep
进行文本提取
grep
是一个内置的 bash 实用程序。它的全称是 “global regular expression print”,即全局正则表达式打印。grep
用于在文件中匹配字符串。
- 以下是
grep
的一些常见用途: - 此命令在命名為
filename
的文件中尋找”search_string”字串。 - 此命令將遞迴在指定目錄及其子目錄中的所有文件尋找”
search_string
“。 - 此命令將在命名為
filename
的文件中進行大小寫不敏感的尋找”search_string”字串。 - 這個命令會顯示名為
檔案名稱
的檔案中符合行的行號。 - 這個命令會計算名為
檔案名稱
的檔案中包含 “搜尋字串” 的行數量。 - 這個命令會顯示文件名
filename
中不包含”search_string”的所有行。 - 這個命令在文件名
filename
中搜尋完整單詞”word”。
這個命令允許在文件名filename
中使用擴展的正則表達式進行更複雜的模式對齊。
💡 小贴士: 如果一個文件夾中有多個文件,你可以使用以下命令來找到包含所需字符串的文件列表。
grep -l "String to Match" /path/to/directory
# 找到包含所需字符串的文件列表
文字提取使用 sed
sed
是 “流编辑器” 的缩写。它以数据流的方式进行处理,意即一次读取一行数据。sed
可以讓您搜尋模式,並對匹配那些模式的行進行操作。
sed
的基本語法:
sed [options] 'command' file_name
sed
的基本語法如下:
在這裡,command
用於對文字數據進行如替換、刪除、插入等操作。filename 是您想要處理的檔案名。
sed
的用法:
1. 替換:
sed 's/old-text/new-text/' filename
使用 s
標誌進行文字替換。old-text
會被替換為 new-text
:
sed 's/error/warning/' system.log
例如,將 system.log
日志檔中的所有 “error” 變更為 “warning”:
2. 列印包含特定模式的行:
sed -n '/pattern/p' filename
使用 sed
篩選並顯示匹配特定模式的行:
sed -n '/ERROR/p' system.log
例如,尋找所有包含 “ERROR” 的行:
3. 刪除包含特定模式的行:
sed '/pattern/d' filename
您可以刪除從輸出中匹配特定模式的行:
sed '/DEBUG/d' system.log
例如,移除所有包含 “DEBUG” 的行:
4. 從日誌行提取特定的字段:
sed -n 's/^\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*/\1/p' system.log
您可以使用正則表達式來 extracts 文字。假設每個 log 行都是以 “YYYY-MM-DD” 格式的日期開始。您可以 extracts 只 date 從每一行:
使用 awk
進行文字剖析
awk
能夠容易將每一行拆分成字段。它非常適合處理如 log 文件等結構化文字。
基本的 awk
語法
awk 'pattern { action }' file_name
awk
基本的語法是:
這裡,模式
是一個必須符合才能執行 动作
的條件。如果省略了模式,动作會對每一行執行。
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
INFO
- 在未來的示例中,您將使用這個 log 文件作為示例:
使用 awk
存取列
zaira@zaira-ThinkPad:~$ awk '{ print $1 }' sample.log
在 awk
中(默認由空格分隔)的字段可以用 $1
、$2
、$3
等等來訪問。
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
zaira@zaira-ThinkPad:~$ awk '{ print $2 }' sample.log
# 輸出
09:00:00
09:01:00
09:02:00
09:03:00
09:04:00
09:05:00
09:06:00
09:07:00
09:08:00
09:09:00
- # 輸出
awk '/ERROR/ { print $0 }' logfile.log
列印包含特定模式(例如,ERROR)的行
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
# 輸出
- 這會列印包含 “ERROR” 的所有行。
awk '{ print $1, $2 }' logfile.log
extracts 第一名(日期和時間)
2024-04-25 09:00:00
2024-04-25 09:01:00
2024-04-25 09:02:00
2024-04-25 09:03:00
2024-04-25 09:04:00
2024-04-25 09:05:00
2024-04-25 09:06:00
2024-04-25 09:07:00
2024-04-25 09:08:007
2024-04-25 09:09:00
# 輸出
- 這將從每一行 extracts 第一名和第二名字段,在這情況下將是日期和時間。
awk '{ count[$3]++ } END { for (level in count) print level, count[level] }' logfile.log
汇总每種 log 級别的出現次數
1
WARN 1
ERROR 1
DEBUG 2
INFO 6
# 产出
- 产出將是每個日誌等級出現次數的汇总。
awk '{ $3="INFO"; print }' sample.log
移除特定字段(例如,第三個字段是INFO)
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
INFO
# 产出
這個命令將提取所有第三個字段為”INFO”的行。
💡 提示:在awk
中,默認的分隔符是空格。如果你的日誌文件使用不同的分隔符,你可以使用-F
選項來指定。例如,如果你的日誌文件使用冒號作為分隔符,你可以使用awk -F: '{ print $1 }' logfile.log
來提取第一個字段。
使用cut
剖析日誌文件
cut
命令是一個簡單而強大的命令,用於從輸入的每行文本中提取文本段。由於日誌文件是有結構的,每個字段都是由特定的字符,如空格、制表符或自訂分隔符分隔,cut
命令很好地提取這些特定的字段。
cut [options] [file]
cut命令的基本語法是:
- cut命令的一些常用選項:
-d
:指定用作字段分隔符的分隔符。-f
:選擇要顯示的字段。
-c
: 指定字元位置。
cut -d ' ' -f 1 logfile.log
例如,下面的命令會從每一行程式日誌中提取第一個欄位(以空格分隔):
使用cut
進行日誌解析的例子
2024-04-25 08:23:01 INFO 192.168.1.10 User logged in successfully.
2024-04-25 08:24:15 WARNING 192.168.1.10 Disk usage exceeds 90%.
2024-04-25 08:25:02 ERROR 10.0.0.5 Connection timed out.
...
假設您有一個結構如下的日誌檔,其中欄位以空格分隔:
cut
可以以下列方式使用:
cut -d ' ' -f 2 system.log
從每個日誌條目中提取時間:
08:23:01
08:24:15
08:25:02
...
# 輸出
- 這個命令使用空格作為分隔符,選擇第二個欄位,這是每個日誌條目的時間部分。
cut -d ' ' -f 4 system.log
從日誌中提取IP地址:
192.168.1.10
192.168.1.10
10.0.0.5
# 輸出
- 這個命令提取第四個欄位,這是每個日誌條目的IP地址。
cut -d ' ' -f 3 system.log
提取日誌級別(INFO, WARNING, ERROR):
INFO
WARNING
ERROR
# 輸出
- 這個命令提取含有日誌級別的第三個欄位。
結合cut
與其他命令:
grep "ERROR" system.log | cut -d ' ' -f 1,2
其他命令的輸出可以通過管道傳遞給 cut
命令。假設您想在切割之前過濾日誌,您可以使用 grep
提取包含 "ERROR" 的行,然後使用 cut
從這些行中獲取特定信息:
2024-04-25 08:25:02
# 輸出
- This command first filters lines that include “ERROR”, then extracts the date and time from these lines.
提取多個欄位:
cut -d ' ' -f 1,2,3 system.log`
可以一次提取多個欄位,方法是指定一個範圍或以逗號分隔的欄位清單:
2024-04-25 08:23:01 INFO
2024-04-25 08:24:15 WARNING
2024-04-25 08:25:02 ERROR
...
# 輸出
上述命令從每個日誌條目中提取前三個欄位,即日期、時間和日誌級別。
使用 sort
和 uniq
解析日誌文件
排序和刪除重複項是處理日誌文件時的常見操作。 sort
和 uniq
命令分別用於對輸入進行排序和刪除重複項。
sort的基本語法
sort [options] [file]
sort
命令按照字母或數字順序對文本行進行組織。
- sort命令的一些關鍵選項:
-n
:假設文件內容為數值進行排序。-r
:顛倒排序的順序。-k
:指定用於排序的鍵或列號。
-u
:排序並刪除重複行。
命令 uniq
用於過濾或計算並報告文件中的重複行。
uniq [options] [input_file] [output_file]
uniq
的語法為:
- 一些
uniq
命令的重要選項: -c
:在行前加上出現次數。-d
:只打印重複行。
-u
:只打印獨特行。
將 sort
與 uniq
結合使用進行日誌解析的例子
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-26 ERROR Connection timed out.
- 假設以下日誌條目作為這些演示的例子:
sort system.log
按日期排序日誌條目:
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
# 輸出
- 這會將日誌條目按字母順序排序,如果日期是第一個字段,這樣實際上也會按日期排序。
sort system.log | uniq
排序並刪除重複項:
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
# 輸出
- 這個命令會將日誌文件排序,並通過管道傳遞給
uniq
,刪除重複行。
sort system.log | uniq -c
計算每行的出現次數:
2 2024-04-25 INFO User logged in successfully.
1 2024-04-25 WARNING Disk usage exceeds 90%.
2 2024-04-26 ERROR Connection timed out.
1 2024-04-26 INFO Scheduled maintenance.
# 輸出
- 這會將日誌條目排序,然後計算每個獨特行的次數。根據輸出,行
'2024-04-25 INFO User logged in successfully.'
在文件中出現了2次。
sort system.log | uniq -u
辨識獨特性日記条目:
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 INFO Scheduled maintenance.
# 输出
- 此命令显示独一的日志条目。
sort -k2 system.log
根据日志级别排序:
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-25 WARNING Disk usage exceeds 90%.
# 输出
根据第二字段,即日志级别,对条目进行排序。
8.4. 通过命令行管理 Linux 进程
- 进程是程序的运行实例。一个进程包括:
- 分配内存的地址空间。
- 进程状态。
如所有权、安全属性、资源使用情况等属性。
- 进程还有一个环境,包括:
- 局部和全局变量。
- 当前调度上下文。
分配的系统资源,如网络端口或文件描述符。
当你运行 `ls -l` 命令时,操作系统创建一个新进程来执行该命令。该进程有一个 ID、一个状态,并在命令完成后运行。
了解进程创建和生命周期。
在 Ubuntu 中,所有进程都是由初始系統进程 systemd
發起的,這是核心区在啟動過程中首次執行的进程。
systemd
进程具有 process ID (PID) 作為 1
,負責初始化系統、啟動和管理其他进程以及處理系統服務。系統上的所有其他进程都是 systemd
的後裔。
父进程通過複製自己的地址空間(fork)來創建新的(子)进程結構。每個新进程都被分配一個唯一的 process ID (PID) 以便於追蹤和安全性 reasons. The PID and the parent’s process ID (PPID) are part of the new process environment. 任何进程都可以創建子进程。
通過fork例程,子进程繼承了安全身份、以前的和當前的文件描述符、端口和資源優先權、環境變量以及程序代碼。子进程然後可以執行自己的程序代碼。
通常,父进程在子进程運行時休眠,並設定一個請求(等待)以便在子进程完成時通知。
退出時,子进程已經關閉或丢弃了其資源和環境。唯一 remaining resource,稱為僵尸,是进程表中的條目。當子进程退出時,父进程被信號唤醒,清除了子进程的进程表条目,從而釋放子进程的最後一個資源。父进程然後繼續執行自己的程序代碼。
了解进程狀態
Linux下的进程在它們的生命週期裡會呈現不同的狀態。一個进程的狀態顯示了它目前正在進行什麼操作以及它是如何與系統進行互動的。进程根據其執行狀態和系統的排程算法在狀態之間進行遷移。
Linux系統中的进程可以处于以下之一的狀態: | 狀態 |
描述 | (新) |
通過fork系統調用創建的进程的初始狀態。 | 就緒(可執行) (R) |
进程己準備好運行,正在等待在CPU上排程。 | 運行(用戶) (R) |
进程正在用戶模式下執行,運行用戶應用程序。 | 運行(核心) (R) |
进程正在核心模式下執行,處理系統調用或硬件中斷。 | 休眠 (S) |
进程正在等待事件(例如,I/O操作)完成,並且可以容易被喚醒。 | 休眠(不可中斷) (D) |
进程处于不可中斷的休眠状态,等待一个特定条件(通常是I/O)完成,并且不能被信號中斷。 | 休眠(硬盤休眠) (K) |
进程正在等待硬盤I/O操作完成。 | 休眠(空闲) (I) |
进程处于空闲状态,没有进行任何工作,正在等待事件发生。 | 已中止 (T) |
行程執行已被中止,通常是由信號引起的,並且可以稍後繼續。 | 僵尸行程 (Z) |
行程已完成執行,但仍在行程表中有記錄,等待其父行程讀取其退出狀態。
這些狀態之間的變遷方式如下: | 變遷 |
說明 | 派生 |
從父行程創建新的行程,從 (新) 變為可執行 (就緒) (R)。 | 排程 |
排程器選擇一個可執行的行程,將它變為運行中 (用戶) 或運行中 (核心) 狀態。 | 運行 |
當行程被排程執行時,從可執行 (就緒) (R) 變為運行中 (核心) (R)。 | 抢占或重排程 |
行程可以被抢占或重排程,將它移回可執行 (就緒) (R) 狀態。 | 系統呼叫 |
行程進行系統呼叫,從運行中 (用戶) (R) 變為運行中 (核心) (R)。 | 返回 |
行程完成系統呼叫並返回至運行中 (用戶) (R)。 | 等待 |
行程等待事件,從運行中 (核心) (R) 變為其中之一的中斷 (S, D, K 或 I) 狀態。 | 事件或信號 |
processes被一個事件或信號喚醒,將其從休眠狀態恢復到可运行(準備中)(R)。 | 挂起 |
进程被挂起,從運行(内核)或可运行(準備中)變為停止(T)。 | 恢恢 |
进程被恢恢,從停止(T)恢復到可运行(準備中)(R)。 | 退出 |
进程終止,從運行(用戶)或運行(内核)變為僵尸进程(Z)。 | 回收 |
父进程读取僵尸进程的退出狀態,将其從进程表中移除。
如何查看进程
zaira@zaira:~$ ps aux
您可以使用ps
命令與一些選項的組合來在Linux系統上查看进程。ps
命令用於顯示活躍进程的信息。例如,ps aux
顯示系統上所有運行的进程。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 168140 11352 ? Ss May21 0:18 /sbin/init splash
root 2 0.0 0.0 0 0 ? S May21 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< May21 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< May21 0:00 [rcu_par_gp]
root 5 0.0 0.0 0 0 ? I< May21 0:00 [slub_flushwq]
root 6 0.0 0.0 0 0 ? I< May21 0:00 [netns]
root 11 0.0 0.0 0 0 ? I< May21 0:00 [mm_percpu_wq]
root 12 0.0 0.0 0 0 ? I May21 0:00 [rcu_tasks_kthread]
root 13 0.0 0.0 0 0 ? I May21 0:00 [rcu_tasks_rude_kthread]
*... output truncated ....*
# 输出台
- 上面输出的内容显示了系统当前运行的进程快照。每一行代表一个进程,包含以下列:
USER
: 进程的所有者。PID
: 进程ID。%CPU
: 进程的CPU使用率。%MEM
:進程的記憶體使用情況。VSZ
:進程的虛擬記憶體大小。RSS
:佔用的實際記憶體大小,即任務使用的非交換物理記憶體。TTY
:進程的控制終端。?
表示沒有控制終端。Ss
:會话 leaders. 這是開始一個會話的进程,它是多個进程的领导者並且可以控制終端信號。第一個S
指示休眠狀態,第二個s
指示它是會話领导者。START
:进程的開始時間或日期。TIME
:累計CPU時間。
命令
: 開始處理的命令。
背景和前台进程
在這一節,你將學習如何通過在背景或前台運行它們來控制作业。
作业是一個由外壳開始的进程。當你在外觀運行命令時,它被視為一個作业。一個作业可以在前台或背景運行。
- 為展示控制,你將首先創建3個进程,然後將它們在背景中運行。之後,你將列出行列,並將它們在前台和背景之間互換。你將看到如何將它們置於休眠或完全退出。
創建三個进程
打開一個終端並開始三個長時間運行的进程。使用sleep
命令,該命令使进程運行指定的秒數。
sleep 300 &
sleep 400 &
sleep 500 &
#為300、400和500秒運行sleep命令
- 每個命令末尾的
&
將进程移至背景。
顯示背景作业
jobs
使用jobs
命令來顯示背景作业的列表。
jobs
[1] Running sleep 300 &
[2]- Running sleep 400 &
[3]+ Running sleep 500 &
- 輸出應該像這樣:
將背景作业移至前台
fg %1
要把背景作业移至前台,使用fg
命令跟上作业號。例如,要把第一個作业(sleep 300
)移至前台:
- 這會將作业
1
移至前台。
將前台作业移回背景
在前台運行的作業,您可以按 Ctrl+Z
將其暫停,並將其移回背景運行。
zaira@zaira:~$ fg %1
sleep 300
^Z
[1]+ Stopped sleep 300
zaira@zaira:~$ jobs
暫停的作業會顯示如下:
[1]+ Stopped sleep 300
[2] Running sleep 400 &
[3]- Running sleep 500 &
# 暫停的作業
現在使用 bg
命令在背景中繼續運行ID為1的作業。
# 按下 Ctrl+Z 暫停前台作業
bg %1
- # 然後,在背景中繼續運行它
jobs
[1] Running sleep 300 &
[2]- Running sleep 400 &
[3]+ Running sleep 500 &
再次顯示作業列表
- 在這個練習中,您:
- 使用 sleep 命令啟動了三個背景进程。
- 使用 jobs 命令顯示background作业列表。
- 使用
fg %job_number
将作业移至前台。 - 使用
Ctrl+Z
暂停作业,并使用bg %job_number
将其移回后台。
再次使用 jobs 以确认 background 作业的状态。
現在您知道如何控制作業了。
結束进程
可以通過使用 `kill` 命令來終止無反應或不需要的进程。`kill` 命令會向进程 ID 傳送信號,要求其結束。
`kill` 命令有多種選項可供選擇。
kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24)
...terminated
# kill 命令的選項
- 以下是在 Linux 中使用 `kill` 命令的一些示例:
- 這個命令將默認的 `SIGTERM` 信號傳送到 PID 为 1234 的进程,要求其結束。
- 這個命令將默認的 `SIGTERM` 信號傳送到所有指定名的进程。
- 此命令向PID為1234的进程發送
SIGKILL
信號,強行终止它。 - 此命令向PID為1234的进程發送
SIGSTOP
信號,中止它。
此命令向指定用戶所拥有的所有进程發送默認的SIGTERM
信號。
這些示例展示了在 Linux 環境中使用 kill
命令管理进程的各種方式。
以下是 kill 命令選項和信號的相關資訊,以表格形式呈現:此表总结了在 Linux 中用於管理进程的 kill 命令最常見的選項和信號。 |
命令 / 選項 | 信號 |
描述 | kill |
SIGTERM |
請求进程 gracefully 終止 (默認信號)。 | kill -9 |
SIGKILL |
強制讓进程立即終止,不進行清理。 | kill -SIGKILL |
SIGKILL |
強制讓进程立即終止,不進行清理。 | kill -15 |
SIGTERM |
明確發送 SIGTERM 信號以請求 graceful 終止。 |
kill -SIGTERM |
SIGTERM |
明確發送 SIGTERM 信號以請求 graceful 終止。 |
kill -1 |
SIGHUP |
傳統上表示 “掛斷”; 可以用來重新加載配置文件。 | kill -SIGHUP |
SIGHUP |
traditional Chinese interpretation:
挂起; 可用于重新加载配置文件。 |
kill -2 |
SIGINT |
請求进程結束(與在終端按下Ctrl+C 相同)。 |
kill -SIGINT |
SIGINT |
請求进程結束(與在終端按下Ctrl+C 相同)。 |
kill -3 |
SIGQUIT |
導致进程結束並產生一個核心转储以進行除錯。 | kill -SIGQUIT |
SIGQUIT |
導致进程結束並產生一個核心转储以進行除錯。 | kill -19 |
SIGSTOP |
暫停进程。 | kill -SIGSTOP |
SIGSTOP |
暫停进程。 | kill -18 |
SIGCONT |
繼續一個已暫停的进程。 | kill -SIGCONT |
SIGCONT |
繼續一個已暫停的进程。 | killall |
變化 |
向給定名字的所有进程發送信號。 | killall -9 |
SIGKILL |
強制杀死所有命名匹配的进程。 | pkill |
因系统而异 |
根据模式匹配发送信号给进程。 | pkill -9 |
SIGKILL |
強制杀死所有匹配模式的进程。 | xkill |
SIGKILL |
允许点击窗口以杀死对应进程的图形实用程序。
8.5. Linux中的标准输入输出流
- 读取输入和写入输出是理解命令行和Shell脚本的关键部分。在Linux中,每个进程都有三个默认的流:
- 标准输入
stdin
的文件描述符是0
。 - 標準輸出(
stdout
):這是進程寫入其輸出的預設輸出流。預設情況下,標準輸出是終端機。輸出也可以重定向到文件或其他程序。stdout
的文件描述符是1
。
標準錯誤(stderr
):這是進程寫入其錯誤消息的預設錯誤流。預設情況下,標準錯誤是終端機,即使stdout
被重定向,也能看到錯誤消息。stderr
的文件描述符是2
。
重定向和管道
重定向:您可以將錯誤和輸出流重定向到文件或其他命令。例如:
ls > output.txt
# 將 stdout 重定向到文件
ls non_existent_directory 2> error.txt
# 將 stderr 重定向到文件
ls non_existent_directory > all_output.txt 2>&1
# 將 stdout 和 stderr 都重定向到文件
- 在最後一個命令中,
ls non_existent_directory
: 列出名稱為 non_existent_directory 的目錄內容。由於此目錄不存在,`ls` 將產生一個錯誤訊息。> all_output.txt
: 冒號運算符將 `ls` 命令的標準輸出 (`stdout`) 重定向到 `all_output.txt` 文件中。如果文件不存在,它将被創建。如果文件已存在,其內容將被覆蓋。
2>&1
: 在這裡,`2` 代表標準錯誤 (`stderr`) 的文件描述符。`&1` 代表標準輸出 (`stdout`) 的文件描述符。`&` 字符用於指明 `1` 不是文件名,而是文件描述符。
所以 `2>&1` 意味著「將標準錯誤 (2) 導向到當前標準輸出 (1) 所在的地方」,在這個情況下是文件 `all_output.txt`。因此,`ls` 的任何輸出(如果有的話)和錯誤信息都會被寫入 `all_output.txt`。
管线:
ls | grep image
您可以使用管道 (`|`) 將一個命令的輸出作為另一個命令的輸入:
image-10.png
image-11.png
image-12.png
image-13.png
... Output truncated ...
# 輸出
8.6 Linux 中的自動化 – 使用 Crontab 自動化任務
Cron 是一個在類 Unix 作業系統中可用的強大工具,用於排程工作计划。通過配置 cron,您可以設定自動化任務在每日、每周、每月或其他特定的時間基礎上運行。cron 提供的自動化功能對於 Linux 系統管理至关重要。
`crond` 服務員(一種在背景運行的電腦程序)使他能夠執行 cron 功能。cron 會讀取 crontab(cron 表)以運行预定义的脚本。
通過使用特定的語法,您可以配置 cron 工作任务来自動執行腳本或其他命令。
Linux 中的 cron 工作任务是什麼?
您通過 cron 排程的任何任務都稱為 cron 工作任务。
現在,讓我們看看 cron 工作任务是如何工作的。
如何控制對 cron 的访问
為了使用 cron 工作任务,管理員需要允許在 `/etc/cron.allow` 文件中為用戶添加 cron 工作任务。
如果您收到這樣的提示,表示您沒有使用 cron 的權限。
為了允許 John 使用 cron,請將他的名字加入 /etc/cron.allow
。如果文件不存在,請創建該文件。這將允許 John 創建和編輯 cron 工作任务。
用戶也可以通過在 /etc/cron.d/cron.deny
文件中輸入他們的用戶名來拒絕他们对 cron 作业的访问。
如何在 Linux 中添加 cron 工作任务
首先,要使用 cron 工作任务,您需要檢查 cron 服務的狀態。如果 cron 沒有安裝,您可以通过包管理器轻松地下载它。只需使用以下命令來檢查:
sudo systemctl status cron.service
# 在 Linux 系統上檢查 cron 服務
Cron 工作任务語法
- Crontabs 使用以下Flags來添加和列印 cron 工作任务:
crontab -e
: 使用以添加、刪除或編輯 cron 工作任务的 crontab 條目。crontab -l
: 列印出當前用戶的所有 cron 工作任务。crontab -u 用戶名 -l
: 列印出另一個用戶的 crons。
crontab -u 用戶名 -e
: 編輯另一個用戶的 crons。
當您列印出 crons 並且它們存在時,您將看到類似以下內容:
* * * * * sh /path/to/script.sh
# 定時任務示例
- 在上面的示例中,
* 分別代表分鐘、小時、日期、月份、星期幾。以下是這些值的詳細說明: |
值 | |
說明 | 分鐘 | 0-59 |
命令將在指定分鐘執行。 | 小時 | 0-23 |
命令將在指定小時執行。 | 日期 | 1-31 |
命令將在這些月份的日期執行。 | 月份 | 1-12 |
需要執行任務的月份。 | 星期幾 | 0-6 |
- 命令將在這些星期幾運行。這裡,0代表星期日。
sh
表示腳本為bash腳本,應從/bin/bash
運行。
/path/to/script.sh
指定腳本的路徑。
* * * * * sh /path/to/script/script.sh
| | | | | |
| | | | | Command or Script to Execute
| | | | |
| | | | |
| | | | |
| | | | Day of the Week(0-6)
| | | |
| | | Month of the Year(1-12)
| | |
| | Day of the Month(1-31)
| |
| Hour(0-23)
|
Min(0-59)
以下是定時任務語法的總結:
定時任務示例
以下是定時任務排程的一些示例。 | 排程 |
排定值 | 5 0 * 8 * |
八月五時五分。 | 5 4 * * 6 |
星期六零四時五分。 | 0 22 * * 1-5 |
每天從星期一日至星期五的晚上十點。
如果你一下子無法掌握這些內容,也没關係。你可以透過 crontab guru 網站來練習並產生 cron 排程。
如何設定 cron 工作
- 在這一節中,我們將查看一個示例,了解如何使用 cron 排程來設定一個簡單的腳本。
#!/bin/bash
echo `date` >> date-out.txt
建立一個稱為 date-script.sh
的腳本,該腳本會印出系統的日期和時間,並將其追加到一個文件中。以下是該腳本的內容:
chmod 775 date-script.sh
2. 通過授予執行權使腳本可執行。
3. 使用 crontab -e
在 crontab 中添加腳本。
*/1 * * * * /bin/sh /root/date-script.sh
在這裡,我們將其排程為每分鐘運行一次。
cat date-out.txt
4. 檢查文件 date-out.txt
的輸出。根據腳本,系統日期應該會每分鐘被印到此文件中。
Wed 26 Jun 16:59:33 PKT 2024
Wed 26 Jun 17:00:01 PKT 2024
Wed 26 Jun 17:01:01 PKT 2024
Wed 26 Jun 17:02:01 PKT 2024
Wed 26 Jun 17:03:01 PKT 2024
Wed 26 Jun 17:04:01 PKT 2024
Wed 26 Jun 17:05:01 PKT 2024
Wed 26 Jun 17:06:01 PKT 2024
Wed 26 Jun 17:07:01 PKT 2024
# 輸出
如何排解 cron 問題
雖然 cron 非常有益,但它們可能不會總是按照预期工作。幸運的是,有一些有效的方法可以用於排解它們的問題。
1. 檢查排程。
首先,您可以嘗試核驗為 cron 設定 hex 的排程。您可以使用我們在上面節段中看到的語法來進行。
2. 檢查 cron 記錄。
首先,你需要檢查 cron 是否在计划的時間運行。在 Ubuntu 中,你可以從位於 /var/log/syslog
的 cron 記錄中進行核實。
如果這些記錄在正確的時間有一條条目,那麼這意味著 cron 已按照你設置的計劃運行。
1 Jun 26 17:02:01 zaira-ThinkPad CRON[27834]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
2 Jun 26 17:02:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
3 Jun 26 17:03:01 zaira-ThinkPad CRON[28255]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
4 Jun 26 17:03:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
5 Jun 26 17:04:01 zaira-ThinkPad CRON[28538]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
以下是我們 cron 任務的記錄示例。注意第一列顯示的時間戳。腳本的路徑也在行的末尾提及。第 1、3 和 5 行顯示腳本按計劃運行。
3. 將 cron 輸出重定向到文件。
你可以將 cron 的輸出重定向到文件,並檢查文件中是否有任何可能的錯誤。
* * * * * sh /path/to/script.sh &> log_file.log
# 將 cron 輸出重定向到文件
8.7. Linux 網絡基礎
Linux 提供了許多命令來查看網絡相關的信息。在這一節中,我們將简要討論一些命令。
使用 ifconfig
查看網絡接口
ifconfig
ifconfig
命令提供了網絡接口的資訊。以下是一個示例輸出:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::a00:27ff:fe4e:66a1 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:4e:66:a1 txqueuelen 1000 (Ethernet)
RX packets 1024 bytes 654321 (654.3 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 512 bytes 123456 (123.4 KB)
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
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 256 bytes 20480 (20.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 256 bytes 20480 (20.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 輸出
ifconfig
命令的輸出顯示了系統上配置的網絡接口,以及如 IP 位址、MAC 位址、數據包統計等詳細信息。
這些接口可以是實體或虛擬設備。
要提取 IPv4 和 IPv6 位址,你可以分別使用 ip -4 addr
和 ip -6 addr
。
查看網路活動使用netstat
netstat
指令顯示網路活動和統計資料,提供以下資訊:
- 以下是在命令行中使用
netstat
指令的一些範例: - 顯示所有正在監聽和非監聽的套接字:
- 僅顯示正在監聽的端口:
- 顯示網路統計:
- 顯示路由表:
- 顯示TCP连线:
- 顯示UDP连线:
- 顯示網絡接口:
- 顯示连线 processes 的 PID 和程式名稱:
- 顯示特定協定(例如TCP)的統計資料:
顯示延伸資訊:
使用 ping
檢查兩台設備之間的網絡連通性
ping google.com
ping
用來測試兩台設備之間的網絡連通性。它會向目標設備發送 ICMP 封包並等待回應。
ping google.com
PING google.com (142.250.181.46) 56(84) bytes of data.
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=1 ttl=60 time=78.3 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=2 ttl=60 time=141 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=3 ttl=60 time=205 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=4 ttl=60 time=100 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 78.308/131.053/204.783/48.152 ms
ping
測試你是否能在超時之前收到回應。
— google.com ping 統計 —
你可以用 Ctrl + C
停止回應。
使用 curl
命令測試端點
curl
命令代表 “客戶端 URL”。用來在服務器之間傳輸數據。也可以用來測試 API 端點,幫助解決系統和應用錯誤。
curl http://www.official-joke-api.appspot.com/random_joke
{"type":"general",
"setup":"What did the fish say when it hit the wall?","punchline":"Dam.","id":1}
- 例如,你可以使用
http://www.official-joke-api.appspot.com/
來嘗試curl
命令。
curl -o random_joke.json http://www.official-joke-api.appspot.com/random_joke
curl
命令沒有任何選項時,默認使用 GET 方法。
curl -o
將輸出保存到指定文件。
curl -I http://www.official-joke-api.appspot.com/random_joke
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
X-Powered-By: Express
Access-Control-Allow-Origin: *
ETag: W/"71-NaOSpKuq8ChoxdHD24M0lrA+JXA"
X-Cloud-Trace-Context: 2653a86b36b8b131df37716f8b2dd44f
Content-Length: 113
Date: Thu, 06 Jun 2024 10:11:50 GMT
Server: Google Frontend
#將輸出保存到 random_joke.json
curl -I
只索取頭部信息。
8.8. Linux 故障排除:工具與技術
使用 sar
進行系統活動報告
Linux 中的 sar
命令是一個強大的工具,用於收集、報告和保存系統活動信息。它是 sysstat
套件的一部分,廣泛用於監控系統性能隨著時間的變化。
要使用 sar
,您首先需要使用 `sudo apt install sysstat` 安裝 sysstat
。
安装後,使用 `sudo systemctl start sysstat` 启动服務。
使用 `sudo systemctl status sysstat` 核驗狀態。
sar [options] [interval] [count]
一旦狀態為活躍,系統將開始收集各種統計數據,您可以使用這些數據來存取和分析歷史數據。我們很快就詳細看到那部分。
sar -u 1 3
sar
命令的語法如下:
Linux 6.5.0-28-generic (zaira-ThinkPad) 04/06/24 _x86_64_ (12 CPU)
19:09:26 CPU %user %nice %system %iowait %steal %idle
19:09:27 all 3.78 0.00 2.18 0.08 0.00 93.96
19:09:28 all 4.02 0.00 2.01 0.08 0.00 93.89
19:09:29 all 6.89 0.00 2.10 0.00 0.00 91.01
Average: all 4.89 0.00 2.10 0.06 0.00 92.95
例如,sar -u 1 3
將每秒顯示 CPU 利用率統計三次。
# 輸出
以下是一些常見用途和使用 sar
命令的示例。
sar
可用於各種用途:
sar -r 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad) 04/06/24 _x86_64_ (12 CPU)
19:10:46 kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
19:10:47 4600104 8934352 5502124 36.32 375844 4158352 15532012 65.99 6830564 2481260 264
19:10:48 4644668 8978940 5450252 35.98 375852 4165648 15549184 66.06 6776388 2481284 36
19:10:49 4646548 8980860 5448328 35.97 375860 4165648 15549224 66.06 6774368 2481292 116
Average: 4630440 8964717 5466901 36.09 375852 4163216 15543473 66.04 6793773 2481279 139
1. 記憶體使用
要檢查記憶體使用(免费和已使用),使用:
此命令每秒顯示記憶體統計三次。
sar -S 1 3
sar -S 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad) 04/06/24 _x86_64_ (12 CPU)
19:11:20 kbswpfree kbswpused %swpused kbswpcad %swpcad
19:11:21 8388604 0 0.00 0 0.00
19:11:22 8388604 0 0.00 0 0.00
19:11:23 8388604 0 0.00 0 0.00
Average: 8388604 0 0.00 0 0.00
2. 交換區利用率
要查看交換區利用率統計,使用:
此命令有助監控記憶體用量,對於那些物理記憶體不足的系統來說非常關鍵。
sar -d 1 3
3. I/O 設備負載
要報告區塊設備及區塊設備分割的活動:
此命令提供有關區塊設備之間的數據傳輸詳細統計數據,對於診斷 I/O 瓶頸很有幫助。
sar -n DEV 1 3
5. 網絡統計
sar -n DEV 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad) 04/06/24 _x86_64_ (12 CPU)
19:12:47 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
19:12:48 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
19:12:48 enp2s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
19:12:48 wlp3s0 10.00 3.00 1.83 0.37 0.00 0.00 0.00 0.00
19:12:48 br-5129d04f972f 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
.
.
.
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: enp2s0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
...output truncated...
查看網絡統計,如網絡接口收到的(傳送的)數據包數量:
# -n DEV 告訴 sar 報告網絡設備接口
這會每秒顯示網絡統計三次,幫助監控網絡流量。
- 6. 歷史數據
- # 只能是 “true” 或 “false”。请不要输入其他值,它们
- 設定數據收集間隔: 編輯 cron 工作任务配置以設定數據收集間隔。
sar -u -f /var/log/sysstat/sa04
Linux 6.5.0-28-generic (zaira-ThinkPad) 04/06/24 _x86_64_ (12 CPU)
15:20:49 LINUX RESTART (12 CPU)
16:13:30 LINUX RESTART (12 CPU)
18:16:00 CPU %user %nice %system %iowait %steal %idle
18:16:01 all 0.25 0.00 0.67 0.08 0.00 99.00
Average: all 0.25 0.00 0.67 0.08 0.00 99.00
用 <DD>
替換為您想要查看數據的月份日期。
在以下命令中,/var/log/sysstat/sa04
提供了當月第 4 天的統計數據。
sar -I SUM 1 3
7. 實時 CPU 中斷
Linux 6.5.0-28-generic (zaira-ThinkPad) 04/06/24 _x86_64_ (12 CPU)
19:14:22 INTR intr/s
19:14:23 sum 5784.00
19:14:24 sum 5694.00
19:14:25 sum 5795.00
Average: sum 5757.67
要用來觀察每秒由 CPU 服務的中斷次數,使用這個命令:
# 輸出
這個命令有助於監控 CPU 處理中斷的頻率,這對於實時性能調節非常關鍵。
這些例子展示了如何使用 `sar` 來監控系統性能的各个方面。定期的使用 `sar` 有助于識別系統的瓶頸並確保應用程序能夠有效地運行。
8.9. 服務器的一般性问题解決策略
為什麼我們需要了解監控?
系統監控是系統管理的重要方面。关键應用需要高度的積極性來防止故障並減少停機的影響。
Linux 提供了非常強大的工具來衡量系統健康。在這一節中,您將學習到各種可用的方法來檢查您的系統健康並識別瓶頸。
[user@host ~]$ uptime 19:15:00 up 1:04, 0 users, load average: 2.92, 4.48, 5.20
查找负载平均值和系統上線時間
系統重啟可能會發生,有時候會弄亂一些配置。要檢查 machine 已經運行了多長時間,使用命令:`uptime`。除了上線時間外,該命令還顯示平均负载。
平均负载是過去 1、5 和 15 分鐘內系統的负载。一眼就能看出系統负载是否隨著時間的推移而增加或減少。
注意:理想的 CPU 隊列是 `0`。這只可能在沒有 CPU 等待隊列的情況下發生。
lscpu
通過將平均负载除以可用的 CPU 總數,可以計算每個 CPU 的负载。
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Address sizes: 48 bits physical, 48 bits virtual
Byte Order: Little Endian
CPU(s): 12
On-line CPU(s) list: 0-11
.
.
.
output omitted
要查找 CPU 數量,使用命令 `lscpu`。
# 输出行
如果負載平均值似乎增加且不退還,CPU 已過載。有一些进程卡住或者有記憶體洩漏。
free -mh
計算可用記憶體
total used free shared buff/cache available
Mem: 14Gi 3.5Gi 7.7Gi 109Mi 3.2Gi 10Gi
Swap: 8.0Gi 0B 8.0Gi
Sometimes, high memory utilization might be causing problems. To check the available memory and the memory in use, use the free
command.
# 输出版本
計算磁碟空間
df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.5G 2.4M 1.5G 1% /run
/dev/nvme0n1p2 103G 34G 65G 35% /
tmpfs 7.3G 42M 7.2G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
efivarfs 246K 93K 149K 39% /sys/firmware/efi/efivars
/dev/nvme0n1p3 130G 47G 77G 39% /home
/dev/nvme0n1p1 511M 6.1M 505M 2% /boot/efi
tmpfs 1.5G 140K 1.5G 1% /run/user/1000
为确保系统健康,不要忘记磁碟空间。使用以下命令列出所有可用挂载点和它们各自的使用百分比。理想情况下,使用的磁碟空间不应超过80%。
df
命令提供详细的磁碟空间信息。
確定进程狀態
[user@host ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
runner 1 0.1 0.0 1535464 15576 ? S 19:18 0:00 /inject/init
runner 14 0.0 0.0 21484 3836 pts/0 S 19:21 0:00 bash --norc
runner 22 0.0 0.0 37380 3176 pts/0 R+ 19:23 0:00 ps aux
可以通过监控进程状态来查看任何卡住的进程或高内存或CPU使用情况。
我们之前看到,ps
命令提供了有关进程的有用信息。请查看CPU
和MEM
列。
实时系统监控
实时监控为您提供了系统的实时状态窗口。
您可以使用的一个工具是top
命令。
top命令显示系统的进程的动态视图,首先显示摘要头,然后是进程或线程列表。与静态的ps
命令不同,top
会持续刷新系统统计数据。
使用 `top` 指令,您可以在一個 compact window 內看到井然有序的詳細信息。 `top` 指令附帶許多旗標、快捷鍵和強調方法。
您也可以使用 `top` 指令來結束 processes。要做到這點,請按 `k` 然後輸入 process id。
解读 logs
系統和應用程序的 logs 包含了關於系統目前狀況的大量信息。它們包含了有用的信息以及指向錯誤的錯誤代碼。如果您在 logs 中搜索錯誤代碼,可以大幅缩短問題Identification和修復時間。
網絡端口分析
network 方面不應該被忽視,因為網絡問題很常見,可能會影響系統和交通流。常見的網絡問題包括端口耗盡、端口阻塞、未釋放資源等。
要識別這些問題,我們需要了解端口狀態。 | 以下是一些端口狀態的简要說明: |
端口狀態 | 說明 |
LISTEN | 代表等待任何遠端TCP和端口的連接請求的端口。 |
ESTABLISHED | 代表开放的連接,已經收到可以傳送到目的地 Data。 |
TIME WAIT | 代表等待時間以确保它的連接結束請求得到確認。 |
FIN WAIT2
代表等待遠端TCP的連接結束請求。
[user@host ~]$ /sbin/sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 15000 65000
讓我們探險如何在 Linux 分析與埠(port)相關的信息。
埠範圍: 系統中定義了埠範圍,這個範圍可以根據需求進行增加或減少。在下面的片段中,範圍從 15000
到 65000
,總共 50000
(65000 – 15000) 可用的埠。如果已使用的埠達到或超過此限制,那麼就有問題了。
在這種情況下日志中報告的錯誤可能是 Failed to bind to port
或 Too many connections
。
辨識封包失落
在系統監控中,我們需要確保出入通信是完好的。
[user@host ~]$ ping 10.13.6.113
PING 10.13.6.141 (10.13.6.141) 56(84) bytes of data.
64 bytes from 10.13.6.113: icmp_seq=1 ttl=128 time=0.652 ms
64 bytes from 10.13.6.113: icmp_seq=2 ttl=128 time=0.593 ms
64 bytes from 10.13.6.113: icmp_seq=3 ttl=128 time=0.478 ms
64 bytes from 10.13.6.113: icmp_seq=4 ttl=128 time=0.384 ms
64 bytes from 10.13.6.113: icmp_seq=5 ttl=128 time=0.432 ms
64 bytes from 10.13.6.113: icmp_seq=6 ttl=128 time=0.747 ms
64 bytes from 10.13.6.113: icmp_seq=7 ttl=128 time=0.379 ms
^C
--- 10.13.6.113 ping statistics ---
7 packets transmitted, 7 received,0% packet loss, time 6001ms
rtt min/avg/max/mdev = 0.379/0.523/0.747/0.134 ms
一個有幫助的命令是 ping
。ping
命中目標系統並將回應帶回。注意統計信息的最後几行,這些顯示了封包失落百分比和時間。
# ping 目標 IP
封包也可以使用 tcpdump
在 runtime 捕捉。我們稍後再看。
集結問題死后(post mortem)的統計數據
- 總是 Collect certain stats that would be useful for identifying the root cause later 是一個好習慣。通常,在系統重開或服務重新啟動後,我們會失去早先的系統快照和日誌。
以下是一些捕捉系統快照的方法。
- 日誌備份
在進行任何更改之前,將日志文件複製到其他位置。這對於了解系統在問題發生時的狀態至关重要。有時候,日誌文件是查看過去系統狀態的唯一窗口,因為其他運行時統計信息會丢失。
sudo tcpdump -i any -w
TCP截取
Tcpdump 是一個命令行工具,允許您捕捉和分析進程和 outgoing 網絡流量。它主要用于幫助解決網絡問題。如果您認為系統流量受到影響,按以下方式進行tcpdump
截取:
# 其中,
# -i any 捕捉所有介面上的流量
# -w 指定输出文件名
# 在几分钟後停止命令,因為文件大小可能會增加
# 使用文件擴展名 .pcap
截取tcpdump
後,您可以使用如 Wireshark 等的工具來視覺化分析流量。
結論
感謝您讀到這本书的結尾。如果您認為它有幫助,考慮與他人分享。
這本書雖然到此結束,但還没結束。我會繼續改善它,並在未來添加新材料。如果您發現任何問題,或者您想建議任何改善,請自由地打開一個 PR/ Issue。
- 保持聯繫並繼續您的學習旅程!
-
LinkedIn:我在那裡分享關於技術的文章和帖子。在LinkedIn上給我留下一份推薦並 endorse 我相關技能。
取得獨家內容的訪問:要取得一对一的幫助和獨家內容,請點此處。
取得獨家內容的訪問:要取得一对一的幫助和獨家內容,請點此處。
Source:
https://www.freecodecamp.org/news/learn-linux-for-beginners-book-basic-to-advanced/