首页/系统/Linux 运维命令速查/su 切换用户身份

su 切换用户身份

su 切换用户:su - 进登录 shell 并重置环境,su 保留当前环境变量;运维中最常见的坑都在环境变量与 PATH 上。

Linux 运维命令速查系统更新于 2026-10-13

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 分工

维度susudo
授权方式需要目标用户密码,root 切任意用户免密按 /etc/sudoers 规则授权,默认校验执行者自己的密码
审计能力只记录一次切换动作每条命令都可记入日志,含用户、命令与参数
环境处理su - 重置为登录环境默认保留当前环境,sudo -i 可模拟登录 shell
适用场景交互式切换身份自动化脚本与最小权限授权
su -c 写在 cron 里会因为没有终端可输入密码而静默失败。要让任务以指定用户运行,应在 /etc/crontab 或 systemd 计时器里指定 User=,而不是靠 su。
用 su -c 传命令时把密码写进命令行或脚本,会通过进程列表与历史文件长期泄露。需要免密码的自动化请走 sudo NOPASSWD 的受限规则。

易错点

  • 省略 - 时环境变量仍是原用户的,脚本里可能出现解释器版本不对或命令找不到的隐性故障
  • cron 中的 su -c 无法交互输入密码,任务静默失败且日志里看不出明显痕迹
  • root 用 su 切换时未重置 HOME,会让目标用户家目录里出现属主混乱的文件
  • 命令里含空格或分号时 su -c 的引号层级容易写错,复杂逻辑写成脚本文件更稳妥

数据来源与参考

  • man 1 su(util-linux)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