如果我创建一个名为'root'的账户会发生什么?

如果我在Ubuntu中创建一个名为root的用户账户,它会自动拥有root权限吗?

25已经有一个名为root的账户。 - mikewhatever
@mikewhatever 这是他观点的一部分;root 是一个特殊用户,所以你会得到一个"特殊"(即有错误的)结果吗? - Sapphire_Brick
6个回答

用户名必须是唯一的,所以,正如 Owen Hines' answer提到的那样,你将无法创建该用户。然而,关键点在于超级用户权限(所有可能的权限)不是由用户名root授予的,而是由UID授予的。

具有UID 0的用户是超级用户。

因此,如果具有UID 0的用户有一个不同的名称,并且您创建了一个名为root的用户,它们将不具备任何特殊状态。

我参考了标签维基!


你能否将现有的账户root重新命名,然后创建一个普通用户root? - emory
顺便提一下,似乎有可能(虽然我没有尝试过)将uid 0的用户名更改为其他内容,这样超级用户就不叫“root”了。这不是一个好主意,但是确实可行。因此,例如,可以创建一个名为“god”的超级用户帐户,其uid为0,并创建一个名为“root”的普通用户,其uid为1000或其他数字。 - Ian D. Scott

它不会让你这样做,因为已经存在一个root用户。

但是,正如Florian Diesch在评论中所说:

有些工具可能会报错,但是你可以随时手动编辑/etc/passwd/etc/shadow来创建一个名为root的第二个用户。


2如果你这样做的话,chown root file会发生什么呢? - fkraiem
1@fkraiem,嗯...好问题,我不知道答案。 - TheOdd
3以前发生的事情是文件中的第一个获胜。我现在不知道了。 - Joshua

首先,就像其他人所说的那样,你需要将UID为0的用户更改为其他内容。然后,你可以创建一个普通用户,用户名为root,UID大于1000。这样系统将会“正常”工作。所有权限和核心系统功能都使用UID而不是用户名。实际上,这是加固Linux系统的一个很好的第一步(虽然禁用root更好,但在sudo出现之前我们经常这样做)。
现在来谈谈会发生什么。
大多数情况下,不会有任何问题。所有与授权或认证相关的系统调用都使用UID(据我所知)。而且这种方式已经存在一段时间了。你的系统将继续正常运行。系统工具将反映新的用户名,但仍然正常工作。换句话说,“root”只是一种约定,并非铁板钉钉。
话虽如此,我相信有些工具和程序编写得很差。检查$USER环境变量的程序可能会表现不正常。通常这些是脚本和小项目,但你可能需要花些时间追踪6年前在fdisk中犯下的那个错误提交,它一直让你头疼。
这是我过去经常做的事情。这是一个简单的步骤,属于“不可预测的用户名”规则。然而,如今有更好的方法来达到相同的目标。

你是指UID吧,我想。 - Zanna

如其他人所解释的那样,它是UID = 0给予用户“超级权限”,而不是用户名为“root”。因此,如果你以某种方式成功创建了另一个名为“root”的用户(在重命名/删除原始用户之后),该用户的超级状态将取决于您给予它的UID。
这也引出了另一个有趣的想法:完全可以拥有具有相同UID的多个用户(从文件系统权限的角度来看,它们本质上是同一个用户,但允许具有不同的shell和主目录)。实际上,一些类UNIX系统还有另一个名为toor(root倒写)的超级用户帐户,它允许拥有两个具有不同设置的超级用户帐户。

如何创建第二个“root”:
是的,在理论上,不应该有两个具有相同用户名或相同ID的用户。标准工具是防错的,不会为您创建这样的用户。但您始终可以手动编辑/etc/passwd文件。
例如,我这样做了:
$ sudo adduser root2 # created ordinary user
$ sudo vim /etc/passwd # edit last line, change 'root2' to 'root'. 
$ sudo -u '#1002' id # 1002 is UID of new user, it's in last line of /etc/passwd
uid=1002(root) gid=1002(root2) группы=1002(root2)

如你所见,我们现在是root!是的,这不是真正的root(不是uid=0),但它有相同的四个字母。令人印象深刻但无用。
如何创建更好的第二个“root”:
此外,你还可以进行其他修改。保留用户名不变(yourname或root2),但更改uid。
$ tail -n 1 /etc/passwd
root2:x:0:0:,,,:/home/root2:/bin/bash

(请注意,UID和GID字段为零) 现在你有一个普通(非root)用户,他的用户名几乎没有可疑之处(或者可以将用户名设置为'johndoe'以获得更好的效果),但实际上,该用户拥有超能力!
$ fdisk /dev/sda
fdisk: unable to open /dev/sda: Permission denied
$ sudo -u root2 fdisk /dev/sda

Command (m for help):

如你所见,普通用户无法在/dev/sda上使用fdisk命令,但root2可以做任何事情!
这个简单的技巧有时在系统被黑客入侵后用来提供后门。即使真正的root更改了他的密钥/密码,黑客仍然可以通过其他具有uid=0的用户完全控制系统。

矩阵是如何工作的

实际上,无论是用户名'root'还是uid=0本身并没有什么神奇之处。这只是一种约定。而且它甚至并不总是正确的。(参见这个问题:root账户是否总是具有UID/GID 0?) 内核代码才是神奇的。实际上,用户空间代码本身 - 即使以root身份运行 - 也不能做root能做的任何事情。root的权限在内核中。例如,如果你执行"cat /etc/shadow"(通常只有root可以执行此操作),/bin/cat程序调用libc的open()函数,这仍然是用户空间代码,而这个open()函数执行系统调用到内核。然后内核自己决定要做什么。例如,内核可能允许某些操作,如果有效用户的id==0。
理论上,如果您在内核中更改一些代码并以不同的方式处理'www-data'用户,则某些操作可能仅允许'www-data'用户执行(甚至不允许root用户执行)。

大多数“用户友好”的工具都会检查,如果用户名已被使用,将不允许您创建帐户。
如果您绕过此限制,并手动在/etc/passwd和/etc/shadow中添加第二个root帐户,那么使用哪一个取决于您是将其放在原始帐户之前还是之后。与Unix系统上的所有用户帐户一样,只有当其UID为零时,它才具有超级用户访问权限,而与名称无关。