深入解析 su 命令:从选项到实战案例的全面指南
su(switch user)命令用于切换当前用户身份到其他用户,可变更有效用户 ID 和组 ID。以下是对该命令及各选项的详细说明:
选项
说明
-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没有切换过来。
通过上面的例子我们已经注意到,切换用户时如果没有加入-,那么切换是不完全的,要想完全切换,可以使用如下命令:
有些系统命令只有root可以执行,比如添加用户的命令useradd,所以我们需要使用root身份执行。但是我们只想执行一次,而不想切换身份,可以做到吗?当然可以,命令如下: