su 是 Linux/Unix 系统中用于切换用户身份的核心命令,其名称源自英文 "switch user" 或 "substitute user"。它允许当前登录用户在终端环境中临时切换为其他用户(默认是超级用户 root),从而以目标用户的权限执行命令或进入交互式 shell。

从执行机制上看,su 命令的核心原理是:当用户执行 su 时,系统会要求输入目标用户的密码(除非当前用户是 root 或具有相应权限),验证通过后,su 会调用 setuid() 或 setgid() 等系统函数,将当前进程的用户 ID(UID)和组 ID(GID)替换为目标用户的 ID,并启动一个新的 shell 环境。该新 shell 的环境变量(如 HOME、USER、PATH 等)默认不会自动切换,除非使用 su - 或 su -l(login shell 模式),后者会模拟目标用户的完整登录过程,重新加载其配置文件(如 .bash_profile、.profile 或 .login)。
在典型用法中,直接执行 su 且不加任何参数,等同于 su root,但仅切换用户身份,不改变当前工作目录,也不会加载 root 的环境变量;而 su - 则彻底切换到 root 的登录环境,工作目录变为 root 的家目录,并重新初始化 PATH 等环境变量。此外,su 还支持使用 su -c "命令" 形式,以目标用户身份执行单条命令后立即返回原用户,例如 su -c "systemctl restart nginx" 可使用 root 权限执行服务重启操作。
与 sudo 相比,su 的区别在于:su 需要知道目标用户的密码(尤其是切换到 root 时需要 root 密码),而 sudo 只需要当前用户自己的密码,且通过 /etc/sudoers 文件进行细粒度的权限控制。因此,su 更适用于明确知道目标用户密码且需要长期处于该用户身份的场景;出于安全审计和最小权限原则考虑,现代 Linux 系统更推荐使用 sudo 来执行提权操作。但 su 仍然是系统管理、故障修复、脚本切换用户等场景中的基础工具。
需要特别注意的是,在安全配置中,su 命令的使用通常依赖 PAM(可插拔认证模块)进行认证。许多发行版默认将 su 限制在 wheel 组内,只有属于该组的用户才能切换到其他身份(尤其是 root),这增强了系统安全性。同时,su 在执行时会记录审计日志到 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS),以便管理员跟踪身份切换行为。
总而言之,su 是 Linux 权限管理体系中一种身份切换机制,它通过密码认证和进程凭证变更,使用户能够在不同账户之间安全地转移操作权限,是系统管理员进行日常维护、权限委派和故障排查时不可或缺的命令。

查看详情

查看详情