跳到主要内容

切换用户

su --- Switch User(切换用户)

su # 切换到 root(需要输入 root 密码)
su - # 切换到 root,并加载 root 的环境(推荐)
su - alice # 切换到 alice 用户,并加载 alice 的环境
su alice # 切换到 alice 用户,但保留当前环境变量

两种方式的区别:

命令效果通俗理解
su alice仅切换身份,不加载 alice 的环境换个马甲接着干
su - alice切换身份,同时加载 alice 的 home 目录和环境变量完全变成 alice 这个人
# 当前是 alice,环境变量 HOME=/home/alice
$ echo $HOME
/home/alice

$ su bob
Password: [输入 bob 的密码]
$ echo $HOME
/home/alice # ❌ HOME 还是 alice 的!因为没用 -

$ exit
$ su - bob
Password: [输入 bob 的密码]
$ echo $HOME
/home/bob # ✅ 现在才是 bob 的环境

sudo --- SuperUser DO (以其他用户身份执行命令)

sudo 不是“切换用户”,而是“借用某个用户的权限来执行特定的命令”。

sudo command # 以 root 身份执行 command
sudo -u postgres psql # 以 postgres 用户身份执行 psql
sudo -u nginx ls /var/log/nginx # 以 nginx 用户身份列出日志

为什么现代系统推荐 sudo 而不是 su

  • 不需要分享 root 密码 :管理员只需要把自己的账户加入 sudo 组即可,不用把 root 密码告诉所有人
  • 操作可追溯 :日志里清清楚楚写着 “xxx 在什么时候执行了什么命令”
  • 权限最小化 :可以通过配置权限某个用户只能执行特定的命令

配置哪些用户能用 sudo :

编辑 /etc/sudoers(必须使用 visudo 命令,有语法检查):

# 允许 wheel 组的所有成员使用 sudo
%wheel ALL=(ALL) ALL

# 允许 alice 以 root 身份执行所有命令
alice ALL=(ALL) ALL

# 允许 bob 只能重启 Nginx,不能干别的
bob ALL=(root) /usr/bin/systemctl restart nginx

查看和修改超时时间:

# 查看当前时间戳
sudo -v # 刷新时间戳(不需要重新输入密码,只是延长有效期)

# 强制清除缓存(下次 sudo 需要重新输入密码)
sudo -k

# 查看配置中的超时时间
sudo cat /etc/sudoers.d/* 2>/dev/null || grep timestamp_timeout /etc/sudoers

login 命令(较少用)

login # 重新登录
login alice # 以 alice 身份重新登录

这会启动一个新的登录会话,效果类似于注销当前用户再重新登录。