Skip to content
On this page

Linux 的用户和权限管理

🎫 教程内容于 2023-08-02 在以下平台验证通过
✅ Ubuntu 22.04

在 Linux 中,用户是可以访问系统及其资源的个体。每个用户都有一个唯一的用户名和用户 ID(UID),用于标识他们在系统中的身份。组是一组共享相同权限以访问文件和目录的用户集合。权限是确定谁可以访问文件或目录以及他们可以对其执行什么操作的规则。

Linux 使用一种由三种类型的权限组成的权限系统:读取、写入和执行。这些权限可以针对三种类型的用户进行设置:文件或目录的所有者、拥有该文件或目录的组的成员以及系统上的所有其他用户。

了解 Linux 中用户、组和权限的工作原理对于管理对系统资源的访问并确保系统安全至关重要。

用户

识别当前用户

要在Linux中识别当前用户,可以使用whoami命令。该命令将在终端中显示当前用户的用户名。

sh
> whoami
tinymemo

此外,您还可以检查$USER环境变量的内容,它也会显示当前用户的用户名。

sh
> echo $USER
tinymemo

用户ID

Linux中的每个用户都有一个唯一的用户ID(UID),用于标识他们在系统中的身份。您可以使用id命令来显示当前用户的UID

sh
> id
uid=1000(tinymemo) gid=1000(tinymemo) groups=1000(tinymemo),4(adm),27(sudo),44(video),50(staff)

如您所见,当前用户的UID是1000。您还可以使用-u选项仅显示UID,或者使用id -u命令仅显示UID

sh
> id -u
1000

> echo $UID
1000

用户的UID在创建用户时会自动生成。root用户的UID始终为0。

Linux系统上的所有用户都存储在/etc/passwd文件中。您可以使用cat命令来显示此文件的内容。

sh
> cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
...
tinymemo:x:1000:1000::/home/tinymemo:/bin/bash

/etc/passwd文件中每行的第二个和第三个字段分别是用户的UID和GID。需要注意的是,用户的UID与用户的GID不同。用户的GID是用户所属组的ID。我们将在下一节讨论组。

创建新用户

要在Linux中创建新用户,可以使用adduser命令。该命令将使用指定的用户名和UID创建一个新用户。如果不指定UIDadduser命令将自动生成一个UID给新用户。

sh
> sudo adduser newusername

正在添加用户 `newusername' ...
正在添加新组 `newusername' (1000) ...
正在添加新用户 `newusername' (1000) 到组 `newusername' ...
正在创建主目录 `/home/newusername' ...
正在从 `/etc/skel' 复制文件 ...
新密码:
重新输入新密码:
passwd:密码已成功更新
正在更改 newusername 的用户信息
输入新值,或按 ENTER 保留默认值
	全名 []:
	房间号码 []:
	工作电话 []:
	家庭电话 []:
	其他 []:
信息是否正确?[Y/n] y

运行adduser命令后,您将被提示为新用户设置密码。您还可以使用passwd命令为新用户设置密码。

sh
> sudo passwd newuser
新密码:
重新输入新密码:
passwd:密码已成功更新

如果在运行passwd命令时省略了用户名,它将为当前用户设置密码。

删除用户

要在Linux中删除用户,可以使用deluser命令。该命令将从系统中删除指定的用户。

sh
> sudo deluser newusername

正在删除crontab ...
正在删除用户 `newuser' ...
完成。

用户组

用户组是共享对文件和目录的访问权限的用户集合。每个组都有一个唯一的组ID(GID),用于标识它在系统中的身份。您可以使用id命令来显示当前用户的GID

sh
> id
uid=1000(tinymemo) gid=1000(tinymemo) groups=1000(tinymemo),4(adm),27(sudo),44(video),50(staff)

如您所见,当前用户的GID1000。您还可以使用-g选项仅显示GID,或者可以使用id -g命令仅显示GID

将用户添加到组

一个用户可以是多个组的成员。要将用户添加到组中,可以使用usermod命令。该命令将指定的用户添加到指定的组中。

sh
> sudo usermod -a -G groupname username

-a选项告诉usermod命令将用户追加到组中,而不是替换用户当前的组。-G选项告诉usermod命令将用户添加到指定的组中。

从组中移除用户

要从组中移除用户,可以使用 gpasswd 命令。该命令将从指定的组中移除指定的用户。

sh
> sudo gpasswd -d 用户名 组名

从组 tinkink 中移除用户 newuser

检查用户所属的组

要检查用户所属的组,可以使用 groups 命令。该命令将显示指定用户所属的组。

sh
> groups newuser

newuser : newuser tinkink

创建和删除组

要在 Linux 中创建新组,可以使用 addgroup 命令。该命令将使用指定的组名和 GID 创建新组。如果不指定 GIDaddgroup 命令将自动生成一个 GID

sh
> sudo addgroup testgroup

sudo addgroup testgroup
正在添加组 `testgroup' (GID 1001) ...
完成。

要在 Linux 中删除组,可以使用 delgroup 命令。该命令将从系统中删除指定的组。

sh
> sudo delgroup testgroup

