如何查找具有特定用户特定权限的文件?

如何查找具有特定用户特定权限的文件?

如何获取特定用户具有“读写”权限的所有文件的列表。

例如,当我进入 Mac 桌面时,右键单击文件“A”,然后“获取信息”,然后在底部我有“共享和权限”,我可以在其中添加自定义用户,例如“popo”例如,然后指定他可以“读取和写入”该文件。

然后我想使用命令行获取POPO可以读写的所有文件,并且只有这些(我想在上面的示例中获取“A”)。

我所有的研究目前引导我的是:

find /Users/Me/Desktop -user popo -perm 777

但我什么也没得到..

上述有什么问题find,我应该如何处理?

答案1

您需要搜索每个人都可以读写的文件、或者可以通过用户的 uid 读写的文件、或者可以通过用户所属的所有组读写的文件。但实际情况比这要复杂一些。正如所指出的这里作者:Stephane Chazelas,如果文件由用户拥有,则仅所有者权限计数,如果文件由用户所属的组拥有,则仅组权限计数。

因此,我们需要检查“所有者=RW或(不是所有者和组=rw)或(不是所有者且不是组和其他=rw)”

您可以使用 获取用户所属的组 gid 的列表id -G。这可用于构建具有标准 shell 命令替换的 find 命令行。

我最初的答案是一句台词,但这项工作太复杂了,无法用一句台词来完成。这是一个可以完成这项工作的 bash shell 脚本。

#! /bin/bash

U="$1"      # username to do perm search on - e.g. popo
TOPDIR="$2" # starting directory for search - e.g. /Users/Me/Desktop

# permissions to search for - defaults to "rw"
PERMS=${3:-rw}

# permission bits "style".  "/"=ANY or "-"=ALL. defaults to / 
#
# see find(1) and search for '-perm -mode' or '-perm /mode' for 
# details on how this works.
PSTYLE=${4:-/}

# construct a find expression specifying all groups that the user
# is a member of
GIDS="$(for i in $(id -G "$U"); do echo -n " -gid $i -o "; done)"
GIDS=$(echo "$GIDS" | sed -e 's/ -o $//')    # strip trailing " -o "

find "$TOPDIR" \
   \( -user "$U" -perm ${PSTYLE}u=$PERMS \) \
   -o \( -not -user "$U" -a \( $GIDS \) -perm ${PSTYLE}g=$PERMS \) \
   -o \( -not -user "$U" -not \( $GIDS \) -perm ${PSTYLE}o=$PERMS \) 

该脚本必须以 root 身份运行。其他用户可能没有所需的权限来查看 popo 可以查看的所有目录。

id注意:我已经使用GNU Coreutils 和findGNU findutils的最新版本在 Debian Linux 系统上对此进行了测试。id和的 Mac 实现find可能有所不同,我目前没有可用的 Mac 来测试。如果不同,请检查 Mac 手册页中的idfind- 要查找的可能需要修改以适应 Mac 的内容是 的-G-u选项id以及-perm /的或“-perm -”选项find

答案2

这是因为-user选项在指定用户(如果文件所有者)所在的位置搜索文件,而这不是您的情况。

看起来最简单的方法是在 popo 用户下执行命令:

find /Users/Me/Desktop -readable

答案3

sudo find . -print0 | 
  sudo -u popo perl -Mfiletest=access -l -0ne '
    print if -r && -w'

几乎相同问题的答案为什么检查权限通常不起作用。

相关内容