首页 > 教程 > FreeBSD 教程 > FreeBSD 基础 > FreeBSD 文件或目录权限

FreeBSD 文件或目录权限

在 FreeBSD 中,每个文件和目录都配置了一组权限,且 FreeBSD 提供了多个命令来查看和修改这些权限。了解这些文件和目录的权限可以了解 FreeBSD 的运行机制,以及在无法访问文件或目录时的解决方法。

在 FreeBSD 系统中,文件或目录的权限分为三种类型:读、写和执行。可以为文件所有者、组和其他人(其他所有人)分别设置这三类权限。

读、写和执行权限可以分别使用字母 rwx 表示;也可以用二进制数字表示,当使用数字表示时,顺序始终为 rwx,其中具有 r 时值为 4,具有 w 时值为 2,具有 x 时值为 1。

查看文件或目录权限

使用 ls 命令的 -l 可以查看目录中的文件或目录的详细权限:

% ls -l

输出类似于以下内容:

total 530
-rw-r--r--  1 root  wheel     512 Sep  5 12:31 myfile

输出内容的每一行的第一列为其对应的权限:

  • 第一个字符表示文件为普通文件、目录、特殊字符设备、套接字还是任何其他特殊伪文件设备,- 为普通文件。
  • 接下来的三个字符(在此示例中为 rw-)为文件所有者的权限;所有者具有读写文件权限;对应二进制值为 6。
  • 再接下来的三个字符 r-- 为所属组的权限;组具有读取权限;对应二进制值为 4。
  • 最后三个字符 r-- 为其他人的权限。其他人具有读取权限;对应二进制值为 4。

文件权限说明

FreeBSD 系统将大多数硬件设备视为程序可以打开、读取和写入数据的文件。这些特殊设备文件存储在 /dev/ 中。

目录也被视为文件,也具有读、写和执行权限。当目录具有可执行权限时,可以使用 cd 转到该目录。这样可以在 shell 中访问该目录中的文件,但特定文件能不能访问,受文件自己的权限控制。

要列出目录的结构,必须对目录具有读权限;要删除目录中的文件,必须对目录具有读和执行权限。

为了执行目录列表,必须在目录上设置读权限。为了删除已知名称的文件,必须具有包含该文件的目录的写和执行权限。

还有其他的一些用于特殊情况的权限位,如 setuidsticky

八进制权限

二进制数字和权限的对应表:

二进制权限值 符号表示 权限
0 --- 无读、无写、无执行
1 --x 无读、无写、执行
2 -w- 无读、写、无执行
3 -wx 无读、写、执行
4 r-- 读、无写、无执行
5 r-x 读、无写、执行
6 rw- 读、写、无执行
7 rwx 读、写、执行

说明:- 表示为没有对应的权限。

使用八进制设置权限

要使用八进制数字设置文件或目录的权限,需要使用 chmod 命令。使用八进制设置权限时,不许使用 4位3位 八进制数字。

使用八进制设置权限,只能设置为特定的权限,不能添加权限或删除权限。

1)对文件 FILE 赋予所有者读写权限,组和其他人读权限:

% chmod 644 FILE

chmod 命令在 Linux 和 FreeBSD 系统中的使用方法基本相同,关于 chmod 的使用方法可以查看:chmod 命令使用方法

符号权限

符号权限使用字符为文件或目录分配权限。符号权限使用语法(who)(action)(permissions):

who 为需要设置权限的对象,可以使用的字符如下:

字符 说明
u 用户(所有者)
g
o 其他
a 所有(“所有人”),等同于使用 ugo

action 为如何设置权限,可以使用的字符如下:

字符 对应的操作说明
+ 添加权限
- 删除权限
= 设置为对应的权限

permissions 为设置的对应权限,可以使用的字符如下:

字符 对应的权限说明
r
w
x 执行
t 粘性位
s 设置 UID 或 GID

使用符号设置权限

要使用符号设置文件或目录的权限,需要使用 chmod 命令。