正在移除组 `testgroup' ...
完成。

权限

在理解用户和组的漫长旅程之后,我们终于可以谈论权限了。权限是确定以下内容的规则:

  • 谁可以访问文件或目录
  • 以及他们可以对其进行什么操作

这些权限可以针对三种类型的用户(谁)进行设置:

  • 文件或目录的所有者
  • 拥有文件或目录的组的成员
  • 系统上的所有其他用户。

有三种类型的权限(可以做什么):读取写入执行

因此,文件或目录的权限可以针对三种类型的用户(谁)和三种类型的权限(可以做什么)进行设置。

检查权限

要查看文件或目录的权限,可以使用 ls -l 命令。该命令将显示指定文件或目录的权限。

sh
> ls -l

-rw-r--r-- 1 tinymemo tinymemo  0 Aug  1 16:00 file.txt
drwxr-xr-x 2 tinymemo tinymemo 40 Aug  1 16:00 directory
-rwxr-xr-x 1 tinymemo tinymemo  0 Aug  1 16:00 script.sh

ls -l 命令输出的每行的第一个字符是文件类型。最常见的类型有:

  • - 表示普通文件
  • d 表示目录

接下来的九个字符是文件或目录的权限。前三个字符是文件或目录的所有者的权限。接下来的三个字符是拥有文件或目录的组的权限。最后三个字符是系统上所有其他用户的权限。

每组三个字符的第一个字符是 读取 权限。每组三个字符的第二个字符是 写入 权限。每组三个字符的第三个字符是 执行 权限。

file.txt 为例:

  • 前三个字符是 rw-,表示文件的所有者具有 读取写入 权限,但没有 执行 权限。

  • 下面三个字符是 r--,表示文件的所有者所在的组(tinymemo 组)具有 读取 权限,但没有 写入执行 权限。

  • 最后三个字符是 r--,表示系统上的所有其他用户具有 读取 权限,但没有 写入执行 权限。

更改权限

要更改文件或目录的权限,可以使用 chmod 命令。该命令将更改指定文件或目录的权限。以下是一些使用 chmod 命令的示例:

sh
> chmod +x file.txt
> chmod -x file.txt
> chmod u+x file.txt
> chmod g+x file.txt
> chmod o+x file.txt
> chmod 755 file.txt
> chmod 644 file.txt
> chmod 777 file.txt
> chmod 400 file.txt

权限的第一个语法是 [角色][操作符][权限]

  • 角色 可以是文件或目录的所有者的 u,文件或目录所属组的 g,或系统上的所有其他用户的 o(除了所有者和文件或目录所属组的用户)。如果省略 角色,则适用于所有三个角色。
  • 操作符 可以是 + 添加权限,- 移除权限,或 = 设置权限。
  • 权限 可以是 r 表示 读取w 表示 写入,或 x 表示 执行

权限的第二种语法是由三个数字组成的,每个数字代表系统上的所有者、组和其他所有用户的权限。例如,第一个数字代表所有者的权限,第二个数字代表组的权限,第三个数字代表其他所有用户的权限。

每个数字的范围是从07。实际上,它是一个三位二进制数。第一位表示读取权限,第二位表示写入权限,第三位表示执行权限。如果数字为1,表示权限已设置。如果数字为0,表示权限未设置。例如,7在二进制中表示为111,表示所有三个权限都已设置。6在二进制中表示为110,表示读取写入权限已设置,但执行权限未设置。

因此,如果我们想将文件的权限设置为rw-r--r--,我们可以计算每个数字的二进制数:

  • rw-在二进制中表示为110,在十进制中表示为6
  • r--在二进制中表示为100,在十进制中表示为4
  • r--在二进制中表示为100,在十进制中表示为4

我们可以使用以下命令:

sh
> chmod 644 file.txt

更改所有权

要更改文件或目录的所有权,可以使用 chown 命令。该命令将更改指定文件或目录的所有权。以下是一些使用 chown 命令的示例:

sh
> chown tinymemo:tinymemo file.txt
> chown tinymemo: file.txt
> chown :tinymemo file.txt
> chown tinymemo file.txt

所有权的第一种语法是 [用户]:[组]。您可以省略 [用户][组],它将只更改您指定的部分。

您可以使用 -R 递归地更改目录的所有权。

常见权限

以下是一些常见的权限:

  • 644 用于文件,也是文件的默认权限
  • 755 用于目录,也是目录的默认权限
  • 600400 用于敏感文件,例如 SSH 私钥
  • 777 用于临时文件,例如缓存文件,或者在开发、调试或测试时使用,强烈不建议在生产环境中使用此权限

你可能注意到 644755 之间的区别是文件或目录的所有者是否具有 执行 权限。为什么目录需要所有者的 执行 权限呢?这是因为访问目录实际上是在 "执行" 目录,这意味着你可以列出目录中的文件和目录。

最后的提示

以下是一些最后的提示:

首先,文件或目录的权限也取决于其父目录的权限。

例如,如果您没有对目录的执行权限,即使您对文件和目录的读取权限,也无法访问该目录中的文件和目录。最常见的例子是home目录,即使您对home目录中的文件和目录的读取权限,也无法访问其他用户的home目录。

因此,如果您想与其他用户共享文件或目录,最好将其放在所有用户都具有执行权限的目录中(home目录之外),否则可能会遇到一些权限问题。

其次,SELinux也可能影响文件或目录的权限。如果遇到某些权限问题,并且您绝对确定权限是正确的,可以尝试禁用SELinux以查看是否有效。

最后但同样重要的是,在设置权限时应始终使用最小权限原则。例如,如果您想与其他用户共享文件,应仅授予他们读取权限,而不是写入权限。如果您正在运行一个Web服务器,应仅授予Web服务器读取执行权限,而不是写入权限。

总结

在本文中,我们学习了用户、组和权限。我们学习了如何创建用户和组,如何将用户添加到组中,如何更改文件或目录的所有权,以及如何更改文件或目录的权限。希望您喜欢,下次见!