为文件夹上的特定用户和组添加执行并将其从文件中删除

为文件夹上的特定用户和组添加执行并将其从文件中删除

我正在尝试执行此命令,但它没有得到预期的结果

chmod -R u-x+Xrw,g-x+Xrw,o-x+Xr *

我希望我的所有目录都是可执行的,而我的所有文件都不是,这是用于 Web 服务器的存储文件夹,我不希望任何人在其中执行任何操作。只是读写,但我希望它的目录是可遍历的。

由于某种原因,这些文件最终也可执行,我做错了什么?

编辑:我知道如何使用其他答案中显示的解决方案来解决问题,但是我想知道为什么这里编写的命令在文件上保留 x 标志,而它似乎会删除它。

答案1

由于您希望文件(读取和写入)与目录(读取和执行)具有不同的权限,因此我建议使用两个单独的命令,而不是尝试将它们合并为一个。通配符*将匹配文件和目录。

其次,X权限添加“执行”...

如果该文件是一个目录或者已经具有某些用户的执行权限

...因此,如果文件开始时具有任何(用户、组或其他)执行权限,那么它将最终具有可执行权限。

考虑两个单独的命令:

find /base/path -type d -exec chmod u+rx,g+rx,o+rx {} +

find /base/path -type f -exec chmod u-x+rw,g-x+rw,o=r {} +

根据自己的策略调整权限集;上面的命令:

  • 在目录上:添加供所有人阅读和执行
  • 关于文件:删除为用户和组执行
  • 关于文件:添加为用户和组读写
  • 关于文件:其他仅供阅读

答案2

经过一些测试后,我发现以下 chmod 命令应该为您提供预期的行为:

chmod -R ugo-x+Xr,ug+w FILE

例如,我们从一个具有 775 权限的目录和文件开始:

[root@testvm1 ~]# ls -ld testdir/
drwxrwxr-x. 2 root root 22 Dec 14 16:47 testdir/
[root@testvm1 ~]# ls -l testdir/testfile
-rwxrwxr-x. 1 root root 0 Dec 14 16:47 testdir/testfile

现在我们运行命令:

[root@testvm1 ~]# chmod -R --verbose ugo-x+Xr,ug+w testdir/
mode of ‘testdir/’ retained as 0775 (rwxrwxr-x)
mode of ‘testdir/testfile’ changed from 0775 (rwxrwxr-x) to 0664 (rw-rw-r--)

该目录保留了其执行权限,而该文件已被剥夺其执行权限。

假设您想要所有目录的 775 权限和所有文件的 664 权限,您也可以使用以下变体来操纵写入权限:

chmod -R ugo-wx+Xr,ug+w *

问题中的原始chmod命令不会从文件中删除执行权限。这种行为差异似乎是模式评估方式的结果。chmod mode1, mode2 file提供与 相同的结果chmod mode1 file; chmod mode2 file。由于在原始命令中首先评估用户权限,因此组/其他类别的执行权限将导致文件保留执行权限。一个例子如下所示:

[root@testvm1 testdir]# chmod 775 testfile

[root@testvm1 testdir]# chmod -R --verbose u-x+Xrw,g-x+Xrw,o-x+Xr testfile
mode of ‘testfile’ retained as 0775 (rwxrwxr-x)

[root@testvm1 testdir]# chmod -R --verbose u-x+Xrw testfile
mode of ‘testfile’ retained as 0775 (rwxrwxr-x)
[root@testvm1 testdir]# chmod -R --verbose g-x+Xrw testfile
mode of ‘testfile’ retained as 0775 (rwxrwxr-x)
[root@testvm1 testdir]# chmod -R --verbose o-x+Xr testfile
mode of ‘testfile’ retained as 0775 (rwxrwxr-x)

请注意,目录会自动获取执行位X,因此此行为仅影响文件。

相关内容