在Linux中以其他用户身份執行命令或腳本是一個常見的需求,最近工作中碰到了這個需求,在這裏簡單總結一下.假如我們在root用户下想以其它用户(例如oracle,mysql)身份執行一些腳本或命令,那麼有哪一些方法呢?
su命令(switch user)
su命令的使用方式有兩種, 如下所示:
- 切換用户只執行一條命令的可以用:
su - oracle -c shell_command
-c "<命令>": -c 參數告訴 su執行完後面的命令後就退出,而不是啓動一個新的交互式shell。
- 切換用户執行一個shell腳本
su - oracle -s /bin/bash oracle_start.sh
需要注意的是, 這裏使用su切換用户有兩種方式,即帶"-"與不帶"-"的方式, 如下所示:
su oracle -c <shell_command>
或
su - oracle -c <shell_command>
兩者的區別
su <用户名> (不帶橫槓)
這是非登錄式切換。
- 行為:它會切換當前的用户身份(UID 和 GID),但不會改變當前的shell環境。
- 環境變量:大部分環境變量(如 PATH, HOME, USER, PS1 等)仍然保持為切換之前的用户的環境變量。
- 工作目錄:當前的工作目錄(PWD)也不會改變。
- 本質:你只是 “穿上了另一個用户的馬甲”,但所處的 “房間”(環境)還是原來的。
適用場景:當你需要臨時以另一個用户身份執行一個或幾個命令,並且希望利用當前的環境(比如當前目錄、已經設置好的變量)時。
缺點: 如果是非root用户,需要知道目標用户的密碼. 不適合自動化腳本.
su - <用户名> (帶橫槓)
這是登錄式切換。
- 行為:它會模擬一個完整的、全新的用户登錄流程。
- 環境變量:它會加載目標用户(例如oracle)的所有環境變量配置文件(如 /etc/profile, ~/.bash_profile, ~/.bashrc 等),並使用這些變量來構建一個全新的環境。
- 工作目錄:工作目錄會自動切換到目標用户的主目錄(/home/oracle)。
- 本質:你完全"進入了另一個用户的房間",使用的是它的所有配置和環境。
適用場景:當你需要完全進入另一個用户的角色,執行一系列操作,或者運行依賴於該用户特定環境變量的腳本時。這是更常見和推薦的用法。
sudo 命令
sudo命令,它的作用是“excute a command as another user",默認為root用户,可以用 -u 指定用户名
你有目標用户的 sudo 權限,且只想臨時以該用户身份運行腳本。
sudo -u <用户名> <命令或腳本>
與 su 類似,sudo 也可以用來獲取一個目標用户的交互式 shell。命令格式:
sudo -u <用户名> -i
# 或者
sudo -u <用户名> -s
-i (模擬初始登錄,--login):行為與 su - <用户名> 非常相似,會加載目標用户的環境變量並切換到其主目錄。
-s (啓動 shell, --shell):啓動一個 shell,但不一定會完全加載登錄環境,行為可能略有不同。通常推薦使用 -i。
不會加載目標用户的完整環境(如 .bashrc),但會加載其基本環境變量(如 $HOME)。
優點:
- 安全性高:執行命令時驗證的是執行者自己的密碼,而不是目標用户的密碼。
- 權限控制精細:通過 /etc/sudoers 可以精確控制哪個用户能以哪個身份執行哪些命令。
- 易於審計:所有 sudo 操作都會被記錄在系統日誌中(通常在 /var/log/auth.log 或 /var/log/secure)。
缺點:
- 需要管理員預先配置 /etc/sudoers 文件,對於臨時一次性操作可能略顯繁瑣。
- 這些方式也不適合在腳本中使用.
runuser 命令
runuser 是一個相對小眾但非常有用的命令,它與 su 類似,但設計初衷是讓 root 用户在切換到其他用户身份時無需輸入密碼,並且不通過PAM(Pluggable Authentication Modules)進行認證。這使得它比su更快,並且更適合在腳本中使用。
runuser -u <用户名> -- <命令或腳本路徑>
優點:
- root 用户使用時無需密碼,非常適合在自動化腳本(如 cron, systemd service)中使用。
- 性能比 su 稍好。
缺點:
- 功能不如 sudo 強大和靈活。
- 通常只有 root 用户可以使用 runuser 切換到其他用户。