普通用户秒变管理员!Linux 提权 su/sudo 彻底玩明白
·
Linux提权管理
大多数时候Linux系统管理员以非特权用户身份登录系统,并使用工具暂时获得特权用户root管理系统。
su 命令
- 示例1:
su username启动一个非登录shell,使用当前的环境设置(上一个用户) - 示例2:
su -l username启动一个登录shell,设置了shell环境
username 省略时,代表切换到root账户。
# 不加用户名的 nologin shell
[cyw@centos7 ~ 13:33:57]$ su
密码:
# 很多环境变量仍保留为cyw用户
[root@centos7 cyw 13:56:24]# env | grep cyw
HOSTNAME=centos7.cyw
USER=cyw
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/cyw/.local/bin:/home/cyw/bin
MAIL=/var/spool/mail/cyw
PWD=/home/cyw
LOGNAME=cyw
XDG_DATA_DIRS=/home/cyw/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
# 不加用户名的 login shell
[cyw@centos7 ~ 13:57:54]$ su -l
密码:
上一次登录:六 7月 18 13:57:46 CST 2026pts/1 上
[root@centos7 ~ 13:58:27]# set | grep cyw
HOSTNAME=centos7.cyw
提示: 尽可能使用 loging shell 登录。
# 添加一个用户
[root@centos7 ~ 13:59:12]# useradd laowang
# 设置密码为redhat
[root@centos7 ~ 14:00:13]# echo redhat | passwd --stdin laowang
更改用户 laowang 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@centos7 ~ 14:00:20]# grep laowang /etc/passwd
laowang:x:8891:8891::/home/laowang:/bin/bash
# 以特定用户身份执行特定命令
[cyw@centos7 ~ 14:01:35]$ su -l laowang -c id
密码:
uid=8891(laowang) gid=8891(laowang) 组=8891(laowang) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 加单引号
[cyw@centos7 ~ 14:01:54]$ su -l laowang -c 'cat /etc/hosts'
密码:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
# 不加单引号
[cyw@centos7 ~ 14:02:35]$ su -l laowang -c cat /etc/hosts
密码:
hello #键盘输入hello,回车
hello #显示hello
# 原因:没有把 "cat /etc/hosts" 当作整体
^C
Session terminated, killing shell... ...已杀死。
其他使用方法
# 创建的文件位置在 ~cyw/haha
[root@centos7 ~ 14:04:52]# su -l -c 'touch haha' cyw
# 无权创建
[root@centos7 ~ 14:05:27]# su -c 'touch haha' cyw
touch: 无法创建"haha": 权限不够 #原因:nologin shell 执行,当前位置不变,导致cyw用户无法在/root下创建
# 切换 nologin shell 账户
[root@centos7 ~ 14:06:02]# grep adm /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin #/sbin/nologin
[root@centos7 ~ 14:08:15]# su -l adm -c id
This account is currently not available.
[root@centos7 ~ 14:06:44]# su -l adm -s /bin/bash -c id
uid=3(adm) gid=4(adm) 组=4(adm) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c102 # 只有 root 用户可以指定 shell
[root@centos7 ~ 14:08:49]# su -l adm -s /bin/bash
上一次登录:六 7月 18 14:08:45 CST 2026pts/1 上
-bash-4.2$
# 提示符不正常,原因是家目录中缺少bash相关配置文件
# 处理方法如下:
-bash-4.2$ su -l root
密码:
上一次登录:六 7月 18 14:04:52 CST 2026pts/1 上
[root@centos7 ~ 14:10:26]# grep adm /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 ~ 14:10:46]# cp /etc/skel/{.bash_profile,.bashrc} /var/adm/
[root@centos7 ~ 14:11:44]# su adm -l -s /bin/bash
上一次登录:六 7月 18 14:09:47 CST 2026pts/1 上
[adm@centos7 ~ 14:12:08]$
sudo 命令
从根本上说,Linux实现了一个非常粗糙的获得权限模型:root 可以做任何事情,其他用户与系统相关什么也不能做。
- su 缺点:
- 用户必须知道 root 用户密码获取 root 用户所有权限。
- 未记录用户执行命令。
- 无法以
/sbin/nologin的用户身份运行命令。 - sudo 优点:
- sudo 允许用户以其他用户身份执行特定命令。
- sudo 需要用户输入用户自己的密码,而非他们想访问的用户密码。
- sudo 执行的命令会记录在
/var/log/secure文件中。
语法:sudo [-u username] command
# 有sudo权限的用户,输入自己的密码,确认是否是本人在操作
[cyw@centos7 ~ 16:42:23]$ sudo id
[sudo] password for cyw:
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 没有sudo权限的用户
[laowang@centos7 ~ 15:04:33]$ sudo id
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] laowang 的密码:
laowang 不在 sudoers 文件中。此事将被报告。
sudo 配置
[root@centos7 ~ 15:06:11]# export EDITOR=vim
[root@centos7 ~ 15:06:46]# visudo
# 其中两条记录,wheel组中成员,可以以任何用户身份执行任何命令
root ALL=(ALL) ALL
# 组以%开头
%wheel ALL=(ALL) ALL

