我的脚本在我运行时运行良好,但在由其他用户运行时失败,并出现表单错误
chmod: changing permissions of `/A/B/C/D/E': Operation not permitted
Run Code Online (Sandbox Code Playgroud)
(这/A/B/C/D/E
是一个目录。FWIW,脚本驻留在/A/B/C/D
.)
如果重要,有问题的目录及其所有祖先的权限结构如下:
drwxrwsrwx kjo11 proj1 /A/B/C/D/E/
drwxrwsrwx cwr8 proj1 /A/B/C/D/
drwxrwsr-x root proj1 /A/B/C/
drwxrwsr-x root proj1 /A/B/
drwxr-xr-x root root /A/
drwxr-sr-x root root /
Run Code Online (Sandbox Code Playgroud)
(在这个清单中,kjo11
是我的$USER
名字。碰巧,cwr8
是$USER
脚本失败的用户的名字。无论如何,我们都在proj1
组中。)
的输出uname
是Linux
。
我难住了。唯一引起我注意的细节是错误是Operation not permitted
,而不是Permission denied
,但我无法从中得到更多。
什么条件会导致运行时出现此类错误chmod
?
只有文件的所有者或超级用户才能更改文件的权限。这是真的,即使用户是拥有文件的组的成员,并且文件和父目录的权限会建议设置权限应该是可能的。
您可以在创建时控制文件和目录的权限,方法是使用umask
shell 的功能:
$ umask 002
$ mkdir -p targetdir
$ ls -ld targetdir
...
drwxrwxr-x 2 dan wheel 2 19 Mar 15:13 targetdir
Run Code Online (Sandbox Code Playgroud)
如果您在脚本中执行此操作,保存原始 umask 值可能是个好主意,这样您就可以在成功创建目录后恢复它。