身為一位資深技術工作者,我對 Linux 檔案系統的理解和運用早已融入我的技術 DNA。一個高效的檔案系統管理策略不僅能提升工作效率,更能讓我清晰地掌控系統資源。在這篇文章中,我將分享我多年來積累的經驗和技巧,帶你深入探索 Linux 檔案系統的奧秘。

檔案系統核心結構:Linux 的根本

Linux 檔案系統採用樹狀結構,所有檔案和目錄都從根目錄 / 開始,如同大樹的根系,向下延伸出各個分支,井然有序地組織著系統資源。我喜歡將其比喻為一座城市,每個目錄如同城市的區域,各司其職。

  • /bin:系統工具箱,存放 lscdcat 等基本命令,如同城市的公共設施,供所有居民使用。
  • /boot:系統引擎,存放核心檔案和啟動載入器,如同城市的發電廠,驅動整個系統的運作。
  • /dev:硬體介面,存放裝置檔案,如同城市的交通樞紐,連線各種硬體裝置。
  • /etc:系統控制中心,存放系統組態檔,如同城市的市政廳,管理著系統的各種設定。
  • /home:居民區,存放一般使用者的家目錄,每個使用者都有自己的獨立空間。
  • /lib:系統程式函式庫,提供程式執行所需的分享資源,如同城市的圖書館,提供各種知識和工具。
  • /media/mnt:外部裝置掛載點,如同城市的港口,連線外部世界。
  • /opt:第三方軟體區,存放可選或第三方軟體,我個人習慣將一些特殊的工具安裝在此,例如我常用的滲透測試工具。
  • /proc:系統資訊中心,存放正在執行的程式資訊,如同城市的監控中心,實時監控系統狀態。
  • /root:超級使用者之家,root 使用者的家目錄,擁有最高許可權。
  • /run:系統執行時資訊,存放自上次啟動以來的暫時資訊,如同城市的新聞中心,播報最新的系統動態。
  • /sbin:系統管理工具箱,存放系統管理員常用的系統二進位制檔案,如同城市的維修中心,維護系統的正常運作。
  • /srv:系統服務資料區,存放系統服務使用的資料,如同城市的服務中心,提供各種服務。
  • /sys:核心介面,提供核心物件及其屬性的介面,如同城市的底層設施,支撐整個城市的運作。
  • /tmp:臨時檔案區,存放系統重新啟動時會刪除的暫存檔案,如同城市的垃圾站,定期清理不需要的檔案。
  • /usr:使用者程式和資源,存放使用者二進位制檔案、程式函式庫、檔案等,如同城市的商業區,提供各種應用程式和資源。
  • /var:可變資料區,存放大小可變的資料、檔案和目錄,例如日誌、暫存檔案等,如同城市的倉函式庫,存放各種資料。

你可以使用 man hier 命令檢視更詳細的說明。

檔案系統導航與操作:在 Linux 世界中自由穿梭

瞭解檔案系統結構後,接下來我將分享一些我常用的導航和操作技巧,讓你像一位經驗豐富的探險家,在 Linux 世界中自由穿梭。

導航命令:精準定位

cd 命令是導航的利器,如同地圖和針,帶你快速到達目的地。例如,cd /homecd ~ 可以切換到家目錄。善用 Tab 自動完成功能,可以事半功倍。

pushdpopd 命令則像時光機,讓你輕鬆在不同目錄間跳躍。pushd 將當前目錄推入堆積疊,popd 則彈出堆積疊中的最後一個目錄。

  graph LR
  A["~"] --> B["/var/log"]
  B --> C["/etc"]
  C --> B
  B --> A

絕對路徑與相對路徑:兩種不同的導航方式

絕對路徑如同 GPS 座標,從根目錄 / 開始,精確地指向目標位置,例如 /home/user/filename。相對路徑則像路標,以當前位置為參考,指示目標方向,例如 directory1/directory2/filename

導航技巧:我的私藏秘笈

cd - 命令可以快速傳回上一個目錄,如同回退按鈕,方便快捷。

使用別名,可以為常用目錄建立捷徑,如同設定導航點,省時高效。例如,在 .bashrc 檔案中新增 alias docs='cd /home/user/documents',即可使用 docs 命令快速切換到檔案目錄。

Ctrl + R 反向搜尋功能可以搜尋命令歷史記錄,如同搜尋引擎,快速找到之前的命令。

Tab 自動完成功能可以自動完成目錄或檔案名稱,如同智慧輸入法,提高輸入效率。

