Linux su(英文全拼:switch user)命令用於變更為其他使用者的身份,除 root 外,需要鍵入該使用者的密碼。使用權限:所有使用者。
一、語法
su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]
1、參數說明:
- -m -p 或 --preserve-environment 執行 su 時不改變環境變數
- -c command 或 --command=command 變更為帳號為 USER 的使用者並執行指令(command)后再變回原來使用者
- -s shell 或 --shell=shell 指定要執行的 shell (bash csh tcsh 等),預設值為 /etc/passwd 內的該使用者(USER) shell
- --help 顯示說明文件
- --version 顯示版本資訊
- - l 或 --login 這個參數加了之后,就好像是重新 login 為該使用者一樣,大部份環境變數(HOME SHELL USER等等)都是以該使用者(USER)為主,並且工作目錄也會改變,如果沒有指定 USER ,內定是 root
- USER 欲變更的使用者帳號
- ARG 傳入新的 shell 參數
2、實例
// 變更帳號為 root 並在執行 ls 指令后退出變回原使用者
su -c ls root // 變更帳號為 root 並傳入 -f 參數給新執行的 shell
su root -f // 變更帳號為 clsung 並改變工作目錄至 clsung 的家目錄(home dir)
su - clsung
切換用戶:
[root@moapp-0003 ~]# whoami // 顯示當前用戶
root [root@moapp-0003 ~]# pwd // 顯示當前目錄
/root [root@moapp-0003 ~]# su postgres // 切換到 postgres 用戶
[postgres@moapp-0003 root]$ whoami postgres [postgres@moapp-0003 root]$ pwd // 顯示當前目錄,仍是 /root
/root
切換用戶,改變環境變量:
[root@moapp-0003 ~]# whoami root [root@moapp-0003 ~]# pwd /root [root@moapp-0003 ~]# su - postgres // 切換到 postgres 用戶 Last login: Mon Aug 16 22:08:09 CST 2021 on pts/0 [postgres@moapp-0003 ~]$ whoami // 顯示當前用戶 postgres [postgres@moapp-0003 ~]$ pwd // 顯示當前目錄,目錄已變為 postgres 用戶的家目錄 /home/postgres
二、Linux下su與su - 命令的區別
其實這個區別上面實例的展示都體現了。
1、這里看一下別人遇到的問題:
在啟動服務器 ntpd 服務時遇到一個問題
使用 su root 切換到 root 用戶后,不可以使用 service 命令;
使用 su -(等價於 su - root)后,就可以使用service命令了。
2、原因 —— su 命令和 su - 命令區別就是:
su 只是切換了root身份,但 Shell 環境仍然是之前普通用戶的Shell;
而 su - 連用戶和 Shell 環境一起切換成 root 身份了。
只有切換了Shell環境才不會出現PATH環境變量錯誤,報command not found的錯誤。
su 切換成 root 用戶以后,pwd 一下,發現工作目錄仍然是普通用戶的工作目錄;而用su -命令切換以后,工作目錄變成 root 的工作目錄了。
用 echo $PATH 命令看一下 su 和 su - 后的環境變量已經變了。
三、su 和 sudo 的區別
由於su 對切換到超級權限用戶root后,權限的無限制性,所以su並不能擔任多個管理員所管理的系統。如果用su 來切換到超級用戶來管理系統,也不能明確哪些工作是由哪個管理員進行的操作。特別是對於服務器的管理有多人參與管理時,最好是針對每個管理員的技術特長和 管理范圍,並且有針對性的下放給權限,並且約定其使用哪些工具來完成與其相關的工作,這時我們就有必要用到 sudo。
通過sudo,我們能把某些超級權限有針對性的下放,並且不需要普通用戶知道root密碼,所以sudo 相對於權限無限制性的su來說,還是比較安全的,所以sudo 也能被稱為受限制的su ;另外sudo 是需要授權許可的,所以也被稱為授權許可的su;
sudo 執行命令的流程是當前用戶切換到root(或其它指定切換到的用戶),然后以root(或其它指定的切換到的用戶)身份執行命令,執行完成后,直接退回到當前用戶;而這些的前提是要通過sudo的配置文件/etc/sudoers來進行授權;
四、su -c 參數的使用
我們主要看一下 -c 參數的意思:-c command 或 --command=command 變更為帳號為 USER 的使用者並執行指令(command)后再變回原來使用者
今天主要是在這里有用到這個 -c 參數,所以把這個命令研究了一下。
su - postgres -c xxx —— 用 postgres 這個用戶執行了后面的命令 xxx 后再變回原來的用戶,並沒有真的切換用戶。
這個命令知識到時候在運維里面啟動各種服務的時候估計會經常用到。