파일에 대한 그룹 권한을 확인하는 방법

파일에 대한 그룹 권한을 확인하는 방법

Bash 스크립트에서 파일의 그룹 권한을 확인하고 싶습니다. 특히 파일에 그룹 쓰기 가능 비트가 있는지 확인해야 합니다.

그게 다야. 그렇게 간단합니다. 하지만:

  1. 휴대하기에도 필요했어요.
  2. test -w <file그룹 쓰기 가능 여부는 알려주지 않습니다.
  3. 출력은 ls -ld사람에게는 괜찮아 보이지만 스크립트에 대해서는 확신이 없습니다. 기술적으로는 drwxrwxr-x그룹 비트를 추출하는 등 출력을 구문 분석할 수 있지만 이는 취약해 보입니다.
  4. OS X와 ​​다른 시스템 간의 인터페이스는 stat완전히 호환되지 않습니다.
  5. find <file> -perm ...답이 될 수는 없나요?

답변1

방법 #1 - 통계

stat명령을 사용하여 권한 비트를 얻을 수 있습니다. stat대부분의 Unix(내가 아는 한 AIX가 아닌 OSX, BSD)에서 사용할 수 있습니다. 이것은 내가 찾을 수 있는 OSX와 BSD를 제외한 대부분의 Unix에서 작동합니다.

$ stat -c "%a" <file>

$ ls -l a
-rw-rw-r-- 1 saml saml 155 Oct  6 14:16 afile.txt

다음 명령을 사용하십시오.

$ stat -c "%a" afile.txt
664

그리고 간단한 방법을 사용하여 grep그룹의 권한 모드가 6인지 7인지 확인합니다.

$ stat -c "%a" afile.txt | grep ".[67]."

statOSX 및 BSD의 경우 이 형식 을 사용 하고 stat -f그에 stat -x따라 구문 분석해야 합니다. 옵션이 stat다르기 때문에 이 명령을 하나로 묶어서 lsb_release -a운영 체제에 따라 적절한 버전을 호출할 수 있습니다. 이상적이지는 않지만 가능합니다. lsb_release임을 깨달았다Linux 배포판에만 적용됩니다.그래서다른 옵션다른 Unix 운영 체제를 테스트하기 위해 설계되어야 합니다.

방법 #2 - 찾기

내 생각엔 이 명령이 당신에게 더 도움이 될 것 같아요. 사용 find하고 printf전환합니다.

$ find a -prune -printf '%m\n'
664

방법 #3 - 펄

다루려는 운영 체제에 따라 Perl이 더 이식성이 뛰어난 방법일 수 있습니다.

$ perl -le '@pv=stat("afile.txt"); printf "%04o", $pv[2] & 07777;'
0664

노트:위의 내용은 Perl stat()함수를 사용하여 파일 시스템 비트를 쿼리합니다.

@pv배열을 버리고 출력을 직접 처리하여 더 컴팩트하게 만들 수 있습니다 stat().

$ perl -le 'printf "%04o", (stat("a"))[2] & 07777;'
0664

답변2

나는 결국 ls구문 분석을 마쳤습니다.

is_group_writable() {
  local ls="$(ls -ld "$1")"
  [ "${ls:5:1}" = "w" ]
}

@slm의 광범위한 답변에 감사하지만 다른 방법은 그렇게 간단하지 않습니다. 이 stat방법을 사용하려면 OS X을 다루기 위해 최소한 두 개의 서로 다른 호출을 작성해야 하며, 그런 다음에도 여전히 산술을 적용해야 하는 8진수 표현이 반환됩니다. Perl 접근 방식은 괜찮지만 이러한 간단한 작업을 위해서는 인터프리터를 실행해야 하므로 단순하게 유지하고 posix 유틸리티만 사용하고 싶습니다.

답변3

한 가지 옵션은 를 사용하는 것인데 perl, perl가능한 곳이면 어디든 이식할 수 있습니다. 그것 없이는 유닉스 시스템을 찾기가 어렵습니다. 다음은 이를 쉘 스크립트에 통합하는 방법에 대한 예입니다.

if perl -e 'use Fcntl ":mode"; exit( ((stat("file.txt"))[2] & S_IWGRP) >> 3)'; then
    echo "file is group writable"
else
    echo "file is not group witeable"
fi

유사한 perl예는 다음에서 찾을 수 있습니다.통계 펄독.

답변4

FILE="filename";G=$(stat -c '%a' ${FILE} | cut -c2);
if [ $G -gt 5 ];then   echo "Group write is set on ${FILE}";fi

모든 표준 Unix/Linux 도구.

그룹 글쓰기는 가능하지만 그룹 읽기는 불가능한 것 같아요. 이 경우 사례 설명 2|3|6|7) 또는 grep '[2|3|6|7]'이 됩니다.

관련 정보