关于Linux目录结构 & 用户 & 权限的注意事项
这是一篇关于Linux目录结构、用户和权限的笔记。
引言
这是一篇关于Linux目录结构、用户和权限的说明。
背景
这是一篇关于Linux目录结构、用户和权限的说明。无论您是Linux新手还是经验丰富的用户,这些主题都容易被遗忘并且需要经常回顾。在这篇说明中,我使用了一个Linux Mint 18.3 Cinnamon 64位虚拟机(VM)。您可以通过这些步骤获取一个Linux Mint虚拟机。如果您喜欢其他Linux发行版,您也可以获取一个CentOS虚拟机。
Linux目录结构
Linux中最顶层的目录被称为根目录或/。在Linux系统中,您通常会在根目录/下看到以下目录。
这种结构就是所谓的文件系统层级标准。它由Linux基金会维护。
/ | 主要层级根目录,是整个文件系统层级的根目录。 |
/bin | 需要对所有用户都可用的基本命令二进制文件,例如cat, ls, cp。 |
/boot | 引导加载程序文件,例如内核、initrd。 |
/dev | 基本设备文件,例如/dev/null。 |
/etc | 特定于主机的系统范围内的配置文件。 关于名称本身的含义一直存在争议。在贝尔实验室UNIX实现文档的早期版本中,/etc被称为etcetera目录,因为该目录历史上包含了所有不属于其他地方的内容(然而,FHS将/etc限制为静态配置文件,并且不包含二进制文件)。自早期文档发布以来,该目录名称已被重新解释为各种方式。最近的解释包括首字母缩写词,如“Editable Text Configuration”或“Extended Tool Chest”。 |
/etc/opt | 存储在/opt中的附加包的配置文件。 |
/etc/sgml | 用于处理SGML的软件的配置文件,例如目录。 |
/etc/X11 | X Window System版本11的配置文件。 |
/etc/xml | 用于处理XML的软件的配置文件,例如目录。 |
/home | 用户的家目录,包含保存的文件、个人设置等。 |
/lib | /bin和/sbin中的二进制文件所必需的库。 |
/lib<qual> | 其他格式的基本库。这些目录是可选的,但如果存在,它们有一些要求。 |
/media | 可移动媒体的挂载点,例如CD-ROM(在FHS-2.3中于2004年出现)。 |
/mnt | 临时挂载的文件系统。 |
/opt | 可选的应用程序软件包。 |
/proc | 虚拟文件系统,以文件形式提供进程和内核信息。在Linux中,对应于procfs挂载。通常由系统实时自动生成和填充。 |
/root | root用户的家目录。 |
/run | 运行时变量数据:自上次启动以来有关运行系统的的信息,例如当前登录的用户和正在运行的守护进程。此目录下的文件必须在启动过程开始时删除或截断;但对于提供此目录作为临时文件系统(tmpfs)的系统来说,则不必如此。 |
/sbin | 基本系统二进制文件,例如fsck, init, route。 |
/srv | 此系统提供的站点特定数据,例如Web服务器的数据和脚本、FTP服务器提供的数据以及版本控制系统的存储库(在FHS-2.3中于2004年出现)。 |
/sys | 包含有关设备、驱动程序和某些内核功能的信息。 |
/tmp | 临时文件(另请参阅/var/tmp)。通常在系统重启后不会保留,并且可能有严格的大小限制。 |
/usr | 只读用户数据的次级层级;包含大部分(多用户)实用程序和应用程序。 |
/usr/bin | 非基本命令二进制文件(单用户模式下不需要);对所有用户可用。 |
/usr/include | 标准包含文件。 |
/usr/lib | /usr/bin和/usr/sbin中的二进制文件的库。 |
/usr/lib<qual> | 其他格式的库,例如在64位机器上用于32位库的/usr/lib32(可选)。 |
/usr/local | 本地数据的第三级层级,特定于此主机。通常有进一步的子目录,例如bin, lib, share。 |
/usr/sbin | 非基本系统二进制文件,例如各种网络服务的守护进程。 |
/usr/share | 与体系结构无关(共享)的数据。 |
/usr/src | 源代码,例如带有头文件的内核源代码。 |
/usr/X11R6 | X Window System版本11,版本6(最高到FHS-2.3,可选)。 |
/var | 可变文件——其内容预计在系统正常运行期间会持续更改的文件——例如日志、假脱机文件和临时电子邮件文件。 |
/var/cache | 应用程序缓存数据。这些数据是通过耗时的I/O或计算在本地生成的。应用程序必须能够重新生成或恢复这些数据。缓存的文件可以被删除而不会丢失数据。 |
/var/lib | 状态信息。程序运行时修改的持久数据,例如数据库、软件包元数据等。 |
/var/lock | 锁定文件。记录当前正在使用的资源的文件。 |
/var/log | 日志文件。各种日志。 |
/var/mail | 邮箱文件。在某些发行版中,这些文件可能位于已弃用的/var/spool/mail中。 |
/var/opt | 存储在/opt中的附加包的可变数据。 |
/var/run | 运行时变量数据。此目录包含描述自系统启动以来的系统信息的变量数据。在FHS 3.0中,/var/run被/run取代;为了向后兼容,系统应继续提供/var/run目录,或提供从/var/run到/run的符号链接。 |
/var/spool | 等待处理的任务的假脱机目录,例如打印队列和外发邮件队列。 |
/var/spool/mail | 用户邮箱的已弃用位置。 |
/var/tmp | 在系统重启之间需要保留的临时文件。 |
在这些目录中,/root目录是root用户的家目录。普通用户的家目录默认在/home目录中。
此时,我只有一个用户,用户名为song
。以下是我家目录下的目录。
Linux用户
添加Linux用户
添加和删除用户本应是一项简单的任务,但随着历史的发展变得困难。根据这篇说明,我们至少有两种方式添加用户,即adduser和useradd,它们在不同的Linux发行版上行为不同。
- Debian/Ubuntu - 在Debian或Ubuntu系统上,useradd本身就是一个命令,您可以使用此命令创建用户并定义其选项,而adduser是一个Perl脚本,它使用useradd来创建帐户,并询问您密码、全名、电话等信息。
- Fedora或CentOS系统 - adduser只是useradd的一个符号链接
- Gentoo系统 - 与CentOS或Fedora系统相同,adduser只是useradd的一个符号链接
看起来useradd
命令在不同平台之间更一致,因此我将在本说明中使用useradd
。要添加Linux用户,您可以使用以下命令:
sudo useradd test-user-1
您可以使用以下命令为用户分配或更改密码:
sudo passwd test-user-1
如果用户当前已登录,用户可以更改自己的密码,而无需提供用户名且无需sudo
。
passwd
您还可以向用户添加其他信息,例如全名,可以使用以下命令:
sudo usermod -c "Test User 1" test-user-1
根据useradd
的手册页,用户的家目录应该自动添加。但在我的Linux Mint虚拟机中,它没有添加。我需要手动添加。
sudo mkdir /home/test-user-1
sudo chown test-user-1:test-user-1 /home/test-user-1
创建家目录后,用户就可以使用提供的密码顺利登录系统了。
读取用户信息
用户信息保存在/etc/passwd文件中,普通用户默认具有读取权限。
您可以读取此文件来查找Linux用户。
但是,getent命令更常用于读取/etc/passwd文件中的信息。您可以使用以下命令查找有关用户song
的相同信息:
getent passwd song
Linux用户密码
用户的密码保存在/etc/shadow文件中,普通用户默认没有任何权限。
如果您可以sudo
,您可以查看它。
密码以加盐哈希的形式存储,理论上非常难以解密。您可以使用getent
命令获取相同的信息。
sudo getent shadow song
删除Linux用户
您可以使用以下命令删除Linux用户:
sudo userdel -r test-user-1
-r
选项指示userdel也删除用户的家目录。
Linux组
添加Linux组
如果您可以sudo
,您可以使用groupadd创建一个用户组。
sudo groupadd test-group-1
根据手册页,groupadd
允许您使用-p
选项为组设置密码。但是,从大量的讨论来看,这是不推荐的。组信息保存在/etc/group中,普通用户默认具有读取权限。
您可以读取有关Linux组的信息。
您还可以使用getent
获取相同的信息。
getent group test-group-1
删除Linux组
您可以使用groupdel删除用户组。
sudo groupdel test-group-1
根据“groupdel”手册页,删除可能会因以下原因而失败:
- 您不能删除任何现有用户的初级组。您必须先删除用户,然后才能删除组。
- 您应该手动检查所有文件系统,以确保没有文件仍然属于该组。
Linux组与用户的关联
一个Linux组可以拥有多个用户,一个Linux用户也可以属于多个组。如果您遵循了本说明,您可能已经删除了test-user-1
。如果是这样,让我们重新创建它。
初级组
要查找用户所属的所有组,您可以使用groups命令。当创建一个新用户时,会默认创建一个同名的组。该用户默认被添加到该组,并且这是用户的初级组。
当该用户创建目录或文件时,目录或文件的组所有者就是该用户的初级组。
用户初级组的信息保存在/etc/passwd文件中。
您可以找到用户ID与test-group-1
组的组ID匹配后的1001
。
次级组
除了初级组之外,用户还可以被分配到多个次级组。让我们先创建两个空的子用户组。
您可以使用usermod命令将用户分配到次级组。
sudo usermod -a -G test-group-1 test-user-1
要列出用户所属的所有组,您还可以使用id命令,该命令会显示组名称旁边的ID。
次级组中用户列表保存在/etc/group文件中。此时,test-group-1
只有test-user-1
作为其次级组。
您可以使用gpasswd命令将用户从次级组中移除。
sudo gpasswd -d test-user-1 test-group-1
更新用户的初级组
您需要更新用户初级组的情况很少见。但如果您想这样做,可以使用带有-g
选项的usermod。
sudo usermod -g test-group-1 test-user-1
如我们所知,初级组在/etc/passwd文件中与用户相关联,次级组在/etc/group文件中与用户相关联。
- 如果组A在两个文件中都与用户相关联,它将被视为用户的初级组。如果我们将其更改为组B,则组A将仍然是该用户的次级组。
- 如果组A仅在/etc/passwd文件中与用户相关联,它是用户的初级组。如果我们将其更改为组B,则组A将不再与用户相关联。
Linux目录和文件权限
考虑到Linux目录结构和用户,现在可以轻松地查看文件和目录的权限。本节中的大部分信息来自这篇说明,您可能想直接查看它。
模式部分告诉我们文件和目录对用户(所有者)、组所有者和其他用户的权限。
根据这篇说明,文件和目录的读、写和执行权限的解释不同。
对于文件,权限解释如下:
- 读取 - 读取权限允许用户查看文件内容。
- 写入 - 写入权限允许用户修改和删除文件。
- 执行 - 执行权限允许用户执行文件(用户还必须具有读取权限)。因此,在用户能够运行可执行程序和shell脚本之前,必须为其设置执行权限。
对于目录,权限解释如下:
- 读取 - 读取权限允许用户查看目录中的文件名。
- 写入 - 写入权限允许用户删除目录、修改其内容(创建、删除和重命名其中的文件)以及修改用户可以读取的文件内容。
- 执行 - 执行权限允许用户访问或遍历(即
cd
)并访问目录中文件的元数据(ls -l
中列出的信息)。
“chown”与用户和组所有权
我们可以使用chown命令来更改文件或目录的所有者和组所有者。根据这里的讨论,chown
需要sudo
。
如果您只想更改所有者,可以使用以下命令:
sudo chown test-user-1 a-file
如果您只想更改组所有者,可以使用以下命令:
sudo chown :test-group-1 a-file
“chmod”与权限
可以使用chmod来设置文件或目录的权限。以下命令将为其他用户设置对文件的所有权限。
chmod o=rxw a-file
其中o
代表其他用户。如果您想为所有者和组设置权限,可以使用u
和g
,其中u
代表所有者用户,g
代表组。
您还可以使用+
或-
来修改权限。以下命令将删除其他用户的执行权限。
chmod o-x a-file
在Linux中,权限有数字表示。
- 1 = 执行权限
- 2 = 写入权限
- 4 = 读取权限
除了1/2/4之外,3 =“执行+写入”,5 =“执行+读取”,6 =“写入+读取”,7 =“执行+写入+读取”。
chmod 357 a-file
将权限设置为357
后,文件上的权限如下:
- 用户(所有者) - 写入和执行
- 组 - 读取和执行
- 其他用户 - 读取、写入和执行
根据我的观察,只有所有者可以运行chmod
。组所有者和其他用户需要sudo
才能运行chmod
。
SUDOERS
在Linux中,我们可以有用户通过提供自己的密码来获得root特权。这些用户可以执行比普通用户更多的工作。这些特权在/etc/sudoers文件中定义。例如,在我的Linux Mint虚拟机中,我是一个SUDOER。
我创建虚拟机时,被添加到了用户组sudo
。sudo
组在sudoers文件中被授予了所有权限。
在我的CentOS虚拟机中,它直接将用户song
添加到了sudoers文件中。
不建议直接修改sudoers文件。如果您需要对sudoers文件进行更改,建议使用visudo命令。
关注点
- 这是一篇关于Linux目录结构、用户和权限的说明。
- 希望您喜欢我的帖子,并希望这篇说明能对您有所帮助。
历史
- 2018年5月31日:第一次修订