읽기 권한만 있는 디렉터리의 파일에 대해 테스트 -e가 실패하는 이유는 무엇입니까?

읽기 권한만 있는 디렉터리의 파일에 대해 테스트 -e가 실패하는 이유는 무엇입니까?

디렉토리 읽기 권한에 대해 제가 이해한 바에 따르면 디렉토리의 파일만 나열될 뿐 그 이상은 허용되지 않습니다.

다음 이 소유한 0744 권한이 있는 디렉토리가 제공됩니다 userA.

[userA@localhost ~]$ mkdir -m 0744 /tmp/semi-secret
[userA@localhost ~]$ ls -ld /tmp/semi-secret/
drwxr--r--. 2 userA userA 6 Aug 29 10:15 /tmp/semi-secret/
[userA@localhost tmp]$ touch semi-secret/foobar.txt
[userA@localhost tmp]$ chmod 0600 semi-secret/foobar.txt

userB에, 파일의 존재는 명령을 통해 알 수 있습니다 .foobar.txtls

[userB@localhost ~]$ ls -l /tmp/semi-secret/
ls: cannot access /tmp/semi-secret/foobar.txt: Permission denied
total 0
-????????? ? ? ? ?            ? foobar.txt

그런데 test -e명령이 0이 아닌 상태로 종료되는 이유는 무엇입니까? ! 유일한 작업은 파일이 존재하는지와 디렉터리 권한이 이를 허용하는지 확인하는 것입니다.

[userB@localhost ~]$ test -e /tmp/semi-secret/foobar.txt || echo "The file doesn't exist."
The file doesn't exist.

답변1

권한 비트가 없는 디렉터리의 파일에서는 stat(2)시스템 호출 도 작동할 수 없으므로 이러한 디렉터리에서는 시스템 호출을 기반으로 하는 모든 작업이 실패합니다.xstat(2)

디렉터리에 해당 r비트가 설정되어 있으면 실제로 해당 디렉터리의 내용을 읽을 수 있지만 파일 은 readdir()읽을 수 없습니다 .statopen

x반대로, 이 비트가 설정된 디렉터리를 사용하면 문제의 파일 이름을 알고 있지만 문제의 디렉터리 내용을 검색할 수 없는 경우 파일을 검색할 수 있습니다 stat(2).openreaddir()

test -e파일이 존재하지 않는 경우(심볼릭 링크 확인 후에도 적용됨) 0이 아닌 상태로 종료됩니다.기존의심볼릭 링크존재하지 않는또는 접근할 수 없는 파일) 또는 stat(2)관련 파일에 접근하는 동안 오류가 발생했습니다.

답변2

@schily의 좋은 답변을 보완하기 위해 읽기 액세스 권한이 있지만 반드시 특정 디렉토리에 대한 것은 아닌지 확인하는 방법입니다.찾다특정 이름이 포함된 항목에 액세스하려면 해당 디렉터리의 내용을 읽고 파일 이름을 찾습니다.

이를 달성하기 위해 쉘 와일드카드를 사용할 수 있습니다.

set -- /tmp/semi-secret/[f]oobar.txt
if [ "$1" = /tmp/semi-secret/foobar.txt ]; then
  echo exists
fi

를 사용하면 zsh다음 작업도 수행할 수 있습니다.

if ()(($#)) /tmp/semi-secret/foobar.txt(N); then
  echo exists
fi

find지원되는 구현을 통해 -maxdepth:

if find /tmp/semi-secret -mindepth 1 -maxdepth 1 -name foobar.txt -print |
     grep -q '^'; then
  echo exists
fi

솔루션을 제외하고는 zsh임의의 파일 이름에 적응하기가 어렵습니다.

관련 정보