파일의 그룹 권한을 검사하는 방법


9

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

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

  1. 또한 휴대용이어야합니다.
  2. test -w <file 그룹 쓰기 가능 여부는 알려주지 않습니다.
  3. 출력은 ls -ld인간에게는 좋지만 스크립트에 대해서는 확실하지 않습니다. 기술적으로 drwxrwxr-x그룹 비트를 추출하는 것과 같은 출력을 구문 분석 할 수는 있지만 부서지기 쉬운 것 같습니다.
  4. 의 인터페이스 stat는 OS X과 다른 시스템간에 완전히 호환되지 않습니다.
  5. find <file> -perm ... 아마도 대답이 될 수 없습니까?

그룹 권한 비트를 확인해야합니까, 아니면 특정 그룹에 쓰기 권한이 있는지 확인해야합니까? 그룹 (또는 사용자)은 ACL을 통해 쓰기 권한을 가질 수 있습니다.
Gilles 'SO- 악마 그만해

그룹 권한 비트 만 특정 그룹이 관련이 없습니다.
mislav

답변:


8

방법 # 1-통계

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

$ 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]."

OSX와 BSD 위해 당신은이 양식을 사용 할 것 stat, stat -f(혹은 stat -x), 그에 따라 구문 분석합니다. 옵션 stat이 다르므로이 명령을 명령으로 감싸서 lsb_release -aOS에 따라 적절한 버전을 호출 할 수 있습니다. 이상적이지 않지만 실행 가능합니다. 그 실현 lsb_release입니다 리눅스 배포판에서만 사용할 수 있도록 다른 대안은 다른 유닉스 운영체제를 테스트하기 위해 고안 될 필요가있을 것이다.

방법 # 2-찾기

나는이 명령이 당신에게 더 잘 도움이 될 것이라고 생각합니다. 내가 사용하게 find하고 printf스위치를.

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

방법 # 3-Perl

Perl은 다루려는 OS에 따라 더 이식성이 좋은 방법 일 수 있습니다.

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

참고 : 위는 stat()파일 시스템 비트를 쿼리하기 위해 Perl의 기능을 사용합니다.

array을 사용하지 않고 직접 @pv출력을 처리 하여 이보다 컴팩트하게 만들 수 있습니다 stat().

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

그의 요점 4를 놓쳤다 고 생각합니다. stat명령은 시스템마다 크게 다르며 이식성이 없습니다.
jordanm

@jordanm-고마워 대안을 찾고있었습니다. 나는 find . -printf그것을 할 수 있다고 생각 하지만 OSX에서 찾을 수 있는지 확인할 수는 없습니다.
slm

1
POSIX2008 안내서에서도 참조 할 수 없으므로 동의하는 경향이 있습니다. 다른 방법이 확실하지 않습니다. 여기에 총알을 물고 어떤 OS를 감지하고 approp을 호출해야한다고 생각합니다. 명령이 최선의 방법 인 것 같습니다.
slm

1
표준 쉘 유틸리티를 사용하는 방법을 생각할 수 없었습니다. 그래서 제 대답은 펄을 사용합니다.
jordanm

1
@ Jordanm-좋은 마음. 나는 너무 펄 솔루션을 작업하고 있었다 8)
slm

1

하나의 옵션은 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

stat perldocperl 에서 비슷한 예제를 찾을 수 있습니다 .


1

나는 ls파싱했다.

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

@ slm의 광범위한 답변에 감사하지만 다른 방법은 간단하지 않습니다. 이 stat방법은 OS X를 다루기 위해 적어도 두 개의 다른 호출을 작성해야하며 그 후에도 여전히 산술을 적용 해야하는 8 진 표현을 반환합니다. Perl 방법은 괜찮지 만 간단한 작업을 위해 인터프리터를 시작해야하며 posix 유틸리티 만 사용하여 간단하게 유지하고 싶습니다.


2
POSIX뿐만 ​​아니라 bash를 사용하고 있습니다. POSIX :perms=$(ls -ld -- "$1"); perms=${perms%% *}; case $perms in ?????w????) …
Gilles 'SO- 악의를 멈춰라'

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

모든 표준 유닉스 / 리눅스 도구.

그룹 쓰기는 가능하지만 그룹 읽기는 불가능하다고 가정합니다. 이 경우, 사례 진술 2 | 3 | 6 | 7) 또는 grep '[2 | 3 | 6 | 7]'이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.