파일에 대한 쓰기 액세스를 비침습적으로 테스트하는 방법은 무엇입니까?

파일에 대한 쓰기 액세스를 비침습적으로 테스트하는 방법은 무엇입니까?

쉘 스크립트에서 어떻게 쉽고비침습적으로실제로 파일을 수정하려고 시도하지 않고 파일에 대한 쓰기 액세스를 테스트합니까?

의 출력을 구문 분석할 수 있지만 stat구현과 시간에 따라 통계 출력이 얼마나 다른지는 잘 모르겠지만 실제로는 복잡하고 불안정해 보입니다.

파일 끝에 추가하여 성공하는지 확인할 수 있지만 이는 잠재적으로 위험할 수 있습니다. 두 가지 이유는 다음과 같습니다.

  1. 이제 추가 항목을 제거해야 하며 다른 프로세스가 파일에 쓰는 경우 내 줄이 더 이상 마지막 줄이 아니기 때문에 이는 즉시 중요하지 않게 됩니다.
  2. 파일을 읽는 모든 프로세스에는 해당 파일의 내용에 대한 임의의 요구 사항이 있을 수 있으며, 해당 응용 프로그램이 손상되었을 수도 있습니다.

답변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명령 운영자는 단지 testa를 수행 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 ]

최고다선험적으로.

관련 정보