[root@centos7 ~ 15:08:44]# visudo
# 添加laowang 记录如下
laowang ALL=(ALL) ALL
[root@centos7 ~ 15:10:05]# sudo id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#不需要输入密码情况下,直接执行命令
# laowang 记录如下
laowang ALL=(ALL) NOPASSWD:ALL
[root@centos7 ~ 15:12:15]# sudo id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#只能够执行特定命令
# 添加laowang 记录如下
laowang ALL=(ALL) /sbin/useradd,/sbin/usermod,/sbin/userdel
#验证
[laowang@centos7 ~ 15:22:39]$ sudo id
[sudo] laowang 的密码:
对不起,用户 laowang 无权以 root 的身份在 centos7.cyw 上执行 /bin/id。
[laowang@centos7 ~ 15:22:52]$ sudo useradd laozhang
[sudo] laowang 的密码:
[laowang@centos7 ~ 15:23:13]$ id laozhang
uid=8892(laozhang) gid=8892(laozhang) 组=8892(laozhang)
**总结:**在分配命令的时候,切记只给用户特定功能的命令(例如用户管理相关命令),而不是通用功能的工具(例如 vim)。
配置文件路径:
- 主配置文件:
/etc/sudoers,正常情况不要修改。 - 从配置文件:
/etc/sudoer.d/*,如果想添加配置,在此处添加。
例:
[root@centos7 ~ 15:26:58]# echo 'laowang ALL=(ALL) NOPASSWD:ALL'>> /etc/sudoers.d/laowang
[root@centos7 ~ 15:27:03]# cat /etc/sudoers.d/laowang
laowang ALL=(ALL) NOPASSWD:ALL
命令别名
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
# sys组中成员执行以下命令别名中的所有命令
%sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
实践:
- 配置用户 xiaoniuma 可以以root身份运行vim命令
- 用户 xiaoniuma 将自己提权为 root 用户 - 方法一:使用vim将/etc/passwd中用户的uid改为0 - 方法二:将sudo规则中vim程序改为bash或者ALL
# 创建用户
[root@centos7 ~ 15:47:43]# useradd xiaoniuma
[root@centos7 ~ 16:52:06]# echo 123 | passwd --stdin xiaoniuma
更改用户 xiaoniuma 的密码 。
passwd:所有的身份验证令牌已经成功更新。
# 配置sudo
[root@centos7 ~ 16:49:13]# echo 'xiaoniuma ALL=(ALL) /bin/vim'> /etc/sudoers.d/xiaoniuma
# 切换用户并修改用户id
[root@centos7 ~ 16:52:27]# su -l xiaoniuma
上一次登录:六 7月 18 16:50:54 CST 2026pts/0 上
# 修改 xiaoniuma 的 UID 为0
[xiaoniuma@centos7 ~ 16:52:37]$ sudo vim /etc/passwd
#验证,查看的UID显示为0,与root用户相同,进入该用户后命令提示符仍为[root@centos7 ~ 16:55:32]#,但通过pwd命令查看所在位置是显示未/home/xiaoniuma
[root@centos7 ~ 16:56:06]# grep xiaoniuma /etc/passwd
xiaoniuma:x:0:8893::/home/xiaoniuma:/bin/bash
[root@centos7 ~ 16:55:23]# su -l xiaoniuma
上一次登录:六 7月 18 15:45:07 CST 2026pts/0 上
[root@centos7 ~ 16:55:32]#
[root@centos7 ~ 17:02:10]# pwd
/home/xiaoniuma
[root@centos7 ~ 1
还原环境
# 修改用户id为原来的1001
[root@centos7 ~ 17:02:16]# sudo vim /etc/passwd
xiaoniuma:x:1001:8893::/home/xiaoniuma:/bin/bash
# 删除用户
[root@centos7 ~ 17:05:36]# userdel -r xiaoniuma
userdel:/var/spool/mail/xiaoniuma 并不属于 xiaoniuma,所以不会删除
userdel:/home/xiaoniuma 并不属于 xiaoniuma,所以不会删除
[root@centos7 ~ 17:05:54]# ls /home/
cyw developer1 laowang laozhang tom xiaoniuma zhangsan
#删除对应文件
[root@centos7 ~ 17:07:08]# rm -fr /home/xiaoniuma
[root@centos7 ~ 17:07:57]# rm -fr /var/spool/mail/xiaoniuma
[root@centos7 ~ 17:08:08]# ls /home/
cyw developer1 laowang laozhang tom zhangsan
# 删除sudo规则
[root@centos7 ~ 17:06:15]# rm -f /etc/sudoers.d/xiaoniuma
总结
以下是关于 Linux 中 su 和 sudo 使用的几条建议:
- 优先使用
sudo而非susudo允许临时获取管理员权限,操作完成后自动退回普通用户状态,降低误操作风险;而su会直接切换到 root 身份,长期保持高权限状态存在安全隐患。 - 限制
su的使用范围 尽量仅在需要长时间执行多个管理员操作时使用su,且完成后立即通过exit退出 root 身份,避免在 root 权限下进行日常操作。 - 合理配置
sudoers文件 通过visudo命令配置sudoers,精确控制用户可执行的管理员命令(如user ALL=(ALL) /bin/apt),避免授予无限制的sudo权限。 - 注意命令的完整路径 使用
sudo时,尽量指定命令的绝对路径(如sudo /usr/bin/apt update),防止因环境变量篡改导致的安全风险。 - 避免在脚本中硬编码
sudo密码 不要在脚本中直接写入sudo密码(如通过管道传递),可通过配置sudoers实现特定命令免密执行,或使用更安全的权限管理方式。 - 定期审计操作日志
sudo的操作会记录在/var/log/auth.log(或/var/log/secure)中,定期检查日志可追踪权限使用情况,及时发现异常操作。 - 使用
sudo -i替代su进行交互式操作 若需要类似su的交互式 root 环境,可使用sudo -i,它会加载 root 的环境变量,同时保留sudo的日志记录功能。
更多推荐




所有评论(0)