# 基礎 Shell 指令
[TOC]
## Linux 常用指令概覽
Linux 系統提供了豐富的指令集,用於檔案管理、系統監控、網路操作及使用者權限控制等。以下將這些指令依功能分類整理,並附上詳細說明與範例,以提升您對這些指令的理解與運用。
### 系統資訊與監控
這些指令用於查詢和監控系統的狀態、硬體資訊、開機訊息以及正在執行的程序。
#### `uname` - 顯示 Linux 系統基本資訊
* **簡介**:顯示有關 Linux 系統基本資訊。
* **用法**:
* `uname`:顯示核心名稱。
* `uname -a`:顯示詳細系統資訊,包括核心版本、主機名稱、處理器架構等。
```bash
uname # Linux
uname -a # Linux leafish 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
```
#### `dmesg` - 顯示 Linux 開機資訊
* **簡介**:顯示 Linux 開機資訊指令,也可用於顯示硬體狀態資訊。
* **用法**:
* `$dmesg`
* `dmesg | grep sda`:顯示硬碟狀態資訊。
#### `top` - 動態觀察程序
* **簡介**:動態觀察系統當前狀態,包括 CPU 使用率、RAM 使用情況、正在運行的程序數量等。預設每 3 秒自動更新。
* **用法**:
* `$top`
* `$top + <1>`:查看多顆 CPU 的使用情況。
* `$top + <shift+m>`:依記憶體用量排序程序。
* **顯示欄位與意義**:
* `up`: uptime,從開機到現在經過多少時間。
* `user`: 目前線上同時有幾個使用者在使用。
* `load average`: 參考值,數字代表有多少個程序在等待 CPU 及 Disk I/O 等資源運算,三個數字分別代表 1, 5, 15 分鐘累積的負載情況。
* `Tasks`: 有多少個背景程序正在執行,包括 `running`、`sleeping`、`zombie`。
* `us`: user space 佔用 CPU 的百分比。健康的系統通常 `us` 較高。
* `sy`: kernel 執行的程序,內核空間佔用 CPU 的百分比。健康的系統通常 `sy` 較低。
* `ni`: nice 值,數字越少,優先權越高,範圍為 -20 到 +19。
* `id`: idle (閒置) 的 CPU 百分比,數字越高越好。
* `wa`: 硬碟讀寫,表示花費在等待 I/O 的時間成本,數值高代表 I/O 繁忙。
* `hi`: hardware interrupts (硬體中斷),`si`: software interrupts (軟體中斷)。通常都很低。
* `MiB Mem`: 物理記憶體總量 (`total`)、剩餘 (`free`)、已使用 (`used`)、暫存 (`buff/cache`)。
* `MiB Swap`: 置換空間,當記憶體不足時用作延伸記憶體,但速度較慢。建議設定為實體記憶體的 1-2 倍大小,可避免記憶體溢位 (OOM) 導致當機。
* `PID`: 程序 ID。
* `USER`: 程序擁有者。
* `PR`: Priority (優先度),由核心決定,數字越小優先權越高。
* `VIRT`: 虛擬記憶體總量。
* `RES`: 實體記憶體使用量。
* `SHR`: 共用記憶體大小。
* `S`: 程序狀態,包括 `D`(不可中斷睡眠), `R`(運行), `S`(睡眠), `T`(跟蹤/停止), `Z`(僵屍)。
* `%CPU`: CPU 的使用率,多核心系統可能超過 100%。
* `%MEM`: 記憶體的使用率。
* `TIME+`: CPU 使用時間累加。
* `COMMAND`: 執行指令。
#### `free` - 觀察記憶體與 Swap 使用情況
* **簡介**:顯示目前記憶體使用情況,預設以 KB 顯示。
* **用法**:
* `$free -m`:以 MB 為單位顯示。
* `free -b`:以 bytes 顯示。
* `free -g`:以 GB 顯示。
* **顯示欄位**:`total` (總量), `used` (已使用量), `free` (剩餘可用)。
#### `ps` - 列出程序資訊
* **簡介**:顯示命令執行時的系統狀態(靜態),不會持續更新。
* **用法**:
* `ps aux`:列出所有程序的詳細資訊。
* `ps -ef`:顯示程序的完整格式。
* `ps -u username`:列出特定使用者的程序。
* `ps -p PID`:顯示特定程序的詳細資訊。
* `ps aux | grep {yourname} | wc`:查詢特定使用者的程序數量並計算行數。
* **常用參數**:
* `-A`:列出所有程序,與 `-e` 效用相同。
* `-a`:不與 terminal 有關的所有程序。
* `-u`:有效使用者 (effective user) 相關的程序。
* `-x`:通常與 `-a` 一起使用,可列出比較完整的資訊。
#### `pstree` - 用樹狀圖方式列出程序關係
* **簡介**:以樹狀圖的方式顯示系統中正在執行的程序及其父子關係。
* **用法**:
* `pstree -p | less`:以樹狀圖列出程序關係並顯示 PID,透過 `less` 分頁顯示。
* **常用參數**:
* `-a`:顯示全部程序。
* `-p`:顯示 PID。
* `-np`:用 PID 順序排序列出。
#### `whoami` - 現在是哪個使用者
* **簡介**:顯示目前登入的使用者名稱。
* **用法**:
* `whoami`
* `sudo whoami`:會顯示 `root`。
#### `id` - 查看自己的 UID, GID
* **簡介**:查看目前使用者的 UID (User Identifier) 和所屬群組的 GID (Group Identifier)。
* **用法**:
* `id`。
* `id -u username`:查看特定使用者的 UID。
* `id -g username`:查看特定使用者的 GID。
* `sudo id <others_username>`:以 root 權限查詢其他使用者的 UID、GID。
* **核心概念**:系統是透過 UID 辨識使用者,UID 0 通常是 root。
#### `groups` - 顯示所屬群組
* **簡介**:顯示目前使用者的所屬群組。第一個群組為有效群組,新增檔案的擁有者為有效群組。
* **用法**:
* `groups`。
#### `history` - 顯示用戶執行過的命令歷史
* **簡介**:顯示之前在 Bash 中輸入的命令歷史。
* **用法**:
* `history`。
* **進階用法**:
* `!n`:引用命令歷史中的第 `n` 行。
* `!-n`:引用命令歷史中的倒數第 `n` 行。
* `!!`:引用上一行指令,等同於 `!-1`。
* `!string`:引用最近的以 `string` 開頭的命令。
#### `uptime` - 開機時間
* **簡介**:顯示系統從開機到現在所經過的時間。如果時間很短,可能表示系統有問題導致重開機。
* **用法**:`uptime`。
#### `iotop` - 監控主機 I/O 使用狀態
* **簡介**:監控主機的磁碟 I/O 讀寫狀態,查看哪個程序在大量使用 I/O 資源,以及是否發生 `swap in`/`swap out`。
* **安裝**:`sudo apt install iotop`。
* **用法**:
* `sudo iotop`。
* `sudo iotop -o`:只顯示正在讀寫的程序。
* `sudo iotop -a`:顯示累積的讀寫資料量。
#### `stat` - 顯示檔案的詳細時間戳記與資訊
* **簡介**:顯示檔案的詳細資料,包括檔案大小、區塊、連結數、擁有者、群組,以及三種時間戳記。
* **用法**:`stat <檔名>`。
* **時間參數**:
* `Access` (atime):檔案被讀取的最後時間。
* `Modify` (mtime):檔案內容最後的變更時間。
* `Change` (ctime):檔案狀態 (如權限、屬性) 最後的變更時間。
### 檔案與目錄管理
這些指令用於瀏覽、創建、修改、複製、移動和刪除檔案與目錄。
#### `pwd` - 顯示當前目錄位置
* **簡介**:Print Working Directory,顯示當前工作目錄的完整路徑。
* **用法**:
* `pwd`。
* `pwd -p`:印出此目錄所連結的實體目錄位置。
#### `ls` - 列出目錄內容
* **簡介**:list,列出指定目錄下的檔案和子目錄。
* **用法**:
* `ls`:列出當前目錄下的非隱藏檔案。
* `ls [path]`。
* **常用參數**:
* `-a`:顯示所有檔案,包含開頭為 `.` 的隱藏檔案。
* `-A`:包含隱藏的全部檔案,但不包含 `.` (當前目錄) 和 `..` (上一層目錄)。
* `-l`:顯示詳細資訊,如檔案類型、權限、連結數、擁有者、群組、大小、最後修改時間等。
* `-S`:依照檔案大小排序 (預設降冪)。
* `-r`:以反向排序列出檔案。
* `-R`:遞迴列出目錄下所有檔案,包含子資料夾內的所有檔案。
* `-t`:依照檔案建立時間 (修改時間) 列出。
* `-c`:依照檔案狀態最後變更時間 (ctime) 列出。
* `-u`:依照檔案被讀取的最後時間 (atime) 列出。
1. 檔案類型與權限 (Mode):第一個字元表示檔案類型 (`-` 一般檔案, `d` 目錄, `l` 符號連結, `b` 區塊設備, `c` 字元設備)。隨後 9 個字元分為 3 組,分別表示檔案擁有者、群組、其他使用者的讀取 (`r`)、寫入 (`w`)、執行 (`x`) 權限。
2. 連結數量 (Links):顯示這個檔案或目錄的連結數量。
3. 擁有者 (Owner):檔案的擁有者名稱。
4. 群組 (Group):檔案所屬的群組名稱。
5. 檔案大小 (Size):檔案的大小,以位元組 (bytes) 為單位。
6. 最後修改時間 (Timestamp):檔案最後修改的日期和時間。
7. 檔案名稱 (Name):檔案或目錄的名稱。
* **相關圖片**:

