su仅切换uid/gid不重载环境,su-模拟完整登录加载root配置;sudo-i以当前用户密码启动root登录shell,更安全可控。

能切换,但方式和后果完全不同:用 su - 需 root 密码,用 sudo -i 需当前用户有 sudo 权限——两者加载的环境、权限范围、安全边界都不可互换。
为什么 su 和 su - 切换后行为不一样
根本区别在 shell 启动模式:su 只改 UID/GID,不重载配置;su -(等价于 su -l)会模拟完整登录,加载 /root/.bash_profile、/root/.bashrc 和 PATH 等环境变量。
常见现象包括:
-
su后执行ifconfig报错command not found,因为普通用户的PATH里没有/sbin -
su后某些脚本因$HOME仍指向原用户家目录而读取错误配置 -
su -后cd默认进入/root,且所有 root 级命令可直接调用
实际运维中,除非你明确知道要保留当前环境(比如调试 PATH 冲突),否则一律用 su -。
sudo -i 和 sudo su - 本质不同
sudo -i 是标准做法,它直接启动一个 root 权限的 login shell;sudo su - 是“用 sudo 跑一次 su 命令”,多了一层进程嵌套,且可能触发额外的日志或策略检查。
关键差异点:
-
sudo -i读取/etc/sudoers中针对该用户的Defaults env_reset策略,更干净 -
sudo su -在某些加固系统(如 SELinux enforcing 模式)下可能被拦截或降权 - 如果
sudoers配置了NOPASSWD,sudo -i无需输密码,sudo su -同样生效,但逻辑路径更绕
别写 sudo su -——它不是错,只是冗余且掩盖了真实权限模型。
root 密码没设过?先用 sudo passwd root
Ubuntu、Kali 等发行版默认禁用 root 密码,su - 必然失败。此时不能靠“猜默认密码”,必须由已有 sudo 权限的用户显式设置:
sudo passwd root
执行后会提示输入并确认新密码。注意:
- 密码强度需满足 PAM 策略(如至少 8 位、含大小写字母+数字)
- 设置完成后,
su -才真正可用;此前所有su类命令都会报Authentication failure - 若系统启用了
auth required pam_deny.so(极少数安全加固场景),即使设了密码也无法su,得查/etc/pam.d/su
退出时别只记得 exit,还要注意子 shell 嵌套
用 sudo -i 进入的是单层 root shell,exit 或 Ctrl+D 即退;但用 sudo su - 或连续 su - 可能形成多层 shell 堆栈。
验证当前 shell 层数最简单的方法是看提示符:root@host:/root# 是顶层,root@host:/root# root@host:/root#(重复显示)说明已嵌套。此时单次 exit 只退一层。
更可靠的方式是检查进程树:
ps -o pid,ppid,comm -H
找到最上层的 bash 或 zsh 进程,其 PPID 是 1 或你原始用户的 PID,那就是该退出的位置。











