su命令(Switch User)用于切换当前用户身份。它允许用户在不注销的情况下临时切换到另一个用户账户,特别是用于切换到root用户执行管理任务。
su [选项] [用户名]
如果不指定用户名,默认切换到root用户。
| 参数 | 说明 |
|---|---|
用户名 |
要切换到的目标用户名。如果不指定,默认为root |
- 或 -l 或 --login |
以登录shell方式切换,会加载目标用户的环境变量和配置文件 |
-c, --command=命令 |
以目标用户身份执行单个命令,然后返回原用户 |
-s, --shell=shell |
指定使用的shell程序 |
-m, -p, --preserve-environment |
保持当前环境变量不改变 |
-h, --help |
显示帮助信息 |
-V, --version |
显示版本信息 |
-或-l参数会加载目标用户的完整环境-l会切换到目标用户的家目录| 特点 | su | sudo |
|---|---|---|
| 需要密码 | 目标用户的密码 | 自己的密码 |
| 权限控制 | 完全切换到目标用户 | 细粒度控制,可限制命令 |
| 默认用户 | root | root |
| 环境变量 | 可切换完整环境 | 通常保持当前环境 |
| 审计日志 | 简单 | 详细,可记录每个命令 |
最基本的用法,切换到root用户:
# 切换到root用户,需要输入root密码
$ su
Password:
# 提示符变为#,表示现在是root身份
# whoami
root
# exit
$
使用-l或-参数完整切换到目标用户环境:
# 切换到mysql用户并加载其环境
$ su - mysql
Password:
$ pwd
/home/mysql
$ echo $PATH
/usr/local/mysql/bin:/usr/bin:/bin
$ exit
切换到系统中存在的其他用户:
# 查看当前用户
$ whoami
john
# 切换到alice用户,需要alice的密码
$ su alice
Password:
$ whoami
alice
$ exit
使用-c参数执行命令后立即返回:
# 以root身份创建目录
$ ls -la /opt/myapp
ls: cannot access '/opt/myapp': No such file or directory
$ su -c "mkdir /opt/myapp && chmod 755 /opt/myapp" root
Password:
$ ls -la /opt/
drwxr-xr-x 2 root root 4096 Mar 10 10:00 myapp
# 查看当前用户是否变回
$ whoami
john
使用-m参数保持当前环境变量:
# 设置环境变量
$ export MY_VAR="test123"
$ echo $MY_VAR
test123
# 保持环境切换到root
$ su -m root
Password:
# echo $MY_VAR
test123
# 对比登录方式切换
$ su - root
Password:
# echo $MY_VAR
# 变量不存在,因为是新的环境
使用-s参数指定特定的shell:
# 使用bash作为shell切换到root
$ su -s /bin/bash root
# 使用zsh作为shell
$ su -s /bin/zsh alice
查看su的PAM配置文件:
# 查看su的PAM配置
$ cat /etc/pam.d/su
#%PAM-1.0
auth sufficient pam_rootok.so
auth required pam_wheel.so use_uid
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
配置pam_wheel.so可以限制只有wheel组成员可以使用su切换到root。
多种方式退出切换的用户:
# 方法1:使用exit命令
$ su alice
$ exit
# 方法2:使用Ctrl+D快捷键
$ su alice
$ [按Ctrl+D]
# 方法3:使用logout命令(仅限登录shell)
$ su - alice
$ logout
/var/log/secure或/var/log/auth.logsu -c "command1; command2; command3" username
#!/bin/bash
# 在脚本中以其他用户身份执行命令
su -c "/path/to/script.sh" username <<< "password"
if su -c "whoami" username &>/dev/null; then
echo "可以切换到username"
fi
A: su只切换用户身份,保持当前工作目录和环境;su -或su -l会切换到目标用户的家目录并加载其完整环境变量。
A: 可能的原因:1) 密码错误;2) 用户被锁定;3) 用户不存在;4) PAM配置限制了su访问。
A: 编辑/etc/pam.d/su,启用pam_wheel.so,然后将允许的用户添加到wheel组。
A: sudo通常更安全,因为它提供细粒度控制、不需要共享root密码、有详细的审计日志。
A: 查看系统日志文件:/var/log/secure(RHEL/CentOS)或/var/log/auth.log(Ubuntu/Debian)。
sudo - 以其他用户身份执行命令(推荐替代su)whoami - 显示当前用户名passwd - 修改用户密码usermod - 修改用户账户属性visudo - 编辑sudoers配置文件