檔案和目錄管理:掌控全域性

Linux 提供了豐富的命令列工具,如同精密的儀器,讓我可以精確地管理檔案和目錄。

  • ls:列出目錄內容,如同清單,一目瞭然。
  • mkdir:建立新目錄,如同建造新的房間。
  • rmdir:刪除空目錄,如同拆除空房間。
  • rm:刪除檔案,如同清除不需要的物品。
  • cp:複製檔案或目錄,如同複製檔案。
  • mv:移動或重新命名檔案或目錄,如同搬移或改名。
  • touch:建立空檔案或更新檔案時間戳記,如同建立新的檔案或更新修改時間。
  • cat:顯示檔案內容,如同閱讀檔案。
  • lessmore:分頁顯示檔案內容,如同翻閱書籍。
  • headtail:顯示檔案的開頭或結尾部分,如同檢視檔案的摘要或結尾。
  • grep:搜尋檔案中的特定模式,如同在檔案中查詢關鍵字。
  • find:在檔案系統中搜尋檔案,如同在圖書館中搜尋書籍。
  • chmod:更改檔案或目錄的許可權,如同設定存取許可權。
  • chown:更改檔案或目錄的所有者,如同更改檔案的所有者。

在這篇文章中,我分享了我的 Linux 檔案系統管理心法,從核心結構到導航技巧,再到常用的管理命令,希望能幫助你更深入地理解和運用 Linux 系統,提升你的技術水平。

Linux 檔案系統許可權與安全:深入解析檔案許可權、連結與 Bash 程式設計基礎

身為一位資深系統管理員,我經常需要處理 Linux 檔案系統的許可權設定。這就像管理一個城市的交通系統,需要精確控制每個使用者的存取許可權,才能確保系統安全和穩定執行。本文將探討 Linux 檔案系統許可權管理的各個導向,從檔案所有權和許可權修改,到特殊許可權 SUID 與 SGID,以及硬連結和符號連結的應用。此外,我也會分享 Bash 程式設計的基礎元素,包括變數、條件、迴圈和陣列,幫助讀者建立更強大的自動化指令碼。

檔案所有權與群組

每個檔案和目錄都像一棟房子,有其屋主(所有者)和允許進入的訪客名單(群組)。所有者擁有最高的控制權,可以決定誰可以讀取、寫入或執行檔案。群組則是一組分享特定許可權的使用者。

  • 所有者: 對檔案或目錄具有完全控制權的使用者。
  • 群組: 分享特定許可權的一組使用者,像是社群住戶。

使用 chown 更改所有權

chown 命令就像房產過戶,可以更改檔案或目錄的所有者和群組。

chown [user]:[group] [file]

這個命令可以同時更改所有者和群組。若只想更改其中一個,可以省略另一者,但若省略使用者,群組名稱前必須加上冒號。

chown :[group] [file]  # 只更改群組,像是更改社群名稱

--reference 引數則像複製鑰匙,可以將一個檔案的許可權套用到另一個檔案。

chown --reference=file1 file2  # 將 file1 的許可權複製給 file2

-h-R 引數則分別用於處理符號連結和遞迴操作,就像處理捷徑和整個資料夾結構。

使用 chmod 修改許可權

許可權就像房子的門鎖,決定了誰可以進入和進行哪些操作。有三種基本許可權:讀取 (r)、寫入 (w) 和執行 (x)。

ls -l 命令可以顯示檔案的許可權,就像檢視門鎖狀態。

ls -l .bashrc
-rw-r--r-- 1 steve steve 6115 Feb 21 10:02 .bashrc

這表示檔案所有者 steve 可以讀取和寫入 .bashrc,而同群組的使用者和其他使用者只能讀取。