圖:`ls` 指令範例。

圖:`ls -a` 顯示隱藏檔案的範例。

圖:`ls -l` 顯示詳細資訊的範例。

圖:`ls -la` 顯示詳細資訊和隱藏檔案的範例.
#### `cd` - 切換路徑 (Change Directory)
* **簡介**:Change Directory,用於切換當前工作目錄。
* **用法**:
* `cd [相對路徑]` 或 `cd [絕對路徑]`。
* `cd /`:移至根目錄。
* `cd ~` 或 `cd`:移至當前使用者的家目錄。
* `cd ..`:回到上一層目錄。
* `cd .`:當前目錄。
* `cd -`:回到前一個工作目錄。
* `cd ~ <username>`:指定使用者的家目錄。
* **相關圖片**:

圖:`cd` 指令範例。
#### `mkdir` - 建立資料夾 (Make Directory)
* **簡介**:建立新的目錄 (資料夾)。
* **用法**:
* `mkdir <DIR_name>`。
* `mkdir -p <DIRpath/DIR_name>`:如果後面的路徑不存在,會自動建立所需的路徑。
* **相關圖片**:

圖:`mkdir` 指令範例。
#### `touch` - 新增檔案 / 更新檔案時間
* **簡介**:用於建立一個新的空白檔案。如果檔案已存在,則會更新檔案的修改時間 (mtime)、狀態時間 (ctime) 和讀取時間 (atime)。
* **用法**:
* `touch <檔名>`。
* `touch -a <檔名>`:只更改檔案的 atime。
* **相關圖片**:

圖:`touch` 指令範例。

圖:使用 `nano` 編輯器創建並保存檔案的範例。
#### `cat` - 檢視檔案內容
* **簡介**:concatenate,用於連接檔案內容並印出到標準輸出,常用於檢視檔案內容。
* **用法**:
* `cat <filename>`。
* `cat -b`:印出行號,空白行不標記。
* `cat -n`:印出行號,空白行也標記。
* `cat -T`:會把 TAB 按鍵用 `^I` 顯示出來。
* **相關圖片**:

圖:`cat` 指令顯示檔案內容的範例。
#### `head` - 擷取檔案前幾行
* **簡介**:用於顯示檔案的前面幾行,預設顯示 10 行。
* **用法**:
* `head filename.txt`:顯示前 10 行。
* `head -n 5 filename.txt`:顯示前 5 行。
#### `tail` - 擷取檔案後幾行
* **簡介**:用於顯示檔案的最後幾行,預設顯示 10 行。常用於日誌檔案的即時監控。
* **用法**:
* `tail filename.txt`:顯示最後 10 行。
* `tail -n 20 filename.txt`:顯示最後 20 行。
* `tail -f logfile.log`:實時監控檔案末尾的變動。
* `tail -f /var/log/auth.log | grep "sudo"`:即時更新 `auth.log` 中包含 "sudo" 的行。
#### `more` - 分頁顯示檔案內容
* **簡介**:用於分頁顯示檔案內容,適用於顯示較大的檔案。它會一次顯示一頁的內容,按空格鍵可以繼續往下看,但**不能返回**上一頁。
* **用法**:`more filename.txt`。
* **操作**:按下 `空格鍵` 向下翻一頁;按下 `Enter` 向下翻一行;按下 `q` 退出.
#### `less` - 上下滾動查看檔案內容
* **簡介**:功能與 `more` 相似,但更靈活,可以上下滾動查看檔案內容,並支援搜索功能。它不需要一次將整個檔案加載到記憶體中,因此在查看大檔案時非常有效率。
* **用法**:`less filename.txt`。
* **操作**:使用 `Page Up` 和 `Page Down` 進行翻頁;使用 `q` 退出;按下 `/` 鍵後輸入搜尋字串,並按 `n` 查找下一個.
#### `tac` - 反向印出檔案內容
* **簡介**:與 `cat` 相反,從檔案的最後一行開始反向印出內容。
* **用法**:`tac <檔名>`.
#### `cp` - 複製檔案或目錄
* **簡介**:copy,用於複製檔案或目錄。
* **用法**:
* `cp <source> <destination>`。
* `cp -r <source> <destination>`:遞迴複製整個目錄。
* `cp -p <source> <destination>`:連同檔案的權限、擁有者、時間一起複製,常用於備份。
* `cp -a`:複製檔案的全部特性 (包括權限等)。
* **相關圖片**:

圖:`cp` 指令複製檔案的範例。
#### `mv` - 移動或更名檔案/目錄
* **簡介**:move,用於移動檔案或目錄,也可用於更名。
* **用法**:
* `mv <source> <destination>`:移動檔案或目錄到新的位置。
* `mv <file_or_DIR> <new_name>`:更名檔案或目錄。
* **相關圖片**:

圖:`mv` 指令移動檔案或更名的範例。
#### `rm` - 刪除檔案或目錄
* **簡介**:remove,用於刪除檔案或目錄。
* **用法**:
* `rm <filename_or_DIR>`。
* `rm -r`:遞迴刪除目錄及其內容。
* `rm -f`:強制刪除,不提示確認。
* `rm -rf`:強制遞迴刪除檔案或目錄,**請小心使用**。
* `sudo rm -rf --no-preserve-root /`:**摧毀系統的危險指令,後果自負**。
* **`rmdir` 與 `rm -r` 差異**:
* `rmdir` 只能刪除空目錄。
* `rm -r` 可以刪除包含內容的目錄。
* **相關圖片**:

