当我使用 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
豪克·拉金的回答试图说:
cp
以及复制或以其他方式重新创建文件的相关程序(例如cpio
,tar
、 等),这将(尝试)将新文件设置为与原始文件相同的模式。- 创建二进制可执行文件的编译器指定模式为 777(至少,如果编译成功的话),因此用户实际上能够执行他们刚刚编译的程序。
任何创建文件或目录的程序都会指定它希望该文件具有的模式(权限)。这几乎总是硬编码在 C 程序(或任何使用的语言)中,并且用户几乎无法直接访问。那么该umask
值和默认ACL可以关闭权限位,但不能添加它们。
您的问题是,虽然mkdir
指定模式为 777 ( rwxrwxrwx
),但几乎所有创建文件的程序都指定为 666 ( rw-rw-rw-
)。这包括touch
、 shell(用于 I/O 重定向;例如)、编辑器(、、等...)、、等等。因此,无论您如何使用 ACL,您都不会在创建后立即获得普通文件的权限(通过任何这些程序);您必须创建该文件,然后再创建它。program > file
vi
vim
emacs
dd
split
rwxrwxrwx
chmod
此规则有几个例外:
答案2
你没有提到“预期结果”是什么。我认为这是设置了位的文件x
。
您无法强制执行此操作,因为默认 ACL(如 umask)仅阻止权限但不会自行设置权限。新目录或文件不会获得比创建它所请求的open()
或调用更多的权限(对于用户、组和其他)。mkdir()
对于文件,通常只请求读和写权限。但是,如果编译器创建二进制文件,那么它也会请求执行权限。
答案3
$ touch file && chmod a+x file
其他答案里的解释都很棒。我想添加一些实际上可以回答问题的内容,
如何解决这个问题?
有具体代码。 @Scott 告诉了如何做到这一点,
您必须创建该文件,然后再创建
chmod
它。
我的答案中的代码显示了如何做到这一点并强调它把它放在第一位。
更多说明
首先,为了简单起见,我只需添加到touch
OP 给出的命令中,具体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