chmod 命令則像換鎖,可以修改許可權。可以使用數字或符號模式,例如 chmod 755 filenamechmod +x filename

  graph LR
    subgraph 使用者
        ur["讀取(r) - 4"] --> urw["讀取+寫入(rw) - 6"]
        uw["寫入(w) - 2"] --> urw
        urw --> urwx["讀取+寫入+執行(rwx) - 7"]
        ux["執行(x) - 1"] --> urx["讀取+執行(rx) - 5"]
        ux --> uwx["寫入+執行(wx) - 3"]
        urx --> urwx
        uwx --> urwx
    end
    subgraph 群組
        gr["讀取(r) - 4"] --> grw["讀取+寫入(rw) - 6"]
        gw["寫入(w) - 2"] --> grw
        grw --> grwx["讀取+寫入+執行(rwx) - 7"]
        gx["執行(x) - 1"] --> grx["讀取+執行(rx) - 5"]
        gx --> gwx["寫入+執行(wx) - 3"]
        grx --> grwx
        gwx --> grwx
    end
    subgraph 其他
        or["讀取(r) - 4"] --> orw["讀取+寫入(rw) - 6"]
        ow["寫入(w) - 2"] --> orw
        orw --> orwx["讀取+寫入+執行(rwx) - 7"]
        ox["執行(x) - 1"] --> orx["讀取+執行(rx) - 5"]
        ox --> owx["寫入+執行(wx) - 3"]
        orx --> orwx
        owx --> orwx
    end

上圖清楚地展示了檔案許可權的各種組合以及它們對應的數字表示,方便快速查詢和設定。例如,755 表示所有者擁有所有許可權,而群組和其他使用者只有讀取和執行許可權。

特殊許可權:SUID 和 SGID

SUID 和 SGID 是特殊許可權,允許使用者以檔案所有者或群組的許可權執行檔案,就像臨時借用鑰匙。

  • SUID: 以檔案所有者的身份執行檔案,例如使用 passwd 命令修改密碼。
  • SGID: 以檔案群組的成員身份執行檔案。

使用 chmod u+schmod g+s 可以設定 SUID 和 SGID。然而,這些許可權也可能被濫用,因此需要謹慎管理。

檔案連結:硬連結和符號連結

硬連結就像同一個檔案的多個名稱,就像一個人的多個綽號。刪除一個名稱不會影響檔案本身,除非所有名稱都被刪除。

符號連結則像捷徑,指向原始檔案。如果原始檔案被刪除,捷徑就會失效。

ln 命令用於建立硬連結,ln -s 用於建立符號連結。

Bash 程式設計基礎:變數、條件、迴圈和陣列

Bash 程式設計就像撰寫食譜,需要使用變數、條件、迴圈和陣列等元素來控制程式流程。

變數

變數就像容器,用於儲存資料。

my_variable="Hello, World!"

可以使用命令替換來儲存命令的輸出。

current_date=$(date)

(後續內容待補充,因字數限制,無法一次完成所有內容)

#!/usr/bin/env bash

# 變數宣告
name="玄貓"
age=30
city="台北"

# 使用 && (AND) 邏輯運算元
if [[ "$name" == "玄貓" && "$age" -ge 18 ]]; then
  echo "$name 已成年,居住在 $city。"
fi


# 使用 || (OR) 邏輯運算元
if [[ "$city" == "台北" || "$city" == "高雄" ]]; then
  echo "$name 居住在台灣主要城市。"
fi

這段程式碼示範了邏輯運算元的使用。第一個 if 條件句使用了 && 運算元,要求 $name 等於 “玄貓” $age 大於等於 18。第二個 if 條件句使用了 || 運算元,要求 $city 等於 “台北” “高雄”。

  graph LR
    AND[AND]
    B[B]
    E[E]
    OR[OR]
    A[條件1] -- AND --> B{條件2}
    B -- 結果 --> C(執行程式碼)
    D[條件3] -- OR --> E{條件4}
    E -- 結果 --> F(執行程式碼)

此流程圖展示了邏輯運算元 AND 和 OR 的運作方式。AND 運算元要求兩個條件都成立,才會執行程式碼;OR 運算元則只需其中一個條件成立,就會執行程式碼。

case 陳述式:簡化多重條件

當需要根據變數值進行多重條件判斷時,case 陳述式比巢狀的 if 陳述式更簡潔易讀。

#!/usr/bin/env bash

fruit="$1"

case "$fruit" in
  "apple")
    echo "蘋果"
    ;;
  "banana")
    echo "香蕉"
    ;;
  "cherry")
    echo "櫻桃"
    ;;
  *)  # 預設情況
    echo "未知水果"
    ;;
esac

這段程式碼根據 $fruit 的值判斷水果種類別。case 陳述式會依序比對 $fruit 與各個模式(例如 “apple”、“banana”),如果比對成功,則執行對應的程式碼區塊。*) 代表預設情況,如果沒有任何模式比對,則執行此區塊。;; 表示 case 選項的結束。

Bash 流程控制:迴圈的藝術

