知识点详细解析
su
命令
核心功能:临时切换用户身份(需目标用户密码),适用于权限提升、环境测试等场景。
语法
su [选项] [目标用户名]
# 无用户名:默认切换到 `root`,需输入 `root` 密码。
# 指定用户名:切换到指定用户,需输入目标用户密码。
常用选项:
选项 | 作用 |
---|---|
- 或 -l 或 --login |
完全切换用户环境(加载目标用户的 profile 配置) |
-c "命令" |
以目标用户身份执行单条命令后退出(不进入交互式 Shell) |
-s 或 --shell |
指定 Shell 类型(如 su -s /bin/bash alice ) |
-m 或 -p |
保留当前环境变量(不加载目标用户配置) |
工作流程与权限规则
graph LR
A[当前用户] --> B{输入 su 命令}
B --> |目标用户密码正确| C[获得目标用户的 Shell]
B --> |密码错误| D[拒绝切换]
C --> E[操作完成]
E --> |执行 exit 或 Ctrl+D| F[返回原用户身份]
关键机制:
- 切换需要 目标用户的密码(root 切换其他用户除外)
- 默认仅切换用户身份,不重置环境变量(需
-
选项完全切换) - 切换后进程属主变更为目标用户
操作示例
- 示例:完全切换为 root(推荐方式)
$ su - # 或 su - root
Password: ******** # 输入 root 密码
whoami # root
exit # 返回原用户
```
- **示例:切换到普通用户**
```bash
$ su - alice # 完全切换至 alice
Password: ******** # 输入 alice 的密码
$ env | grep HOME # 显示 /home/alice(环境已重置)
# HOME=/home/alice
```
**安全警告**
- **密码暴露风险**
```bash
# 禁止在命令行直接暴露密码!
$ su -c '命令' <<< 'password' ❌
- 环境残留污染 :用
su
(不带-
)切换时,原用户的PATH
等变量可能导致命令执行异常 - root 切换限制
# 默认禁止 root 通过 SSH 直接登录
# 修改 /etc/ssh/sshd_config:
PermitRootLogin no
️ 常见错误处理
错误 | 原因 | 解决方案 |
---|---|---|
su: Authentication failure |
密码错误 | ① 确认目标用户密码<br>② 检查密码键盘布局 |
su: user alice does not exist |
用户不存在 | 用 getent passwd alice 验证用户 |
su: failed to execute /bin/zsh |
Shell 路径错误 | 检查目标用户的合法 Shell(/etc/shells ) |
sudo
命令
以其他用户身份(默认为 root)安全执行特权命令,需通过 /etc/sudoers
配置文件授权。
基本语法
sudo [选项] 命令 [参数]
常用选项详解
选项 | 说明 | 示例 |
---|---|---|
-u 用户 |
以指定用户身份执行 | sudo -u alice whoami |
-g 组 |
以指定组的权限执行 | sudo -g admin cat /etc/shadow |
-i |
模拟登录环境(加载目标用户的配置文件) | sudo -i |
-s |
启动目标用户的 Shell | sudo -s |
-v |
刷新 sudo 凭证有效期(默认为 5 分钟) | sudo -v |
-k |
强制清除 sudo 缓存(需重新输入密码) | sudo -k |
-l |
查看当前用户的 sudo 权限 | sudo -l |
-H |
设置 $HOME 为目标用户的家目录 |
sudo -H pip install package |
配置文件 (/etc/sudoers
)
通过 visudo
命令安全编辑配置文件:
sudo visudo
典型配置示例
# 允许 alice 执行所有 root 命令(需密码)
alice ALL=(ALL:ALL) ALL
# 允许 dev 组无需密码执行 /usr/bin/apt
%dev ALL=(ALL) NOPASSWD: /usr/bin/apt
# 允许用户以 alice 身份执行特定命令
bob ALL=(alice) /usr/bin/whoami, /usr/bin/ls
重要安全实践
- 最小权限原则
避免使用ALL=(ALL) ALL
,按需精确授权命令路径
# 反例(过度授权)
user1 ALL=(ALL) NOPASSWD: ALL
# 正例(精确授权)
user1 ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
- 日志审计
所有 sudo 操作记录在:
/var/log/auth.log # Debian/Ubuntu
/var/log/secure # RHEL/CentOS
- 防止误操作
危险命令前添加echo
预览:
sudo echo rm -rf /path/ # 先预览命令
操作示例
- 安装软件(需 root 权限)
sudo apt install nginx # Debian/Ubuntu
sudo yum install httpd # RHEL/CentOS
- 管理服务
sudo systemctl restart apache2
- 编辑系统文件
sudo nano /etc/hosts
- 修复权限问题
sudo chown -R alice:alice /custom_home
常见错误处理
错误信息 | 原因 | 解决方案 |
---|---|---|
user is not in the sudoers file |
用户未获得 sudo 权限 | 1. 用 root 执行 usermod -aG sudo alice <br>2. 通过 visudo 手动添加授权 |
sudo: 3 incorrect password attempts |
密码错误 | 1. 确认用户密码<br>2. 等待超时后重试 |
Sorry, try again |
密码输入错误 | 检查键盘大小写/Caps Lock 状态 |
案例与代码解析
案例:su
的基本用法
# 1:切换到root用户并查看根目录
su - root # 输入root密码后切换
whoami # 输出:root
ls /root # 查看root目录内容
exit # 退出root用户
# 2:以root身份执行单条命令(不切换用户)
su -c ls /root # 输入当前用户密码后执行
# 输出:/root目录下的文件列表
# 3:切换到普通用户
su - demo_user # 输入demo_user密码后切换
whoami # 输出:demo_user
解析:
su - root
:加载root
的环境变量(如$PATH
)。exit
:退出当前用户会话。su -c "命令"
:直接执行命令后退出,无需手动退出。
案例:sudo
的基本用法与权限配置
# 案例1:以root身份执行命令(需用户有sudo权限)
sudo ls -l /root # 输入当前用户密码后执行
# 案例2:配置sudo权限(需root用户操作)
sudo visudo # 编辑/etc/sudoers文件
# 在文件中添加以下行:
# demo_user ALL=(ALL) NOPASSWD:ALL # 允许demo_user无需密码执行所有命令
# 保存退出后,测试:
sudo -u demo_user whoami # 输出:demo_user(无需密码)
解析:
visudo
:安全编辑/etc/sudoers
,避免语法错误导致sudo
不可用。NOPASSWD:ALL
:允许用户免密执行命令(需谨慎使用)。
常见错误及解决方法
错误:su: Authentication failure
- 原因:输入的密码错误或用户不存在。
- 解决:
- 确认用户名和密码正确。
- 使用
passwd 用户名
修改密码(需root
权限)。
错误:user is not in the sudoers file
- 原因:用户未被授权使用
sudo
。 - 解决:
- 使用
root
用户编辑/etc/sudoers
,添加用户到sudo
组或直接授权。 - 示例:
- 使用
sudo visudo
# 添加以下行:
# demo_user ALL=(ALL) ALL
错误:sudo: parse error in /etc/sudoers
- 原因:
/etc/sudoers
文件语法错误。 - 解决:
- 使用
visudo
编辑文件(自动检查语法)。 - 若已损坏,使用
pkexec visudo
恢复默认配置。
- 使用
错误:sudo: command not found
- 原因:系统未安装
sudo
或环境变量异常。 - 解决:
- 以
root
身份运行apt install sudo
(Debian/Ubuntu)或yum install sudo
(RHEL/CentOS)。
- 以
理论与实操练习
理论练习
问答题:su
和 sudo
的主要区别是什么?
答案:su
直接切换用户,sudo
以其他用户身份执行命令。
问答题:如何通过 /etc/sudoers
允许用户 monitor
仅执行 tcpdump
和 top
命令?
答案:在 /etc/sudoers
中添加
monitor ALL=(root) /usr/sbin/tcpdump, /usr/bin/top
问答题:如果 sudo
报错“user is not in the sudoers file”,可能的原因是什么?
答案: 用户未被授权使用 sudo
,需在 /etc/sudoers
中添加配置。
问答题:解释 sudo
的 NOPASSWD
和 PASSWD
标签的区别。
答案:NOPASSWD
允许用户无需密码执行命令,PASSWD
(默认)要求输入密码。
实操练习
操作题:创建一个新用户 testuser
,并通过 sudo
允许其执行 ls /root
和 cat /etc/shadow
(仅限 ls /root
免密)。
答案:
sudo useradd testuser
sudo visudo
# 添加以下行:
# testuser ALL=(root) NOPASSWD:/bin/ls /root, /bin/cat /etc/shadow
# 保存退出后,测试:
sudo -u testuser ls /root # 无需密码
sudo -u testuser cat /etc/shadow # 需密码(或配置为免密)
操作题:配置 sudo
免密执行 apt update
和 apt upgrade
命令(仅限用户 demo_user
)。
答案:
sudo visudo
# 添加以下行:
# demo_user ALL=(root) NOPASSWD:/usr/bin/apt update, /usr/bin/apt upgrade
# 保存退出后,测试:
sudo -u demo_user apt update # 无需密码
sudo -u demo_user apt upgrade # 无需密码
知识总结
-
**
su
vssudo
**:su
直接切换用户,需知道目标用户密码,安全性较低。sudo
以其他用户身份执行命令,需配置/etc/sudoers
,安全性更高。
-
sudo
的安全配置:- 使用
visudo
编辑/etc/sudoers
,避免语法错误。 - 遵循最小权限原则,仅授权必要的命令。
- 使用