특정 사용자에게 "읽기 및 쓰기" 권한이 있는 모든 파일 목록을 얻으려면 어떻게 해야 합니까?
예를 들어, 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 \)
이 스크립트는 루트로 실행되어야 합니다. 다른 사용자에게는 popo가 볼 수 있는 모든 디렉토리를 보는 데 필요한 권한이 없을 수도 있습니다.
id
참고: 저는 최신 버전의 GNU Coreutils 및 GNU findutils를 사용하여 find
Debian Linux 시스템에서 이것을 테스트했습니다 . id
Mac 구현은 find
다를 수 있습니다. 현재 테스트할 수 있는 Mac이 없습니다. 서로 다른 경우 Mac 매뉴얼 페이지에서 id
and find
- Mac에 맞게 수정해야 할 수 있는 항목은 -G
and -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'
바라보다거의 같은 질문에 대한 답변권한 확인이 종종 작동하지 않는 이유