深入解析 su 命令:從選項(xiàng)到實(shí)戰(zhàn)案例的全面指南
su(switch user)命令用于切換當(dāng)前用戶身份到其他用戶,可變更有效用戶 ID 和組 ID。以下是對(duì)該命令及各選項(xiàng)的詳細(xì)說(shuō)明:
su [options] [-] [ [...]]
選項(xiàng) | 說(shuō)明 |
-m, -p, --preserve-environment | 不重置環(huán)境變量,保留當(dāng)前用戶的環(huán)境配置(如 PATH、USER 等) |
-w, --whitelist-environment <list> | 僅保留指定的環(huán)境變量(列表形式,如 -w PATH,USER),其他變量會(huì)被重置 |
-g, --group <group> | 指定切換后的主組(primary group),需與目標(biāo)用戶一起使用 |
-G, --supp-group <group> | 指定切換后的附加組(supplemental group),可添加多個(gè)額外權(quán)限組 |
-, -l, --login | 以登錄 shell 方式切換,會(huì)加載目標(biāo)用戶的登錄配置(如 .bash_profile),并切換到其家目錄 |
-c, --command <command> | 執(zhí)行一條指定命令后退出(如 su -c "ls /root");--session-command 額外禁止創(chuàng)建新會(huì)話 |
--session-command <command> | --session-command 額外禁止創(chuàng)建新會(huì)話 |
-f, --fast | 向 shell 傳遞 -f 參數(shù)(僅適用于 csh/tcsh),用于加速 shell 啟動(dòng) |
-s, --shell <shell> | 指定切換后使用的 shell(需在 /etc/shells 中允許,如 -s /bin/zsh) |
-P, --pty | 創(chuàng)建偽終端(pseudo-terminal),支持交互式操作(如 vim、交互式命令行) |
-T, --no-pty | 不創(chuàng)建偽終端(安全性較差,可能導(dǎo)致交互式工具失效) |
-h, --help | 顯示命令幫助信息 |
-V, --version | 顯示命令版本信息 |
-不能省略,它代表切換用戶身份時(shí),用戶的環(huán)境變量也要切換成新用戶的環(huán)境變量。大家知道環(huán)境變量是用來(lái)定義用戶的操作環(huán)境的,如果環(huán)境變量沒(méi)有隨用戶身份切換,那么很多操作將無(wú)法正確執(zhí)行。比如用戶opsbugs切換成超級(jí)用戶,但是沒(méi)有加入-,那么雖然是root用戶,但是$PATH環(huán)境變量還是opsbugs用戶的,不包含/sbin、/usr/sbin等超級(jí)用戶命令保存路徑,所以無(wú)法使用管理員命令;而且root用戶在接收郵件時(shí),還會(huì)發(fā)現(xiàn)收到的opsbugs用戶的郵件,因?yàn)榄h(huán)境變量$MAIL沒(méi)有切換過(guò)來(lái)。
[opsbugs@localhost ~]$ whoami
opsbugs
#查詢用戶身份,我是opsbugs
[opsbugs@localhost ~]$ su root
Password:
#切換到root,但是沒(méi)有切換環(huán)境變量。注意:普通用戶切換到root需要root密碼
[root@localhost opsbugs]# env | grep opsbugs
#查詢環(huán)境變量,提取包含opsbugs的行
USER=opsbugs
#用戶名還是opsbugs,而不是root
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/opsbugs/.local/bin:/home/opsbugs/bin
#命令查找的路勁不包含超級(jí)用戶路勁
MAIL=/var/spool/mail/opsbugs
PWD=/home/opsbugs
LOGNAME=opsbugs
#郵箱、家目錄、目前用戶名還是opsbugs通過(guò)上面的例子我們已經(jīng)注意到,切換用戶時(shí)如果沒(méi)有加入-,那么切換是不完全的,要想完全切換,可以使用如下命令:
[opsbugs@localhost ~]$ su - root
Password:
#`-`代表連帶環(huán)境變量一起切換,不能省略有些系統(tǒng)命令只有root可以執(zhí)行,比如添加用戶的命令useradd,所以我們需要使用root身份執(zhí)行。但是我們只想執(zhí)行一次,而不想切換身份,可以做到嗎?當(dāng)然可以,命令如下:
[opsbugs@localhost ~]$ whoami
opsbugs
#當(dāng)前用戶為opsbugs
[opsbugs@localhost ~]$ su - root -c `useradd user1`
Password:
#不切換成root,但是執(zhí)行useradd命令添加user1用戶
[opsbugs@localhost ~]$ whoami
opsbugs
#當(dāng)前用戶還是opsbugs
[opsbugs@localhost ~]$ grep `user1` /etc/passwd
user1:x:1001:1001::/home/user1:/bin/bash
#user1用戶已經(jīng)添加了


































