特定のユーザーに「読み取りと書き込み」権限を持つすべてのファイルのリストを取得するにはどうすればよいですか?
たとえば、Macデスクトップに移動して「A」ファイルを右クリックし、「情報のインポート」をクリックし、下部に「popo」などのカスタムユーザーを追加できる「共有と権限」があります。次に、ファイルを「読み書きする」ことができることを指定します。
次に、コマンドラインを使用してPOPOが読み書きできるすべてのファイルとそのファイルのみをインポートしたいと思います(上記の例では「A」をインポートしたい)。
現在、私のすべての研究は次の結果をもたらします。
find /Users/Me/Desktop -user popo -perm 777
しかし、私は何も得られませんでした..
上記にはどのような問題がfind
あり、どのように対処する必要がありますか?
答え1
誰でも読み書きできるファイル、ユーザーのuidで読み書きできるファイル、ユーザーが属するすべてのグループから読み書きできるファイルを検索する必要があります。しかし、現実はそれよりも複雑です。指摘したとおりここ作成者: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とGNU findutilsを使用してfind
Debian Linuxシステムでこれをテストしました。id
Macの実装はfind
異なる場合があります。現在テストできるMacはありません。異なる場合は、Macのマニュアルページでid
and find
-Macに合わせて変更する必要がある項目は、andオプションおよび-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'
バラよりほぼ同じ質問に対する回答権限確認がしばしば機能しない理由