【问题标题】:Find is returning "find: .: Permission denied", but I am not searching inFind 正在返回“find: .: Permission denied”,但我没有在搜索
【发布时间】:2011-04-26 14:14:08
【问题描述】:

我有一个巨大的 shell 脚本,我正在对其进行故障排除。我经常使用sudo 从我的主目录运行脚本。每当执行 find 时,我都会看到此错误:

find: .: Permission denied

确实,root 无权访问我的主目录(即当前工作目录或上述错误中的 .),但我并没有要求 find 在我的主目录中执行任何操作,并且宁愿它完全不管它。

为了真正把要点带回家,我运行了这个:

sudo find /dev -maxdepth 1 -type f

仍然会出现同样的错误。如果删除了-type -f,则错误将附加到预期结果的末尾。当然,如果我cd /dev 没有错误..可能是因为root 可以访问/dev。即使我不认为它会引起问题,它也会使脚本看起来有问题。如何防止脚本显示这些错误?

【问题讨论】:

  • root 应该如果sudo find命令指定它可以访问你的主目录:这就是'root'的意思。
  • @pavium 除非主目录是,例如,使用root_squash 选项(默认)安装在 NFS 上。
  • @Bolo 是正确的。主目录是外部挂载的。 root 没有权限。

标签: linux bash sudo


【解决方案1】:

我跑了:

strace find /dev -maxdepth 1

在 GNU/Linux (Ubuntu) 上,find 使用 fchdir 系统调用遍历目录树,最后执行 fchdir 回到原来的工作目录。这是一个sn-p:

open(".", O_RDONLY|O_NOCTTY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_NOFOLLOW) = 4
fchdir(4)                               = 0

... irrelevant ...

write(1, "/dev\n", 5)                   = 5
open("/dev", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 5
fcntl64(5, F_GETFD)                     = 0x1 (flags FD_CLOEXEC)
fchdir(5)                               = 0

... potentially more fchdirs ...

fchdir(4)                               = 0
close(4)                                = 0

我的提示?在运行 find 之前,cd /tmp(或其他一些完全可访问的目录)。

【讨论】:

  • 感谢您的帮助。我希望有某种开关可以关闭这种行为。
【解决方案2】:

在脚本开头添加cd /。除非你source它,脚本是在子shell中运行的,所以你自己的$PWD不会被改变。如果您它的来源,要么在开头存储$PWD,在末尾存储cd -- "$PWD",或者如果你没有在脚本中执行任何其他cds,则只存储cd -

【讨论】:

    【解决方案3】:

    尝试重定向标准错误。例如,你可以把它扔掉:

    find /dev 2>/dev/null
    

    【讨论】:

    • 感谢您的建议。我还是想看看stderr的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多