圖:`rm` 指令刪除檔案的範例。
#### `echo` - 印出字串或變數
* **簡介**:在 terminal 上印出字串或變數的內容。
* **用法**:
* `echo "hello world"`。
* `echo -n "Hello"`:不換行。
* `echo *.副檔名`:印出所有指定副檔名的檔案名稱。
* `echo $PATH`:印出 `PATH` 環境變數的內容。
* `echo $$`:印出當前 shell 的 PID。
* `echo <文字> > <檔名>`:將 `echo` 顯示的內容**覆蓋**寫進另一個檔案內。
* `echo <文字> >> <檔名>`:將 `echo` 顯示的內容**新增**到原有內容後。
* **相關圖片**:

圖:`echo` 指令的基本範例。

圖:`echo $PATH` 指令範例。

圖:`echo $$` 指令範例。
#### `mktemp` - 自動建立暫存檔案/目錄
* **簡介**:自動建立檔名不重複的暫存檔案或目錄,方便程式或指令存放資料。
* **用法**:
* `mktemp`:建立暫存檔案。
* `mktemp -d`:建立暫存目錄。
* **相關圖片**:

圖:`mktemp` 指令範例。
#### `ln` - 建立連結 (Link)
* **簡介**:用於建立檔案之間的連結,分為硬連結 (hardlink) 和符號連結 (symbolic link / softlink)。
* **硬連結 (Hardlink)**:
* 兩個檔案都指向同一個底層資料 (inode),像是多個入口通往同一個儲存區。
* 無法跨檔案系統。
* 刪除其中一個連結不會影響另一個,除非所有連結都被刪除,資料才會被釋放。
* **建立**:`ln <filepath> <linkname>`。
* **特性**:
* 看起來和一般的檔案一樣。
* 寫入內容到連結,原始檔案和連結的內容會是一樣的。
* inode 編號會一樣 (`ls -i` 可看到)。
* **符號連結 / 軟連結 (Symbolic Link / Softlink)**:
* 一個檔案指向另一個檔案的路徑,類似 Windows 的捷徑。
* 可以跨檔案系統。
* 如果原始檔案被刪除,軟連結就會失效 (因為它指向的路徑已經不存在)。
* **建立**:`ln -s filepath linkname`。
* **特性**:
* 儲存的是一個字串 (原始檔案的路徑),所以其大小就是路徑字串的大小。
* 建立時即使原始路徑不存在也不會出錯。
* 對軟連結進行的任何操作都會影響到其指向的原始檔案,但不會改變連結本身。
* **inode 概念**:
* 如果兩個檔案的 `inode` 編號相同,它們就是同一個檔案 (指硬連結)。
* **相關圖片**:

圖:`ls -i` 顯示 inode 編號,可見硬連結 (hardlink, linktest) 具有相同的 inode。

圖:`ln -s` 建立軟連結的範例,顯示軟連結指向原始檔案。
### 使用者與群組管理
這些指令用於管理系統上的使用者帳戶、群組,以及切換使用者身份。
#### `sudo` - 以超級使用者權限執行指令
* **簡介**:super user do,允許被授權的使用者以 root (或其他使用者) 的身份執行指令,而不需要知道 root 的密碼。
* **優點**:
* 無需洩漏 root 密碼,使用者只需自己的密碼。
* 可追蹤行為,`sudo` 日誌會記錄每個使用者執行的每條命令。
* 權限控制,透過 `/etc/sudoers` 設定檔,管理員可以為不同使用者設置特定的權限,限制他們只能執行某些命令。
* **用法**:`sudo <command>`。
* **設定**:
* `visudo`:用於編輯 `/etc/sudoers` 檔案的安全編輯器,會先暫存變更並檢查語法錯誤。
#### `su` - 切換使用者
* **簡介**:用於切換使用者身份。
* **用法**:
* `su username`:僅僅是切換使用者身份,保持當前的 shell 和環境變數。如果在普通使用者的目錄中使用 `su`,切換到 root 後,你仍然會停留在普通使用者的目錄,並保持原有的 `PATH`。需要輸入目標使用者的密碼。
* `su -`:不僅切換身份,還會初始化目標使用者的登入環境,進入該使用者的 home 目錄,並使用該使用者的環境變數。
* `sudo su <username>`:以 sudo 權限切換到其他使用者,但環境變數仍維持上一個使用者。
* `sudo su - <username>`:以 sudo 權限切換到其他使用者,並重置環境變數為目標使用者。此時需輸入執行 `sudo` 指令的使用者自己的密碼。
* **注意事項**:
* **不建議直接使用 `su` 切換成 `root` 進行主機管理**:這會增加 root 密碼外洩風險,且無法辨識原始使用者和追蹤行為。
* 切換使用者後,可用 `exit` 指令來退出。
#### `adduser` vs `useradd` - 新增使用者
* **簡介**:兩者都用於新增使用者,但功能有所不同。
* **`adduser`**:
* 功能較多,會自動建立家目錄、設定密碼等,是較推薦的創建使用者方式。
* **用法**:`sudo adduser newuser`。
* **`useradd`**:
* 需要手動設定選項,它不會自動建立家目錄或設定密碼。
* **用法**:`sudo useradd -m newuser` (創建新使用者並自動創建家目錄),通常會搭配 `passwd` 命令來設定新使用者的密碼:`sudo passwd newuser`。
#### `deluser` - 刪除使用者
* **簡介**:刪除使用者帳號。
* **用法**:
* `sudo deluser <username>`:刪除使用者。只有在沒有使用者將該群組設為初始群組的情況下才能刪除。
* `userdel --remove <username>`:移除使用者及其家目錄。
#### `passwd` - 修改密碼
* **簡介**:用於修改使用者密碼。
* **用法**:`passwd`。
#### `groupadd` - 建立新群組
* **簡介**:用於建立新的群組。
* **用法**:
* `sudo groupadd <群組名稱>`。
* `sudo groupadd -g <group-ID> <group-name>`:自訂 GID。
* `sudo usermod -aG <group_name> <username>`:將指定使用者新增至群組。
* **查看群組**:`cat /etc/group`。
* **相關圖片**:

