Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux su 命令深度解析:切換用戶身份的核心機制與實戰案例

編輯:關於 Linux

在 Linux 系統管理中,su(Switch User)命令是實現用戶身份切換的基石工具。它不僅能讓普通用戶提權為超級用戶,也能在不同普通用戶間切換。然而,許多初學者對其底層運作機制存在誤解:執行 su 後,原用戶的會話去哪了?為什麼無法直接刪除原用戶?本文將從進程模型、用戶 ID 概念、實戰案例三個維度,徹底講透 su 的本質。

核心概念:實際用戶 ID 與有效用戶 ID

要理解 su,必須先搞清 Unix/Linux 進程的兩個關鍵屬性:

  • 實際用戶 ID (Real UID):標識進程的「創建者身份」。例如 root 用戶(UID 0)啟動一個進程,該進程的 Real UID 即為 0。
  • 有效用戶 ID (Effective UID):決定進程「當前擁有的權限」。通過 Setuid 機制(文件權限中的 s 位),程序執行時可暫時獲得文件擁有者的權限。

su 命令本身擁有 Setuid 權限(-rwsr-xr-x),屬於 root。當普通用戶執行 su 時,進程的 Real UID 仍是該用戶,但 Effective UID 變為 0(root),從而獲得特權操作能力。

進程樹視角:父子關係而非替換

這是最關鍵的認知點:su 不會終結原有 Shell 進程,而是創建一個新的子 Shell 進程。

當 root 執行 su - user1 時:

  1. 當前 root Shell(PID 2939)調用 fork() 創建子進程。
  2. 子進程執行 exec() 載入 su 程序,驗證密碼通過後,再次 exec() 載入目標用戶的 Shell(如 bash)。
  3. 此時進程樹呈現:root bash (2939) → su (2958) → user1 bash (2966)。

原 root Shell 進程(2939)依然存在,只是處於等待狀態。這解釋了為什麼執行 exit 或 Ctrl+D 會「返回」原用戶——實際上只是結束子 Shell,控制權交還給父 Shell。

實戰驗證:who am i vs whoami

兩個命令的區別完美印證了上述機制:

  • who am i:查詢 utmp 記錄,顯示登錄會話的原始用戶(Real UID 對應的登錄信息)。
  • whoami:顯示當前進程的有效用戶名(Effective UID)。

案例演示:

root@host:~# who am i
root     pts/0  2023-10-01 10:00 (:0.0)
root@host:~# whoami
root
root@host:~# su - user1
user1@host:~$ who am i
root     pts/0  2023-10-01 10:00 (:0.0)   <-- 登錄會話仍屬 root
user1@host:~$ whoami
user1                                    <-- 當前有效身份為 user1

進程列表(ps -ef)清晰可見父子鏈路:

root   2939  2935  0 10:00 pts/0  00:00:00 bash
user1  2958  2939  0 10:01 pts/0  00:00:00 su - user1
user1  2966  2958  0 10:01 pts/0  00:00:00 -bash

常見問題解答

Q: 執行 su 後嘗試刪除原用戶,提示 "user logged in",為什麼?

A: 因為原用戶的登錄 Shell 進程(父進程)仍在運行,系統檢測到該用戶仍有活躍會話。必須先 exit 退出子 Shell,或殺掉父進程(kill -9 父PID),才能釋放會話。

Q: su 和 su - 有何區別?

A: su -(或 su -l)會啟動「登錄 Shell」,重新讀取目標用戶的環境變量(PATH、HOME 等),切換工作目錄至其家目錄;而單純 su 保留當前環境,僅切換有效 UID。

總結

su 的本質是利用 Setuid 機制創建特權子進程,而非替換當前會話。理解「父子進程」、「Real UID vs Effective UID」、「登錄 Shell vs 非登錄 Shell」這三組概念,即可洞悉用戶切換的所有行為表現。掌握這一機制,不僅能解決操作疑惑,更是掌握 Linux 權限模型的關鍵一環。

Linux su 命令示意圖

Copyright © Windows教程網 All Rights Reserved