063 su命令

命令说明

su(switch user)用于切换用户身份,默认切到 root,需要目标用户密码;加 - 加载目标用户的完整登录环境,是临时提权与以他人身份调试的手段。

语法

su [选项]... [用户 [参数]]

常用参数

参数说明
- / -l完整登录 shell:切换环境变量、家目录(推荐)
-c 命令以目标用户执行一条命令后返回,如 su - www -c "ls /var/www"
-s Shell指定切换后的 shell
-m / -p保留当前环境变量(不重置)
-u 用户配合 runuser/systemd-run 的细粒度用法(部分实现)
(无参数)su 不带用户默认切 root,环境部分保留,易踩坑
exit / Ctrl+D退出切换回到原用户

使用示例

$ su -

切换到 root 并加载 root 环境

$ su - zhangsan

切换到普通用户 zhangsan(需其密码)

$ su - www -s /bin/bash -c "id"

以 www 用户执行命令验证身份

$ su -c "systemctl restart nginx" root

root 下执行单条服务命令

$ sudo su -

知道 sudo 密码而不知 root 密码时的提权路径

$ whoami

切换后确认当前身份

$ exit

退出 su 会话

$ tail -f /var/log/secure

su 失败排错:看认证日志与 PAM 限制

实用技巧

  • su 与 su - 区别:不带 - 时 PATH、HOME、USER 仍是原用户的,常导致“明明 root 却 command not found”;养成习惯永远加 -。
  • su 需要目标用户密码,sudo 只需要自己的密码(由 /etc/sudoers 授权),且 sudo 每条命令留审计日志,运维规范优先 sudo。
  • RHEL 默认禁止普通用户 su root 之外的切换?不是——默认 su 任何用户都要密码;wheel 组限制要改 /etc/pam.d/su 取消 auth required pam_wheel.so 的注释。
  • root 可 su 到任何用户不需要密码,反向不行;这也是 root 密码丢失时的恢复思路(单用户模式重置)。
  • 容器里常没有 root 密码(passwd -d 或从未设置),su 会直接失败,用 su -s /bin/bash -c 或 docker exec -u 用户 进容器。