Linux文件权限与用户身份管理全解析
立即解锁
发布时间: 2025-08-14 01:38:24 阅读量: 9 订阅数: 12 


Linux命令行完全入门指南
### Linux 文件权限与用户身份管理全解析
#### 1. 文件权限符号表示法
在 Linux 系统中,文件和目录的权限设置可以使用符号表示法。以下是一些常见符号表示法及其含义:
| 符号表示 | 含义 |
| --- | --- |
| o-rw | 移除除文件所有者和组所有者之外的用户的读写权限 |
| go=rw | 设置组所有者和其他用户具有读写权限。如果组所有者或其他用户之前有执行权限,则移除该权限 |
| u+x,go=rx | 为文件所有者添加执行权限,并设置组和其他用户具有读写和执行权限。多个设置可以用逗号分隔 |
符号表示法的优点是可以在不影响其他属性的情况下设置单个属性。若想了解更多详细信息和选项,可以查看 `chmod` 的手册页。不过,使用 `--recursive` 选项时需谨慎,因为它会同时作用于文件和目录,而我们通常不希望文件和目录具有相同的权限。
#### 2. 使用图形界面设置文件模式
在 Nautilus(GNOME)和 Konqueror(KDE)中,右键单击文件或目录图标会弹出属性对话框。以 KDE 3.5 为例,在属性对话框中可以看到所有者、组和其他用户的权限设置。点击“高级权限”按钮,还能分别设置每个模式属性。这体现了通过命令行理解权限设置后,对图形界面操作的帮助。
#### 3. umask - 设置默认权限
`umask` 命令用于控制文件创建时的默认权限。它使用八进制表示法来表示要从文件模式属性中移除的位掩码。下面通过示例说明:
```bash
[me@linuxbox ~]$ rm -f foo.txt
[me@linuxbox ~]$ umask
0002
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-r-- 1 me me 0 2012-03-06 14:53 foo.txt
```
首先,删除已存在的 `foo.txt` 文件,确保操作是全新的。然后,运行 `umask` 命令查看当前值,得到 `0002`(`0022` 也是常见的默认值),这是掩码的八进制表示。接着创建新的 `foo.txt` 文件并查看其权限,可以看到所有者和组具有读写权限,其他用户只有读权限,这是因为掩码值的作用。
接下来,手动设置掩码:
```bash
[me@linuxbox ~]$ rm foo.txt
[me@linuxbox ~]$ umask 0000
[me@linuxbox ~]$ > foo.txt
[me@linuxbox ~]$ ls -l foo.txt
-rw-rw-rw- 1 me me 0 2012-03-06 14:58 foo.txt
```
当将掩码设置为 `0000` 时,文件变为所有用户可写。为了理解其工作原理,将掩码展开为二进制并与属性进行比较:
| 模式 | 详情 |
| --- | --- |
| 原始文件模式 | --- rw- rw- rw- |
| 掩码 | 000 000 000 010 |
| 结果 | --- rw- rw- r-- |
暂时忽略前面的 `0`,可以看到掩码中 `1` 出现的位置,对应的属性被移除,这里是其他用户的写权限。同样,对于掩码值 `0022` 也有相同的效果。可以尝试不同的值(如 `7`)来熟悉其工作方式,完成后记得清理:
```bash
[me@linuxbox ~]$ rm foo.txt; umask 0002
```
大多数情况下,不需要更改掩码,系统默认值通常就足够了。但在一些高安全要求的情况下,可能需要手动控制。
#### 4. 特殊权限
虽然通常八进制权限掩码用三位数表示,但更准确的是用四位数,因为除了读写和执行权限外,还有一些较少使用的权限设置:
- **setuid 位(八进制 4000)**:应用于可执行文件时,它会将有效用户 ID 从实际运行程序的用户 ID 更改为程序所有者的用户 ID。通常,超级用户拥有的一些程序会设置此权限。普通用户运行设置了 `setuid root` 的程序时,程序将以超级用户的有效权限运行,从而可以访问普通用户通常被禁止访问的文件和目录。但由于这会带来安全风险,设置 `setuid` 的程序数量应尽量少。
- **setgid 位(八进制 2000)**:与 `setuid` 位类似,它会将有效组 ID 从用户的实际组 ID 更改为文件所有者的组 ID。如果在目录上设置了 `setgid` 位,该目录中新建的文件将具有该目录的组所有权,而不是文件创建者的组所有权。这在共享目录中很有用,当同一组的成员需要访问目录中的所有文件时,无论文件所有者的主组是什么。
- **sticky 位(八进制 1000)**:这是古老 Unix 系统的遗留设置,在 Linux 中,文件会忽略该位,但应用于目录时,它可以防止用户删除或重命名文件,除非该用户是目录所有者、文件所有者或超级用户。常用于控制对共享目录(如 `/tmp`)的访问。
使用 `chmod` 符号表示法设置这些特殊权限的示例如下:
- 为程序分配 `setuid` 位:`chmod u+s program`
- 为目录分配 `setgid` 位:`chmod g+s dir`
- 为目录分配 `sticky` 位:`chmod +t dir`
通过 `ls` 命令的输出可以判断特殊权限的设置情况:
- 设置了 `setuid` 的程序:`-rwsr-xr-x`
- 设置了 `setgid` 属性的目录:`drwxrwsr-x`
- 设置了 `sticky` 位的目录:`drwxrwxrwt`
#### 5. 改变用户身份
在某些情况下,我们可能需要以其他用户的身份执行操作。常见的需求是获取超级用户权限来执行管理任务,也可以“变成”其他普通用户来测试账户。有三种方法可以实现身份切换:
1. 注销并以其他用户身份重新登录。
2. 使用 `su` 命令。
3. 使用 `sudo` 命令。
由于第一种方法缺乏便利性,这里重点介绍后两种方法。不同的 Linux 发行版可能会更倾向于使用其中一种命令。
#### 6. su - 以替代用户和组 ID 运行 shell
`su` 命令用于以其他用户身份启动 shell,命令语法如下:
```bash
su [-[l]] [user]
```
如果包含 `-l` 选项,生成的 sh
0
0
复制全文
相关推荐










