NCNU-OpenSource
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Write
        • Owners
        • Signed-in users
        • Everyone
        Owners Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights
    • Engagement control
    • Transfer ownership
    • Delete this note
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Versions and GitHub Sync Note Insights Sharing URL Help
Menu
Options
Engagement control Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Write
Owners
  • Owners
  • Signed-in users
  • Everyone
Owners Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       owned this note    owned this note      
    Published Linked with GitHub
    Subscribed
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    Subscribe
    # 基礎 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,因為硬碟損壞時救援困難。

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully