Categories: Linux

Linux 使用 su 指令切換使用者教學與範例

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 切換使用者時,預設只會設定 HOMESHELL 兩個環境變數(若不是切換為 root,則會多設定 USERLOGNAME 兩個環境變數),其餘既有的環境變數都會留存在新的 shell 環境中。

除非有特別原因需要保原帳號 shell 中的環境變數,否則一般在使用 su 切換使用者時,建議都加上 -l--login 參數,讓 su 在切換使用者之後,直接啟動一個類似新登入的 shell 環境:

# 切換為 root(啟動類似新登入的 shell 環境)
su -l

# 切換為 myuser(啟動類似新登入的 shell 環境)
su -l myuser

進入類似新登入的 shell 環境之後,會有以下幾個改變:

  • 清除除了 TERM 之外的變數,若需要保留特定環境變數,可以使用 --whitelist-environment 參數指定要保留的變數。
  • 初始化 HOMESHELLUSERLOGNAMEPATH 環境變數。
  • 將目前工作目錄切換至使用者家目錄。
  • 設定 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 在切換使用者時,保留所有環境變數(亦即不設定 HOMESHELLUSERLOGNAME 這幾個變數),可以加上 -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 會依據以下規則與順序:

  1. --shell 參數所指定的 shell。
  2. 若有加上 --preserve-environment 參數,則採用 SHELL 環境變數所指定的 shell。
  3. passwd 項目中所記載的 shell。
  4. 若沒有任何 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

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago