早期的操作系统没有用户的概念(如 MS-DOS),或者有「用户」的概念,但是几乎不区分用户的权限(如 Windows 9x)。而现在,这不管对于服务器,还是个人用户来说,都是无法接受的。
在服务器环境中,「用户」的概念是明确的:服务器的管理员可以为不同的使用者创建用户,分配不同的权限,保障系统的正常运行;也可以为网络服务创建用户(此时,用户就不再是一个有血有肉的人),通过权限限制,以减小服务被攻击时对系统安全的破坏。
而对于个人用户来说,他们的设备不会有第二个人在使用。此时,现代操作系统一般区分使用者的用户与「系统用户」,并且划分权限,以尽可能保证系统的完整性不会因为用户的误操作或恶意程序而遭到破坏。
你可以查看 文件,来得到系统中用户的配置信息。
可以关注到,除了你自己以外,还有一个特殊的用户:,和一大堆你素未相识的名字。下面将会进行介绍。
根用户
在前文中我们知道,在使用 安装软件时,我们需要在前面加上 。这可以使我们以根用户 () 的身份安装软件。
根用户 / 用户在 Linux 操作系统中拥有最高的权限,可以对系统做任何操作(包括删除所有系统文件这一类极端危险的操作)。 用户的用户数据存储在 下。
在我们使用 的时候,输入自己的密码并验证正确之后, 就会以 用户的身份,执行后面我们希望执行的命令。而使用 安装的软件存储在了系统的目录下,所以必须要以 用户的身份安装。这就是我们平时需要 来安装软件的原因。
系统用户
除了你、 和其他在用你的电脑/服务器的人(如果有)以外,剩下还有很多用户,如 , 等。它们由系统或相关程序创建,用于执行服务等系统任务。不要随意删除这些用户,以免系统运行出现问题。
普通用户
普通用户可以登录系统,并对自己的家目录下的文件进行操作。所有普通用户的家目录都在 下,位于 的位置,其中 是用户名。
普通用户无法直接修改系统配置,也无法为系统环境安装或卸载软件。
命令可以让你以另一个用户的身份执行指定的命令。当然,它最常见的用途,就是能让普通用户以 的身份执行命令:不加入其他参数, 后面直接加命令,我们在前面的课程中也见到很多次了。
那么,如何以 之外的用户的身份执行命令呢?加上 的参数即可。
这里,我们就用 这个用户的身份,执行了 ,得到了 的 UID 等信息。
命令用于直接切换用户,格式是 。如果没有用户名这个参数,则切换到 用户。
在读完上面这句话之后,你可能会尝试切换到 ,但是却失败了:
这是因为,如 Ubuntu 等 Linux 发行版默认禁止了 用户的密码登录,只允许通过 提高权限。但是,我们可以用 运行 ,来得到一个为 用户权限的 shell。
, 等命令有一些细微的区别,可以阅读本章的补充材料。另外,也可以使用 (与 等价),获得一个 权限 shell。
用户组是用户的集合。通过用户组机制,可以为一批用户设置权限。可以使用 命令,查看自己所属的用户组。
可以看到,用户 从属于多个用户组,包括一个与其名字相同的用户组。一般在用户创建的时候,都会创建与它名字相同的用户组。
对于普通用户来说,用户组机制会在配置部分软件时使用到。如在使用第八章的 Docker 时,可以把自己加入 用户组,从而不需要使用 权限,也可以访问它的接口。
同样,用户组和用户一样,也有编号:GID (Group ID)。
修改密码:
可以使用此命令修改用户密码,格式为 。如果没有输入用户名,则修改自己的密码。
(*) 简单的用户配置:
是 Debian 及其衍生发行版中附带的一个方便的用户管理脚本。它可以用来向系统添加用户、添加组,以及将用户加入组。输入:
即可添加此用户。而输入
即可添加此用户组。将用户加入指定用户组也非常简单:
在 Linux 中,每个文件和目录都有自己的权限。可以使用 查看当前目录中文件的详细信息。
第一列的字符串从左到右意义分别是:文件类型(一位)、文件所属用户的权限(三位)、文件所属用户组的权限(三位)、其他人的权限(三位)。对于每个权限,第一位 代表读取 (Read),第二位 代表写入 (Write),第三位 代表执行 (Execute), 代表没有对应的权限。
第三、四列为文件所属用户和用户组。
例如,上面的文件 为普通文件 (),所属用户权限为 ,所属用户组权限为 ,其他人的权限为 ,文件所属用户和用户组均为 。
可以使用 (change file mode bits) 修改权限, (change file owner) 修改文件所有者。具体的使用方法,请查阅相关的文档,这里不再列出。
相信到现在你应该已经发现了:Linux 下文件系统的结构和 Windows 的很不一样。在 Windows 中,分区以盘符的形式来标识(如「C 盘」、「D 盘」),各个分区的分界线是很明确的。在系统所在的分区(一般为 C 盘)中,存储着程序文件 (),系统运行需要的文件 (),用户文件 () 等。这种组织形式源于 DOS 和早期的 Windows,并一直传承下来。
而 UNIX 系列采用了一种不一样的思路组织文件:整个系统的文件都从 (根目录)开始,像一棵树一样,类似于下图。
其他的分区以挂载 (mount) 的形式「挂」在了这棵树上,如图中的 。
那么在根目录下的这些目录各自有什么含义呢?这就由文件系统层次结构标准 (FHS, Filesystem Hierarchy Standard) 来定义了。这个标准定义了 Linux 发行版的标准目录结构。大部分的 Linux 发行版遵循此标准,或由此标准做了细小的调整。以下进行一个简要的介绍。也可以在官网查看标准的具体内容。
当然,实际情况不一定会和以下介绍的内容完全一致。可以使用 和 查看你的系统中关于文件系统层次结构的文档。
- 存储必须的程序文件,对所有用户都可用。
- 存储在启动系统时需要的文件。
-
存储设备文件。
-
存储系统和程序的配置文件。
-
用户的家目录。存储用户自己的信息。
-
存放系统运行必须的程序库文件。
- 和
-
这两个目录都用于挂载其他的文件系统。 用于可移除的文件系统(如光盘),而 用于临时使用。
-
存放额外的程序包。一般将一些大型的、商业的应用程序放置在这个目录。
-
用户的家目录。
-
系统运行时的数据。在每次启动时,里面的数据都会被删除。
-
存储用于系统管理,以及仅允许 用户使用的程序。如 (文件系统修复程序)、(重启系统)等。
-
存储网络服务的数据。
- 临时目录,所有用户都可使用。
-
大多数软件都会安装在此处。其下有一些目录与 下的结构相似,如:
此外,还有一些目录:
- : 存储系统通用的 C 头文件。当然,里面会有你非常熟悉的头文件,如 。
- : 存储系统管理员自己安装的程序,这些文件不受系统的软件管理机制(如 )控制。 里面的层次结构和 相似。
- : 存储程序的数据文件(如 文档、GUI 程序使用的图片等)。