Skip to content

Files

Latest commit

1153698 · Aug 15, 2022

History

History
113 lines (71 loc) · 3.85 KB

67.md

File metadata and controls

113 lines (71 loc) · 3.85 KB

文件系统,第 3 部分:权限

原文:https://github.com/angrave/SystemProgramming/wiki/File-System%2C-Part-3%3A-Permissions

再次重申一下权限意味着什么?

每个文件和目录都有一组 9 个权限位和一个类型字段

  • r,读取文件的权限
  • w,写入文件的权限
  • x,执行文件的权限

chmod 777

CHMOD 7 7 7
01 111 111 111
d rwx rwx rwx
1 2 3 4
  1. 文件类型

  2. 所有者权限

  3. 组权限

  4. 其他人的许可

mknod更改第一个字段,即文件的类型。 chmod接受一个数字和一个文件并更改权限位。

该文件有一个所有者。如果您的进程具有与所有者(或 root)相同的用户 ID,则第一个三元组中的权限将适用于您。如果您与文件位于同一组(所有文件也归组所有),则下一组权限位适用于您。如果以上都不适用,则最后一个三元组适用于您。

如何更改文件的权限?

使用chmod(“更改文件模式位”的缩写)

也可以使用下面这个系统函数int chmod(const char *path, mode_t mode);,但我们将专注于 shell 命令。使用chmod有两种常用方法;使用八进制值或符号字符串:

$ chmod 644 file1
$ chmod 755 file2
$ chmod 700 file3
$ chmod ugo-w file4
$ chmod o-rx file4 

base-8('octal')数字描述了每个角色的权限:拥有该文件的用户,该组以及其他所有人。八进制数是给予三种权限类型的三个值的总和:read(4),write(2),execute(1)

示例:chmod 755 myfile

  • r + w + x =数字
  • 当前用户有 4 + 2 + 1,完全权限
  • 当前组具有 4 + 0 + 1,读取和执行权限
  • 其它用户都有 4 + 0 + 1,读取和执行权限

如何从 ls 读取权限字符串?

使用`ls -l'。请注意,权限将以“drwxrwxrwx”格式输出。第一个字符表示文件类型的类型。第一个字符的可能的取值:

  • (-)常规文件
  • (d)目录
  • (c)字符设备文件
  • (l)链接
  • (p)管道
  • (b)块设备
  • (s)网络设备

什么是 sudo?

使用sudo可以获取超级管理员权限。例如通常(除非在'/ etc / fstab'文件中明确指定,否则您需要 root 权限才能挂载文件系统)。 sudo可用于以 root 身份临时运行命令(前提是用户具有 sudo 权限)

$ sudo mount /dev/sda2 /stuff/mydisk
$ sudo adduser fred 

如何更改文件的所有权?

使用chown username filename

如何从代码中设置权限?

chmod(const char *path, mode_t mode);

为什么有些文件要进行'setuid'操作?这是什么意思?

set-user-ID-on-execution是为了在文件运行时更改与进程关联的用户。这通常用于需要有root权限才行,但由非root用户执行的该命令。这个时候就用到sudo

set-group-ID-on-execution 更改运行进程的组。

它们为什么有用?

最常见的用例是,用户可以在程序的持续时间内拥有 root(admin)访问权限。

sudo 运行的权限是什么?

$ ls -l /usr/bin/sudo
-r-s--x--x  1 root  wheel  327920 Oct 24 09:04 /usr/bin/sudo 

's'位表示执行和 set-uid;该进程的有效用户标识将与父进程不同。在这个例子中它将是 root

getuid()和 geteuid()之间有什么区别?

  • getuid返回真实用户 ID(如果以 root 身份登录则为零)
  • geteuid返回有效的用户 ID(如果作为 root 用户,则为零,例如由于程序上设置的 setuid 标志)

如何确保只有特权用户才能运行我的代码?

  • 通过调用geteuid()检查用户的有效权限。返回值为零表示程序以 root 身份有效运行。

转到文件系统:第 4 部分