Linux权限管理
01. 文件访问者的分类
在Linux系统中,用户(User)按照不同的角色和权限分为几个主要类型:
- 超级用户(root):
- 'root’用户可以被看作是系统管理员,拥有对系统的完全控制权。
- 'root’用户能够执行所有命令并访问系统上的所有文件。由于这个权限级别的强大(和潜在的危险),不建议常规使用。
- 系统用户(System Users):
- 系统用户是出于系统服务和管理任务需要创建的用户。这些用户通常不是为人而设的,而是为了让特定的服务(如web服务器进程、数据库服务等)运行在特定的权限下。
- 系统用户通常没有登录shell,也就是说,不能通过常规方法(如密码登录)启动交互式会话。
- 例子包括
daemon
、sys
、bin
等用户。
- 普通用户(Regular Users):
- 普通用户是为实际的人创建的账户。它们有自己的用户名和密码。
- 普通用户对系统资源的访问受到限制。他们通常只能在自己的主目录中更改文件,除非被授予特定位置的额外权限。
- 手动创建的任何新用户通常都是这种类型的用户。
- 虚拟用户(Virtual Users):
- 虚拟用户并非Linux系统本身使用或创建的用户账户,而是由一些具体应用程序(如FTP服务)为了特定需求而创建的用户。
- 这些用户可能没有系统上的一个真正的主目录,它们的用户信息可能存储在应用程序特定的数据库中。
- 用户组(Groups):
- Linux中还有一个“用户组”的概念,这是将用户分类的一种方式。一个用户可以属于一个或多个用户组。
- 用户组允许你为一组用户设定特定的权限。这样,你可以授予特定组对特定文件或目录的访问权限,而无需逐一为每个用户设置。
默认用户和用户组的信息存储在几个重要的文件中,如:
/etc/passwd
: 存储用户基本信息,包括用户名、用户ID(UID)、组ID(GID)、主目录、登录shell等。/etc/shadow
: 存储加密过的用户密码及相关的账户安全信息。/etc/group
: 存储用户组的信息。/etc/gshadow
: 存储加密过的用户组密码。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令:su [用户名] 功能:切换用户。 例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令
02.文件类型和访问权限
Linux权限是Linux操作系统用来控制对文件和目录访问的一个关键特性。在Linux中,每个文件和目录都有与之关联的访问权限,这些权限决定了用户和进程可以如何与这些文件和目录进行交互。
Linux权限主要分为三类:
- 读取权限(Read):表示用户或进程能够读取文件内容或者列举目录中的内容。
- 对于文件来说,读取权限允许用户查看文件内容。
- 对于目录来说,读取权限允许用户列举目录中的文件和子目录。
- 写入权限(Write):表示用户或进程能够修改文件内容或者改变目录内容。
- 对于文件来说,写入权限允许用户修改和删除文件内容。
- 对于目录来说,写入权限允许用户在目录中创建或删除文件或子目录。
- 执行权限(Execute):表示用户或进程能够执行一个文件或者访问目录。
- 对于文件来说,执行权限允许用户运行一个脚本或程序。
- 对于目录来说,执行权限允许用户进入目录,及执行搜索操作,即进入到目录中的路径(例如 cd 命令)。
权限的分配是基于三类不同的用户身份:
- 文件拥有者(Owner):创建文件或目录的用户,拥有对该文件或目录的默认权限。
- 用户组(Group):文件拥有者所在的用户组。在Linux中,一个用户可以属于多个用户组,但是每个文件有一个主要的用户组。
- 其他用户(Others):除了拥有者和用户组以外的所有用户。
用 ls -l
命令可以查看一个文件或目录的详细权限信息,例如:
-rwxr-xr-- 1 user group 12345 Jan 1 12:34 example.txt
这里的权限分段如下:
-rwxr-xr--
:这代表了example.txt
文件的权限。- 第一个字符标识文件类型(
-
表示普通文件,d
表示目录,l
表示链接等)。 - 接下来的三个字符
rwx
代表文件拥有者的权限:读(r)、写(w)、执行(x)。 - 紧接着的三个字符
r-x
代表用户组的权限:读(r)、不可写(-)、执行(x)。 - 最后的三个字符
r--
代表其他用户的权限:读(r)、不可写(-)、不可执行(-)。 1
:表示硬链接的数量。user
:文件拥有者的用户名。group
:文件所属用户组的名称。12345
:文件的大小。Jan 1 12:34
:文件最后修改时间。example.txt
:文件名。
文件类型: d:文件夹 -:普通文件(文本文件,可执行程序,库等都叫普通文件) l:软链接(类似Windows的快捷方式) b:块设备文件(例如硬盘、光驱等) p:管道文件 c:字符设备文件(例如屏幕等串口设备) s:套接口文件
linux不通过后缀来区分文件类型,但是linux上面的工具(如gcc)可能会区分!
03.文件访问权限的相关设置方法
chmod
和 chown
是两种用于管理Linux文件和目录权限的命令。它们用途分明,以下是每个命令的基本使用方法:
1. chmod(改变文件或目录的模式)
chmod
命令用于改变文件或目录的权限。它有两种基本的使用方式:符号模式(symbolic mode)和数字模式(numeric mode)。
使用符号模式:
在符号模式下,您可以为特定的用户(u:用户,g:组,o:其他,a:所有)指定要添加(+)、删除(-)或设置(=)的权限(r:读,w:写,x:执行)。
chmod [ugoa][+-=][rwx] file_or_directory
示例:
给文件拥有者添加执行权限:
chmod u+x filename
删除组的写权限:
chmod g-w filename
给其他用户设置只读权限:
chmod o=r filename | |
```bash | |
给所有用户添加执行权限:
chmod a+x filename
使用数字模式:
在数字模式中,权限由数字表示:4 stands for “读”(r),2 for “写”(w),1 for “执行”(x)。要为一个文件或目录设置权限,您需要为用户、组和其他用户选择它们的权限值。
chmod [mode] file_or_directory
其中,mode
是三位数,每位数是其对应用户的权限之和。
示例:
给文件拥有者全部权限,组和其他用户只读权限:
chmod 744 filename
给文件拥有者和组读写执行权限,其他用户只读权限:
chmod 775 filename
移除所有用户的所有权限:
chmod 000 filename
root账号不受权限的约束
所以对于普通用户,自身要受到对应权限的约束,即便这个文件是自己的!
2. chown(改变文件或目录的所有者)
chown
命令用于改变文件或目录的所有者和/或所属组。
改变所有者:
chown [新所有者] file_or_directory
示例:
更改文件的所有者:
chown newowner filename
同时改变所有者和组别:
chown [新所有者]:[新组] file_or_directory
示例:
更改文件的所有者和组别:
chown newowner:newgroup filename
只改变组别:
chown :[新组] file_or_directory
或者使用 chgrp
命令:
chgrp [新组] file_or_directory
示例:
只更改文件的组别:
chown :newgroup filename
使用 chgrp
更改文件的组别:
chgrp newgroup filename
使用 chmod
和 chown
命令通常需要管理员权限,因此在使用它们时一般需要在命令前添加 sudo
,这取决于您是否有足够的权限来对文件或目录进行更改。这里可以用su把自己变为root再修改
记得在执行这些命令之前,仔细检查所要赋予或更改的权限,错误的权限设置可能会导致系统安全问题或削弱文件的功能性。
例如:
chmod u+x example.txt
: 给文件拥有者添加执行权限。chmod g=r example.txt
: 设置用户组的权限仅为读取。chmod o-w example.txt
: 移除其他用户的写入权限。chmod 755 example.txt
: 设定所有者权限为读写执行(7=4读+2写+1执行),组权限为读执行(5=4读+1执行),其他用户权限也为读执行(5=4读+1执行)。
相应地,你可以使用 chown
命令改变文件的拥有者,以及 chgrp
命令改变文件的用户组。
在Linux和其他类Unix系统中,“可执行权限”(execute permission),表示为 x
,是用于控制用户或用户组是否有权限执行某个文件的一种文件权限。理解可执行权限需要考虑两种情况:对文件的可执行权限和对目录的可执行权限。
对文件的可执行权限(x)
当一个文件具有可执行权限时,这意味着用户(或用户组)可以告诉操作系统启动并运行这个文件。一般来说,可执行文件包括二进制可执行文件或者脚本文件,如shell脚本、Python脚本等。
例如,如果您有一个名为 script.sh
的shell脚本,且设置了可执行权限,那么您就可以直接运行该脚本,而不必调用shell程序作为解释器来运行它:
./script.sh
如果该文件没有可执行权限,您尝试执行它时会遇到 “Permission denied” 的错误。
对目录的可执行权限(x)
目录的可执行权限与文件略有不同。对于目录,可执行权限表示用户(或用户组)能够"进入"该目录,即允许用户遍历目录的内容。具体来说,这包括使用如 cd
这样的命令切换到目录,以及允许对目录内容列表的访问权限(当和读权限(r) 结合时)。
如果一个目录没有可执行权限,即使用户有该目录的读(r)权限,也无法列出目录内容。此外,即使知道文件的完整路径,也无法直接访问目录中的文件,因为遍历该目录需要可执行权限。
例如,如果您的用户没有家目录(比如 /home/username
)的可执行权限,即使您知道家目录中有一个文件叫做 important.txt
,您也无法读取或编辑它,因为您无法进入家目录。
创建的目录文件,起始权限是包含x的,普通文件,起始权限是去掉x的
04.umask
umask
(用户文件创建掩码)是一个Linux和其他类Unix系统中的命令,也是一个环境设置,用来确定新创建文件和目录的默认权限。umask
定义了当文件或目录被创建时,哪些权限不应被设置。
在Linux系统中,文件通常默认具有666
(-rw-rw-rw-)的权限,而目录通常默认具有777
(drwxrwxrwx)的权限。这些权限是在没有umask
值作用时的默认权限。umask
值用来从这些默认权限中减去特定的权限,以提供不同的默认设置。
umask 值
umask
值通常以八进制数表示,默认值通常是022
(只有所有者享有写权限),但这可以根据用户或系统的安全策略进行更改。当从默认权限中减去umask
值时,结果是新文件或目录最终的权限。
例如,如果umask
值设置为022
:
- 新文件将有
644
(666
-022
)的权限,即-rw-r--r--
(所有者读写,组和其他只读)。 - 新目录将有
755
(777
-022
)的权限,即drwxr-xr-x
(所有者读写执行,组和其他只读执行)。
设置 umask 值
可以通过在终端中输入umask
命令 followed followed 以所需的权限掩码来设置umask
值。例如:
umask 027
这将设置一个umask
值,其中所有者不受影响,而组没有写权限,其他用户既没有写权限也没有执行权限。
查看当前 umask 值
要查看当前的umask
值,只需输入umask
命令而不带任何参数:
umask
系统将输出当前umask
的值,通常是一个三位数的八进制数。
在配置文件中设置 umask
umask
值可以在各种shell的启动脚本中设置,比如:
- 全局范围(对所有用户生效):
/etc/profile
或/etc/bash.bashrc
(对于Bash shell) - 用户范围(仅对特定用户生效):
~/.profile
,~/.bashrc
或~/.bash_profile
(根据用户所使用的Shell和操作系统而定)
在这些文件中添加umask
命令,可以改变登录时的默认umask
值。
umask
的设置对系统安全非常重要。太宽松的umask
(例如 ‘000’)可能会导致新创建的文件和目录过于开放,任何用户都可以读写执行,这是一个严重的安全风险。因此,通常推荐具有合理限制的umask
设置,例如022
或027
,以确保系统不会无意中暴露敏感文件
05.粘滞位
粘滞位(Sticky Bit)是Unix和类Unix操作系统中特殊的文件权限设置之一。它最初是用来指明哪些可执行文件(主要是二进制文件)应该保持在交换区(swap)中,以便快速重新加载执行,不过这种用途在现代操作系统中已经不再使用。
现在,粘滞位的主要用途是用于目录。当粘滞位设置在目录上时,它影响该目录中文件的删除。粘滞位可以确保只有文件的所有者或根用户(root)可以删除或重命名目录内的文件。这一特点特别对公共目录很有用,如/tmp
。
在/tmp
等临时文件目录中,许多用户都有写入权限,系统利用粘滞位可以防止用户删除或重命名不属于他们的文件。即便用户有目录的写权限,没有粘滞位他们也不能删除他人的文件。
查看粘滞位
当你使用 ls -l
命令列出一个设置了粘滞位的目录时,目录权限列表的最后一位不是 x
而是 t
或 T
,表明粘滞位被设置。
- 如果可执行位也被设置(任何其他用户都有执行权限),显示
t
。 - 如果可执行位没有被设置,显示为
T
。
如,以下命令输出了/tmp
目录的权限:
ls -ld /tmp
输出可能如下所示:
drwxrwxrwt 10 root root 4096 Jan 31 12:00 /tmp
在上面的权限中,drwxrwxrwt
中的最后一个 t
表示粘滞位被设置。
设置粘滞位
你可以使用 chmod
命令来设置或取消设置目录的粘滞位:
- 设置粘滞位:
chmod +t directory_name
- 取消设置粘滞位:
chmod -t directory_name
例如,要设置一个名为 shared_dir
的目录的粘滞位:
chmod +t shared_dir
要取消设置该目录的粘滞位:
chmod -t shared_dir
在设置粘滞位时,通常也会为该目录设置所有用户的可写权限,以达到创建公共目录的目的。
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
- 一、超级管理员删除
- 二、该目录的所有者删除
- 三、该文件的所有者删除
权限设置表示法
使用八进制数字设置粘滞位时,前面会增加一个 1
:
1777
:代表所有用户都有读写执行权限,并且设置了粘滞位。1755
:代表所有者有读写执行权限,组和其他用户有读执行权限,并且设置了粘滞位。
综上所述,尽管粘滞位的原始目的在现代已经不再使用,但在多用户环境中控制目录中文件的删除仍然非常有用。