圖:`cat /etc/group` 指令範例。
#### `groupdel` - 刪除群組
* **簡介**:用於刪除群組。
* **用法**:`sudo groupdel <群組名稱>`:只有在沒有使用者把這個群組當作 initial group 的情況下才能刪除。
#### `gpasswd` - 群組管理相關指令
* **簡介**:用於管理群組,通常由 root 或群組管理員執行。
* **root 可執行指令**:
* `sudo gpasswd <grpname>`:設定群組密碼。
* `sudo gpasswd -A <username> <grpname>`:將指定使用者新增至群組管理員。
* `sudo gpasswd -M <username> <grpname>`:新增使用者進群組。
* `sudo gpasswd -r <grpname>`:刪除該群組的密碼。
* **群組管理員可執行指令**:
* `gpass -a <username> <group_name>`:將指定使用者新增至群組。
* `gpass -d <username> <group_name>`:將指定使用者從群組刪除。
#### `newgrp` - 切換有效群組
* **簡介**:用於切換當前使用者的有效群組。
* **用法**:`newgrp <group_name>`。
#### `exit` - 登出現在的使用者
* **簡介**:登出當前登入的使用者或退出 shell。
* **用法**:`exit`。
#### `last` - 列出使用者登入資訊
* **簡介**:列出使用者的登入資訊,資料來源為 `/var/log/wtmp` (內容編碼過)。
* **用法**:
* `last`。
* `last -n<number>`:指定顯示的列數。
#### `w` - 顯示現在有哪些登入的使用者
* **簡介**:顯示當前登入系統的使用者及其正在執行的程序。
* **用法**:`w`。
### 權限管理
這些指令用於更改檔案和目錄的擁有者、群組和權限設定,以及特殊權限的應用。
#### `chown` - 改變檔案或目錄的擁有者
* **簡介**:change owner,用於更改檔案或目錄的擁有者。
* **用法**:
* `chown <user_name> <dirname/filename>`。
* `chown :<group_name> <dirname/filename>`:僅更改群組。
* `chown <user_name>:<group_name> <dirname/filename>`:同時更改擁有者和群組。
* `chown -R <user_name> <dirname>`:遞迴更改目錄及其底下所有檔案的擁有者。
* **注意**:要成功執行 `chown`,指定的擁有者和群組必須是現有的使用者和群組。
* **為何需要 `sudo`**:通常更改檔案擁有者需要管理員權限。
#### `chgrp` - 改變檔案或目錄的所屬群組
* **簡介**:change group,用於更改檔案或目錄的所屬群組。
* **用法**:
* `chgrp <group name> <dirname/filename>`。
* `chgrp -r <group name> <dirname>`:遞迴更改目錄及其底下的所有檔案的群組。
* **注意**:指定的群組必須在 `/etc/group` 檔案中存在。
#### `chmod` - 更改檔案或目錄權限
* **簡介**:change mode,用於更改檔案或目錄的讀取 (r)、寫入 (w)、執行 (x) 權限。
* **用法**:
* `chmod -R <mode> <file_or_dir>`:遞迴更改目錄及其內容的權限。
* **權限模式**:
* **數字類型 (八進位)**:
* `r` (讀取) = 4,`w` (寫入) = 2,`x` (執行) = 1。
* 將三種權限值相加,形成一個三位數或四位數的八進位數字。
* 第一個數字 (可選) 用於特殊權限 (SUID=4, SGID=2, Sticky Bit=1)。
* 其後的三個數字分別代表:擁有者 (user)、群組 (group)、其他人 (others) 的權限總和。
* **範例**:
* `chmod 755 filename`:擁有者 (7=rwx) 可讀寫執行,群組 (5=rx) 和其他人 (5=rx) 可讀執行。
* `644` 代表 `-rw-r--r--`。
* `chmod 4755 printUid`:設定 SUID,擁有者 (7=rwx),群組 (5=rx),其他人 (5=rx)。
* **符號類型 (Symbolic)**:
* `chmod <人 動作 權限設定,...> <file_or_dir>`。
* **人 (Who)**:`u` (user 擁有者), `g` (group 群組), `o` (other 其他人), `a` (all 所有人)。
* **動作 (Operator)**:`+` (加入權限), `-` (移除權限), `=` (設定權限,覆蓋原有)。
* **權限設定 (Permission)**:`r` (讀取), `w` (寫入), `x` (執行)。
* **範例**:
* `chmod u+x a.txt`:給擁有者執行 `a.txt` 的權限。
* `chmod u-x a.txt`:移除擁有者執行 `a.txt` 的權限。
* 將 `-rw-rw-r--` 改為 `-rwxr-xr-x`:`chmod u+x,g-w+x,o+x`。
* `chmod ug+rw mydir`:對目錄的所有者和群組增加讀寫權限。
* `chmod a-w myfile`:對所有使用者刪除寫入權限。
* **權限的意義**:
* **對於檔案**:
* `r`:可讀取檔案內容。
* `w`:可編輯檔案內容,但沒有刪除檔案的權限。
* `x`:可以把檔案內容給系統執行。
* **對於目錄**:
* `r`:可讀取目錄中的檔案清單。
* `w`:可編輯這張清單,等同於可以編輯名稱、新增、刪除、移動該目錄底下的檔案或目錄。
* `x`:可以 `cd` 進入目錄。
* **相關圖片**:

圖:`chmod` 數字權限與對應的 `rwx` 表示。
#### 特殊權限 (Special Permissions)
特殊權限可以讓檔案或目錄在某些條件下,擁有超越一般權限的能力,常與安全相關。
* **SUID (Set User ID)**:
* **簡介**:針對**可執行檔案**設置的特殊權限。任何使用者在執行此檔案時,都會以檔案**擁有者**的身份來運行該程式,而不是以執行者自己的身份。
* **設定**:
* 數字模式:`chmod 4??? <filename>` (在權限數字最前面加上 4)。
* 符號模式:`chmod u+s <filename>`。
* **表示**:在 `ls -l` 的輸出中,如果擁有者的執行權限 (`x`) 位置顯示為 `s` (小寫),則表示 SUID 已設定且檔案有執行權限。如果顯示為 `S` (大寫),則表示設定了 SUID 但該檔案沒有執行權限。
* **範例**:`passwd` 指令。普通用戶可以執行 `passwd` 來更改自己的密碼,即使 `/etc/shadow` (儲存密碼的檔案) 只有 root 才能讀寫,這是因為 `passwd` 程式設定了 SUID 權限,執行時會暫時以 root 身份運行。
* **相關圖片**:

圖:`ls -l /usr/bin/passwd` 顯示 SUID 權限 (`-rwsr-xr-x`) 的範例。

圖:`ls -l` 輸出中 SUID (小寫 `s`) 的位置。
* **SGID (Set Group ID)**:
* **簡介**:可設置在**檔案**或**目錄**上的特殊權限。
* **設定**:
* 數字模式:`chmod 2??? <filename>` (在權限數字最前面加上 2)。
* 符號模式:`chmod g+s <filename>`。
* **表示**:在 `ls -l` 的輸出中,如果群組的執行權限 (`x`) 位置顯示為 `s` (小寫),則表示 SGID 已設定且檔案/目錄有執行權限。如果顯示為 `S` (大寫),則表示設定了 SGID 但該檔案/目錄沒有執行權限。
* **應用**:
* **設定在檔案上**:任何使用者執行該檔案時,將會以該檔案的**群組身份**執行,而不是以執行者的當前群組身份。
* **設定在目錄上**:這個目錄內新創建的所有檔案和子目錄,將自動繼承該目錄的群組,而不是繼承創建者的主群組。這在群組協同編輯檔案時非常有用。
* **相關圖片**:

圖:`ls -l` 輸出中 SGID (小寫 `s`) 的位置。
* **Sticky Bit (SBIT)**:
* **簡介**:主要設置在**目錄**上,當 Sticky Bit 被設定在一個目錄上時,該目錄內的檔案和子目錄只能由以下幾類使用者刪除或重命名:檔案的所有者、目錄的所有者、root 超級使用者。
* **設定**:
* 數字模式:`chmod 1??? <filename>` (在權限數字最前面加上 1)。
* 符號模式:`chmod o+t <filename>`。
* **表示**:在 `ls -l` 的輸出中,如果其他使用者的執行權限 (`x`) 位置顯示為 `t` (小寫),則表示 Sticky Bit 已設定且目錄有執行權限。如果顯示為 `T` (大寫),則表示設定了 Sticky Bit 但該目錄沒有執行權限。
* **範例**:`/tmp` 目錄通常會設定 Sticky Bit (`rwxrwxrwt`)。這可以防止使用者之間相互刪除檔案,即使其他使用者對該目錄有寫入權限,他們也不能刪除或修改他人建立的檔案。
* **相關圖片**:

