执行摘要:“ root”是管理员帐户的实际名称。“ sudo”是允许普通用户执行管理任务的命令。“ Sudo”不是用户。
长答案:
“ root”(又名“ superuser”)是系统管理员帐户的名称。名称的由来有点陈旧,但这没关系。
根用户的用户ID为0,并且名义上具有无限特权。根目录可以访问任何文件,运行任何程序,执行任何系统调用以及修改任何设置。(但请参见下面¹)。
在发明“ sudo”命令之前,如果要执行管理任务,则必须以root用户身份登录,要么以某种方式获得登录提示²,要么使用su
命令(“ su”表示替代用户。)³
这有点麻烦,也不允许您授予用户部分管理权限。因此发明了“ sudo”命令(“替代用户”的缩写)。
只要您的用户ID在sudoers文件中,就可以使用“ sudo”命令以超级用户特权执行命令,从而为您提供必要的授权。
因此,例如,sudo vi /etc/hosts
将允许您像以root用户身份运行一样编辑hosts文件。您甚至不需要root密码,只需您自己的登录密码。
当然,sudo su
这会让您简单地扎根。结果与您以root用户身份登录或执行su
命令的结果相同,只是您不需要知道root密码,但您确实需要将其保存在sudoers文件中。
sudoers文件确定谁可以使用sudo命令以及它们可以做什么。
sudoers文件为您提供了多个管理员。实际上,您的管理员是root,再加上sudoers文件中列出的所有人。没有sudoers文件,唯一的管理员是root。
实际上,在其他人为您管理计算机的组织中,不知道您自己计算机的root密码是很普遍的-只要您在sudoers文件中,就没有关系。
在一个为我服务的公司中,有一个巨大的服务器场,只有极少数人知道根密码。相反,有一个数据库允许谁在哪些服务器上工作。自动化过程会将您添加到被授权访问的那些服务器的sudoers文件中,并在您的授权到期时将您删除。
¹还有一件事:现代Unix版本现在甚至可以限制root用户的权限。
在SELinux(安全性增强Linux)下,有效地存在一个访问控制列表,该列表确定哪个程序可以执行什么操作,甚至root也不能越过这些限制。
在Apple的系统完整性保护(SIP)(又名“无根”)系统下,某些文件和目录被锁定,因此只有相应白名单上的应用程序才能访问它们。
这些系统的存在是为了保护系统免受恶意用户设法获得根访问权限的情况的侵害。(或者在某些情况下,防止用户越狱其嵌入式设备。)出于明显的原因,即使具有root用户访问权限,也很难绕过这些限制。
²“ login:”提示是Unix历史上的另一段古老历史,可以追溯到我们都在串行线路而不是窗口系统上使用ascii终端时。您仍然可以通过简单地login
在任何终端窗口中键入或通过从其他位置打开到计算机的ssh(或telnet或rsh)连接来获得“ login:”提示。如果需要,可以从那里以其他用户身份登录。(并且,如果您的计算机碰巧有串行端口,您仍然可以对其进行配置,以允许在其上登录。)
³也可以为单个程序授予root访问权限。即使由普通用户运行,这些程序也可以执行具有root用户访问权限的用户可以执行的任何操作。这些通常仅限于特定任务。例如,crontab程序具有root特权,因此它可以编辑cron表。显然,“ sudo”具有root特权,因此它可以执行其操作。
⁴我将再讲一遍我之前提到的问题。我一直在交替使用“管理员”和“根”,但是还有其他类型的管理员。这些帐户通常称为“角色帐户”,也就是说,这些帐户不属于实际的人,而是为了在系统上执行某些特定角色而存在。如果您查看系统上的/etc/passwd
文件,将会发现数十个这样的帐户。
例如,如果您的系统上安装了mysql,则将有一个“ mysql”用户,并且所有数据库文件,配置文件等都将归该用户所有。只有该用户才具有访问文件和运行mysql服务器所需的权限。从某种意义上说,该用户将是管理员帐户,但仅适用于mysql。
如果您需要执行数据库管理任务,则可以使用该su mysql
命令成为“ mysql” ,或者使用sudo
sudoers文件为这些特定命令赋予mysql特权的位置。