☰
Linux普通用户如何获取root权限:sudo配置与安全实践
2026/10/18 7:29:32 网站建设 项目流程

1. 为什么要配置普通用户的root权限

刚开始接触Linux的人,几乎都会撞上同一个问题:装完系统之后,直接用普通用户登录,然后想执行一条需要管理员身份的命令,终端提示“Permission denied”,瞬间一脸懵。

这不是系统故意刁难你。Linux的设计哲学里,普通用户和root用户之间的隔离,是整个安全体系的基石。root拥有系统最高权限,可以修改一切文件、管理所有进程、加载内核模块。如果日常操作全在这个权限级别下进行,一个回车输错命令,可能整台机器就废了。这也是很多人实际工作中坚持用普通用户干活、需要管理员权限时才临时提升的根本原因。

但现实中,我们不可能永远不碰管理员操作。装软件需要写/usr,改配置需要动/etc,看日志可能要读/var/log。于是,“普通用户如何获取root权限”就成了每一个Linux使用者绕不开的课题。

这个课题的核心,说白了就三个方案:su、sudo、以及直接登录root。三个方案各有适用场景,也各有坑。本文会把它们的原理、用法、配置方法和常见问题一次讲透,适合刚从Windows转到Linux、或者对权限管理还停留在“会用就行”阶段的人,也适合那些想给同事写一份安全提权规范的一线运维。

2. sudo不是“万能钥匙”,理解它的工作原理很关键

2.1 sudo到底做了什么

很多人以为sudo就是“切换成root执行一条命令”,这个理解不算错,但不够准确。

sudo的全称是“superuser do”,它的工作方式是:系统根据/etc/sudoers文件里的规则,判断当前发起请求的普通用户,是否有权限以指定身份执行指定命令。如果有,就在一个受控的、临时提升权限的进程里执行那条命令,执行结束后立刻恢复普通身份。

这意味着sudo把权限提升的控制粒度细化到了“哪个用户、哪台主机、哪条命令、要不要密码”这个级别。举个例子,你可以让普通用户zhangsan只能用systemctl restart nginx这一条命令,其他任何管理员操作都做不了。这种细粒度控制,是直接登录root完全做不到的。

2.2 权限识别与缓存机制

sudo在判断用户身份时,靠的不只是用户名。它会读取发起命令的终端信息、用户所属组、以及sudoers里的匹配规则。比如默认规则里写着:

%wheel ALL=(ALL) ALL

这行的意思是:wheel组的所有成员,可以在任何主机上,以任何用户身份,执行任何命令。

这里有个容易忽视的细节:sudo的授权是“按用户身份”判定的,但执行命令时,它默认不重置环境变量,某些情况下会继承你当前用户的环境配置。这就是为什么有时候明明通过sudo装好了某个软件,当前用户直接执行却提示找不到命令——PATH变量和普通环境的配置没有同步到sudo环境里。

另外,sudo有缓存机制。执行过一次sudo并输入密码后,五分钟之内再次执行通常不需要重新输密码,这个时间间隔由sudoers里的timestamp_timeout控制。要是临时提高敏感度,也可以改成0,即每次执行都必须输入密码。

2.3 为什么推荐sudo而不是su

如果你去问一个工作了十年的老运维:普通用户需要管理员权限时,你让他用su还是sudo?绝大多数人会回答sudo。

核心原因有两条:

  1. sudo只提升单条命令的权限,用完即失效,不会让你长时间处于root身份下。这能避免“手滑”造成的事故。用su直接切到root的话,后续所有命令都是root身份,一旦连续误操作,后果很难挽回。

  2. sudo的行为有完整审计日志。别人的服务器上谁执行过什么命令、什么时候执行的、执行结果如何,在/var/log/secure或者systemd日志里都能查到。而用su切换后,root在终端里敲了什么,日志里基本无从追踪。

所以,无论从安全性、可控性、还是可追溯性来说,sudo都是普通用户获取root权限的首选。

3. su命令:适合临时切换的备用方案

3.1 su的基本用法

su的作用是切换用户身份。常见用法是:

su - root

加不加那个-,差异非常大。-代表同时切换当前shell环境,包括PATH、HOME、环境变量等,全部切换为目标用户的环境。如果不带-,只切换用户身份,shell环境仍然是原来用户的,这时候执行命令经常会出现PATH不对、找不到命令的诡异情况。

举例说明:

  • su root:切换成root身份,但保留当前普通用户的环境变量
  • su - root:切换成root身份,环境变更为root的登录环境

两者对比,实际经验是日常使用尽量带-。带-之后,pwd会跳转到root的家目录,echo $PATH也会变成root的路径集合,行为符合直觉。

