萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux su 指令深度解析:切換身份、進程關係與 whoami/who am i 差異

su (Substitute User) 是切換使用者身份的經典指令。許多人誤以為 su - 只是「帶環境變數切換」,實際上它涉及 **進程樹結構、Real UID / Effective UID 分離、Shell 父子關係**。本文透過進程視角深度剖析 su 運作機制,並釐清 whoami 與 who am i 的本質差異。

核心機制:Real UID vs Effective UID

  • Real UID (RUID):進程建立者的真實身份 (登入者)。
  • Effective UID (EUID):進程**當前執行權限**的身份。
  • su 二進制檔擁有 **Setuid 位 (rwsr-xr-x)**,執行時 EUID 變為目標使用者 (通常 root=0),RUID 不變。

進程樹視角:su 會建立新 Shell 子進程

# 原始狀態:root 登入,PID 2939 (bash)
root@host:~# ps -o pid,ppid,cmd
  PID  PPID CMD
 2939  2935 bash

# su - yunhw
yunhw@host:~$ ps -o pid,ppid,cmd
  PID  PPID CMD
 2939  2935 bash                 # root 原本的 shell (父進程)
 2958  2939 su - yunhw           # su 進程
 2966  2958 -su                  # yunhw 的新 login shell (子進程)

# who am i  顯示 RUID (登入者) → root
# whoami    顯示 EUID (當前權限) → yunhw

結論:su **不會結束原使用者的 Shell**,只是在其下 fork 新 Shell。輸入 exit 或 Ctrl+D 只會結束子 Shell,返回父 Shell。若殺死父進程 (kill -9 2939),整個終端機登出。

su 參數差異

whoami vs who am i 本質差異

whoami          # 讀取 EUID → geteuid() 系統呼叫
who am i        # 讀取 utmp/wtmp 記錄的登入資訊 → RUID (終端機擁有者)

別名 whoami 實為 id -un;who am i 等同 who -m。

安全提醒

  • 限制 su 使用者:編輯 /etc/pam.d/su,啟用 auth required pam_wheel.so use_uid,僅允許 wheel 群組成員 su root。
  • 審計:/var/log/secure / /var/log/auth.log 記錄所有 su 嘗試。
  • 優先使用 sudo:單一指令提權、留存完整審計軌跡、無需共享 root 密碼。

su 指令進程樹示意圖

copyright © 萬盛學電腦網 all rights reserved
指令環境變數工作目錄Shell 類型適用場景
su user保留呼叫者環境不變非登入 Shell臨時以該身份執行單一指令
su - user
su -l user
重置為目標使用者完整環境切換至目標家目錄登入 Shell (讀取 /etc/profile, ~/.bash_profile)完整切換身份、執行該使用者慣用環境