圖:`ls -ld /tmp` 顯示 Sticky Bit (`t`) 的範例。
#### ACL (Access Control List) - 針對特定用戶設定權限
* **簡介**:ACL 提供了比傳統 `rwx` 權限更細緻的控制,可以針對單一使用者、單一檔案或目錄進行讀寫執行 (r,w,x) 的權限規範。
* **指令**:
* `getfacl <檔名>`:查看檔案的 ACL 權限。
* `setfacl -m u:<使用者名稱>:<給啥權限> <檔名>`:為特定使用者增加權限。
* `setfacl -x u:<使用者名稱> <檔名>`:移除特定使用者的權限。
### 網路工具
這些指令用於查看系統的網路連接、監聽埠、DNS 查詢、測試網路連通性以及監控網路流量。
#### `netstat` - 查看網路連接和統計數據
* **簡介**:查看系統的網路連接和統計數據。
* **安裝**:`sudo apt install net-tools`。
* **用法**:
* `netstat -an`:顯示所有連接並以數字格式顯示 IP 和埠號。
* `netstat -r`:顯示路由表,功能與 `route` 指令相同。
* `netstat -ntupl`:顯示所有 TCP、UDP 監聽埠,以數字格式顯示,並列出相關的程序 ID 和名稱。
* **常用參數**:
* `-n`:不將能變成數字的資訊轉換為主機名稱或服務名稱,直接顯示數字 (如 IP 和埠號)。
* `-t`:顯示 TCP 連線。
* `-u`:顯示 UDP 連線。
* `-p`:顯示與連接相關的程序 PID 和檔名。
* `-l`:顯示正在監聽的埠 (listening sockets)。
#### `ss` - 現代化的 Socket 統計工具
* **簡介**:現代化的 Socket 統計工具,功能類似 `netstat` 但通常速度更快,直接從核心讀取數據。
* **用法**:
* `ss -tuln`:顯示所有 TCP、UDP 監聽埠,以數字格式顯示。
* `ss -p`:顯示與連接相關的程序。
* `ss -t4lp`:顯示系統上所有使用 IPv4 開啟的 TCP 監聽 Socket 及對應的程序。
* **常用參數**:
* `-l`:列出所有開啟的埠號。
* `-pl`:列出開啟 Socket 的程序名稱。
* `-a`:列出所有資訊。
* `-t`:只列出 TCP Sockets。
* `-u`:只列出 UDP Sockets。
* `-x`:只列出 Unix Sockets。
* `-4`:只列出 IPv4 Sockets。
* `-6`:只列出 IPv6 Sockets。
#### `dig` - DNS 查詢工具
* **簡介**:用於獲取網域的 DNS 資訊。
* **用法**:
* `dig example.com`:查詢 `example.com` 的 A 記錄 (IPv4 地址)。
* `dig google.com MX`:查詢 `google.com` 的 MX 記錄 (郵件交換器)。
* `dig @8.8.8.8 example.com`:使用 Google 的 DNS 伺服器 (8.8.8.8) 查詢 `example.com`。
* `dig -x <ip>`:反向查詢 IP 地址對應的網域。
#### `nslookup` - DNS 查詢工具
* **簡介**:看 DNS 伺服器相關資料,類似 `dig`。
* **用法**:`nslookup <domain_name>`。
#### `host` - 網域轉 IP
* **簡介**:將網域解析為 IP 地址。
* **用法**:`host <domain_name>`。
#### `whois` - 查詢網域/IP 註冊資訊
* **簡介**:查詢網域的註冊資訊 (誰註冊、何時到期等) 或 IP 地址的歸屬資訊 (哪個國家、哪個機構管理)。
* **用法**:`whois <domain_name/ip>`。
#### `ping` - 測試網路連通性
* **簡介**:測試網路連通性,檢測主機是否可達並計算延遲時間。
* **用法**:
* `ping example.com`:向 `example.com` 發送 ICMP 數據包,測試連通性。
* `ping -c 4 google.com`:向 `google.com` 發送 4 個 ICMP 數據包。
#### `ifconfig` - 查看網卡資訊
* **簡介**:查看目前已啟動網卡的相關資訊,包括 IP 地址、子網路遮罩、MAC 地址等。
* **安裝**:`sudo apt install net-tools`。
* **用法**:
* `ifconfig`:顯示所有已啟動網卡的資訊。
* `ifconfig -a`:查看所有網卡 (包括未啟動的)。
* `ifconfig <網卡名稱>`:顯示指定網卡的資訊。
* `sudo ifconfig <網卡名稱> down`:關閉網卡。
* `sudo ifconfig <網卡名稱> up`:開啟網卡。
* **概念**:現代 Linux 系統採用「預測性網路介面設備名稱」,例如 `enp0s1`,其中 `en` 代表 Ethernet,`p0` 代表 PCI Bus 0,`s1` 代表 Slot 1。
#### `route` - 查看路由表
* **簡介**:查看系統的路由表。
* **安裝**:`sudo apt install net-tools`。
* **用法**:
* `route`。
* `route -n`:以數字格式顯示 IP 地址,不進行主機名稱解析。
#### `iproute2` - 網路參數綜合指令
* **簡介**:一個綜合性的網路參數指令集,旨在取代舊有的 `ifconfig` 和 `route` 等指令。
* **主要組成**:`ip [option] [動作] [指令]`。
* **動作**:`link` (裝置設定), `addr/address` (IP 協定設定), `route` (路由設定)。
* **指令**:`show` (查閱), `set` (設定), `add` (增加), `del` (刪除)。
* **用法範例**:
* **`ip link` (裝置相關)**:
* `ip link show`:查閱所有網卡資訊。
* `ip link show <網卡卡號>`:查閱指定網卡資訊。
* `ip link set <網卡卡號> up`:開啟網卡。
* `ip link set <網卡卡號> down`:關閉網卡。
* **`ip addr/address` (IP 參數相關)**:
* `ip addr show`:查閱 IP 參數。
* `ip address [add|del] [IP參數] [dev 裝置名] [相關參數]`:增加或刪除 IP 地址。
* **`ip route` (路由相關)**:
* `ip route show/list`:查閱路由表。
* `ip route [add|del] [IP或網域] [via gateway] [dev 裝置]`:增加或刪除路由。
#### `iftop` - 網路即時流量監控
* **簡介**:監控網路介面的即時流量。
* **安裝**:`sudo apt install iftop`。
* **用法**:`sudo iftop -Pp <網卡名稱>`。
* **常用參數**:
* `-p`:顯示埠相關資訊。
* `-P`:顯示主機名稱和埠號。
#### `nmap` - 網路地圖
* **簡介**:網路探測和安全掃描工具,用於發現網路上的主機和服務。
* **用法**:
* `nmap`。
* `nmap -sS -A 10.0.2.0/24`:對指定子網路進行 SYN 掃描並嘗試 OS 偵測和服務版本偵測。
#### `RDP` (Remote Desktop Protocol) - 遠端桌面協定
* **簡介**:一種遠端桌面協定。
#### `Telnet` - 遠端連線協定 (不安全)
* **簡介**:一種遠端連線協定,但由於傳輸資料未加密 (明文傳輸) 且沒有驗證機制,被認為不安全,應盡量避免使用。
* **埠號**:預設使用 23 埠。
#### `SSH` - 安全遠端連線協定
* **簡介**:Secure Shell,一種加密的網路協定,用於在不安全的網路中進行安全的遠端連線。
* **設定檔**:`/etc/ssh/sshd_config` (SSH daemon 設定檔),`~/.ssh/config` (使用者 SSH 設定檔)。
* **用法**:`ssh [user@]hostname`。
* **加密方式**:支援對稱式和非對稱式加密。
* **對稱式**:接收端與發送端持有相同密鑰用於加密。
* **非對稱式**:使用者擁有公鑰 (可公開) 和私鑰 (自己保留),利用其中一支加密則必須用另一支解密。
* **服務管理**:
* `sudo service ssh start/stop/restart`:啟動/停止/重啟 SSH 服務。
* `sudo service ssh status`:確認 SSH 服務狀態。
### 軟體與套件管理
這些指令用於在 Linux 系統上安裝、更新、移除和查詢軟體套件。
#### `apt` (Advanced Package Tool) - 軟體管理工具
* **簡介**:Linux 系統中用於管理軟體套件的工具。
* **用法**:
* `sudo apt install <packagename>`:安裝軟體套件。
* `sudo apt update`:檢查軟體源更新,並將軟體列表下載到 `/var/lib/apt/lists/`。
* `sudo apt upgrade`:升級系統已安裝的軟體。
* `sudo apt dist-upgrade`:執行 `upgrade` 並處理軟體套件的相依性升級。
* `sudo apt remove <packagename>`:移除某程式,但會留下一些設定檔。
* `sudo apt purge <packagename>`:徹底移除套件,包括其設定檔。
* `sudo apt autoremove`:自動移除系統中不再需要的套件。
* `sudo apt clean`:清除已下載的套件安裝包,釋放磁碟空間。
* `sudo apt autoclean`:自動清除過期的套件安裝包。
* `sudo apt search <套件>`:搜尋套件。
* `sudo apt show <套件名稱>`:顯示套件的詳細資訊,包括相依性。
* **軟體源**:
* 軟體源位置在 `/etc/apt/sources.list`。
* 可透過修改此檔案來更改下載源,例如將 `tw.archive.ubuntu.com` 改為 `ftp.ubuntu-tw.net` (暨大伺服器) 以加快下載速度。
#### `aptitude` - 互動式套件管理
* **簡介**:一個提供 TUI (terminal user interface) 的套件管理工具,功能比 `apt` 更強大,提供更安全的升級選項。
* **安裝**:`sudo apt install aptitude`。
* **用法**:
* `sudo aptitude hold <packagename>`:鎖定套件版本,使其不再被更新。
* `sudo aptitude unhold <packagename>`:取消鎖定。
* `sudo aptitude save-upgrade`:安全地升級,避免不必要的刪除。
* `sudo aptitude search <套件>`:搜尋套件。
#### `wget` - 從網址下載內容
* **簡介**:用於從指定的網址下載內容。
* **用法**:`sudo wget <網址>`。
#### `dpkg` - 處理 .deb 檔案
* **簡介**:Debian Package 工具,用於安裝、管理 .deb 格式的套件。
* **用法**:
* `sudo dpkg -i <filename.deb>`:安裝指定的 `.deb` 檔案。
* `dpkg -L <package name>`:列出已安裝套件的所有檔案及其位置。
* `dpkg -S <path of a file>`:查詢特定檔案是由哪個套件安裝而來。
* `dpkg -al`:列出所有已安裝的套件。
#### `gcc` - C 語言編譯器
* **簡介**:GNU Compiler Collection,用於編譯 C、C++ 等程式語言。
* **安裝**:`sudo apt install gcc`。
* **用法**:
* 編譯 C 檔案:`gcc <file name> -o <output file name>`。
* 執行編譯後的檔案:`./<output file name>`。
### 磁碟與記憶體管理
這些指令用於檢查磁碟使用量、分割區資訊、格式化硬碟以及監控記憶體使用情況。
#### `df` - 列出檔案系統的整體磁碟用量
* **簡介**:用於顯示檔案系統的整體磁碟使用量和剩餘空間。
* **用法**:
* `df`。
* `df -h`:以人類可讀的格式 (如 MB, GB) 顯示磁碟用量。
* `df -T`:查看各個磁碟分割區的檔案系統類型。
* **顯示欄位**:
* `Filesystem`:磁碟或分區的名稱。
* `Size`:總大小。
* `Used`:已使用空間。
* `Avail`:可用空間。
* `Use%`:使用比例。
* `Mounted on`:該磁碟或分區被掛載到的目錄 (掛載點)。
* **相關圖片**:

