即使权限被修改,如何确定当前用户对哪些文件具有读取和执行权限

即使权限被修改,如何确定当前用户对哪些文件具有读取和执行权限

我正在尝试创建一个 shell 脚本,其中命令列出了所有可读可执行我或当前用户允许的文件,无论用户是谁以及用户位于何处。因此,即使我将来更改权限,更改仍然会反映出来。

这是我到目前为止所拥有的:

user=`id -un`
group=`id -gn`

IFS='
'
for file in `ls -al /home/cg/root`; do
    perm=$(echo $file | awk '{print $1}')
    fileowner=$(echo $file | awk '{print $3}')
    filegroup=$(echo $file | awk '{print $4}')
    ownerreadbit=${perm:1:2}
    ownerexecbit=${perm:3:4}
    groupreadbit=${perm:4:5}
    groupexecbit=${perm:6:7}
    worldreadbit=${perm:7:8}
    worldexecbit=${perm:9:10}
    if ["$user"=="$fileowner" && "$ownerreadbit"=="r" && "$ownerexecbit"=="x"]; then
        echo $file
    elif ["$group"=="$filegroup" && "$groupreadbit"=="r" &&" $groupexecbit"=="x"]; then
        echo $file
    elif ["$worldreadbit"=="r" && "$worldexecbit"=="x"]; then
        echo $file
    fi
done

答案1

为什么不使用 GNUfind命令?

find /home/cg/root -readable -executable

或者只列出文件:

find /home/cg/root -readable -executable -type f

答案2

用户 IporSricer 的答案find /home/cg/root -readable -executable是正确的选择。另请注意,该find命令还有一个额外的优点,即能够自定义其输出的格式,包括包含有关每个文件的许多可能详细信息的选项。请参阅页面-printf中的选项man。此答案的主要目的是尝试为您未来的脚本问题提供有用的反馈。

  1. 不要使用 的输出ls来编写脚本!这是初学者常见的错误。参考为什么*不*解析`ls`?

  2. 不使用ls,只需使用 shell 的本机文件通配,例如。/home/cg/root/*。这就是该功能存在的(原因之一)。

  3. 您的脚本不会下降到子目录,但用户 IporSricer 的答案会下降。

  4. 您错误地使用了 shell 的子字符串扩展功能,因此您的所有测试都不起作用。第二个参数是一个子字符串长度,不是结束位置,因此${perm:1:2}返回两个字符的子字符串;您想要${perm:1:1}单个字符子字符串。

  5. 更快的测试是定义表单的单独变量owner=${perm:1:2},然后针对“rx”测试它们。

  6. 我很惊讶你似乎说它&&在测试命令中有效[;我认为它只能在[[.

  7. 由于您的所有三个if, elif,elif都在做相同的事情, an ,您可以使用逻辑“或”运算符(在测试之外)echo将它们组合成一个。if||[

希望这有用。

相关内容