Linux常用命令学习笔记:su

一、命令简介

su(Switch User)命令是Linux系统中用于切换用户身份的核心工具,允许当前用户临时切换到其他用户账户,从而获得目标用户的权限。该命令在系统管理、权限控制和多用户环境管理中具有重要作用。 核心功能

  • 从当前用户切换到目标用户
  • 获取目标用户的shell环境和权限
  • 支持完整登录环境加载或保留当前环境
  • 允许执行单条命令后立即返回

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

二、基本语法

su [选项] [用户名]

权限要求

  • 普通用户切换到其他用户需要输入目标用户密码
  • root用户切换到任何用户无需密码验证
  • 所有用户均可使用,无需特殊权限

三、常用选项详解

选项全称功能描述示例
--l--login模拟完整登录过程,加载目标用户环境变量、工作目录、配置文件su - username
-c--command以目标用户身份执行单条命令,执行后返回原用户su -c "command" username
-m-p--preserve-environment保留当前用户的环境变量,不加载目标用户环境su -m username
-s--shell指定切换后使用的shell程序su -s /bin/bash username
-g--group指定主组(仅root可用)su -g groupname username
-G--supp-group指定附加组(仅root可用)su -G groupname username
-h--help显示帮助信息su -h
-V--version显示版本信息su -V

四、实际应用场景

1. 切换到root用户(最常用)

# 切换到root用户(保持当前环境)
su

# 切换到root并加载完整环境(推荐)
su -
su -l root

注意:使用su -会加载root的完整环境变量(如PATH、HOME等),避免因环境不完整导致命令执行错误。

2. 切换到指定用户

# 切换到alice用户(不加载环境)
su alice

# 切换到alice并加载完整环境
su - alice

3. 执行单条命令后返回

# 以root身份执行apt更新
su -c "apt update && apt upgrade" root

# 以www-data用户查看日志
su -c "tail -f /var/log/apache2/access.log" www-data

# 以postgres用户执行SQL查询
su - postgres -c "psql -c 'SELECT version();'"

4. 保留当前环境变量

# 切换到root但保留当前环境变量
su -m root
su -p root

适用场景:需要临时以目标用户身份执行命令,但依赖当前用户的某些环境配置(如开发环境变量)。

5. 指定自定义Shell

# 切换到alice并使用/bin/zsh
su -s /bin/zsh alice

前提条件:目标shell必须在/etc/shells文件中列出,且目标用户有权限访问。

6. 指定用户组

# 切换到test用户,指定主组为developers,附加组为docker
su -g developers -G docker test

注意-g-G选项仅root用户可用。

五、su与su -的区别

这是su命令最重要的概念区别:

特性su usernamesu - username
环境变量保持当前用户环境加载目标用户完整环境
工作目录保持当前目录切换到目标用户家目录
配置文件不加载.bashrc/.profile加载.bashrc/.profile等
PATH变量保持当前PATH重置为目标用户的PATH
推荐度不推荐推荐

示例对比

# 当前用户:john,工作目录:/home/john
pwd          # /home/john
echo $HOME   # /home/john

# 使用su(不推荐)
su root
pwd          # /home/john(目录未变)
echo $HOME   # /home/john(环境未变)
exit

# 使用su -(推荐)
su - root
pwd          # /root(切换到root家目录)
echo $HOME   # /root(完整环境)
exit

六、su与sudo的区别

特性susudo
密码验证目标用户密码当前用户密码
权限控制无细粒度控制可通过sudoers文件精细控制
会话持续直到手动exit单次命令或短时间缓存
环境变量可加载目标环境默认保留当前环境
日志记录有限详细日志记录
安全性较低(需共享密码)较高(无需共享root密码)
配置复杂度简单需要配置sudoers文件

推荐选择

  • 临时执行特权命令:优先使用sudo command
  • 长时间以root操作:使用su -
  • 多用户环境:优先配置sudo,避免共享root密码

七、最佳实践与安全建议

1. 始终使用su -而非su

# 错误示例(可能导致环境问题)
su root

# 正确示例(推荐)
su - root
su -l root

2. 避免直接以root登录

  • 以普通用户登录系统
  • 需要时通过su -临时切换到root
  • 操作完成后立即exit退出root会话

3. 限制su访问权限

# 仅允许wheel组用户使用su切换到root
# 编辑/etc/pam.d/su,取消注释:
auth required pam_wheel.so use_uid

# 将允许的用户加入wheel组
usermod -aG wheel username

4. 监控su使用日志

# 查看su操作记录
grep "su:" /var/log/auth.log      # Ubuntu/Debian
grep "su:" /var/log/secure         # CentOS/RHEL

5. 禁用root密码(配合sudo使用)

# 锁定root密码,禁止通过su切换到root
passwd -l root

# 此时仅允许通过sudo执行特权命令
sudo command

八、常见问题排查

1. 认证失败(Authentication failure)

原因

  • 目标用户密码错误
  • 目标用户被锁定
  • 目标用户不存在

排查

# 确认目标用户存在
id username

# 检查用户是否被锁定
passwd -S username    # 显示L表示锁定

2. 切换后命令找不到(command not found)

原因:未使用su -,导致目标用户的PATH环境变量未加载。 解决

# 使用su -加载完整环境
su - username

3. 无法执行shell(权限被拒绝)

原因:目标用户的默认shell不可访问。 解决

# 查看目标用户的默认shell
grep username /etc/passwd

# 检查shell文件权限
ls -l /bin/bash

# 临时指定可用shell
su -s /bin/bash username

九、高级用法

1. 在脚本中使用su

#!/bin/bash

# 以postgres用户执行SQL脚本
su - postgres -c "psql -f /path/to/script.sql"

# 以www-data用户重启服务
su - www-data -c "systemctl restart apache2"

2. 使用sudo配合su

# 在Ubuntu等默认禁用root密码的系统
sudo su -     # 以当前用户密码切换到root

# 等同于
sudo -i

3. 创建伪终端会话

# 为会话创建独立的伪终端(提高安全性)
su -P username

# 后台运行
su -P username -c "command" &

十、总结

su命令是Linux系统中用户身份切换的基础工具,掌握其正确用法对于系统管理和权限控制至关重要。核心要点总结:

  1. 优先使用su -:始终使用su - username而非su username,确保加载完整环境
  2. 理解环境差异:明确susu -在环境变量、工作目录、配置文件加载方面的区别
  3. 安全第一:避免长时间持有root权限,操作完成后立即退出
  4. 推荐sudo:在多用户环境中优先配置sudo,提供更细粒度的权限控制和审计能力
  5. 监控日志:定期审计su使用记录,及时发现异常操作

通过合理使用su命令,结合sudo等现代权限管理工具,可以在保障系统安全的同时,高效完成日常系统管理任务。


作 者:南烛
链 接:https://www.itnotes.top/archives/667
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