圖:`df` 指令顯示磁碟使用量的範例。

圖:`df -h` 顯示 ZFS、NFS 等檔案系統掛載點的範例。
#### `lsblk` - 列出系統的磁碟與磁碟分割資訊
* **簡介**:list block device,顯示系統中的區塊設備 (如磁碟、分區等),並展示它們的層次結構和掛載點。主要用於查看系統中的磁碟結構,而非磁碟的空間使用情況。
* **用法**:
* `$lsblk -ip /dev/sda`:查看指定硬碟的分割區資訊。
* **常用參數**:
* `-f`:列出磁碟內的檔案系統名稱。
* `-p`:列出完整檔案名稱。
* `-t`:列出磁碟詳細資料。
* **顯示欄位**:
* `NAME`:設備名稱。
* `MAJ:MIN`:核心識別裝置的代碼。
* `RM`:表示設備是否可移除 (Removable),1 為可移除 (如 USB 隨身碟),0 為不可移除。
* `SIZE`:該磁碟或分區的大小。
* `RO`:該磁碟是否為唯讀 (Read-Only),1 為唯讀,0 為可讀寫。
* `TYPE`:設備的類型,包括 `disk` (磁碟)、`part` (分區)。
* `MOUNTPOINTS`:該磁碟或分區掛載到的目錄。
* **相關圖片**:

圖:`lsblk` 指令顯示區塊裝置資訊的範例。
#### `dd` - 資料複製工具
* **簡介**:data duplicator,用於複製檔案、轉換檔案格式,或對設備進行低階操作。
* **用法**:
* `sudo dd if=/dev/zero of=/home/test.txt bs=1m count=1`:將 `/dev/zero` (提供無限的零字節流) 的內容複製到 `test.txt`,區塊大小 1MB,複製 1 個區塊。
* `if`: input file (輸入檔案)。
* `of`: output file (輸出檔案)。
* `bs`: block size (區塊大小,不加單位默認為位元組)。
* `count`: 只處理 N 個區塊。
* `sudo dd if=/dev/zero of=/dev/disk1 bs=1024 count=1024`:將引導扇區清空,方便格式化.
#### `sudo fdisk -l` - 列出磁碟分割資訊
* **簡介**:用於列出磁碟分割區的資訊。
* **用法**:
* `$sudo fdisk -l`:列出所有磁碟分割資訊。
* `$sudo fdisk -l /dev/sda`:列出指定磁碟的分割資訊。
#### `sync` - 將暫存記憶體寫入硬碟
* **簡介**:將所有在記憶體中等待寫入的資料寫入到磁碟,確保資料一致性。
* **用法**:`sync`。
### 文字處理與過濾
這些指令用於在檔案內容中搜尋、過濾、排序、格式化文字,以及進行基本的字串操作。
#### `grep` - 從輸出中找指定的關鍵字
* **簡介**:用於在檔案或標準輸入中搜尋符合指定模式 (關鍵字或正規表達式) 的行。
* **用法**:
* `grep "keywords" <filename>`:從檔案中搜尋關鍵字。
* `cat /etc/fstab | grep -i "swap"`:透過管道符號過濾 `fstab` 中包含 "swap" 的行 (不分大小寫)。
* `grep -irn "swap" /etc`:過濾整個 `/etc` 資料夾,並顯示行號 (不分大小寫,遞迴)。
* **常用參數**:
* `-i`:不分大小寫搜尋。
* `-n`:印出行號。
* `-r`:遞迴搜尋,會進入子目錄。
* `"^keywords"`:以 `keywords` 開頭搜尋。
* `grep -e 'sudo.*ls' -e 'ls.*sudo'`:使用多個 AND 模式進行搜尋。
#### `wc` - 印出行數、字元數、位元組數
* **簡介**:Word Count,用於計算檔案或標準輸入的行數、字元數 (或單詞數) 和位元組數。
* **用法**:`wc <filename>`。
* **常用參數**:
* `-l`:印出行數。
* `-w`:印出字元數 (單詞數)。
* `-c`:印出位元組數。
* `cat /var/log/auth.log | grep sudo | wc`:計算包含 "sudo" 的日誌行數。
#### `awk` - 將輸出變成指定格式
* **簡介**:一種強大的文字處理工具,在讀取檔案或資料流時,以行為單位處理,預設以空白或 Tab (`\t`) 分隔欄位,並可對欄位進行操作。
* **用法**:
* `ls -l | awk '{print $1"\t"$8}'`:過濾 `ls -l` 資料的第一列和第八列並印出。
* **取得欄位值**:`awk '{print $1, $2}' filename`。
* **`BEGIN`, `END` 用法**:在輸出結果的第一行和最後一行加上說明。
* **`if-else` 用法**。
* **正規表示式篩選**。
* **相關圖片**:

