在 Linux 系統管理中,掌握 sudo、檔案許可權以及使用者環境設定至關重要。本文將探討如何設定 sudoer,使用 chmod 管理檔案許可權,並透過 .bashrc 和 .bash_profile 等檔案自訂使用者經驗。首先,我們會介紹如何安全地編輯 sudoers 檔案,賦予特定使用者執行特定指令的許可權,接著說明檔案許可權的數值與符號表示法,以及如何使用 chmod 命令修改許可權。最後,將會探討如何設定 umask 值,並利用 .bashrc 和 .bash_profile 等個人化檔案自訂 Shell 環境,例如設定別名、修改命令提示符等,以提升工作效率。
建立 Sudoer
您必須具有 root 使用者存取許可權才能編輯 /etc/sudoers 檔案並使用 visudo 公用程式。visudo 的唯一目的是編輯 /etc/sudoers 檔案。不應直接使用 vi、Emacs 或任何其他文字編輯器編輯它。要編輯 /etc/sudoers 檔案,請以 root 身分發出 visudo 指令,不加任何選項:
# visudo
/etc/sudoers 檔案是一個簡單的文字檔案,描述了可以使用 root 或其他使用者許可權的使用者、群組和指令。可以建立一個具有非常有限許可權的 sudoer(例如,以 root 身分執行單一指令),也可以建立一個具有許可許可權的 sudoer(例如,無需輸入密碼即可執行任何指令作為 root)。我傾向於組態兩者的混合,即建立可以執行任何指令作為 root 但必須提供密碼的 sudoer。
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
khess ALL=(ALL) ALL
內容解密:
root ALL=(ALL) ALL:允許 root 使用者在任何地方執行任何指令。khess ALL=(ALL) ALL:將 root 的設定複製並替換為 khess 使用者帳戶,使其能夠以 root 身分執行任何指令。- 這種設定會立即生效。
讀取和修改許可權
本文將教您如何讀取和修改檔案許可權。您必須瞭解檔案許可權,以便適當地設定和修改對檔案和目錄的存取。瞭解檔案許可權有助於在使用者無法存取檔案或目錄時進行故障排除。
讀取、寫入和執行
三種 Linux 檔案許可權或模式分別是讀取(r)、寫入(w)和執行(x):
- 讀取:檢視檔案或列出目錄內容。
- 寫入:建立和修改檔案,或在目錄中複製、移動和建立檔案。
- 執行:執行/執行檔案或進入目錄。
在 Linux 中,檔案是否可執行取決於其許可權,而非檔名(如 MS Windows 中的 .exe 檔案等)。
使用 rwx 指定許可權的方式稱為符號模式。符號模式是識別許可權的兩種方法之一。另一種是數字模式,它為每個 rwx 許可權分配值。
數值許可權值
每個許可權模式都有其自己的數值。這個捷徑方法使系統管理員更容易設定許可權。
- 讀取 許可權的值為 4。
- 寫入 許可權的值為 2。
- 執行 許可權的值為 1。
許可權值範圍從 0 到 7。0 表示無許可權。下表總結了這個概念。
| 許可權模式 | 數值 | |
|
| | 讀取 | 4 | | 寫入 | 2 | | 執行 | 1 | | 無 | 0 |
內容解密:
- 每個許可權模式都有對應的數值,用於簡化許可權設定。
- 這種方法使系統管理員能夠快速設定所需的許可權組合。
群組許可權
有四種檔案許可權適用於使用者的群組:使用者、群組、其他人和所有人。「所有人」群組包括使用者、群組和其他人。這是一種全域分配檔案或目錄許可權的簡便方法。每個群組都有簡稱,如下表所示。
| 群組 | 值 | |
|
-| | 使用者 | u | | 群組 | g | | 其他人 | o | | 所有人 | a |
內容解密:
- 可以為每個群組個別設定或同時為所有群組設定許可權。
- 每個 Linux 檔案和目錄都為每個群組分配了讀取、寫入和執行許可權。
將許可權匯聚
在本小節中,我將建立一個簡單但完整的檔案安全系統,展示我們討論過的所有許可權如何協同工作。本文的範例將使用檔案 file.txt。如果您想跟隨範例,請發出以下指令來設定您的檔案:
$ touch file.txt
接下來,使用 -l(長格式)選項發出 ls 命令以檢視檔案許可權:
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 19 17:35 file.txt
圖示說明瞭位置及其指定(以粗體顯示)。第一個位置用於特殊檔案型別,例如在該位置具有 d 的目錄(dr-xr-xr-w)。普通檔案具有 -(-rw-rw-rw-)以顯示它們不是目錄或其他特殊檔案。接下來的九個位置是使用者、群組和其他人的許可權位置。
特殊字元位置和使用者、群組及其他人的許可權位置
此圖示展示了不同部分在檔案許可權中的位置關係。
數值許可權值和使用者、群組及其他人的指定
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Linux 許可權管理與使用者環境設定
package "Linux Shell 操作" {
package "檔案操作" {
component [ls/cd/pwd] as nav
component [cp/mv/rm] as file
component [chmod/chown] as perm
}
package "文字處理" {
component [grep] as grep
component [sed] as sed
component [awk] as awk
component [cut/sort/uniq] as text
}
package "系統管理" {
component [ps/top/htop] as process
component [systemctl] as service
component [cron] as cron
}
package "管線與重導向" {
component [| 管線] as pipe
component [> >> 輸出] as redirect
component [$() 命令替換] as subst
}
}
nav --> file : 檔案管理
file --> perm : 權限設定
grep --> sed : 過濾處理
sed --> awk : 欄位處理
pipe --> redirect : 串接命令
process --> service : 服務管理
note right of pipe
命令1 | 命令2
前者輸出作為後者輸入
end note
@enduml此圖示說明瞭不同部分的名稱及其對應的符號表示。
內容解密:
- 圖表顯示了 Linux 中檔案或目錄的詳細資訊結構。
- 第一欄代表特殊檔案型別,如目錄或符號連結等。
- 後面九個字元分成三組,分別代表擁有者、所屬群組和其他使用者的讀、寫、執行許可權。
檔案許可權管理與變更
在Linux系統中,檔案許可權的管理是系統安全的重要組成部分。檔案許可權決定了使用者、群組和其他人對檔案的存取能力,包括讀取、寫入和執行。本文將介紹如何使用chmod命令變更檔案許可權,以及不同許可權設定的影響。
數值許可權表示法
檔案許可權可以用數值表示,每個許可權對應一個數值:讀取(r)= 4,寫入(w)= 2,執行(x)= 1。將這些數值加總可以得到一個三位數的許可權程式碼。例如,-rw-rw-r--對應的數值許可權是664,其中每個數字的計算方式如下:
- 使用者(u):6 = 4(讀取)+ 2(寫入)
- 群組(g):6 = 4(讀取)+ 2(寫入)
- 其他人(o):4 = 4(讀取)
同樣地,如果一個檔案的許可權是750,其對應的符號表示法是`-rwxr-x
`,表示其他人對該檔案沒有任何許可權。
使用chmod命令變更檔案許可權
chmod命令用於變更檔案或目錄的許可權。它支援兩種主要的表示法:符號模式和數值模式。
符號模式
在符號模式下,可以使用字母來表示不同的群組和許可權:
u代表使用者(user)g代表群組(group)o代表其他人(other)a代表所有人(all)
例如,若要移除其他人對檔案file.txt的讀取許可權,可以使用以下命令:
$ chmod o-r file.txt
若要為自己新增執行許可權,可以使用:
$ chmod u+x file.sh
也可以在同一命令中新增或移除多個許可權:
$ chmod ug+x,o+w file.txt # 為使用者和群組新增執行許可權,為其他人新增寫入許可權
$ chmod a-x,o-rw file.txt # 移除所有人的執行許可權,移除其他人的讀取和寫入許可權
數值模式
使用數值模式時,直接指定三位數的許可權程式碼。例如,若要設定檔案許可權為`-rwxr-x
`,可以使用:
$ chmod 750 file.txt
重要注意事項
- 明確指定目標群組:在使用
chmod命令時,務必明確指定要變更許可權的群組,避免意外地變更了不該變更的許可權。 - 安全性考量:過度放寬許可權,尤其是對其他人開放寫入或執行許可權,可能會帶來安全風險。
- 執行檔案:若要執行一個不在PATH中的可執行檔案或指令碼,需要指定明確的路徑,如
./script_name.sh。
數值模式下的許可權變更
為了便於理解和比較,本文中的範例重複了前一節的內容,但這裡使用的是數值模式(而非符號模式)來變更許可權。
建立新檔案並檢查其許可權
首先,清除之前的 file.txt,然後建立一個新的 file.txt 並檢查其許可權:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 21:12 file.txt
使用數值方法移除其他使用者的讀取許可權
首先,計算目前檔案的許可權值,然後決定新的許可權值。目前檔案的許可權值是 664,我們希望將其改為 660:
$ chmod 660 file.txt
$ ls -l
-rw-rw
---
-. 1 khess khess 0 Jun 29 20:12 file.txt
程式碼解析:
$ chmod 660 file.txt
這行指令使用 chmod 命令變更 file.txt 的許可權。數字 660 代表新的許可權設定:
- 第一位
6代表檔案擁有者的許可權:rw-(讀取和寫入,但沒有執行許可權) - 第二位
6代表所屬群組的許可權:rw-(讀取和寫入,但沒有執行許可權) - 第三位
0代表其他使用者的許可權:`
`(沒有任何許可權)
使用數值方法變更許可權
與符號模式不同,數值方法不需要新增或刪除許可權,而是直接重新賦予檔案新的許可權值。以下範例展示瞭如何使用數值方法將執行許可權新增給所有使用者,並移除其他使用者的讀取許可權:
$ rm file.txt
$ touch file.txt
$ ls -l
-rw-rw-r--. 1 khess khess 0 Jun 29 20:13 file.txt
$ chmod 771 file.txt
$ ls -l
-rwxrwx--x. 1 khess khess 0 Jun 29 20:23 file.txt
程式碼解析:
$ chmod 771 file.txt
這裡的 771 代表新的許可權設定:
- 第一位
7代表檔案擁有者的許可權:rwx(讀取、寫入和執行) - 第二位
7代表所屬群組的許可權:rwx(讀取、寫入和執行) - 第三位
1代表其他使用者的許可權:--x(只有執行許可權)
umask 與預設許可權
當你建立新檔案時,它會被賦予特定的預設許可權,例如 664 或 -rw-rw-r--。對於 root 使用者,預設許可權是 644 或 -rw-r--r--。這是因為一個名為 umask(使用者檔案建立遮罩)的全域設定會過濾某些許可權。
檢視 umask 值
$ umask
0002
程式碼解析:
$ umask
這條指令顯示目前使用者的 umask 值。輸出 0002 表示遮罩值為 002,它對應於使用者、群組和其他使用者的 rwx 許可權。
自訂 umask 值
你可以透過 umask 命令變更目前登入會話的 umask 值:
$ umask 006
$ touch test.txt
$ ls -l test.txt
-rw-rw
---
-. 1 khess khess 0 Jun 29 22:16 test.txt
程式碼解析:
$ umask 006
這行指令將 umask 值變更為 006,表示新的檔案將被賦予 660 的許可權。
若要使這個變更永久生效,可以將新的 umask 值附加到家目錄中的 .bashrc 檔案末尾:
$ echo umask 006 >> ~/.bashrc
$ source .bashrc
$ umask
0006
自訂使用者經驗
本章節將介紹如何為自己和使用者自訂使用者經驗。系統管理員經常需要對使用者的環境進行微調,或是對所有使用者設定預設環境。只要這些變更不會損害系統安全或違反公司政策,就可以進行自訂以滿足使用者的需求和工作流程。
修改家目錄選項
每個使用者的家目錄中都有一些隱藏檔案控制著使用者的環境。大多數 Linux 使用者使用 bash,因此本章節將重點介紹 bash 的預設和自訂使用者環境。
相關檔案
.bashrc.bash_profile
這些檔案可以用來自訂使用者的 shell 環境,例如設定別名、環境變數等。系統管理員可以修改這些檔案來為所有使用者建立特定的環境。
Linux 使用者環境自訂的關鍵檔案與注意事項
當使用者登入 Linux 系統時,一系列檔案會自動執行以建立使用者環境。瞭解這些檔案的作用和如何正確修改它們對於系統管理員和使用者來說至關重要。
登入與非登入 Shell 的區別
在討論這些檔案之前,需要了解登入 Shell 和非登入 Shell 的區別。登入 Shell 是指使用者直接登入系統時啟動的 Shell,而非登入 Shell 則是在已登入的 Shell 中再啟動一個新的 Shell。
登入 Shell 的特點
- 使用者需要輸入使用者名稱和密碼或使用 SSH 金鑰進行身份驗證。
$SHLVL變數的值為 1。
非登入 Shell 的特點
- 不需要重新輸入使用者名稱和密碼。
$SHLVL變數的值會遞增,表示當前 Shell 的層級。
重要的環境設定檔案
/etc/bashrc
- 這是一個全域的個人化設定檔案,對所有使用者的登入 Shell 和非登入 Shell 都有效。
- 提供函式和別名給 Bash Shell。
- 不建議直接編輯 此檔案,除非你清楚自己在做什麼。建議在
/etc/profile.d/目錄下建立自定義的 Shell 指令碼。
/etc/profile
- 這是另一個全域的啟動檔案,為所有使用者提供通用的變數、路徑和其他設定。
- 同樣,不建議直接編輯 此檔案。建議在
/etc/profile.d/目錄下建立自定義的 Shell 指令碼,或是在使用者的家目錄下修改個人化設定檔案。 - 這個檔案會呼叫
/etc/bashrc,因此/etc/bashrc會被執行兩次。
.bashrc
- 位於使用者的家目錄下,是一個隱藏檔案。
- 用於設定和使用者的特定環境變數、函式和別名。
- 在全域設定檔案執行後執行,也會在非登入 Shell 中執行。
- 可以用來修改
PATH環境變數,以確保登入和非登入 Shell 的行為一致。
修改環境設定檔案的注意事項
- 謹慎選擇在啟動檔案中新增的程式、指令碼和訊息,因為錯誤的組態可能會導致登入失敗或延遲。
- 使用者應該被告知相關的風險。
- 對全域設定檔案的修改可能會被使用者的個人化設定檔案覆寫。
範例:如何自訂 .bashrc 檔案
# .bashrc
# 引入全域定義
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# 使用者特定的環境設定
if ! [[ "$PATH" =~ "$HOME/.local/bin:$HOME/bin:" ]]; then
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
fi
export PATH
# 使用者特定的別名和函式
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
內容解密:
- 引入全域定義:檢查
/etc/bashrc是否存在,如果存在,則引入其中的定義。 - 修改
PATH環境變數:檢查PATH中是否包含$HOME/.local/bin和$HOME/bin,如果沒有,則新增它們到PATH的前面,並匯出PATH。 - 定義別名:為
rm、cp和mv命令定義別名,使它們在執行時帶有-i選項,提示使用者確認操作。
自訂Shell環境與使用者經驗
在Linux系統中,自訂Shell環境是提升工作效率與個人化體驗的重要步驟。透過修改特定的個人化檔案,使用者可以根據自己的需求調整Shell的行為、外觀及功能。
使用別名(Aliases)提升效率
別名是簡化常用命令或選項的有效方法。例如,建立一個名為ll的別名來執行ls -l命令,以獲得詳細的檔案列表:
alias ll='ls -l'
內容解密:
alias:用於建立別名的命令。ll='ls -l':將ll定義為ls -l的別名,當輸入ll時,Shell會執行ls -l。- 這種方式特別適合於頻繁使用的命令,能夠大幅提升操作效率。
使用者也可以在每次登入時自動載入別名,或臨時在當前會話中定義別名。許多使用者會將自訂的別名和其他設定存放在.bashrc檔案中,以確保無論是登入還是非登入Shell,都能一致地套用這些自訂設定。
重要的個人化檔案
.bashrc:在互動式非登入Shell中執行,用於定義別名、函式和其他互動式Shell的設定。.bash_profile:在互動式登入Shell中執行,用於設定特定於使用者的環境變數和啟動程式。它通常會參照.bashrc以確保設定的一致性。# .bash_profile範例 if [ -f ~/.bashrc ]; then . ~/.bashrc fi內容解密:
if [ -f ~/.bashrc ]; then:檢查.bashrc檔案是否存在。. ~/.bashrc:如果檔案存在,則執行它,載入別名和函式。- 這種設計確保了無論是登入還是非登入Shell,都能套用相同的設定。
.bash_logout:在使用者登出時執行,可用於清理暫存檔或記錄使用時間。
自訂命令提示符(Prompt)
預設的命令提示符通常顯示使用者的名稱、主機名和目前的工作目錄。使用者可以透過修改PS1環境變數來自訂提示符的外觀。例如:
PS1="[\u@\h \W]\\$ "
內容解密:
\u:代表目前使用者的名稱。\h:代表主機名。\W:代表目前工作目錄的基名。\\$:如果目前使用者是root,則顯示#,否則顯示$。
Bash支援多種特殊的跳脫字元,讓使用者能夠自訂提示符的格式,如下表所示:
| 特殊字元 | 描述 |
|---|---|
\a | ASCII響鈴字元(07) |
\d | 日期,格式為"Weekday Month Date" |
\h | 主機名,直到第一個. |
\u | 目前使用者的名稱 |
\w | 目前工作目錄,$HOME以波浪符號(~)縮寫 |
\! | 此命令的歷史編號 |