我以为我了解权限在 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 0755
0644,这导致了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 权限。但您的问题可能并非如此。