权限查询

权限查询

我以为我了解权限在 Linux 中是如何工作的,直到我意识到这种情况。

我有一个子文件夹,古怪的包含具有以下权限的文件:

ls -aRl /mnt/oddball
/mnt/oddball:
total 120
drwx------ 2 bendipa bendipa  4096 Aug 27 00:16 .
drwxr-xr-x 6 root    root     4096 Jul  1 15:51 ..
-rw-rw-r-- 1 bendipa bendipa    12 Aug 27 00:16 Adoc.txt
-rwx------ 1 bendipa bendipa 12655 Aug 26 18:16 .IntBnkDet.doc.pgp
-rwx------ 1 bendipa bendipa 14550 Aug 26 19:04 .PersonalDetail.odt.pgp
-rwx------ 1 bendipa bendipa 76357 Aug 15 15:43 .StatePensionGateway.doc.pgp

问题是每次我在其中创建一个新文件/mnt/奇怪的它假设权限与文件一样Adoc.txt,而我假设文件将从其父文件夹获取权限;在这种情况下古怪的显示为列出的输出行权限中的第一个。我记下的父文件夹古怪的,/mnt是 root 拥有的并且显示的权限不同于古怪的,但不希望这些对古怪的的文件。

当然,更改新文件的权限很容易/mnt 奇怪的在终端中,但每次创建文件时都必须这样做有点乏味。或者说这在 Linux 中是必需的吗?

答案1

权限不是从父文件夹继承的。

在普通文件系统上,新文件是使用模式 0666 ( rw-rw-rw-) 创建的,但是修改的通过umask值(反转)。

因此,例如:

$ umask 0
$ touch foo
$ ls -l foo
-rw-rw-rw- 1 sweh sweh 0 Aug 26 21:14 foo

$ umask 022
$ touch bar
$ ls -l bar
-rw-r--r-- 1 sweh sweh 0 Aug 26 21:14 bar

$ umask 0222
$ echo hello > baz
$ ls -l baz       
-r--r--r-- 1 sweh sweh 6 Aug 26 21:15 baz

我们可以看到该umask值决定了创建新文件所使用的权限。

解释一下这些数字:

r=4
w=2
x=1

每个文件都有“所有者”、“组”、“世界”的权限。如果您查看八进制的数字,则可以将其分解。

例如 0123 的许可意味着

owner = 1 ==> --x
group = 2 ==> -w-
world = 3 ==> -wx

我们可以看到:

$ chmod 0123 foo 
$ ls -l foo
---x-w--wx 1 sweh sweh 0 Aug 26 21:27 foo

一个umask值决定了要处理的位保持。因此,确定您采用 0666 的实际创建模式,并与否定umask 的。

因此,如果umask是 0022,那么否定就是 0755 和0666 AND 07550644,这导致了rw-r--r--我们之前看到的权限。

然而,也存在一些并发症。

首先是为了得到对于该文件,您需要整个目录路径的权限。因此,在您的示例中,即使Adoc.txt具有全局读取权限,其他人也无法看到该文件,因为该目录阻止他们到达那么远。

所以有效的权限取决于对整个目录树的权限以及对文件的权限。

例如:

$ sudo ls -al X
total 8
drwx------ 2 root root 4096 Aug 26 21:19 .
drwxr-xr-x 3 root root 4096 Aug 26 21:18 ..
-rw-r--r-- 1 root root    6 Aug 26 21:19 y

权限y说每个人都可以阅读它,但如果我尝试......

$ cat X/y
cat: X/y: Permission denied

那是因为目录许可阻止了我。

您需要x目录的权限才能读取其中的文件。

$ sudo chmod a+x X

$ ls -ld X
drwx--x--x 2 root root 4096 Aug 26 21:19 X/

$ cat X/y
hello

另一个复杂的问题是如果您使用非本机文件系统(例如 NTFS 或 SMB)。挂载标志可以覆盖 Unix 权限,只是因为原始文件系统不理解 Unix 权限。但您的问题可能并非如此。

相关内容