65.9K
CodeProject 正在变化。 阅读更多。
Home

关于Linux目录结构 & 用户 & 权限的注意事项

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.77/5 (15投票s)

2018年6月7日

CPOL

13分钟阅读

viewsIcon

23906

这是一篇关于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用户

添加和删除用户本应是一项简单的任务,但随着历史的发展变得困难。根据这篇说明,我们至少有两种方式添加用户,即adduseruseradd,它们在不同的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代表其他用户。如果您想为所有者和组设置权限,可以使用ug,其中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。

我创建虚拟机时,被添加到了用户组sudosudo组在sudoers文件中被授予了所有权限。

在我的CentOS虚拟机中,它直接将用户song添加到了sudoers文件中。

不建议直接修改sudoers文件。如果您需要对sudoers文件进行更改,建议使用visudo命令。

关注点

  • 这是一篇关于Linux目录结构、用户和权限的说明。
  • 希望您喜欢我的帖子,并希望这篇说明能对您有所帮助。

历史

  • 2018年5月31日:第一次修订
© . All rights reserved.