Linux 的用户和权限管理
在 Linux 中,用户是可以访问系统及其资源的个体。每个用户都有一个唯一的用户名和用户 ID(UID
),用于标识他们在系统中的身份。组是一组共享相同权限以访问文件和目录的用户集合。权限是确定谁可以访问文件或目录以及他们可以对其执行什么操作的规则。
Linux 使用一种由三种类型的权限组成的权限系统:读取、写入和执行。这些权限可以针对三种类型的用户进行设置:文件或目录的所有者、拥有该文件或目录的组的成员以及系统上的所有其他用户。
了解 Linux 中用户、组和权限的工作原理对于管理对系统资源的访问并确保系统安全至关重要。
用户
识别当前用户
要在Linux中识别当前用户,可以使用whoami
命令。该命令将在终端中显示当前用户的用户名。
> whoami
tinymemo
此外,您还可以检查$USER
环境变量的内容,它也会显示当前用户的用户名。
> echo $USER
tinymemo
用户ID
Linux中的每个用户都有一个唯一的用户ID(UID
),用于标识他们在系统中的身份。您可以使用id
命令来显示当前用户的UID
。
> 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
。
> id -u
1000
> echo $UID
1000
用户的UID
在创建用户时会自动生成。root用户的UID
始终为0。
Linux系统上的所有用户都存储在/etc/passwd
文件中。您可以使用cat
命令来显示此文件的内容。
> 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
创建一个新用户。如果不指定UID
,adduser
命令将自动生成一个UID
给新用户。
> sudo adduser newusername
正在添加用户 `newusername' ...
正在添加新组 `newusername' (1000) ...
正在添加新用户 `newusername' (1000) 到组 `newusername' ...
正在创建主目录 `/home/newusername' ...
正在从 `/etc/skel' 复制文件 ...
新密码:
重新输入新密码:
passwd:密码已成功更新
正在更改 newusername 的用户信息
输入新值,或按 ENTER 保留默认值
全名 []:
房间号码 []:
工作电话 []:
家庭电话 []:
其他 []:
信息是否正确?[Y/n] y
运行adduser
命令后,您将被提示为新用户设置密码。您还可以使用passwd
命令为新用户设置密码。
> sudo passwd newuser
新密码:
重新输入新密码:
passwd:密码已成功更新
如果在运行passwd
命令时省略了用户名,它将为当前用户设置密码。
删除用户
要在Linux中删除用户,可以使用deluser
命令。该命令将从系统中删除指定的用户。
> sudo deluser newusername
正在删除crontab ...
正在删除用户 `newuser' ...
完成。
用户组
用户组是共享对文件和目录的访问权限的用户集合。每个组都有一个唯一的组ID(GID
),用于标识它在系统中的身份。您可以使用id
命令来显示当前用户的GID
。
> id
uid=1000(tinymemo) gid=1000(tinymemo) groups=1000(tinymemo),4(adm),27(sudo),44(video),50(staff)
如您所见,当前用户的GID
是1000
。您还可以使用-g
选项仅显示GID
,或者可以使用id -g
命令仅显示GID
。
将用户添加到组
一个用户可以是多个组的成员。要将用户添加到组中,可以使用usermod
命令。该命令将指定的用户添加到指定的组中。
> sudo usermod -a -G groupname username
-a
选项告诉usermod
命令将用户追加到组中,而不是替换用户当前的组。-G
选项告诉usermod
命令将用户添加到指定的组中。
从组中移除用户
要从组中移除用户,可以使用 gpasswd
命令。该命令将从指定的组中移除指定的用户。
> sudo gpasswd -d 用户名 组名
从组 tinkink 中移除用户 newuser
检查用户所属的组
要检查用户所属的组,可以使用 groups
命令。该命令将显示指定用户所属的组。
> groups newuser
newuser : newuser tinkink
创建和删除组
要在 Linux 中创建新组,可以使用 addgroup
命令。该命令将使用指定的组名和 GID
创建新组。如果不指定 GID
,addgroup
命令将自动生成一个 GID
。
> sudo addgroup testgroup
sudo addgroup testgroup
正在添加组 `testgroup' (GID 1001) ...
完成。
要在 Linux 中删除组,可以使用 delgroup
命令。该命令将从系统中删除指定的组。
> sudo delgroup testgroup
正在移除组 `testgroup' ...
完成。
权限
在理解用户和组的漫长旅程之后,我们终于可以谈论权限了。权限是确定以下内容的规则:
- 谁可以访问文件或目录
- 以及他们可以对其进行什么操作
这些权限可以针对三种类型的用户(谁)进行设置:
- 文件或目录的所有者
- 拥有文件或目录的组的成员
- 系统上的所有其他用户。
有三种类型的权限(可以做什么):读取
,写入
和执行
。
因此,文件或目录的权限可以针对三种类型的用户(谁)和三种类型的权限(可以做什么)进行设置。
检查权限
要查看文件或目录的权限,可以使用 ls -l
命令。该命令将显示指定文件或目录的权限。
> 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
命令的示例:
> 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
表示执行
。
权限的第二种语法是由三个数字组成的,每个数字代表系统上的所有者、组和其他所有用户的权限。例如,第一个数字代表所有者的权限,第二个数字代表组的权限,第三个数字代表其他所有用户的权限。
每个数字的范围是从0
到7
。实际上,它是一个三位二进制数。第一位表示读取
权限,第二位表示写入
权限,第三位表示执行
权限。如果数字为1
,表示权限已设置。如果数字为0
,表示权限未设置。例如,7
在二进制中表示为111
,表示所有三个权限都已设置。6
在二进制中表示为110
,表示读取
和写入
权限已设置,但执行
权限未设置。
因此,如果我们想将文件的权限设置为rw-r--r--
,我们可以计算每个数字的二进制数:
rw-
在二进制中表示为110
,在十进制中表示为6
。r--
在二进制中表示为100
,在十进制中表示为4
。r--
在二进制中表示为100
,在十进制中表示为4
。
我们可以使用以下命令:
> chmod 644 file.txt
更改所有权
要更改文件或目录的所有权,可以使用 chown
命令。该命令将更改指定文件或目录的所有权。以下是一些使用 chown
命令的示例:
> chown tinymemo:tinymemo file.txt
> chown tinymemo: file.txt
> chown :tinymemo file.txt
> chown tinymemo file.txt
所有权的第一种语法是 [用户]:[组]
。您可以省略 [用户]
或 [组]
,它将只更改您指定的部分。
您可以使用 -R
递归地更改目录的所有权。
常见权限
以下是一些常见的权限:
644
用于文件,也是文件的默认权限755
用于目录,也是目录的默认权限600
或400
用于敏感文件,例如 SSH 私钥777
用于临时文件,例如缓存文件,或者在开发、调试或测试时使用,强烈不建议在生产环境中使用此权限
你可能注意到 644
和 755
之间的区别是文件或目录的所有者是否具有 执行
权限。为什么目录需要所有者的 执行
权限呢?这是因为访问目录实际上是在 "执行" 目录,这意味着你可以列出目录中的文件和目录。
最后的提示
以下是一些最后的提示:
首先,文件或目录的权限也取决于其父目录的权限。
例如,如果您没有对目录的执行
权限,即使您对文件和目录的读取
权限,也无法访问该目录中的文件和目录。最常见的例子是home
目录,即使您对home目录中的文件和目录的读取
权限,也无法访问其他用户的home目录。
因此,如果您想与其他用户共享文件或目录,最好将其放在所有用户都具有执行
权限的目录中(home目录之外),否则可能会遇到一些权限问题。
其次,SELinux
也可能影响文件或目录的权限。如果遇到某些权限问题,并且您绝对确定权限是正确的,可以尝试禁用SELinux
以查看是否有效。
最后但同样重要的是,在设置权限时应始终使用最小权限原则。例如,如果您想与其他用户共享文件,应仅授予他们读取
权限,而不是写入
权限。如果您正在运行一个Web服务器,应仅授予Web服务器读取
和执行
权限,而不是写入
权限。
总结
在本文中,我们学习了用户、组和权限。我们学习了如何创建用户和组,如何将用户添加到组中,如何更改文件或目录的所有权,以及如何更改文件或目录的权限。希望您喜欢,下次见!