
쉘 스크립트에서 어떻게 쉽고비침습적으로실제로 파일을 수정하려고 시도하지 않고 파일에 대한 쓰기 액세스를 테스트합니까?
의 출력을 구문 분석할 수 있지만 stat
구현과 시간에 따라 통계 출력이 얼마나 다른지는 잘 모르겠지만 실제로는 복잡하고 불안정해 보입니다.
파일 끝에 추가하여 성공하는지 확인할 수 있지만 이는 잠재적으로 위험할 수 있습니다. 두 가지 이유는 다음과 같습니다.
- 이제 추가 항목을 제거해야 하며 다른 프로세스가 파일에 쓰는 경우 내 줄이 더 이상 마지막 줄이 아니기 때문에 이는 즉시 중요하지 않게 됩니다.
- 파일을 읽는 모든 프로세스에는 해당 파일의 내용에 대한 임의의 요구 사항이 있을 수 있으며, 해당 응용 프로그램이 손상되었을 수도 있습니다.
답변1
그냥 - w
플래그를 사용하세요.test
유틸리티:
[ -w /path/to/file ] && echo "writeable" || echo "write permission denied"
나중에 파일에 쓰려고 해도 파일에 쓰지 못할 수도 있다는 점에 유의하세요. 파일이 이동되었거나 권한이 변경되었을 수 있습니다.-w
쓰기 권한을 감지하지만 다른 요인이 개입하여 파일을 쓸 수 없도록 만듭니다..
답변2
또 다른 접근법:
if >> /path/to/file
then
echo "writeable"
else
echo "write permission denied"
fi
그러면 추가할 파일을 열려고 시도하고, 성공하면 달리다명령 없음(즉,null 명령을 실행) 파일로 출력됩니다.
존재하지 않는 경우 빈 파일이 생성된다는 점에 유의하세요.
-w
명령 운영자는 단지 test
a를 수행 stat
한 다음 사용자에게 액세스 권한이 있어야 하는지 여부를 파악하려고 시도할 수 있습니다. 위의 대안은 test
일부 특별한 조건에서 접근 방식보다 더 안정적입니다. 왜냐하면 액세스 확인이 셸이 아닌 커널에 의해 수행되도록 강제하기 때문입니다. 예를 들어,
- 파일이 Unix가 아닌 파일 시스템에 있는 경우 – 특히 Unix가 아닌 파일 서버에서 원격으로 마운트된 경우 –
stat
잘못된 모드 값을 반환할 수 있기 때문입니다. - 파일이 읽기 전용으로 마운트된 파일 시스템에 있는 경우.
- 파일에 ACL이 있고 모드에서 액세스 권한이 있어야 하는 것처럼 보이지만 ACL이 이를 거부하거나 그 반대의 경우입니다.
- 일부 보안 프레임워크(AppArmor, SELinux 등)가 파일에 대한 액세스를 거부하는 경우.
답변3
G-man이 옳았어: [ -w ]
그렇지 않을 거야언제나진실을 말하십시오. 존재하지 않는 파일에 대처하기 위해 여기에허가가 거부되었습니다쉘의 메시지:
( [ -e /path/to/file ] && >> /path/to/file ) 2> /dev/null &&
echo writable ||
echo not writable
업데이트: 좀 무서운 것 같지 않나요? 글쎄요. 흠... 표현 방법... 예상대로 작동하도록 요청하는 조건에 있다는 것을 완벽하게 알지 않는 한 이것을 사용하지 마십시오. Stephane의 의견을 참조하세요.
그러면 어떤 결론을 내려야 할까요? 비록 [ -w ]
진실을 말하지 않더라도 명령은 단 하나이다.예정된일을 하기 위해. 만약 그렇지 않다면, 우리는 그것을 비난하고 버그 보고서를 작성하고 미래에는 작동할 것입니다. 작동 및 사용 조건을 더 잘 확인하십시오 [ -w ]
. 특별한 경우를 위한 특별한 코드를 작성하세요. 해결 방법에는 고유한 조건이 있습니다.
[ -w /path/to/file ]
최고다선험적으로.