• 跳至主要導覽
  • 跳至主要內容
  • 跳至主要資訊欄
Office 指南

Office 指南

辦公室工作實用教學

  • Excel
  • Word
  • PowerPoint
  • Windows
  • PowerShell
  • R

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 切換使用者時,預設只會設定 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 會依據以下規則與順序:

  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

參考資料

  • Tecmint:How to Disable ‘su’ Access for Sudo Users
  • Tecmint:Learn Difference Between “su” and “su -” Commands in Linux

分類:Linux

讀者互動方式

發佈留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

主要資訊欄

搜尋

近期文章

  • C++ 語言使用 Crypto++ 實作 RSA 數位簽章教學與範例
  • C++ 語言使用 Crypto++ 實作 RSA-OAEP 搭配 SHA256 加密教學與範例
  • C++ 語言使用 Crypto++ 實作 AES 加密、解密、認證加密教學與範例
  • C++ 語言使用 Crypto++ 實作 MD5、SHA1、SHA2、BLAKE2 雜湊教學與範例
  • Ubuntu Linux 安裝、使用 Crypto++ 加密函式庫教學與範例
  • C 語言使用 OpenSSL 實作橢圓曲線 ECDH 金鑰交換教學與範例
  • Python 以 eciespy 實作 ECC 非對稱式加密方法教學與範例
  • C 語言使用 OpenSSL 實作 PBKDF2 教學與範例

推薦網站

  • Udemy 線上教學課程
  • Coursera 線上教學課程

關注本站

  • 電子郵件
  • Facebook

公益

  • 家扶基金會
  • 台灣世界展望會
  • Yahoo 奇摩公益
  • igiving 公益網
  • 兒福聯盟

Copyright © 2021 · Office Guide