圖:`awk` 指令取得欄位值的範例。

圖:`awk` 指令中使用 `BEGIN` 和 `END` 關鍵字的範例。

圖:`awk` 指令中 `if-else` 用法的範例。

圖:`awk` 指令中使用正規表示式篩選的範例。
#### `sort` - 排序
* **簡介**:用於對文字檔案的行進行排序。
* **用法**:`sort <filename>`。
* **常用參數**:
* `-c`:檢查檔案是否已排序。
* `-u`:只顯示唯一 (unique) 的行。
* `-r`:降冪排序。
* `-n`:依照數值排列。
* `-k <第幾個 col>`:依照第幾個欄位排序。
#### `sed` - 文字流編輯器
* **簡介**:Stream EDitor,用於對輸入流 (檔案或標準輸入) 進行文字轉換。
* **用法**:`sed 's/old/new/g' filename` (替換文字)。
* **常用參數**:
* `-i`:直接修改檔案內容,而不是只顯示修改後的結果。
#### `xxd` - 用二進位狀態開啟檔案
* **簡介**:用於將二進位檔案內容以十六進位或其他格式顯示。
* **用法**:
* `xxd zip`。
* `xxd zip | less`。
### 程序管理
這些指令用於監控、管理和終止系統中正在執行的程序。
#### `kill` - 終止程序
* **簡介**:用於向指定程序發送訊號以終止它。
* **用法**:
* `kill <pid>`。
* `kill -9 <pid>`:強制終止程序 (SIGKILL)。
* `ps -aux|awk '{print $2 $3}' | xargs kill`:終止所有使用者程序的範例。
### 其他常用功能與概念
本節涵蓋了其他重要的 Linux 指令、殼層特性和系統概念。
#### 管道符號 (Pipe) `|`
* **簡介**:將前一個指令的標準輸出 (stdout) 作為後一個指令的標準輸入 (stdin)。
* **用法**:
* `cat /etc/fstab | grep -i "swap"`。
* `echo '1234' | base64`。
* `ls | tee -a <檔名>`。
#### 輸入/輸出重導向 (Redirection)
* **簡介**:用於將指令的輸出或輸入導向到檔案或從檔案讀取。
* **符號**:
* `>`:將標準輸出 (stdout,代碼 1) **覆蓋**寫入檔案。
* `>>`:將標準輸出 (stdout,代碼 1) **新增**到檔案內容的後面。
* `2>`:將標準錯誤輸出 (stderr,代碼 2) **覆蓋**寫入檔案。
* `2>&1`:將標準錯誤輸出重導向至標準輸出當前的檔案描述符,使其與標準輸出導向到同一位置。
* `<`:將檔案內容作為標準輸入 (stdin,代碼 0)。
* `<<`:用於 here document,從輸入中讀取多行文字作為標準輸入。
* `cat&>>`:將標準輸出和標準錯誤輸出都新增到檔案。
* **範例**:
* `echo 123 > 123.txt`:將 "123" 覆蓋寫入 `123.txt`。
* `cd /jsdf 2>&1 | less`:將錯誤訊息導到標準輸出再通過管道傳給 `less`。
#### `tee` - 同時輸出到螢幕與檔案
* **簡介**:同時將標準輸入的內容輸出到標準輸出 (螢幕) 和一個或多個檔案。
* **用法**:
* `tee <檔名>`:同時輸出到螢幕與檔案,會覆蓋原檔案。
* `tee -a <檔名>`:同時輸出到螢幕與檔案,會在原有內容後新增。
* `ls | tee -a <檔名>`:將 `ls` 的輸出透過管道傳給 `tee`。
#### `alias` - 將指令簡化
* **簡介**:為常用或複雜的指令設定一個簡短的別名。
* **用法**:
* `alias`:查看已設定的別名。
* `alias <新指令名稱>="<原始指令>"`。
* `unalias <alias名稱>`:刪除別名。
* **設定**:通常將別名設定寫入 `~/.bashrc` 檔案,然後執行 `source ~/.bashrc` 使其生效,這樣每次啟動 `bash` 時都會生效。
* **相關圖片**:

圖:設定 `alias` 前的 `cat` 指令顯示。

圖:設定 `alias` 後的 `cat` 指令顯示。
#### `clear` - 清空 terminal 畫面
* **簡介**:清除當前終端機螢幕上的所有內容。
* **用法**:
* `clear`。
* 快捷鍵:`Ctrl + L`。
#### `man` - 查詢指令說明手冊 (Manual)
* **簡介**:用於查閱系統中每個命令或程式的手冊頁。
* **用法**:`man <指令名稱>`。
#### `info` - 查詢指令詳細說明
* **簡介**:提供了比 `man` 更詳細、更結構化的檔案說明。
* **用法**:`info <指令名稱>`。
#### `whatis` - 查詢簡潔指令說明
* **簡介**:提供更簡潔的指令說明,只會返回一行簡短描述。
* **用法**:`whatis <指令名稱>`。
#### `type` - 查詢指令型態
* **簡介**:查詢某個指令的型態 (例如是內建指令、別名或外部程式)。
* **用法**:`type <指令名稱>`。
#### `file` - 確定檔案型態
* **簡介**:用於確定檔案的類型 (例如是文字檔、執行檔、壓縮檔等)。
* **用法**:`file <檔案路徑>`。
#### `whereis` - 由特定目錄中尋找檔案
* **簡介**:用於在一些特定的目錄中,尋找檔案的檔名、二進位檔、原始碼和說明檔。
* **用法**:`whereis <filename_or_DIR>`。
* **常用參數**:
* `-l`:列出 `whereis` 會查詢的幾個主要目錄。
* `-b`:只找 binary 格式檔案。
* `-m`:只找在說明檔 manual 路徑下的檔案。
* `-s`:只找 source 來源檔案。
* `-u`:搜尋不在上述 3 個項目當中的其他特殊檔案。
#### `which` - 列出執行檔的路徑
* **簡介**:列出第一個在 `PATH` 環境變數所指定的目錄中找到的執行檔路徑。
* **用法**:
* `which <欲尋找的執行黨>`。
* `which -a <欲尋找的執行黨>`:將所有找到的指令路徑均列出。
#### 環境變數
* **簡介**:儲存在系統中,供程式或指令使用的值。
* **常用環境變數**:
* `$HOME`:使用者的家目錄位置。
* `$PWD`:當前工作目錄。
* `$SHELL`:當前所使用的 shell 的名稱。
* `$PATH`:系統尋找執行檔的路徑列表,各路徑之間用冒號 `:` 隔開。當執行指令但沒指定確切目錄時,系統會從 `$PATH` 裡的路徑去找。
* **查看**:`export | less`:顯示所有環境變數,並透過 `less` 進行分頁和搜尋。
* **相關圖片**:

