一、su 命令(完整切换 vs 非完整切换)
1. 核心参数与执行差异
| 命令格式 | 切换类型 | 环境变量/工作目录 | 适用场景 |
|---|---|---|---|
su test | 非登录 shell | ① 保留原用户(如 root)的环境变量($PATH/$HOME等);② 工作目录不变(仍在原用户目录); ③ 仅切换 UID/GID,不加载目标用户的配置 | 临时执行单个命令(如su test -c "ls /home/test"),无需加载目标用户环境 |
su - test | 登录 shell | ① 完全加载目标用户的环境变量(~/.bash_profile/~/.bashrc);② 工作目录切换到目标用户家目录( /home/test);③ 等同于“重新登录目标用户” | 需要完整使用目标用户的环境/权限(如执行目标用户的脚本) |
su -/su - root | 登录 shell 切换 root | 加载 root 的完整环境(/root/.bashrc),工作目录到/root | 推荐的 root 切换方式(完整环境,避免命令找不到) |
2. 补充:su 命令的隐藏风险
su test非完整切换时,若原用户是 root,目标用户test仍可能继承 root 的高权限环境变量(如$PATH包含/sbin),存在权限泄露风险;- 切换后退出:用
exit或Ctrl+D回到原用户,避免多层切换导致权限混乱。
二、sudo 配置进阶
1.sudoers配置的正确方式(禁止直接 chmod 修改!)
chmod u+w /etc/sudoers存在安全风险:若编辑时语法错误,会导致所有 sudo 命令失效,无法恢复。
✅ 正确做法:使用visudo命令编辑(自动语法检查):
# 1. 直接编辑 sudoers 文件(推荐)visudo# 2. 编辑自定义规则文件(更安全,避免污染主文件)visudo -f /etc/sudoers.d/test# 新增 test 用户的规则文件2.sudoers规则语法
# 格式:用户名 主机=(可切换的用户) 免密标识:可执行的命令 # 示例1:仅允许 test 免密执行重启 httpd 命令 test ALL=(root) NOPASSWD:/usr/bin/systemctl restart httpd # 示例2:允许 test 切换 root 执行任意命令(需输密码) test ALL=(ALL) ALL # 示例3:允许 test 以 apache 用户执行脚本(限定用户+命令) test ALL=(apache) /home/test/run_script.sh3.wheel组补充(不同系统差异)
- RHEL/CentOS:
wheel组默认配置了 sudo 全权限(visudo中%wheel ALL=(ALL) ALL),加入该组即可获得 sudo 权限; - Ubuntu/Debian:无
wheel组,默认sudo权限在sudo组(usermod -aG sudo test); - 验证组权限:
groups test查看是否加入目标组,sudo -l查看当前用户的 sudo 权限列表。
4.NOPASSWD的使用场景与风险
- 适用场景:自动化脚本(如 Ansible 执行时无需手动输密码);
- 风险:若用户账号泄露,攻击者可直接免密执行高权限命令;
- 替代方案:配置
timestamp_timeout(sudo 密码缓存时间),默认 15 分钟,避免频繁输密码:# visudo 中添加(全局生效) Defaults timestamp_timeout=5 # 密码缓存5分钟
三、su - 与 sudo -i 的核心差异
| 维度 | su - root | sudo -i |
|---|---|---|
| 权限验证 | 需输入root 密码(风险高:root 密码泄露则全盘失控) | 需输入当前用户密码(仅验证自身身份,root 密码无需扩散) |
| 环境加载 | 完全加载 root 的环境(/root/.bashrc) | 模拟 root 登录 shell,加载 root 环境,但保留SUDO_USER等标识(可追溯操作) |
| 审计日志 | 无日志(无法追踪谁切换了 root) | 所有操作记录到/var/log/secure(如sudo -i会记录test用户执行的命令) |
| 权限管控 | 一旦切换 root,拥有全部权限 | 可通过sudoers限定仅能执行部分命令(即使sudo -i,也可限制) |
| 推荐场景 | 应急操作(临时需要完整 root 环境) | 日常运维(审计+权限管控,符合安全规范) |
四、实操避坑点
- sudo 命令执行后权限回退:
示例:sudo echo "test" > /root/test.txt会报错(重定向由原用户执行,无 root 权限),正确写法:echo"test"|sudotee/root/test.txt# tee 命令由 sudo 执行,支持重定向 - 普通用户 sudo 执行命令的路径问题:
非登录 shell 下,普通用户的$PATH可能不包含/sbin//usr/sbin,需写命令绝对路径(如sudo /usr/sbin/useradd,而非sudo useradd); - sudoers 语法错误恢复:
若误改sudoers导致 sudo 失效,可通过su - root切换后,用visudo -c检查语法:visudo -c# 检查 sudoers 文件语法,输出 "parsed OK" 则正常
总结(核心补充要点)
su侧重“用户切换”,sudo侧重“权限管控”,生产环境优先用sudo;- 编辑
sudoers必须用visudo,禁止直接改权限,避免语法错误锁死 sudo; su - root需 root 密码(风险高),sudo -i需当前用户密码(更安全);- 精细化配置
sudoers,避免给普通用户ALL=(ALL) NOPASSWD:ALL全权限。