权限:修订间差异
无编辑摘要 |
无编辑摘要 |
||
| (未显示同一用户的3个中间版本) | |||
| 第1行: | 第1行: | ||
== 导言 == | |||
Unix 是一个多用户操作系统。其设计初衷并非让所有人都能访问所有文件,而是允许文件所有者指定哪些用户应拥有何种访问权限。 | Unix 是一个多用户操作系统。其设计初衷并非让所有人都能访问所有文件,而是允许文件所有者指定哪些用户应拥有何种访问权限。 | ||
== 权限 == | |||
Unix 文件系统允许用户为其拥有的文件(包括目录:“在 Unix 中,一切皆为文件”)分配三种权限类型('''r'''、'''w'''、'''x''')的任意组合,适用于三类用户('''u'''、'''g'''、'''o''')。当用户请求访问文件时,Unix 首先确定请求者相对于目标文件的用户类别,然后检查所请求的权限类型是否已分配给该用户类别。 | Unix 文件系统允许用户为其拥有的文件(包括目录:“在 Unix 中,一切皆为文件”)分配三种权限类型('''r'''、'''w'''、'''x''')的任意组合,适用于三类用户('''u'''、'''g'''、'''o''')。当用户请求访问文件时,Unix 首先确定请求者相对于目标文件的用户类别,然后检查所请求的权限类型是否已分配给该用户类别。 | ||
== 权限类型 == | |||
三种权限类型的效果各不相同,取决于它们适用于文件还是目录。 | 三种权限类型的效果各不相同,取决于它们适用于文件还是目录。 | ||
{| class="wikitable" | {| class="wikitable" | ||
| 第33行: | 第33行: | ||
然而,目录的'''x'''权限会影响目录子树中更深层目录和文件的权限。要访问一个文件,用户必须对该文件路径中的每个目录都拥有'''x'''权限。换句话说,如果某个目录缺乏'''x'''权限,实际上会阻止访问该目录子树中的任何文件。 | 然而,目录的'''x'''权限会影响目录子树中更深层目录和文件的权限。要访问一个文件,用户必须对该文件路径中的每个目录都拥有'''x'''权限。换句话说,如果某个目录缺乏'''x'''权限,实际上会阻止访问该目录子树中的任何文件。 | ||
=== 用户类别 === | |||
对于给定文件,Unix 文件系统将用户分为三类: | 对于给定文件,Unix 文件系统将用户分为三类: | ||
{| class="wikitable" | {| class="wikitable" | ||
| 第52行: | 第52行: | ||
|} | |} | ||
=== 举例说明 === | |||
文件权限信息可以通过<code>ls</code>命令的长列表(long listing)选项获取:<code>ls -l</code><syntaxhighlight lang="shell">drwxr-xr-x 2 papa arpa 512 Sep 29 01:02 arpastuff | 文件权限信息可以通过<code>ls</code>命令的长列表(long listing)选项获取:<code>ls -l</code><syntaxhighlight lang="shell">drwxr-xr-x 2 papa arpa 512 Sep 29 01:02 arpastuff | ||
-rwxr-x--- 1 papa arpa 11402 Sep 29 01:02 hello | -rwxr-x--- 1 papa arpa 11402 Sep 29 01:02 hello | ||
| 第141行: | 第142行: | ||
用户 <code>papa</code> 可以读取或修改 <code>hello.txt</code> 文件的内容。<code>arpa</code> 组中的用户可以查看该文件。其他用户无法访问该文件。 | 用户 <code>papa</code> 可以读取或修改 <code>hello.txt</code> 文件的内容。<code>arpa</code> 组中的用户可以查看该文件。其他用户无法访问该文件。 | ||
=== 链接和权限 === | |||
一般来说,上述讨论也适用于硬链接和符号链接。文件系统会自动维护链接,以确保链接与目标文件具有相同的有效权限。(对于符号链接,<code>ls</code> 命令会显示一个文件模式,其中所有用户类别的权限类型均已分配,但当通过链接请求文件访问时,将应用目标文件的权限。) | 一般来说,上述讨论也适用于硬链接和符号链接。文件系统会自动维护链接,以确保链接与目标文件具有相同的有效权限。(对于符号链接,<code>ls</code> 命令会显示一个文件模式,其中所有用户类别的权限类型均已分配,但当通过链接请求文件访问时,将应用目标文件的权限。) | ||
然而,在某些配置下,硬链接可以绕过目录 '''x''' 的权限限制。假设用户对文件 <code>./d1/f1</code> 具有访问权限,而该文件在目录 <code>d1</code> 的子树之外有一个硬链接 <code>./h1</code>。如果用户失去了对 <code>d1</code> 的 '''x''' 权限,他将无法访问 <code>./d1/f1</code>,''但仍可通过硬链接'' <code>./h1</code> ''使用其原始权限访问同一文件''。 | 然而,在某些配置下,硬链接可以绕过目录 '''x''' 的权限限制。假设用户对文件 <code>./d1/f1</code> 具有访问权限,而该文件在目录 <code>d1</code> 的子树之外有一个硬链接 <code>./h1</code>。如果用户失去了对 <code>d1</code> 的 '''x''' 权限,他将无法访问 <code>./d1/f1</code>,''但仍可通过硬链接'' <code>./h1</code> ''使用其原始权限访问同一文件''。 | ||
== 更改权限… == | |||
权限通过命令 <code>chmod</code> 更改:<syntaxhighlight lang="shell"> | 权限通过命令 <code>chmod</code> 更改:<syntaxhighlight lang="shell"> | ||
chmod <permission-mode> <file-name> | chmod <permission-mode> <file-name> | ||
| 第153行: | 第155行: | ||
</syntaxhighlight>这个数字644代表什么? | </syntaxhighlight>这个数字644代表什么? | ||
== …解释了 == | |||
权限模式是九个文件模式权限标志的数字表示形式。如前所述,存在三种权限类型和三种用户类别。每个数字代表分配给特定用户类别的权限类型。 | 权限模式是九个文件模式权限标志的数字表示形式。如前所述,存在三种权限类型和三种用户类别。每个数字代表分配给特定用户类别的权限类型。 | ||
{| class="wikitable" style="text-align: center; | {| class="wikitable" style="text-align: center; | ||
| 第190行: | 第192行: | ||
</syntaxhighlight>即可! | </syntaxhighlight>即可! | ||
== …另一种方式 == | |||
<code>chmod</code> 支持一种用于指定权限模式的替代语法,这种语法在一次更改一个或几个权限时更加方便,且比上文提到的数字模式编码稍易记忆。 | <code>chmod</code> 支持一种用于指定权限模式的替代语法,这种语法在一次更改一个或几个权限时更加方便,且比上文提到的数字模式编码稍易记忆。 | ||
| 第199行: | 第201行: | ||
''user-classes 用户类别'' | ''user-classes 用户类别'' | ||
需要更改权限的用户类别。使用单字母类别符号 <code>u</code>、<code>g</code>、<code>o</code> 或使用 <code>a</code> 指定所有类别。可以指定多个类别。 | |||
''operation 操作'' | |||
: 以下之一: | |||
:; <code>+</code> | |||
:: 为用户类别添加权限类型。 | |||
:; <code>-</code> | |||
:: 从用户类别中移除权限类型。 | |||
:; <code>=</code> | |||
:: 为用户类别设置权限类型。 | |||
''permission-types 权限类型'' | |||
:要设置或删除的权限类型。使用单字符类型符号 <code>r</code>、<code>w</code> 或 <code>x</code>。可以指定多种类型。 | |||
因此,命令:<syntaxhighlight lang="shell"> | |||
chmod u=rw,go=r index.html | |||
</syntaxhighlight>将产生与示例命令相同的效果:<syntaxhighlight lang="shell"> | |||
chmod 644 index.html | |||
</syntaxhighlight>如果我想稍后给文件的用户组的成员授予 '''w''' 权限,我可以使用命令:<syntaxhighlight lang="shell"> | |||
chmod g+w index.html | |||
</syntaxhighlight> | |||
== 文件标志 == | |||
除了我们已经讨论过的文件权限外,我们还有文件标志。文件标志为文件提供了额外的安全性和控制,但不适用于目录。文件标志可通过 chflags(1) 工具进行修改。<syntaxhighlight lang="shell"> | |||
% chflags uunlnk foo | |||
</syntaxhighlight>将用于设置用户的撤销删除标志,要禁用该标志,只需在选项前面添加“no”(在此示例中为uunlnk),如下所示:<syntaxhighlight lang="shell"> | |||
chflags nouunlnk foo | |||
</syntaxhighlight> | |||
----''<small>$Id: permissions.html,v 1.8 2007/10/02 11:22:28 papa Exp $</small>'' | |||
2025年8月20日 (三) 06:09的最新版本
导言
Unix 是一个多用户操作系统。其设计初衷并非让所有人都能访问所有文件,而是允许文件所有者指定哪些用户应拥有何种访问权限。
权限
Unix 文件系统允许用户为其拥有的文件(包括目录:“在 Unix 中,一切皆为文件”)分配三种权限类型(r、w、x)的任意组合,适用于三类用户(u、g、o)。当用户请求访问文件时,Unix 首先确定请求者相对于目标文件的用户类别,然后检查所请求的权限类型是否已分配给该用户类别。
权限类型
三种权限类型的效果各不相同,取决于它们适用于文件还是目录。
| 类型 | 文件 | 目录 |
|---|---|---|
| r | 读取文件内容 | 列出目录中文件的名称、大小、修改日期等信息。 1 |
| w | 更改 (write) 文件内容。 | 从目录中添加或删除文件。2 |
| x | 如果在命令行中自行输入文件名,Shell 将尝试执行(execute)该文件。 | 访问(读取或写入)目录3或该目录及其子目录中的任何文件,或将该目录设置为用户的工作目录。 |
Notes: 备注
| ||
与其他一些文件系统(如NTFS)不同,目录的“读取”(r)或“写入”(w)权限不会影响该目录子树中任何子目录或文件的“读取”或“写入”权限。目录的“读取”或“写入”权限由系统为该目录分配给您的用户类所设定的权限决定,而不考虑文件系统树中更高层级目录的“读取”和“写入”权限。
然而,目录的x权限会影响目录子树中更深层目录和文件的权限。要访问一个文件,用户必须对该文件路径中的每个目录都拥有x权限。换句话说,如果某个目录缺乏x权限,实际上会阻止访问该目录子树中的任何文件。
用户类别
对于给定文件,Unix 文件系统将用户分为三类:
| 类别 | 用户 |
|---|---|
| u | User. 当前文件的所有者。 |
| g | Group. 该文件所属用户组的成员。 |
| o | Others. 不属于上述任何一类的用户。这是SDF的Web服务器在Web浏览器从您的网站请求文件时使用的用户类别。1 |
Notes: 备注
| |
举例说明
文件权限信息可以通过ls命令的长列表(long listing)选项获取:ls -l
drwxr-xr-x 2 papa arpa 512 Sep 29 01:02 arpastuff
-rwxr-x--- 1 papa arpa 11402 Sep 29 01:02 hello
-rw-r----- 1 papa arpa 13 Sep 29 01:02 hello.txt
a b c
字段 a 表示文件模式,这是一个由十个单字符标志组成的字符串,用于指示文件的权限和其他信息。以下是按字符顺序排列的模式标志列表,以及每个标志可能的值的部分列表(partial list):
- 文件类型
d- 目录
-- 普通文件
- 文件所有者(用户组 u)的读取(r)权限.
r- 是
-- 否
- 文件所有者(用户组 u)的写入(w)权限.
w- 是
-- 否
- 文件所有者(用户组 u)的执行(x)权限.
x- 是
-- 否
- 文件用户组(用户组 g)的读取(r)权限.
r- 是
-- 否
- 文件用户组(用户组 g)的写入(w)权限.
w- 是
-- 否
- 文件用户组(用户组 g)的执行(x)权限.
x- 是
-- 否
- 其他用户(用户组 o)的读取(r)权限.
r- 是
-- 否
- 其他用户(用户组 o)的写入(w)权限.
w- 是
-- 否
- 其他用户(用户组 o)的执行(x)权限.
x- 是
-- 否
字段 b 是文件所有者的用户 ID。字段 c 是文件所属的用户组。
因此,对于上述 ls 列出的三个文件:
目录arpastuff
用户papa可以在arpastuff目录中列出、添加和删除文件,访问该目录的子目录结构,或将该目录设为工作目录。属于arpa组的用户及其他所有用户可以列出该目录中的文件,访问其子目录结构或将该目录设为工作目录,但无法添加或删除文件。
文件 hello
用户 papa 可以读取或修改 hello 文件的内容,或从命令行执行该文件(文件内容为可能为可执行二进制文件或脚本)。arpa 组的用户可以查看或执行该文件,但无法修改它。其他用户无法访问该文件。
文件 hello.txt
用户 papa 可以读取或修改 hello.txt 文件的内容。arpa 组中的用户可以查看该文件。其他用户无法访问该文件。
链接和权限
一般来说,上述讨论也适用于硬链接和符号链接。文件系统会自动维护链接,以确保链接与目标文件具有相同的有效权限。(对于符号链接,ls 命令会显示一个文件模式,其中所有用户类别的权限类型均已分配,但当通过链接请求文件访问时,将应用目标文件的权限。)
然而,在某些配置下,硬链接可以绕过目录 x 的权限限制。假设用户对文件 ./d1/f1 具有访问权限,而该文件在目录 d1 的子树之外有一个硬链接 ./h1。如果用户失去了对 d1 的 x 权限,他将无法访问 ./d1/f1,但仍可通过硬链接 ./h1 使用其原始权限访问同一文件。
更改权限…
权限通过命令 chmod 更改:
chmod <permission-mode> <file-name>
让我们来看这个例子,
chmod 644 index.html
这个数字644代表什么?
…解释了
权限模式是九个文件模式权限标志的数字表示形式。如前所述,存在三种权限类型和三种用户类别。每个数字代表分配给特定用户类别的权限类型。
| 用户类别: | u | g | o |
|---|---|---|---|
| 权限代码: | 6 | 4 | 4 |
每个用户类别的最终权限代码,是通过将该类别被授予的权限类型对应数值相加得出的:读权限(r)对应4,写权限(w)对应2,执行权限(x)对应1。
在上述示例中,我希望文件 index.html 对所有用户可读,但仅对我可写。因此权限代码应如下所示:
| 用户类别 | 权限类型 | 权限代码 |
|---|---|---|
| u (我自己) | r (4), w (2) | 4 + 2 = 6 |
| g (组) | r (4) | 4 |
| o (其他) | r (4) | 4 |
因此:
chmod 644 index.html
即可!
…另一种方式
chmod 支持一种用于指定权限模式的替代语法,这种语法在一次更改一个或几个权限时更加方便,且比上文提到的数字模式编码稍易记忆。
<user-classes><operation><permission-types>[,<user-classes><operation><permission-types>]…
< 用户类别>< 操作>< 权限类型>[,< 用户类别>< 操作>< 权限类型>]…
user-classes 用户类别
需要更改权限的用户类别。使用单字母类别符号 u、g、o 或使用 a 指定所有类别。可以指定多个类别。
operation 操作
- 以下之一:
+- 为用户类别添加权限类型。
-- 从用户类别中移除权限类型。
=- 为用户类别设置权限类型。
permission-types 权限类型
- 要设置或删除的权限类型。使用单字符类型符号
r、w或x。可以指定多种类型。
因此,命令:
chmod u=rw,go=r index.html
将产生与示例命令相同的效果:
chmod 644 index.html
如果我想稍后给文件的用户组的成员授予 w 权限,我可以使用命令:
chmod g+w index.html
文件标志
除了我们已经讨论过的文件权限外,我们还有文件标志。文件标志为文件提供了额外的安全性和控制,但不适用于目录。文件标志可通过 chflags(1) 工具进行修改。
% chflags uunlnk foo
将用于设置用户的撤销删除标志,要禁用该标志,只需在选项前面添加“no”(在此示例中为uunlnk),如下所示:
chflags nouunlnk foo
$Id: permissions.html,v 1.8 2007/10/02 11:22:28 papa Exp $