深入解析 su 命令:从选项到实战案例的全面指南

su(switch user)命令用于切换当前用户身份到其他用户,可变更有效用户 ID 和组 ID。以下是对该命令及各选项的详细说明:

复制
su [options] [-] [ [...]]1.

选项

说明

-m, -p, --preserve-environment

不重置环境变量,保留当前用户的环境配置(如 PATH、USER 等)

-w, --whitelist-environment <list>

仅保留指定的环境变量(列表形式,如 -w PATH,USER),其他变量会被重置

-g, --group <group>

指定切换后的主组(primary group),需与目标用户一起使用

-G, --supp-group <group>

指定切换后的附加组(supplemental group),可添加多个额外权限组

-, -l, --login

以登录 shell 方式切换,会加载目标用户的登录配置(如 .bash_profile),并切换到其家目录

-c, --command <command>

执行一条指定命令后退出(如 su -c "ls /root");--session-command 额外禁止创建新会话

--session-command <command>

--session-command

 额外禁止创建新会话

-f, --fast

向 shell 传递 -f 参数(仅适用于 csh/tcsh),用于加速 shell 启动

-s, --shell <shell>

指定切换后使用的 shell(需在 /etc/shells 中允许,如 -s /bin/zsh)

-P, --pty

创建伪终端(pseudo-terminal),支持交互式操作(如 vim、交互式命令行)

-T, --no-pty

不创建伪终端(安全性较差,可能导致交互式工具失效)

-h, --help

显示命令帮助信息

-V, --version

显示命令版本信息

-不能省略,它代表切换用户身份时,用户的环境变量也要切换成新用户的环境变量。大家知道环境变量是用来定义用户的操作环境的,如果环境变量没有随用户身份切换,那么很多操作将无法正确执行。比如用户opsbugs切换成超级用户,但是没有加入-,那么虽然是root用户,但是$PATH环境变量还是opsbugs用户的,不包含/sbin、/usr/sbin等超级用户命令保存路径,所以无法使用管理员命令;而且root用户在接收邮件时,还会发现收到的opsbugs用户的邮件,因为环境变量$MAIL没有切换过来。

复制
[opsbugs@localhost ~]$ whoami opsbugs #查询用户身份,我是opsbugs [opsbugs@localhost ~]$ su root Password: #切换到root,但是没有切换环境变量。注意:普通用户切换到root需要root密码 [root@localhost opsbugs]# env | grep opsbugs #查询环境变量,提取包含opsbugs的行 USER=opsbugs #用户名还是opsbugs,而不是root PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/opsbugs/.local/bin:/home/opsbugs/bin #命令查找的路劲不包含超级用户路劲 MAIL=/var/spool/mail/opsbugs PWD=/home/opsbugs LOGNAME=opsbugs #邮箱、家目录、目前用户名还是opsbugs1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.

通过上面的例子我们已经注意到,切换用户时如果没有加入-,那么切换是不完全的,要想完全切换,可以使用如下命令:

复制
[opsbugs@localhost ~]$ su - root Password: #`-`代表连带环境变量一起切换,不能省略1.2.3.

有些系统命令只有root可以执行,比如添加用户的命令useradd,所以我们需要使用root身份执行。但是我们只想执行一次,而不想切换身份,可以做到吗?当然可以,命令如下:

复制
[opsbugs@localhost ~]$ whoami opsbugs #当前用户为opsbugs [opsbugs@localhost ~]$ su - root -c `useradd user1` Password: #不切换成root,但是执行useradd命令添加user1用户 [opsbugs@localhost ~]$ whoami opsbugs #当前用户还是opsbugs [opsbugs@localhost ~]$ grep `user1` /etc/passwd user1:x:1001:1001::/home/user1:/bin/bash #user1用户已经添加了1.2.3.4.5.6.7.8.9.10.11.12.

THE END