一、什么是 root
root 是 Linux 系统中的超级管理员账户,也叫超级用户。它和普通用户最大的区别在于权限范围:普通用户只能操作自己家目录里的内容,访问系统文件时会提示权限不足;而 root 可以操作整个系统的任何文件、任何进程、任何配置,没有任何限制。
1. root 的身份标识:UID 0
在 Linux 中,每个用户都有一个身份标识,用 UID 表示。普通用户的 UID 从 1000 开始,而 root 的 UID 固定为 0。系统判断一个用户是否为超级用户,看的是 UID 是否为 0,而不是看用户名。因此,即使你创建一个名为 root 的普通用户,只要它的 UID 不是 0,也不具备超级权限。
2. root 的能力范围
root 的能力具体体现在多个方面:它可以读写任何文件,包括 /etc 下的系统配置、其他用户的家目录以及日志文件;它可以结束任何进程,包括系统关键服务;它可以安装、卸载软件,修改网络配置,挂载磁盘,创建和删除用户。简单来说,系统上没有 root 做不了的事。
3. 为什么不建议直接使用 root
su 命令的作用:su(switch user)用于切换当前登录用户。执行 su – root 后,会要求输入 root 的密码,验证通过后当前终端就变成 root 身份,提示符从 $ 变成 #,之后执行的所有命令都以 root 权限运行,直到输入 exit 才退回普通用户。下面演示一下 su 命令的基本用法:
# 查看当前用户
whoami
# 输出:yourname
切换到 root 用户(需要输入 root 密码)
su – root
输入密码后,提示符变成
whoami
输出:root
用完退出,回到普通用户
exit
需要注意的是,su 切换后一直保持 root 身份,风险较大;而 sudo 只对单条命令临时提权,用完自动恢复普通身份,更安全。
root 的权限过大,因此正常使用时不推荐直接用 root 登录,原因是风险太高。敲错一个命令就可能把系统搞坏。例如,你想删除自己目录下的临时文件,路径写错一个字符,普通用户最多提示权限不足,而 root 会直接执行,把系统文件删掉。而且 root 操作不会再有二次确认,删了就删了。
正因为如此,Ubuntu 和 Linux Mint 这类发行版默认将 root 账户锁定,不设密码,用户无法直接登录。需要管理员权限时,使用 sudo 临时提权。sudo 的含义是:用你自己的密码,临时以 root 身份执行一条命令,执行完就恢复普通身份。这样既安全,又不用长期开着 root。
sudo 也不是任何人能用的。很多人以为只要知道密码就能用 sudo,其实不是。系统通过 /etc/sudoers 文件来规定哪些用户、哪些组可以使用 sudo,以及能用它执行哪些命令。默认情况下,只有加入 sudo 组的用户才有提权资格。在 Ubuntu 和 Linux Mint 中,安装系统时创建的第一个用户会自动加入 sudo 组,所以它能用 sudo;但如果你后来新建了其他普通用户,这个新用户默认不在 sudo 组里,即使知道密码,执行 sudo 也会提示「该用户不在 sudoers 文件中,此事件将被报告」。换句话说,sudo 的权限是系统授予的,不是靠密码就能拿到的。
那如何给普通用户配置 sudo 认证呢?方法很简单,把该用户加入 sudo 组即可。在 Ubuntu 和 Linux Mint 中,sudo 组的成员默认拥有完整的提权资格。下面演示一下具体操作:
# 先用有 sudo 权限的账户执行,把目标用户加入 sudo 组
sudo usermod -aG sudo 用户名
验证是否加入成功
groups 用户名
输出中应包含 sudo,例如:用户名 : 用户名 sudo
切换回该普通用户,重新登录后即可使用 sudo
sudo whoami
输入该用户自己的密码,输出:root
也就是说,直接把普通用户添加到 sudo 组,是给普通用户开通 sudo 权限最简单、最直接的方式。它不需要去编辑 /etc/sudoers 文件,也不用记复杂的配置语法,一条 usermod 命令就能搞定。对于大多数日常使用场景,比如想让新用户能安装软件、管理系统服务,把用户加入 sudo 组就已经足够了。只有当你需要更精细地控制某个用户能执行哪些命令,或者想配置免密 sudo 时,才需要进一步去编辑 /etc/sudoers 文件。
需要注意两点:一是 usermod -aG 中的 -a 表示追加,务必带上,否则会把用户从其他组中移除;二是修改组之后,该用户需要重新登录(或退出当前会话再登录)才能生效。另外,如果你希望更精细地控制某个用户能执行哪些命令,可以编辑 /etc/sudoers 文件,但建议使用 visudo 命令来编辑,因为它会在保存前检查语法,避免写错导致 sudo 全部失效。
如果你希望更精细地控制某个用户能执行哪些命令,或者想给某个用户配置免密 sudo,就需要直接编辑 /etc/sudoers 文件。注意不要用普通编辑器直接改这个文件,一定要用 visudo 命令来编辑,因为它会在保存前检查语法,避免写错导致 sudo 全部失效。下面演示一下如何给指定用户配置免密 sudo:
# 用 visudo 打开 sudoers 文件(会自动检查语法)
sudo visudo
在文件末尾添加一行,让指定用户免密执行所有命令
用户名 ALL=(ALL) NOPASSWD: ALL
保存退出后,该用户执行 sudo 就不再需要输入密码
sudo whoami
直接输出:root
这里解释一下这行配置的含义:用户名 是要授权的用户;第一个 ALL 表示允许在所有主机上执行;(ALL) 表示可以以任何用户的身份执行命令;NOPASSWD: ALL 表示执行所有命令都不需要输入密码。如果你只想让某个用户免密执行特定命令,可以把最后的 ALL 换成具体命令,例如 NOPASSWD: /usr/bin/apt。需要提醒的是,NOPASSWD 虽然方便,但安全性更低,因为任何人只要拿到这个用户的登录权限,就能直接以 root 身份执行命令,不需要再输入密码确认,所以生产环境要谨慎使用。
为什么不能直接用 su 切换成 root?因为你的系统是 Linux Mint(基于 Ubuntu),它默认锁定了 root 账户,没有给 root 设密码。su 命令要切换成 root,需要输入 root 的密码。但 root 根本没密码,所以无论你输什么,都会提示「认证失败」。这是故意的安全设计,不是系统坏了。Ubuntu 和 Mint 的理念是:不鼓励你直接用 root,而是用 sudo 临时提权。
对比一下两种方式:su – root 是直接变成 root,一直保持 root 身份,直到你 exit,风险大,容易误操作;而 sudo 只在这一条命令期间用 root 权限,执行完立刻回到普通用户,安全,而且每一步操作都会被记录到日志里。所以 Mint 把 root 锁了,逼你走 sudo 这条路。
那想用 root 权限怎么办?用 sudo -i 即可:
sudo -i
输入你自己的密码 123456,就能进入 root shell,提示符会从 $ 变成 #。用完敲 exit 退回普通用户。如果你非要让 su 能用,可以给 root 设个密码:
sudo passwd root
输你自己的密码,然后给 root 设一个新密码,设完之后 su – root 就能用了。但我不建议这么做,原因有两个:一是破坏了 Mint 默认的安全设计;二是 root 一旦有密码,就多了一个可以被暴力破解的入口。日常完全没必要,sudo 已经够用。
4. 新手常见的几个坑
这里有几个新手容易踩的坑,值得特别留意。
第一个坑:su 和 sudo 的密码不一样。su 是切换用户,su – root 需要输入 root 的密码。但 Mint 中 root 没有密码,所以输入什么都会认证失败。而 sudo 需要输入的是你自己的密码,不是root 的密码。很多人第一次用 su 失败,就是因为输入了自己的密码,以为密码错了,其实是用错了命令。
第二个坑:sudo 不是所有命令都能提权。有些命令是 shell 内置的,比如 cd,sudo cd 不会生效,因为 cd 不产生新进程,sudo 无法作用于它。这类情况要用 sudo -i 进入 root shell 再操作,或者用其他方式绕过。
第三个坑:root 的 PATH 和普通用户不一样。普通用户的 PATH 中包含当前目录相关的一些路径,而 root 的 PATH 通常不包含当前目录,也不包含一些用户级安装的路径。所以有些命令普通用户能执行,sudo 之后反而找不到。这是出于安全考虑,防止当前目录下的恶意程序被 root 执行。
第四个坑:不要随意用 sudo 执行从网上下载的脚本。sudo 加脚本等于把整个系统交给这个脚本,脚本里写了什么你根本不知道。正确做法是先查看脚本内容,确认没有问题再执行,能不用 sudo 就不用。
第五个坑:chmod 777 不是万能解药。遇到权限问题,很多人第一反应是 chmod 777,也就是所有人可读可写可执行。这在测试环境可能没事,但在服务器上等于把所有门都打开了,任何用户都能修改你的文件。正确做法是给最小必要权限,比如 755 或 644。
5. 理解 root 的一个比喻
可以把 root 理解成一把万能钥匙。它能打开所有门,但你平时不会一直拿在手里,只在需要的时候借一下,用完就还回去。sudo 就是借钥匙的过程。这样更容易理解为什么要有 root,以及为什么不建议一直使用 root。
二、用户与用户组
在 Linux 中,用户和用户组是权限管理的基础。每个用户都有一个身份标识 UID,每个用户组也有一个组标识 GID。用户组的作用是把多个用户归到一起,方便统一管理权限。比如前面提到的 sudo 组,就是系统预置的一个特殊用户组,加入它的用户就拥有了提权资格。下面从用户组的创建与删除开始,逐步介绍用户管理的常用命令。
1. 用户组的创建与删除:groupadd 和 groupdel
groupadd 命令:用于创建一个新的用户组。基本用法如下:
# 创建一个名为 dev 的用户组
sudo groupadd dev
创建时指定 GID(组标识),避免自动分配
sudo groupadd -g 2000 dev
创建系统组(GID 通常小于 1000,用于系统服务)
sudo groupadd -r sysgroup
这里解释一下参数的含义:-g 用于指定 GID,如果不指定,系统会自动分配一个大于 1000 的 GID;-r 表示创建系统组,系统组的 GID 通常小于 1000,一般用于系统服务或后台程序,不建议普通用户加入。创建用户组需要 root 权限,所以前面要加 sudo。
groupdel 命令:用于删除一个用户组。基本用法如下:
# 删除名为 dev 的用户组
sudo groupdel dev
使用 groupdel 时有几个注意点:一是如果该组是某个用户的初始组(主组),则无法直接删除,会提示「cannot remove the primary group of user」,需要先把该用户的主组改到其他组,或者先删除该用户;二是删除组不会删除组里的用户,用户仍然存在,只是不再属于这个组;三是删除组操作不可恢复,删除前务必确认组名没有写错。
2. 用户的创建:useradd
useradd 命令:用于创建新用户。基本用法如下:
# 创建一个名为 zhangsan 的用户,并指定主组为 dev
sudo useradd -g dev zhangsan
创建用户时指定家目录
sudo useradd -d /home/zhangsan -m zhangsan
创建用户并指定 UID
sudo useradd -u 1500 zhangsan
这里解释一下常用参数:-g 指定用户的主组(初始组),主组只能有一个,创建用户时如果不指定,系统会默认创建一个与用户名同名的组作为主组;-d 指定家目录路径;-m 表示如果家目录不存在则自动创建;-u 指定 UID,如果不指定,系统会自动分配一个大于 1000 的 UID。需要特别注意的是,useradd 创建的用户默认没有密码,也无法登录,需要配合 passwd 命令设置密码后才能正常登录。
3. 用户的删除:userdel
userdel 命令:用于删除用户。基本用法如下:
# 删除用户 zhangsan(保留家目录和邮件)
sudo userdel zhangsan
删除用户并同时删除家目录和邮件
sudo userdel -r zhangsan
这里解释一下参数:-r 表示删除用户的同时,一并删除该用户的家目录和邮件目录。如果不加 -r,用户被删除后,家目录仍然保留在系统里,只是不再属于任何用户。删除用户前要确认该用户没有正在运行的进程,否则可能留下孤儿进程;同时,如果该用户是某个组的主用户,删除时也要注意组的关系。
4. 查看用户信息:id
id 命令:用于查看用户的 UID、GID 以及所属的用户组。基本用法如下:
# 查看当前用户的身份信息
id
查看指定用户的身份信息
id zhangsan
输出结果类似这样:uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan),27(sudo)。其中 uid 是用户标识,gid 是主组标识,groups 列出该用户所属的所有组。通过 id 命令,可以快速确认一个用户是否加入了某个组,比如查看 sudo 是否出现在 groups 列表中,就能判断该用户有没有提权资格。
5. 修改用户信息:usermod
usermod 命令:用于修改用户的属性,比如所属组、家目录、UID 等。基本用法如下:
# 把用户 zhangsan 追加到 sudo 组(-a 表示追加,务必带上)
sudo usermod -aG sudo zhangsan
把用户 zhangsan 的主组改为 dev
sudo usermod -g dev zhangsan
修改用户的家目录
sudo usermod -d /home/newhome -m zhangsan
这里解释一下参数:-aG 中 -a 表示追加(append),-G 表示附加组,两者配合使用可以把用户加入新的组,同时保留原有的组;如果只写 -G 而不写 -a,会把用户从其他组中移除,只保留指定的组,这一点非常容易踩坑。-g 修改主组;-d 配合 -m 可以修改家目录并迁移原有文件。修改组之后,该用户需要重新登录(或退出当前会话再登录)才能生效。
6. 查询用户和组信息:getent
getent 命令:用于从系统的数据库(如 /etc/passwd、/etc/group)中查询用户和组的信息。它比直接查看文件更规范,因为它会同时查询本地文件和远程数据库(如 LDAP)。基本用法如下:
# 查询所有用户信息(来自 /etc/passwd)
getent passwd
查询指定用户的信息
getent passwd zhangsan
查询所有用户组信息(来自 /etc/group)
getent group
查询指定用户组的信息
getent group dev
输出结果中,passwd 的每一行格式为「用户名:密码占位:x:UID:GID:描述:家目录:登录shell」,group 的每一行格式为「组名:密码占位:GID:组成员列表」。通过 getent,可以快速确认一个用户或组是否存在,以及它的 UID、GID 和成员构成,是排查权限问题时非常实用的命令。
到这里,我们已经把 Linux 中的 root 用户、用户与用户组的基础知识梳理清楚了。无论是理解 root 的权限边界,还是掌握用户和组的创建、删除、查看与修改,这些都是后续权限管理的地基。下一篇,我们将基于这一篇的内容,深入讲解 Linux 中的权限管理部分,包括文件权限的读写执行规则、chmod 和 chown 的用法、特殊权限位以及如何通过权限配置来保障系统安全。
网硕互联帮助中心






评论前必须登录!
注册