圖:`echo $PATH` 指令範例。
#### `reboot` - 重新開機
* **簡介**:重新啟動系統。**不建議直接使用**,因為可能無法確保所有資料已寫回硬碟。
#### `shutdown` - 關機/重啟
* **簡介**:安全地關閉或重啟系統,可以設定時間和發送訊息。
* **用法**:
* `shutdown now`:現在關機。
* `shutdown -r <時間>`:在某個時間重新開機。
* `shutdown -k <時間>`:印出幫你安排的關機時間訊息給所有登入使用者,但**不實際關機**。
* `shutdown -h <時間>`:在某個時間讓系統暫時停止 (關機)。
* `shutdown -c`:取消安排的關機時間。
* **訊息傳送**:`shutdown -k` 能將訊息印到所有使用者螢幕上,是因為 Linux 中所有東西都是檔案,包括 TTY (終端機),可以透過 `write <username> pts/<number>` 或 `echo "msg" > /dev/pts/<number>` 發送訊息。
#### `poweroff` - 直接關機
* **簡介**:直接關機,不考慮記憶體的內容是否已全部寫完。**應盡量避免使用**。
#### `login` / `logout`
* **簡介**:用於登入和登出系統。
* **差異**:`logout` 通常用於登出遠端連線或切換使用者後的環境;`exit` 會直接關閉當前的 terminal。
#### `alias` - 客製化指令
* **簡介**:使用者可以自行定義新的指令。
* **步驟**:
1. 建立執行檔:`sudo vim /bin/8jia9` (例如,建立一個名為 `8jia9` 的指令)。
2. 寫入指令:在檔案中寫入 `#!/bin/bash` (Shebang,指定執行這個檔案的 shell),然後是你想執行的指令,例如 `ls` 和 `pwd`。
3. 賦予執行權限:`sudo chmod +x /bin/8jia9`。
4. 現在就可以直接執行 `8jia9` 這個指令了。
### 壓縮與打包
這些指令用於壓縮和打包檔案,以節省儲存空間或方便傳輸。
#### 壓縮指令 (`gzip`, `bzip2`, `xz`, `zstd`)
* **`gzip`**:
* **副檔名**:`*.gz`,最被大眾接受。
* **壓縮**:`gzip <filename>`,壓縮後檔名為 `filename.gz`。
* **解壓縮**:`gzip -d <filename.gz>`。
* **特性**:適合電腦性能較差的環境。
* **`bzip2`**:
* **副檔名**:`*.bz2`。
* **壓縮**:`bzip2 <filename>`,壓縮後檔名為 `filename.bz2`。
* **解壓縮**:`bzip2 -d <filename.bz2>`。
* **常用參數**:`-k` 保留原始檔案。
* **`xz`**:
* **副檔名**:`*.xz`。
* **壓縮**:`xz <filename>`,壓縮後檔名為 `filename.xz`。
* **解壓縮**:`xz -d <filename.xz>`。
* **常用參數**:`-k` 保留原始檔案。
* **特性**:盡可能壓縮,但需要較好的電腦性能。
* **`zstd`**:
* **副檔名**:`*.zst`。
* **安裝**:`sudo apt-get install zstd`。
* **壓縮**:`zstd <filename>`。
* **解壓縮**:`zstd -d <filename.zst>`。
#### 打包指令 (`tar`)
* **簡介**:用於打包檔案,將多個檔案或目錄組合成一個單一的歸檔檔案,本身不具壓縮功能,但可結合壓縮指令使用。
* **用法**:`tar [-z|-j|-J] [c|x] [v] [-f <filename>] <filename>`。
* **常用參數**:
* `-z`:透過 `gzip` 支援壓縮,檔名建議為 `*.tar.gz`。
* `-j`:透過 `bzip2` 支援壓縮,檔名建議為 `*.tar.bz2`。
* `-J`:透過 `xz` 支援壓縮,檔名建議為 `*.tar.xz`。
* `-c`:建立打包檔案。
* `-x`:解打包/解壓縮。
* `-v`:列出正在處理的檔案名稱 (verbose)。
* `-f`:指定打包/壓縮後的檔案名稱。
* **建立打包壓縮檔**:
* `tar -zcvf <destination.tar.gz> <source_dir>`:建立 `gzip` 壓縮的 `tar` 檔案。
* **解開打包壓縮檔**:
* `tar -zxvf <source.tar.gz>`:解開 `gzip` 壓縮的 `tar` 檔案。
### 檔案系統結構 (FHS)
Linux 遵循檔案系統階層標準 (Filesystem Hierarchy Standard, FHS),規定了系統中各個目錄的用途和內容。
* `/root`:根使用者的家目錄,不同於一般使用者的家目錄 `/home/{username}`。
* `/home/{username}`:通常用於一般使用者的家目錄。
* `/boot`:包含開機程序所需的檔案,如核心映像檔和引導載入器 (`GRUB`) 設定。
* `/dev`:存放裝置 (device) 檔案,例如硬碟 (`sda1`, `sda2`) 或 SSD (`nvme`)。
* `/run`:存放正在執行中的程序相關的資料。
* `/var`:存放經常變動的資料,如日誌檔 (在 `/var/log` 下)。
* `/tmp`:存放暫時檔案,通常設定了 Sticky Bit,以防止不同使用者之間互相刪除檔案。
* `/etc`:存放系統的設定檔,例如:
* `/etc/passwd`:存放使用者帳號資訊 (使用者名稱、UID、GID、家目錄、shell 等),**密碼欄位以 `x` 表示,實際密碼存在 `/etc/shadow`**。一般使用者可讀取。
* `/etc/shadow`:存放加密後的使用者密碼,只有 root 才能讀取。包含密碼變更日期、最短/最長使用期限等安全策略。
* `/etc/group`:存放群組資訊。
* `/etc/sudoers`:設定哪些使用者可以使用 `sudo` 以及他們可以執行的指令權限。
* `/etc/apt/sources.list`:定義 `apt` 套件管理器使用的軟體源列表。
* `/etc/ssh/sshd_config`:SSH daemon 的設定檔。
* `/proc`:一個虛擬檔案系統,將每個正在執行的程序表示為檔案,可以在 `/proc/{PID}` 目錄下找到相應的程序資訊,如 `/proc/{PID}/status` 和 `/proc/{PID}/cmdline`。
* `/dev/shm`:用於共享記憶體。
* `/dev/urandom`, `/dev/zero`:亂數產生器和提供零字節流的裝置檔案,常用於安全地覆蓋或格式化磁碟。
* `/var/log/auth.log`:存放認證相關的日誌。
* `/var/log/wtmp`:存放使用者登入/登出資訊 (編碼過,需用 `last` 指令查詢)。
* `/etc/skel`:存放新使用者家目錄的骨架檔案,創建新使用者時會將此目錄下的資料複製到其家目錄。
* `/sbin/`:存放 superuser 專用的指令。
* `/cdrom/`:光碟機的掛載點。
* `/swap/`:通常指 swap 分割區,當記憶體不足時會將較少使用的資料移入此處。
### 系統關機與重啟
* **注意**:`poweroff` 和 `reboot` 等指令應謹慎使用,優先使用 `shutdown` 以確保系統安全關閉。
* **硬碟分割**:規劃硬碟時通常會分割兩個分區:`root` 和 `swap` (建議為記憶體的 1~2 倍大小)。`/boot` 也是一個重要的分區,用於開機程序。
* **LVM (Logical Volume Manager)**:在伺服器上應盡量避免使用 LVM,因為硬碟損壞時救援困難。