0
点赞
收藏
分享

微信扫一扫

「Linux用户账号管理」su和sudo命令

Ichjns 06-25 21:00 阅读 6

知识点详细解析

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 --> |执行 exitCtrl+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)。

理论与实操练习

理论练习

问答题susudo 的主要区别是什么?
答案su 直接切换用户,sudo 以其他用户身份执行命令。

问答题:如何通过 /etc/sudoers 允许用户 monitor 仅执行 tcpdumptop 命令?
答案:在 /etc/sudoers 中添加

monitor ALL=(root) /usr/sbin/tcpdump, /usr/bin/top

问答题:如果 sudo 报错“user is not in the sudoers file”,可能的原因是什么?
答案: 用户未被授权使用 sudo,需在 /etc/sudoers 中添加配置。

问答题:解释 sudoNOPASSWDPASSWD 标签的区别。
答案NOPASSWD 允许用户无需密码执行命令,PASSWD(默认)要求输入密码。

实操练习

操作题:创建一个新用户 testuser,并通过 sudo 允许其执行 ls /rootcat /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 updateapt 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 # 无需密码

知识总结

  1. **su vs sudo**:

    • su 直接切换用户,需知道目标用户密码,安全性较低。
    • sudo 以其他用户身份执行命令,需配置 /etc/sudoers,安全性更高。
  2. sudo 的安全配置

    • 使用 visudo 编辑 /etc/sudoers,避免语法错误。
    • 遵循最小权限原则,仅授权必要的命令。
举报

相关推荐

0 条评论