我正在尝试执行此命令,但它没有得到预期的结果
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
,因此此行为仅影响文件。