在 Bash 指令碼中,迴圈是自動化重複任務的利器。本文將探討 Bash 中兩種主要的迴圈結構:for 迴圈和 while 迴圈,並搭配實用案例與程式碼解密,幫助讀者掌握迴圈的精髓。

for 迴圈:迭代序列

for 迴圈用於迭代一個序列,例如一系列數字、檔案或字串。

#!/usr/bin/env bash

# 迭代數字序列
for i in {1..5}; do
  echo "數字:$i"
done

# 迭代檔案列表
for file in *.txt; do
  echo "檔案:$file"
done

# 迭代字串
for word in "apple" "banana" "cherry"; do
  echo "水果:$word"
done

以上程式碼示範了 for 迴圈的三種常見用法。第一個迴圈迭代數字 1 到 5,第二個迴圈迭代目前目錄下所有 .txt 檔案,第三個迴圈迭代指定的字串列表。

  graph LR
    B[B]
    A[初始化] --> B{條件判斷}
    B -- 成立 --> C[執行程式碼]
    C --> D[更新計數器]
    D --> B
    B -- 不成立 --> E[結束迴圈]

此流程圖展示了 for 迴圈的一般執行流程。首先初始化迴圈計數器,然後進行條件判斷。如果條件成立,則執行迴圈體內的程式碼,接著更新計數器,並再次進行條件判斷。如果條件不成立,則結束迴圈。

while 迴圈:條件控制

while 迴圈會在條件成立時重複執行程式碼區塊。

#!/usr/bin/env bash

count=0
while [ $count -lt 5 ]; do
  echo "計數:$count"
  count=$((count + 1))
done

這段程式碼示範了 while 迴圈的基本用法。迴圈會在 $count 小於 5 時重複執行,每次執行都會印出 $count 的值,並將 $count 加 1。

  graph LR
    B[B]
    A[初始化] --> B{條件判斷}
    B -- 成立 --> C[執行程式碼]
    C --> B
    B -- 不成立 --> D[結束迴圈]

此流程圖展示了 while 迴圈的執行流程。首先初始化迴圈變數,然後進行條件判斷。如果條件成立,則執行迴圈體內的程式碼,並再次進行條件判斷。如果條件不成立,則結束迴圈。

本文介紹了 Bash 流程控制中迴圈的兩種主要形式:for 迴圈和 while 迴圈。for 迴圈適用於迭代序列,而 while 迴圈適用於條件控制的重複執行。熟練運用迴圈是編寫高效 Bash 指令碼的關鍵。


 Shell Script 的世界中,流程控制就像交通指揮,引導程式碼的執行方向。我將帶您探索 Bash 流程控制的三大核心要素:條件判斷、迴圈和 `read` 指令,並分享我多年來的實戰經驗和獨到見解。

## 條件判斷:引導程式走向不同的分支

條件判斷是程式根據不同情況執行不同程式碼的機制,如同岔路口,根據條件選擇不同的路徑。Bash 提供 `if`  `case` 兩種主要的條件判斷語法。

### if 陳述式:根據條件執行程式碼

`if` 陳述式是最基本的條件判斷結構,它根據條件的真假決定是否執行特定程式碼塊。

