linux su命令

su命令(Switch User)用于切换当前用户身份。它允许用户在不注销的情况下临时切换到另一个用户账户,特别是用于切换到root用户执行管理任务。

语法格式

su [选项] [用户名]

如果不指定用户名,默认切换到root用户。

命令功能

  • 切换到其他用户身份
  • 执行特权命令(切换到root)
  • 测试其他用户的环境配置
  • 临时以其他用户身份运行程序

参数说明

参数 说明
用户名 要切换到的目标用户名。如果不指定,默认为root
--l--login 以登录shell方式切换,会加载目标用户的环境变量和配置文件
-c, --command=命令 以目标用户身份执行单个命令,然后返回原用户
-s, --shell=shell 指定使用的shell程序
-m, -p, --preserve-environment 保持当前环境变量不改变
-h, --help 显示帮助信息
-V, --version 显示版本信息

📝 重要说明

  • 切换到其他用户需要知道该用户的密码(root用户除外)
  • 使用--l参数会加载目标用户的完整环境
  • 普通用户切换时,当前目录保持不变;使用-l会切换到目标用户的家目录

💡 su 与 sudo 的区别

特点 su sudo
需要密码 目标用户的密码 自己的密码
权限控制 完全切换到目标用户 细粒度控制,可限制命令
默认用户 root root
环境变量 可切换完整环境 通常保持当前环境
审计日志 简单 详细,可记录每个命令

常用示例

示例1:切换到root用户

最基本的用法,切换到root用户:

# 切换到root用户,需要输入root密码
$ su
Password:
# 提示符变为#,表示现在是root身份
# whoami
root
# exit
$

示例2:以登录方式切换用户

使用-l-参数完整切换到目标用户环境:

# 切换到mysql用户并加载其环境
$ su - mysql
Password:
$ pwd
/home/mysql
$ echo $PATH
/usr/local/mysql/bin:/usr/bin:/bin
$ exit

示例3:切换到其他普通用户

切换到系统中存在的其他用户:

# 查看当前用户
$ whoami
john

# 切换到alice用户,需要alice的密码
$ su alice
Password:
$ whoami
alice
$ exit

示例4:以其他用户身份执行单个命令

使用-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

示例5:保持环境变量切换

使用-m参数保持当前环境变量:

# 设置环境变量
$ export MY_VAR="test123"
$ echo $MY_VAR
test123

# 保持环境切换到root
$ su -m root
Password:
# echo $MY_VAR
test123

# 对比登录方式切换
$ su - root
Password:
# echo $MY_VAR

# 变量不存在,因为是新的环境

示例6:指定shell程序

使用-s参数指定特定的shell:

# 使用bash作为shell切换到root
$ su -s /bin/bash root

# 使用zsh作为shell
$ su -s /bin/zsh alice

示例7:限制su使用(/etc/pam.d/su配置)

查看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。

示例8:退出su会话

多种方式退出切换的用户:

# 方法1:使用exit命令
$ su alice
$ exit

# 方法2:使用Ctrl+D快捷键
$ su alice
$ [按Ctrl+D]

# 方法3:使用logout命令(仅限登录shell)
$ su - alice
$ logout

⚠️ 安全注意事项

  1. 不要共享root密码:使用sudo替代直接su到root
  2. 限制su访问:通过wheel组限制可使用su的用户
  3. 使用强密码:所有允许su切换的用户都应有强密码
  4. 监控su使用:查看/var/log/secure/var/log/auth.log
  5. 及时退出:完成管理任务后立即退出root会话

实用技巧

🛠️ 高级用法

  1. 批量操作
    su -c "command1; command2; command3" username
  2. 脚本中使用
    #!/bin/bash
    # 在脚本中以其他用户身份执行命令
    su -c "/path/to/script.sh" username <<< "password"
  3. 检查是否可切换到某用户
    if su -c "whoami" username &>/dev/null; then
        echo "可以切换到username"
    fi

常见问题

Q: su和su -有什么区别?

A: su只切换用户身份,保持当前工作目录和环境;su -su -l会切换到目标用户的家目录并加载其完整环境变量。

Q: 为什么su提示"Authentication failure"?

A: 可能的原因:1) 密码错误;2) 用户被锁定;3) 用户不存在;4) PAM配置限制了su访问。

Q: 如何限制只有特定用户可以使用su?

A: 编辑/etc/pam.d/su,启用pam_wheel.so,然后将允许的用户添加到wheel组。

Q: su和sudo哪个更安全?

A: sudo通常更安全,因为它提供细粒度控制、不需要共享root密码、有详细的审计日志。

Q: 如何查看su的使用记录?

A: 查看系统日志文件:/var/log/secure(RHEL/CentOS)或/var/log/auth.log(Ubuntu/Debian)。

相关命令

  • sudo - 以其他用户身份执行命令(推荐替代su)
  • whoami - 显示当前用户名
  • passwd - 修改用户密码
  • usermod - 修改用户账户属性
  • visudo - 编辑sudoers配置文件