如何获取特定用户具有“读写”权限的所有文件的列表。
例如,当我进入 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 和find
GNU findutils的最新版本在 Debian Linux 系统上对此进行了测试。id
和的 Mac 实现find
可能有所不同,我目前没有可用的 Mac 来测试。如果不同,请检查 Mac 手册页中的id
和find
- 要查找的可能需要修改以适应 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'
看几乎相同问题的答案为什么检查权限通常不起作用。