3.2 su的潜在风险

前面已经提到,su的最大问题是权限时长。

如果你用su切到root,再顺手开了一堆后台服务、设了一个定时任务,那么这些进程全是以root身份运行的,即使你马上退回了普通用户,它们依然会以root的身份继续存活。一旦被人利用漏洞拿下其中一个进程,攻击者拿到的就是root权限。

网上一搜Linux安全事件,一大半的入侵路径里都有“通过某个root权限进程的漏洞提权”这一步。与其事后亡羊补牢,不如从源头减少root进程的存在时间。

因此,su适合的典型场景是:需要在终端里长时间进行一组管理员操作,而且操作之间互相依赖、频繁切换身份反而会产生额外风险的情况。比如修复一个复杂服务配置,可能需要反复改文件、重启服务、看日志,用sudo逐条执行会有点碎,这时候su -切过去集中处理,效率更高。

3.3 su与sudo的配合使用

实际工作中,这两者不是互斥的,经常混合着来。

比如某个同事需要处理系统的存储扩容问题,他会先通过sudo提权查看当前分区情况:

sudo fdisk -l sudo df -h

确认要做的事情比较多、时间比较长之后,再执行su -切到root,集中把分区、格式化、挂载、更新fstab整套流程走完,最后exit退出。

简单总结一下用场景,我习惯这么选:

场景推荐方案
单次执行一条管理员命令sudo
连续执行多条关联配置命令su - 或 sudo -i
需要长期保持root环境做事不建议
确认身份后执行固定脚本sudo + 脚本路径

4. 实操:从零开始给普通用户配置sudo权限

4.1 环境准备与基础背景

以最常见的发行版为例,默认情况下,安装系统时创建的第一个用户往往自动拥有sudo权限,之后手动添加的普通用户则默认没有。这导致有个常见现象:新用户登录系统,想装个软件,发现自己什么都干不了。

要在实践中给普通用户授权,你需要一台可以登录root账户的Linux主机。如果是云服务器,通常可以通过控制台或者root默认密码直接登录。

这里特别提醒一下:如果你手头机器的Root登录方式已经被禁用,即/etc/ssh/sshd_config里设置了PermitRootLogin no,且当前只有普通用户,但你又忘了给它授权,那就进入单用户模式或者通过云厂商控制台重置密码来救场。新手遇到这个情况不要慌,这不是病,这是安全的双重保险。

4.2 操作步骤详解

整个配置流程分为三步:创建用户、编辑sudoers文件、验证权限。

第一步,用root登录系统,创建普通用户并设置密码:

useradd zhangsan passwd zhangsan

useradd一个常见的坑是:创建一个用户后,系统不会自动创建对应的家目录,除非加了-m参数。所以更稳妥的写法是:

useradd -m zhangsan

-m让系统自动创建/home/zhangsan目录,并拷贝/etc/skel下的默认文件过来。

第二步,编辑sudoers文件。这是关键一步,也是很多人第一次容易搞砸的一步。

在绝大多数Linux发行版上,都提供了visudo这个工具来安全地编辑/etc/sudoers。千万别直接用vim改/etc/sudoers,因为一旦语法写错,sudo可能直接罢工,到时候连提权都提不了了。visudo会在保存退出前检查语法,语法有错就不让你退出,能减少大量翻车事故。

执行:

visudo

在文件里找到类似下面这行:

root ALL=(ALL) ALL

在这一行的下方,添加:

zhangsan ALL=(ALL) ALL

保存退出。

这里解释一下这行的含义:zhangsan可以在所有主机上(第一个ALL),以任何用户的身份(第二个ALL),执行任何命令(第三个ALL)。如果希望执行命令时不输密码,可以改成NOPASSWD:

zhangsan ALL=(ALL) NOPASSWD: ALL

对日常使用,建议保留密码验证。NOPASSWD虽然少打几次密码,但一旦账号密码泄露,任何人都可以零成本获取sudo权限,危险程度明显上升。

第三步,切换回普通用户验证效果:

su - zhangsan sudo whoami

如果输出:

root

说明配置成功。再随便执行一条类似sudo cat /etc/shadow的命令,能正常读出来,说明权限确实生效了。

4.3 常用sudoers写法扩展

了解最基础的授权方式后,有几个更实用的场景值得补充。

场景一:只允许普通用户重启特定服务。

zhangsan ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

这样zhangsan就只能用sudo重启nginx,干不了别的。重启后服务如果挂了,他连启动其他服务的权限都没有,错误半径被限制在一个最小范围内。

场景二:允许整个组的成员拥有sudo权限。

%wheel ALL=(ALL) ALL

