# 基礎 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):檔案或目錄的名稱。 * **相關圖片**: ![image](https://hackmd.io/_uploads/B15fr7apC.png) 圖:`ls` 指令範例。 ![image](https://hackmd.io/_uploads/B165Lmap0.png) 圖:`ls -a` 顯示隱藏檔案的範例。 ![image](https://hackmd.io/_uploads/ryr_PQTaA.png) 圖:`ls -l` 顯示詳細資訊的範例。 ![image](https://hackmd.io/_uploads/BydG_7TTA.png) 圖:`ls -la` 顯示詳細資訊和隱藏檔案的範例. #### `cd` - 切換路徑 (Change Directory) * **簡介**:Change Directory,用於切換當前工作目錄。 * **用法**: * `cd [相對路徑]` 或 `cd [絕對路徑]`。 * `cd /`:移至根目錄。 * `cd ~` 或 `cd`:移至當前使用者的家目錄。 * `cd ..`:回到上一層目錄。 * `cd .`:當前目錄。 * `cd -`:回到前一個工作目錄。 * `cd ~ <username>`:指定使用者的家目錄。 * **相關圖片**: ![image](https://hackmd.io/_uploads/ByZ9d7paA.png) 圖:`cd` 指令範例。 #### `mkdir` - 建立資料夾 (Make Directory) * **簡介**:建立新的目錄 (資料夾)。 * **用法**: * `mkdir <DIR_name>`。 * `mkdir -p <DIRpath/DIR_name>`:如果後面的路徑不存在,會自動建立所需的路徑。 * **相關圖片**: ![image](https://hackmd.io/_uploads/rJRWiXTpA.png) 圖:`mkdir` 指令範例。 #### `touch` - 新增檔案 / 更新檔案時間 * **簡介**:用於建立一個新的空白檔案。如果檔案已存在,則會更新檔案的修改時間 (mtime)、狀態時間 (ctime) 和讀取時間 (atime)。 * **用法**: * `touch <檔名>`。 * `touch -a <檔名>`:只更改檔案的 atime。 * **相關圖片**: ![image](https://hackmd.io/_uploads/Skr9hE6pC.png) 圖:`touch` 指令範例。 ![image](https://hackmd.io/_uploads/By1FR46pC.png) 圖:使用 `nano` 編輯器創建並保存檔案的範例。 #### `cat` - 檢視檔案內容 * **簡介**:concatenate,用於連接檔案內容並印出到標準輸出,常用於檢視檔案內容。 * **用法**: * `cat <filename>`。 * `cat -b`:印出行號,空白行不標記。 * `cat -n`:印出行號,空白行也標記。 * `cat -T`:會把 TAB 按鍵用 `^I` 顯示出來。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SJcQ1HpaR.png) 圖:`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`:複製檔案的全部特性 (包括權限等)。 * **相關圖片**: ![image](https://hackmd.io/_uploads/S1UQzH6pC.png) 圖:`cp` 指令複製檔案的範例。 #### `mv` - 移動或更名檔案/目錄 * **簡介**:move,用於移動檔案或目錄,也可用於更名。 * **用法**: * `mv <source> <destination>`:移動檔案或目錄到新的位置。 * `mv <file_or_DIR> <new_name>`:更名檔案或目錄。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SJEDISa60.png) 圖:`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` 可以刪除包含內容的目錄。 * **相關圖片**: ![image](https://hackmd.io/_uploads/B1VkQraaA.png) 圖:`rm` 指令刪除檔案的範例。 #### `echo` - 印出字串或變數 * **簡介**:在 terminal 上印出字串或變數的內容。 * **用法**: * `echo "hello world"`。 * `echo -n "Hello"`:不換行。 * `echo *.副檔名`:印出所有指定副檔名的檔案名稱。 * `echo $PATH`:印出 `PATH` 環境變數的內容。 * `echo $$`:印出當前 shell 的 PID。 * `echo <文字> > <檔名>`:將 `echo` 顯示的內容**覆蓋**寫進另一個檔案內。 * `echo <文字> >> <檔名>`:將 `echo` 顯示的內容**新增**到原有內容後。 * **相關圖片**: ![image](https://hackmd.io/_uploads/HkwBF8p60.png) 圖:`echo` 指令的基本範例。 ![image](https://hackmd.io/_uploads/SyfKkiWAR.png) 圖:`echo $PATH` 指令範例。 ![image](https://hackmd.io/_uploads/Bk8xz_8Jyg.png) 圖:`echo $$` 指令範例。 #### `mktemp` - 自動建立暫存檔案/目錄 * **簡介**:自動建立檔名不重複的暫存檔案或目錄,方便程式或指令存放資料。 * **用法**: * `mktemp`:建立暫存檔案。 * `mktemp -d`:建立暫存目錄。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SJqU35c11g.png) 圖:`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` 編號相同,它們就是同一個檔案 (指硬連結)。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SJHBBsjyJx.png) 圖:`ls -i` 顯示 inode 編號,可見硬連結 (hardlink, linktest) 具有相同的 inode。 ![image](https://hackmd.io/_uploads/r1AOS0P0A.png) 圖:`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`。 * **相關圖片**: ![image](https://hackmd.io/_uploads/rkXw-wm11g.png) 圖:`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` 進入目錄。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SkpLM50ba.png) 圖:`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 身份運行。 * **相關圖片**: ![image](https://hackmd.io/_uploads/S1D3y_Ly1e.png) 圖:`ls -l /usr/bin/passwd` 顯示 SUID 權限 (`-rwsr-xr-x`) 的範例。 ![image](https://hackmd.io/_uploads/HkNgey2AA.png) 圖:`ls -l` 輸出中 SUID (小寫 `s`) 的位置。 * **SGID (Set Group ID)**: * **簡介**:可設置在**檔案**或**目錄**上的特殊權限。 * **設定**: * 數字模式:`chmod 2??? <filename>` (在權限數字最前面加上 2)。 * 符號模式:`chmod g+s <filename>`。 * **表示**:在 `ls -l` 的輸出中,如果群組的執行權限 (`x`) 位置顯示為 `s` (小寫),則表示 SGID 已設定且檔案/目錄有執行權限。如果顯示為 `S` (大寫),則表示設定了 SGID 但該檔案/目錄沒有執行權限。 * **應用**: * **設定在檔案上**:任何使用者執行該檔案時,將會以該檔案的**群組身份**執行,而不是以執行者的當前群組身份。 * **設定在目錄上**:這個目錄內新創建的所有檔案和子目錄,將自動繼承該目錄的群組,而不是繼承創建者的主群組。這在群組協同編輯檔案時非常有用。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SJHBBsjyJx.png) 圖:`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`)。這可以防止使用者之間相互刪除檔案,即使其他使用者對該目錄有寫入權限,他們也不能刪除或修改他人建立的檔案。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SJt32FDRR.png) 圖:`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`:該磁碟或分區被掛載到的目錄 (掛載點)。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SJAnyqqJyl.png) 圖:`df` 指令顯示磁碟使用量的範例。 ![image](https://hackmd.io/_uploads/ryhTCxyR0.png) 圖:`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`:該磁碟或分區掛載到的目錄。 * **相關圖片**: ![image](https://hackmd.io/_uploads/BJGhecckkl.png) 圖:`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` 用法**。 * **正規表示式篩選**。 * **相關圖片**: ![image](https://hackmd.io/_uploads/r1ls4jqJJe.png) 圖:`awk` 指令取得欄位值的範例。 ![image](https://hackmd.io/_uploads/r1hbLo9ykl.png) 圖:`awk` 指令中使用 `BEGIN` 和 `END` 關鍵字的範例。 ![image](https://hackmd.io/_uploads/HkYP_iqJkx.png) 圖:`awk` 指令中 `if-else` 用法的範例。 ![image](https://hackmd.io/_uploads/Bkphui5J1l.png) 圖:`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` 時都會生效。 * **相關圖片**: ![image](https://hackmd.io/_uploads/r1AOS0P0A.png) 圖:設定 `alias` 前的 `cat` 指令顯示。 ![image](https://hackmd.io/_uploads/ryQP8RPAA.png) 圖:設定 `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` 進行分頁和搜尋。 * **相關圖片**: ![image](https://hackmd.io/_uploads/SyfKkiWAR.png) 圖:`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,因為硬碟損壞時救援困難。