```bash
if [ "$USER" == "steve" ]; then
  echo "Hello, Steve."
elif [ -f "/path/to/file.txt" ]; then
  echo "Hello, Steve. File exists."
elif [ "$USER" == "admin" ] || [ -f "/path/to/admin_file.txt" ]; then
  echo "Admin access granted or admin file exists."
else
  echo "Access denied or file missing."
fi

這段程式碼首先判斷使用者名稱是否為 “steve”。如果是,則印出 “Hello, Steve."。如果不是,則繼續判斷檔案 “/path/to/file.txt” 是否存在。若存在,則印出 “Hello, Steve. File exists."。接下來,判斷使用者名稱是否為 “admin” 或檔案 “/path/to/admin_file.txt” 是否存在。若其中一個條件成立,則印出 “Admin access granted or admin file exists."。最後,如果以上條件都不成立,則印出 “Access denied or file missing."。 我在設計這段程式碼時,特別考慮了多層條件判斷的邏輯清晰性,利用 elifelse 構建出易於理解和維護的程式碼結構。 && (AND) 表示兩個條件都必須成立,結果才為真。|| (OR) 表示只要其中一個條件成立,結果就為真。

  flowchart TB
    A("判斷 USER == steve") -- 是 --> B("echo \"Hello, Steve.\"")
    A -- 否 --> C("判斷 file.txt 存在")
    C -- 是 --> D("echo \"Hello, Steve. File exists.\"")
    C -- 否 --> E("判斷 USER == admin 或 admin_file.txt 存在")
    E -- 是 --> F("echo \"Admin access granted...\"")
    E -- 否 --> G("echo \"Access denied...\"")

Case 陳述式:簡化多重條件判斷

case 陳述式類別似其他程式語言中的 switch 陳述式,可以根據變數的值比對不同的模式,並執行相應的指令。

read -p "Enter your favorite fruit: " fruit

case "$fruit" in
  apple) echo "Apple pie is classic!" ;;
  banana) echo "Bananas are full of potassium." ;;
  orange) echo "Orange you glad I didn't say banana?" ;;
  *) echo "Hmm, I don't know much about that fruit." ;;
esac

read -p 用於提示使用者輸入,並將輸入儲存到變數 fruit 中。case 陳述式會根據 $fruit 的值比對不同的模式。*) 模式作為預設情況,類別似於 if 陳述式中的 else。 使用 case 陳述式可以有效避免多層 if-else 巢狀,提升程式碼的可讀性和 maintainability。

  graph TD
A[輸入 fruit] --> B{fruit == apple?};
B -- 是 --> C[輸出 Apple pie...];
B -- 否 --> D{fruit == banana?};
D -- 是 --> E[輸出 Bananas...];
D -- 否 --> F{fruit == orange?};
F -- 是 --> G[輸出 Orange...];
F -- 否 --> H[輸出 I don't know...];

迴圈:重複執行指令

Bash 提供 forwhile 迴圈來重複執行指令,如同工廠的生產線,自動化地重複執行任務。

For 迴圈:遍歷列表或範圍

for 迴圈適用於已知重複次數的情況,例如處理一組檔案或執行固定次數的任務。

for file in *.txt; do
  echo "Text file: $file"
done

這個迴圈會遍歷目前目錄中所有副檔名為 .txt 的檔案,並將檔名指定給變數 file,然後印出檔名。 在實際應用中,我經常使用 for 迴圈搭配 find 指令來處理特定型別的檔案,例如找出所有修改時間在一天內的 log 檔案並進行分析。

for n in {1..5}; do
  echo "Current value of n: $n"
done

這個迴圈會印出 1 到 5 的數字。 這個簡單的範例展示了 for 迴圈如何搭配序列使用。在實際應用中,我經常用這種方式來產生一系列的數字或字串,例如用於批次建立檔案或目錄。

While 迴圈:條件成立時重複執行

while 迴圈適用於根據條件重複執行的情況,例如讀取檔案直到檔案結束或監控系統資源直到達到特定閾值。

count=5
while [ "$count" -gt 0 ]; do
  echo "Countdown: $count"
  count=$((count - 1))
done

這個迴圈會印出 5 到 1 的倒數計時。 while 迴圈的關鍵在於條件判斷,只要條件成立,迴圈就會一直執行。 我在設計 while 迴圈時,會特別注意避免無限迴圈的產生,例如設定合理的終止條件或加入計數器來限制迴圈次數。

Bash read 指令詳解

Bash 的 read 指令用於從標準輸入讀取一行文字,並將其存入一個或多個變數中,如同程式與使用者互動的橋樑。

  • -p prompt: 顯示提示訊息,讓使用者知道需要輸入什麼資訊。
  • -t timeout: 設定逾時時間,避免程式無限期等待使用者輸入。
  • -s: 靜默模式,不顯示輸入內容,適用於密碼輸入等場景。
  • -r: 原始輸入模式,不將反斜線視為跳脫字元,保留輸入的原始格式。
  • -a array: 將輸入讀入陣列,方便處理多個輸入值。
  • -n nchars: 只讀取指定數量的字元,適用於讀取固定長度的輸入。
  • -d delimiter: 使用指定的字元作為分隔符號,而不是換行符號,可以根據特定分隔符號分割輸入字串。

我經常使用 read 指令結合 ifcase 陳述式來設計互動式指令碼,例如根據使用者輸入的不同選項執行不同的操作。

本文介紹了 Bash 流程控制的核心概念,包含條件判斷、迴圈,以及 read 指令的用法。透過這些工具,您可以撰寫更具彈性與效率的 Bash script,如同一位經驗豐富的樂隊指揮,精準地控制程式碼的執行流程。 我鼓勵您在實踐中不斷探索和應用這些技巧,提升您的 Shell Script 程式設計能力。