更改文件权限可以以 root 身份进行,但不能以 sudo 身份进行

更改文件权限可以以 root 身份进行,但不能以 sudo 身份进行

我遇到了一个非常奇怪的问题。我在一个大目录中有几个文件,我想让每个人都可以读取它们。所以我尝试这样做:

sudo find readme* -not -perm -o+r -exec chmod +r {} \;

并得到这个:

sudo: unable to execute /usr/bin/find: Success

我不知道为什么它显示成功,因为权限没有改变。我通过输入以下内容进行了验证:

find readme* -not -perm -o+r -exec ls -l {} \;

并得到类似

-rw------- 1 root root 536871076 11月22日 14:06 readme_20101122200429
-rw------- 1 root root 536871892 11月22日 14:08 readme_20101122200642
-rw------- 1 root root 293458128 11月22日 14:10 readme_20101122200859

作为最后的手段,我尝试了:

sudo chmod +r *

并得到:

sudo: unable to execute /bin/chmod: Success

再次,成功实际上意味着失败。因此,我放弃了,以 root 身份登录并尝试:

find readme* -not -perm -o+r -exec chmod +r {} \;

这次成功了。为什么?

编辑:/etc/sudoers 看起来像:

## 允许 root 在任何地方运行任何命令
根 ALL=(全部) 全部

##我
用户1 全部=(全部) 全部

答案1

我不知道你使用的是哪个版本的 find。但是,通常第一个参数是要查找的目录,如果你想过滤某些文件名,你必须使用 -name 参数。我猜是

sudo find . -name 'readme*' -not -perm -o+r -exec chmod +r {} \;

不要忘记对文件名模式使用单引号。如果不这样做,* 将由 shell 进行评估,而不是直接作为参数传递。这也许可以解释这种奇怪的行为。因为在这种情况下,shell 可能会尝试将每个与 readme* 匹配的文件名作为参数传递给 sudo。

答案2

我认为你应该使用:

sudo sh -c 'find readme* -not -perm -o+r -exec chmod +r {} \;'

这会导致sudo运行 shell,然后将参数解释为-cshell 脚本。使用单引号括起来是最简单的方法 - 除非要执行的命令中有单引号。在这种情况下,命令中的每个单引号都将被四个字符替换 - '\'':引号、反斜杠、引号、引号。

然而,在这种情况下,我不能保证你不会得到:

sudo: unable to execute /bin/sh: Success

这个奇怪的错误可能意味着一个exec*()系列函数调用返回,但留下的值errno为零。这不应该发生 - 但显然发生了。发生了什么:

sudo /bin/ls      # Or /usr/bin/ls if that's correct for your machine

您上次检查sudo安装是什么时候?您上次重启是什么时候?看起来有些奇怪的事情正在sudo(错误地)处理您的命令。

您在 NFS 中工作的目录是否已挂载?Root 通常在此类目录中拥有相当小的权限。但错误应该是 EPERM(无权限)类型,而不是“失败时成功”类型。

相关内容