su:switch user(完全切换)

su                  # 切到 root(要 root 密码)
su -                # 切到 root 并加载 root 的环境(推荐)
su alice            # 切到 alice
su - alice          # 切到 alice 并切其环境
exit                # 退回原身份

多数 Ubuntu 默认禁用 root 密码 → su 失效;用 sudo -i 代替。

sudo:以 root(或别人)跑单条命令

sudo apt update                   # 用 root 权限跑
sudo -i                           # 切到 root shell(同 su -)
sudo -s                           # 切到 root shell 但保留环境
sudo -u alice command             # 以 alice 身份跑
sudo -l                           # 看自己能 sudo 什么
sudo -k                           # 清空 sudo 缓存(下次重输密码)
sudo !!                           # 重跑上一条加 sudo
sudo -E cmd                       # 保留环境变量

su - vs sudo -i 差别

su -              要目标用户密码;切到目标家
sudo -i           要自己密码;切到 root(或目标)家

生产推荐 sudo——审计日志 + 不需要 root 密码共享。

别 sudo 重定向

sudo echo "hi" > /etc/test       # ❌ shell 在 sudo 前打开 fd 失败
echo "hi" | sudo tee /etc/test   # ✓ 这才行
sudo bash -c 'echo hi > /etc/test'   # ✓ 也行

sudo 配置(/etc/sudoers)

sudo visudo                       # ★ 永远用 visudo(语法检查)

例:

%sudo   ALL=(ALL:ALL) ALL                    # sudo 组成员全权限
alice   ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

详见 linux/18-sudo

看自己有什么 sudo 权限

sudo -l

  • sudo -i 用 root 跑——任何错误代价都大。用完赶紧 exit
  • sudo 缓存 15 分钟——之后再 sudo 要重输密码(可以 sudo -k 立刻清)
  • 重定向用 tee,别忘 -a 追加(不加 -a 默认覆盖)