Bash 스크립트에서 파일의 그룹 권한을 확인하고 싶습니다. 특히 파일에 그룹 쓰기 가능 비트가 있는지 확인해야 합니다.
그게 다야. 그렇게 간단합니다. 하지만:
- 휴대하기에도 필요했어요.
test -w <file
그룹 쓰기 가능 여부는 알려주지 않습니다.- 출력은
ls -ld
사람에게는 괜찮아 보이지만 스크립트에 대해서는 확신이 없습니다. 기술적으로는drwxrwxr-x
그룹 비트를 추출하는 등 출력을 구문 분석할 수 있지만 이는 취약해 보입니다. - OS X와 다른 시스템 간의 인터페이스는
stat
완전히 호환되지 않습니다. 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]."
stat
OSX 및 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]'이 됩니다.