facl 忽略“x”权限,但仅针对文件

facl 忽略“x”权限,但仅针对文件

当我使用 setfacl 来管理子文件/目录应具有哪些权限时,由于某种原因,这些文件具有除执行(“x”)权限之外的所有权限。

someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ getfacl .
# file: .
# owner: someuser
# group: webs
# flags: -s-
user::rwx
group::rwx
other::rwx
default:user::rwx
default:group::rwx
default:other::rwx

someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ touch file
someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ mkdir dir
someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ ls -l
total 4
drwxrwsrwx+ 2 someuser webs 4096 paź 31 13:35 dir
-rw-rw-rw-  1 someuser webs    0 paź 31 13:35 file

我认为这与 umask 有关,但以各种方式改变它永远不会给出预期的结果,除非我错过了一些东西。

如何解决这个问题?

答案1

豪克·拉金的回答试图说:

    任何创建文件或目录的程序都会指定它希望该文件具有的模式(权限)。这几乎总是硬编码在 C 程序(或任何使用的语言)中,并且用户几乎无法直接访问。那么该umask值和默认ACL可以关闭权限位,但不能添加它们。

    您的问题是,虽然mkdir指定模式为 777 ( rwxrwxrwx),但几乎所有创建文件的程序都指定为 666 ( rw-rw-rw-)。这包括touch、 shell(用于 I/O 重定向;例如)、编辑器(、、等...)、、等等。因此,无论您如何使用 ACL,您都不会在创建后立即获得普通文件的权限(通过任何这些程序);您必须创建该文件,然后再创建它。program > filevivimemacsddsplitrwxrwxrwxchmod

    此规则有几个例外:

    • cp以及复制或以其他方式重新创建文件的相关程序(例如cpiotar、 等),这将(尝试)将新文件设置为与原始文件相同的模式。
    • 创建二进制可执行文件的编译器指定模式为 777(至少,如果编译成功的话),因此用户实际上能够执行他们刚刚编译的程序。

答案2

你没有提到“预期结果”是什么。我认为这是设置了位的文件x

您无法强制执行此操作,因为默认 ACL(如 umask)仅阻止权限但不会自行设置权限。新目录或文件不会获得比创建它所请求的open()或调用更多的权限(对于用户、组和其他)。mkdir()

对于文件,通常只请求读和写权限。但是,如果编译器创建二进制文件,那么它也会请求执行权限。

答案3

$ touch file && chmod a+x file

其他答案里的解释都很棒。我想添加一些实际上可以回答问题的内容,

如何解决这个问题?

有具体代码。 @Scott 告诉了如何做到这一点,

您必须创建该文件,然后再创建chmod它。

我的答案中的代码显示了如何做到这一点并强调它把它放在第一位。


更多说明

首先,为了简单起见,我只需添加到touchOP 给出的命令中,具体touch file变为touch file && chmod a+x file.

someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ touch file && chmod a+x file
someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ mkdir dir
someuser@someuser-MS-7816:/opt/lampp/htdocs/project$ ls -l
total 4
drwxrwsrwx+ 2 someuser webs 4096 paź 31 13:35 dir
-rwxrwxrwx  1 someuser webs    0 paź 31 13:35 file

在这里,我将在我的计算机 (Cygwin) 上设置相同的情况以显示其工作原理,然后在虚拟 Ubuntu 机器上执行相同的操作以显示设置中的差异。 (请注意,用于修复问题的实际命令不会改变,我只是想展示可能出现的一些差异setfacl,并亲自验证它是否有效。)

$ uname -a | head -n 1 
CYGWIN_NT-10.0 my_machine 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin
$ pwd
/home/me
$ mkdir user294034
$ setfacl -m u::rwx user294034/
$ setfacl -m d:u::rwx user294034/
$ setfacl -m g::rwX user294034/
setfacl: illegal acl entries
$ setfacl -m g::rws user294034/
setfacl: illegal acl entries
$ # I guess I don't know how to get the `flags: -s-` on Cygwin
$ setfacl -m g::rwx user294034/
$ setfacl -m d:g::rwx user294034/
$ setfacl -m o::rwx user294034/
$ setfacl -m d:o::rwx user294034/
$ cd user294034
$ getfacl .
# file: .
# owner: me
# group: my_group
user::rwx
group::rwx
other:rwx
default:user::rwx
default:group::rwx
default:other:rwx
$ # I admitted that I don't know how to get `# flags: -s-`
$ umask
0022
$ umask 0000
$ touch file
$ mkdir dir
$ # Here, we'll see the same problem
$ ls -l
total 0
drwxrwxrwx+ 1 me my_group 0 Sep 18 20:31 dir
-rw-rw-rw-  1 me my_group 0 Sep 18 20:31 file
$ # Here, we'll fix the problem
$ rm file
$ touch file && chmod a+x file
$ ls -l
total 0
drwxrwxrwx+ 1 me my_group 0 Sep 18 20:31 dir
-rwxrwxrwx  1 me my_group 0 Sep 18 20:32 file

答案4

您可以尝试用这个简单的脚本替换每个文件和目录的 ACL 记录,并给出指定的默认权限。

$ cd ~
$ mkdir .config
$ cat <<'EOF' >> .config/dacl
user::rwx
group::rwx
other:r-x
default:user::rwx
default:group::rwx
default:other:r-x
EOF
$ cat <<'EOF' >> .config/facl
user::rw-
group::rw-
other:r--
default:user::rw-
default:group::rw-
default:other:r--
EOF

$ cd /
$ find $1 -type d -exec setfacl -f ~/.config/dacl {} \;
$ find $1 -type f -exec setfacl -f ~/.config/facl {} \;

$ getfacl .
# file: .
# owner: MyUser
# group: Administrators
user::rwx
group::rwx
other::r-x
default:user::rwx
default:group::rwx
default:other::r-x

相关内容