注意前面那个%,代表后面是组名而不是用户名。想把某个用户加进wheel组,只需:

usermod -aG wheel zhangsan

记住-aG的a不能丢,如果不加a,-G会把用户从其他所有附加组里移除,等于一次误操作把之前的所有组权限都清掉了。

场景三:允许用户在服务器A上执行特权命令,但在服务器B上不允许。

zhangsan 192.168.1.10=(ALL) ALL

这在多台服务器集中管理、账号统一配置的环境下很常用,可以细化到单台机器上。

4.4 配置时最容易犯的错误

在我的经验里,配置sudo权限的新手,最容易在下面几个地方翻车:

第一,直接vim /etc/sudoers而不是visudo。一旦语法写错,sudo基本就废了。正确做法是永远用visudo,它会帮你做语法校验,不给错误留机会。

第二,忘记-m参数建用户,导致用户没有家目录,登录后连工作目录都没有。

第三,修改sudoers时不留后路。远程服务器上,把root的sudo权限误改坏,然后发现sudo无法工作,自己也退出了登录,接下来就只能靠物理机或者云控制台救场了。实操里的安全习惯是:改完sudoers之前另外开一个终端窗口,先把sudo -l测一遍,确认语法和权限都OK,再关闭原来的连接。

第四,把NOPASSWD设置得到处都是。有些运维为了图省事,给所有用户都配上NOPASSWD,这等于出门不锁门,是非常危险的做法。

5. 直接登录root:何时可以,何时不该

5.1 root登录的利与弊

除了su和sudo,还有一种“获取root权限”的方式:直接以root身份登录系统。

在绝大多数个人实验环境下,root登录没有任何问题。但在生产服务器上,直接禁止root远程登录是标配。原因很简单:root账号就是系统的“总钥匙”,如果这把总钥匙天天暴露在网络端口上,暴力和撞库攻击就多了一个明确的攻击目标。常见的加固手段是修改/etc/ssh/sshd_config:

PermitRootLogin no

修改完后,用systemctl或者service记得重启sshd服务:

systemctl restart sshd

注意,此处操作有风险。如果远程连接配置错了,又无法恢复,可能会把自己锁在外面。建议先在本地开一个root终端或通过其他方式确认能恢复访问,再执行这类修改。

5.2 管理root密码的安全事项

很多人在配置root密码时,喜欢设成和某个业务系统相同的密码。这非常不推荐。一旦某个业务系统被攻破,密码被拿到,攻击者非常可能会尝试用同一套凭据去登录服务器root账号。

一个好的root密码,应该具备足够长度和复杂度,同时和任何线上系统无关。写完可以顺手把它存进公司内部的密码管理器里,并加上二步验证。

5.3 什么时候可以允许root远程登录

也不是说root登录一定得全部封死。在没有统一堡垒机、没有集中认证的中小规模服务器上,如果操作员数量极少、网络又是私网隔离,保留root登录有时候反而更高效。但你一定要知道这条路是“方便换安全”的交换,必须给自己设定边界。

例如,可以在防火墙层把SSH端口限制为来源IP白名单,再把root登录限定到具体IP段内。这样即使root能远程登录,攻击面也小了很多。

6. 权限管理的安全原则与合规意识

6.1 最小权限原则

最小权限原则的意思是:任何用户在执行任务时,只拥有完成该项任务所必需的最小权限,绝不多给。

这个原则放到Linux权限管理上,就是能交给组的不要交给个人,能给单条命令的不要给ALL,能给NOPASSWD某个固定脚本的不要给NOPASSWD ALL。

前阵子处理过一种情况,某同事为了测试方便,给测试机上一个很普通的账号配了sudo ALL,结果这机器连着公网,没过几天就被扫了。虽然最后没造成真实损失,但排查的过程极其痛苦。回头看,如果当初只给几个必要的软件安装命令,攻击者就算拿到账号,能干的事也极其有限。

6.2 日志审计与定期检查

配置好sudo之后,日志审计一定不能省。用root或者有权限的运维人员,定期执行:

grep "sudo" /var/log/auth.log

或者查看:

journalctl -u sudo -n 50

就能看到近期有哪些用户执行了sudo命令。如果发现某些账号在深夜反复执行敏感命令,这就是需要关注的信号。

日志审计的意义不仅在于追责,更重要的是通过分析,可以发现权限分配是不是合理。比如某账号从来没执行过sudo命令,那它拥有sudo权限的理由就不充分了。

6.3 反复审查线上配置

权限配置不是一次性的,每次人员变动、服务上线、架构调整,都可能影响到旧的权限规则。

