特定のユーザーの特定の権限を持つファイルを見つけるにはどうすればよいでしょうか?

特定のユーザーの特定の権限を持つファイルを見つけるにはどうすればよいでしょうか?

特定のユーザーに対して「読み取りと書き込み」の権限を持つすべてのファイルのリストを取得するにはどうすればよいですか。

たとえば、Mac のデスクトップでファイル「A」を右クリックして「情報を見る」を選択すると、下部に「共有とアクセス許可」があり、ここで「popo」などのカスタム ユーザーを追加して、そのユーザーがそのファイルを「読み取りおよび書き込み」できることを指定できます。

次に、コマンド ラインを使用して、POPO が読み取りおよび書き込みできるすべてのファイル (上記の例では「A」) のみを取得します。

今のところ私の研究の結果は次のようなものになります:

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

でも何も得られません。

上記の何が問題なのでしょうかfind、またどのように進めればよいでしょうか?

答え1

全員にRWされているファイル、またはユーザーのuidにRWされているファイル、またはユーザーがメンバーであるすべてのグループにRWされているファイルを検索する必要があります。しかし、それはそれよりも少し複雑です。ここStephane Chazelas によると、ファイルがユーザーによって所有されている場合は、所有者の権限のみが考慮されます。また、ファイルがユーザーがメンバーであるグループによって所有されている場合は、グループの権限のみが考慮されます。

したがって、「所有者=RW または (所有者ではなくグループ=rw) または (所有者ではなくグループではなくその他=rw)」をチェックする必要があります。

を使用すると、ユーザーが所属するグループ gid のリストを取得できますid -G。これを使用して、標準のシェル コマンド置換を使用して find コマンド ラインを構築できます。

私の最初の回答はワンライナーでしたが、このジョブはワンライナーで実行するには複雑すぎます。このジョブを実行する bash シェル スクリプトを以下に示します。

#! /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 マニュアル ページを確認してくださいid。Macfindに合わせて変更する必要がある可能性のあるものは、の-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'

見るほぼ同じ質問に対する答え権限の確認が通常は機能しない理由について説明します。

関連情報