su 是什么
su 用来在当前会话里切换到另一个用户身份。加 - 的 su - 走登录 shell:读取目标用户的 /etc/profile 与 shell 启动文件,重置 PATH、HOME、USER、SHELL 等环境变量,得到与直接登录该用户几乎一致的环境;不加 - 时只切换用户与组 ID,当前环境变量原样保留。生产上「切过去命令找不到」「跑出来路径不对」的问题绝大多数出在这个差别上,所以脚本里应默认使用 su -。
基本信息
| 适用平台 | Linux(util-linux 的 su);BSD/macOS 的 su 参数集合略有差异 |
|---|---|
| 命令语法 | su [-] [用户名] [-c '命令'] [-s shell] |
| 常用选项 | - 或 -l 登录式切换 -c 执行单条命令 -s 指定目标 shell -m/-p 保留当前环境 |
| 权限说明 | root 切换到任何用户无需密码;普通用户 su 到其他用户需要目标用户密码或 wheel/sudo 组策略 |
| 相关命令 | sudo 按策略授权单条命令并留审计日志,自动化场景优先 |
典型使用场景
- 以服务账号身份验证:su - www-data -c 'id; pwd' 确认权限与目录是否如预期
- 临时排障:以应用用户身份手动执行一次启动命令,复现「只有服务起不来」的问题
- shell 被设为 nologin 时:su -s /bin/bash 指定可用 shell 进入调试
- 环境差异定位:分别用 su 与 su - 执行同一命令,对比 PATH 与 HOME 判断环境问题
- 交互式运维:从普通账号切到 root 做变更,操作完 su 回原身份
常用示例
常用示例
su - deploy # 登录式切换(推荐)
su - deploy -c 'whoami; pwd; echo $PATH' # 单条命令验证环境
su -s /bin/bash -c 'id' www-data # 目标 shell 为 nologin 时强指定
su - deploy -c 'cd /srv/app && ./run.sh' # 注意引号层级,整条命令要包住
whoami; id -u # 确认当前身份与 UID
su # 不带用户名表示切到 root,需 root 密码su 与 sudo 分工
| 维度 | su | sudo |
|---|---|---|
| 授权方式 | 需要目标用户密码,root 切任意用户免密 | 按 /etc/sudoers 规则授权,默认校验执行者自己的密码 |
| 审计能力 | 只记录一次切换动作 | 每条命令都可记入日志,含用户、命令与参数 |
| 环境处理 | su - 重置为登录环境 | 默认保留当前环境,sudo -i 可模拟登录 shell |
| 适用场景 | 交互式切换身份 | 自动化脚本与最小权限授权 |
su -c 写在 cron 里会因为没有终端可输入密码而静默失败。要让任务以指定用户运行,应在 /etc/crontab 或 systemd 计时器里指定 User=,而不是靠 su。
用 su -c 传命令时把密码写进命令行或脚本,会通过进程列表与历史文件长期泄露。需要免密码的自动化请走 sudo NOPASSWD 的受限规则。