用于测试给定用户是不是可以读取目录和其中所有文件的 Bash 脚本?

Posted

技术标签:

【中文标题】用于测试给定用户是不是可以读取目录和其中所有文件的 Bash 脚本?【英文标题】:Bash script to test if a given user can read a directory and all files inside?用于测试给定用户是否可以读取目录和其中所有文件的 Bash 脚本? 【发布时间】:2013-11-03 08:39:00 【问题描述】:

如果给定用户可以读取包含所有文件和子目录的给定目录,我需要在 bash 脚本中进行测试。该脚本以 root 身份运行。

假设给定的用户名是$user 并且要测试的目录是$dir 我在脚本中添加了以下行

su -m $user -c "test -r $dir && test -x $dir" 如果 [ $? -ne];然后 echo "$dir 不可读或不可执行" 菲

您会建议纠正还是改进它?

【问题讨论】:

【参考方案1】:

你可以简单地说:

su -m $user -c "find $dir >/dev/null 2>&1 || echo $dir is not readable or executable"

如果$dir 中的任何文件/目录不可读,这将生成不可读或可执行消息。

find $dir 如果无法读取任何文件,将返回非零错误代码。


编辑:查找所有不可读的目录/文件的更完整(或更可靠)的方法是:

find . \( -type d -perm /u+r -o -type d -perm /u+x -o -type f -perm /u+r \)

【讨论】:

看起来即使某些文件不可读,“find”也会返回 0。如何测试 $dir 中的 all 文件是否可以被 $user 读取?【参考方案2】:

    这里好像少了什么:

    if [ $? -ne ]; then
    

    你的意思是写:

    if [ $? -ne 0 ]; then
    

    但实际上测试是没有必要的,因为你可以使用||

    su -m $user -c "test -r $dir && test -x $dir" ||
    echo "$dir is not readable or executable"
    

    代替:

    test -r $dir && test -x $dir
    

    您可以使用-a 选项(逻辑与)到test

    test -r $dir -a -x $dir
    

    变量$user 来自哪里?它值得信赖吗?如果没有,如果有人提供像root; 这样的值,就会有麻烦。即使您确定 $user 在这种情况下是可以的,仍然值得养成在 shell 脚本中引用您的变量的习惯:如果您写了以下代码,您会很安全:

    su -m "$user" -c "..."
    

    如果$dir 不受信任,也会出现类似的问题——有人可能会提供类似/; sh 的值。但在这种情况下,这样引用它是行不通的:

    su -m "$user" -c "test -r '$dir' -a -x '$dir'"
    

    因为有人可能会提供像/'; sh; echo ' 这样的值。相反,您需要将引用的"$dir" 作为参数传递给子shell,然后您可以使用$1 安全地引用它:

    su -m "$user" -c 'test -r "$1" -a -x "$1"' -- "$dir"
    

【讨论】:

以上是关于用于测试给定用户是不是可以读取目录和其中所有文件的 Bash 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Dart 中是不是有用于复制目录的内置函数?

Golang:创建用于测试文件读取功能的临时目录

设置目录安全性以允许用户并拒绝所有用户

使用Java在Linux上查找给定文件的根目录

如何从 Python 中的目录中读取 n 个文件?

file文件操作