我的习惯是每季度做一次sudo权限复核,把/etc/sudoers和/etc/sudoers.d/下的所有文件统查一遍。重点检查:

  • 是否还有不活跃用户的授权记录
  • 是否有人配了NOPASSWD后又离职了
  • 是否有生产服务器开了root远程登录

如果发现冗余授权,及时下掉。这个习惯保持了几年,确实帮我避免了好几轮权限风险。

7. 常见问题排查与避坑技巧

7.1 sudo执行时报“xxx is not in the sudoers file”

这是新用户最容易遇到的第一道坎。看到这个提示,说明当前用户根本不在sudoer列表里。解决办法非常简单:用root登录,执行visudo,把该用户的授权行加入,保存退出。

需要注意的是,如果你正在远程操作一台服务器,而该账户是你唯一的登录方式,那么在修改前,最好确保另一个终端里有一个root会话可用。否则修改出错或者改动后权限不生效,等于自锁门外。

7.2 visudo语法错误导致sudo罢工

如果你在sudoers里写错了一行,visudo通常会在保存退出时提示语法错误,并把当前会话停在编辑器里。如果你使用的是默认编辑器,只需选择不保存或者取消,再重新进入修改即可。

但极端情况下,如果你直接编辑了/etc/sudoers而不是通过visudo,且语法错误已经保存,那么任何sudo操作都会报错。这时候唯一可行的恢复方案是:以root身份直接登录,换一种方式修正。所以再次强调,不直接用文本编辑器改sudoers,这句话什么时候强调都不过分。

7.3 sudo可以执行,但命令提示“command not found”

这类问题通常不是权限问题,而是PATH环境变量不一致。

sudo执行命令时,使用的是secure_path里定义的路径,而不是当前用户shell的PATH。所以你当前用户PATH里有/usr/local/bin,但secure_path里没有,那么sudo执行某个安装在该目录下的命令时就会提示找不到。

解决办法有两个:一个是修改sudoers里的secure_path,把目录加进去;另一个是用绝对路径执行命令,比如:

sudo /usr/local/bin/some-tool

在实际业务中,我经常遇到用户通过pip install --user装好某个工具后,用sudo执行时报找不到命令。原因就是这个工具装在当前用户自己的目录下,root去执行时根本找不到。这种问题最好别用NOPASSWD绕路,而是审视一下到底是什么路径问题。

7.4 普通用户能读文件但执行系统命令受限

遇到这种问题,最明显的就是脚本里调用了需要root权限的接口,但当前用户身份不对。

这时候处理方法遵循一个原则:是给用户加sudo权限,还是给脚本加权限?多数成熟系统的做法是,把需要特定权限的模块封装成脚本,再给特定用户配置针对该脚本的NOPASSWD授权。这样既能完成功能,又不用开放整个命令空间。

比如写一个事务脚本,让普通用户通过sudo去执行:

sudo /usr/local/sbin/user-tool.sh

脚本内部可以按需执行各种系统操作,但对用户而言,他只接触到一条固定命令,风险可控。

7.5 sudo -i和sudo -s有什么区别

这两个都是进入root shell的常用方式,但行为有区别。

  • sudo -i会模拟root的完整登录过程,加载root的profile、bashrc等环境配置,最终落到root的家目录。
  • sudo -s只是以root身份启动一个shell,但不会加载root的登录配置,当前目录也保持不变。

实际体验下来,sudo -i更像“真正进入root环境”,适合需要完整root环境变量的长时间操作。sudo -s适合快速进入root shell,但又不希望环境被切换的情况。

两者都不是生产环境的好习惯,但就地处理问题的效率确实高。我会在本地开发机上用,生产环境则严格要求不许长时间驻留root shell。

8. 最后几点实战体会

接触Linux这些年,权限管理是踩坑最多、教训最深的一块。早年我也干过直接把所有用户拉到sudo ALL组的省事操作,后来被一次安全事故教育之后,才彻底改掉这个习惯。

现在我对普通用户获取root权限的态度很简单:能用sudo解决,不用su;能用组管理,不用个人授权;能指定命令,不用ALL权限。多用一层限制,就少一分风险。

另外还有一个小技巧想分享:如果你的系统有多台服务器,强烈建议统一维护sudoers规则,别每次手动去改。可以用一套配置管理工具管理这些文件,或者至少维护好/etc/sudoers.d/目录下的子文件,把不同业务的授权拆开,方便排查和维护。

权限问题是Linux使用的第一课,也恰恰是最容易在初学阶段被忽略的细节。把这套东西理顺了,后续的日常运维会轻松很多。希望你读完以后,不只是会执行两条命令,也能建立起属于自己的一套权限管理边界。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询