Linux 的 su
指令可以用不同的使用者或群組來執行指定的指令,本篇將介紹 su
指令的用法,並提供常見的使用範例。
Linux 中的
su
指令可以讓一般的使用者以其他使用者(與群組)的身分來執行指定的程式,也就是透過 su
切換為 root
管理者(或其他使用者)的工作環境,執行各種工作。
su
指令是設計給一般使用者使用的指令,對於系統管理者而言建議採用 runuser
這個指令,此指令不需要認證流程,而且提供獨立的 PAM 設定;若連 PAM session 都不需要的話,則建議採用 setpriv
指令。切換為 root
管理者
若執行 su
指令不加任何參數,則 su
預設會切換為 root
管理者:
# 切換為 root 管理者
su
執行 su
之後,會需要輸入目標使用者的密碼,若要切換為 root
管理者,就必須輸入 root
管理者帳號的密碼。
若是允許使用 sudo
的使用者,可以使用 sudo
來執行 su
,這樣就可以在認證時輸入自己的密碼:
# 切換為 root 管理者(輸入自己的密碼)
sudo su
切換為指定使用者
若要切換為指定的 Linux 使用者,可以在執行 su
指令時在參數中指定帳號名稱:
# 切換為 myuser 使用者
su myuser
若是允許使用 sudo
的使用者,同樣可以搭配 sudo
來執行 su
:
# 切換為 myuser 使用者(輸入自己的密碼)
sudo su myuser
登入 Shell 環境
在使用 su
切換使用者時,預設只會設定 HOME
與 SHELL
兩個環境變數(若不是切換為 root
,則會多設定 USER
與 LOGNAME
兩個環境變數),其餘既有的環境變數都會留存在新的 shell 環境中。
除非有特別原因需要保原帳號 shell 中的環境變數,否則一般在使用 su
切換使用者時,建議都加上 -l
或 --login
參數,讓 su
在切換使用者之後,直接啟動一個類似新登入的 shell 環境:
# 切換為 root(啟動類似新登入的 shell 環境) su -l # 切換為 myuser(啟動類似新登入的 shell 環境) su -l myuser
進入類似新登入的 shell 環境之後,會有以下幾個改變:
- 清除除了
TERM
之外的變數,若需要保留特定環境變數,可以使用--whitelist-environment
參數指定要保留的變數。 - 初始化
HOME
、SHELL
、USER
、LOGNAME
與PATH
環境變數。 - 將目前工作目錄切換至使用者家目錄。
- 設定 shell 的
argv[0]
為-
,讓其成為一個 login shell。
su
的 -l
與 --login
參數還有一個更精簡的寫法,直接簡寫為 -
:
# 切換為 root(啟動類似新登入的 shell 環境) su - # 切換為 myuser(啟動類似新登入的 shell 環境) su - myuser
這種精簡寫法在實務上非常常見。
指定執行指令
若要以其他使用者的權限執行單一指令,可以使用 -c
或 --command
參數指定要執行的指令:
# 以 root 管理者權限執行 ls 指令 su - -c 'ls -l ~' # 以 myuser 使用者權限執行 ls 指令 su - myuser -c 'ls -l ~'
保留所有環境變數
若要讓 su
在切換使用者時,保留所有環境變數(亦即不設定 HOME
、SHELL
、USER
與 LOGNAME
這幾個變數),可以加上 -m
、-p
或 --preserve-environment
參數:
# 切換為 myuser 使用者(保留所有環境變數) su -p myuser
當 su
有加入 --login
參數時,會忽略 --preserve-environment
參數,兩者無法合併使用。
指定 Shell
su
的 -s
或 --shell
參數可以指定要使用的 shell:
# 切換為 myuser 使用者(指定使用 /bin/tcsh) su - -s /bin/tcsh myuser
實際上 su
要採用哪一種 shell 會依據以下規則與順序:
--shell
參數所指定的 shell。- 若有加上
--preserve-environment
參數,則採用SHELL
環境變數所指定的 shell。 passwd
項目中所記載的 shell。- 若沒有任何 shell 可用,則採用
/bin/sh
。
若目標使用者的預設 shell 屬於 restricted shell(沒有列在 /etc/shells
清單中),則 --shell
參數與 SHELL
環境變數都會被忽略(若以 root
呼叫執行則沒有此限制)。
環境變數白名單
使用 --login
參數啟動一個類似新登入的 shell 環境時,會將 TERM
之外的環境變數清空,若需要保留特定環境變數,可以使用 --whitelist-environment
參數指定要保留的變數,若要保留多個環境變數,則可用逗點分隔:
# 切換為 myuser 使用者(保留 MY_ENV1 與 MY_ENV2 環境變數) su - -w MY_ENV1,MY_ENV2 myuser
禁止 sudo su
通常在安全層級較高的 Linux 系統上,可能會禁止使用者以 sudo
執行 su
,這個規則可以在 sudo
的 /etc/sudoers
設定檔中設定,設定方式就是在原本可執行指令中加上 !/bin/su
,將 su
指令排除:
# 允許 myuser 以 sudo 執行 /bin/su 以外的指令 myuser ALL = ALL, !/bin/su # 允許 admin 群組以 sudo 執行 /bin/su 以外的指令 %admin ALL=(ALL) ALL, !/bin/su