切换用户
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 身份重新登录
这会启动一个新的登录会话,效果类似于注销当前用户再重新登录。