1)使组和其他人对文件 FILE 不具有任何权限:

% chmod go= FILE

说明:

  • go 表示为组和其他人设置权限
  • = 表示设置为对应权限
  • 权限为空,表示不具有任何权限

2)为不同用户设置不同权限,使用逗号 , 分隔各个设置列表:

% chmod go-w,a+x FILE

说明:

  • go-w 表示为组和其他人删除写权限
  • a+x 表示为所有的用户(所有者、组、其他人)赋予读权限

FreeBSD 文件标志

除了文件权限之外,FreeBSD 还支持使用“文件标志”。“文件标志”只能用于普通文件,不能应用在目录上。使用“文件标志”可以添加一些额外的安全标志,甚至可以防止 root 删除或更改文件。

使用 chflags 命令修改文件标志。

1)为文件 file1.txt 设置不可删除标志:

# chflags sunlink file1.txt

2)在 sunlink 前加上 no 为文件 file1.txt 去除不可删除标志:

# chflags nosunlink file1.txt

3)使用 ls 命令同时附带 -lo 选项,可以查看文件的文件标志

# ls -lo file1.txt

输出类似于以下内容:

-rw-r--r--  1 trhodes  trhodes  sunlnk 0 Mar  1 05:54 file1

注意:默认情况下,文件的所有者可以为文件设置文件标志,但是有几个文件标志只能由 root 用户添加或删除。

setuid、setgid 和 sticky 权限

除了前面已经说明的权限之外,还有 setuid、setgid 和 sticky 三个权限。这三个权限对于 FreeBSD 操作有时很重要,这些功能只能由管理员操作。

setuid 权限说明

要理解它们,必须了解真实用户 ID 和有效用户 ID 之间的区别。

真实用户 ID 是拥有或启动进程的 UID。有效 UID 是进程运行时的用户 ID。例如,当用户更改密码时,启动 passwd 命令的用户 ID 为真实用户 ID。但是,但是更改密码需要更新密码数据库,所以命令会以 root 用户的 ID 运行。这允许用户更改密码而不会出现 Permission Denied 错误。

1)可以使用符号 s 为用户添加 setuid 权限:

# chmod u+s suidexample.sh

2)也可以使用 4位 八进制中的第一个八进制数字设置位 4 来设置 setuid 权限:

# chmod 4755 suidexample.sh

3)现在 suidexample.sh 文件的权限如下所示:

-rwsr-xr-x   1 trhodes  trhodes    63 Aug 29 06:36 suidexample.sh

现在 s 是文件所有者权限集的一部分,替换了可执行位。

需要提升权限运行的命令需要设置 setuid 权限,例如 passwd 命令。

setgid 权限说明

setgid 权限与 setuid 权限具有相似的功能;它更改的是组设置。当命令执行时需要使用该权限时,将根据拥有文件的组的权限执行,而不是启动进程的用户的权限执行。

1)可以使用符号 s 为组添加 setgid 权限:

# chmod g+s sgidexample.sh

2)也可以使用 4位 八进制中的第一个八进制数字设置位 2 来设置 setgid 权限:

# chmod 2755 sgidexample.sh

在以下列表中, s 出现在了组的权限字段中:

-rwxr-sr-x   1 trhodes  trhodes    44 Aug 31 01:49 sgidexample.sh

setuidsetgid 权限位可能会降低系统安全性,因为它们允许提升权限。

sticky 权限说明

sticky 权限位,可以增强系统的安全性。

当在目录上设置 sticky 位时,它只允许文件的所有者删除文件,这样可以防止其他人删除文件。

1)使用如下命令位 /tmp目录设置 sticky 权限:

# chmod +t /tmp

2)也可以使用 4位 八进制中的第一个八进制数字设置位 1 来设置 sticky 权限:

# chmod 1777 /tmp

在目录上设置 sticky 权限时,目录权限字符串的最后以为显示为 t

# ls -al / | grep tmp

输出类似于以下内容:

drwxrwxrwt  10 root  wheel         512 Aug 31 01:49 tmp