POSIX 호환 시스템에서 계속 액세스할 수 있는 동안 ls -a에서 파일/디렉토리를 어떻게 숨길 수 있습니까?

POSIX 호환 시스템에서 계속 액세스할 수 있는 동안 ls -a에서 파일/디렉토리를 어떻게 숨길 수 있습니까?

예를 들어, FreeBSD 및 ZoL의 ZFS에는 각 zpool 마운트 지점 내에 디렉토리를 표시 하는 .zfs데 사용할 수 있는 매직 디렉토리가 있습니다 .zfs set snapdir=visible.zfs

제가 궁금한 점은 이 설정이 '숨김'으로 설정되어 있으면dir이 실제로 .zfs출력에서 ​​숨겨진 방법ls -a아니면 여전히 액세스할 수 있는 동안 쉘 경로가 자동 완성됩니까(여전히 cd액세스하거나 호출 할 수 있음 stat)?

나는 어떤 것이 존재하고 접근 가능하다면 그것은 나열되어야 한다고 생각하기 때문에 이 사실에 대해 머리를 감쌀 수 없습니다. ls -a비록 그것이 단지 마법적/가상적일지라도 말입니다.

누군가 이것이 어떻게 작동하는지 설명할 수 있습니까? ls -a액세스 가능한 동안 디렉토리를 숨기는 POSIX 호환 방법이 있습니까 ? 어떻게 하나요?

답변1

이를 수행하는 방법은 간단합니다. ls라는 이름의 시스템 호출(또는 Linux에서는 libc 함수) 목록을 가져옵니다 readdir. 디렉토리 변경은 대부분의 다른 파일 작업과 마찬가지로 별도의 시스템 호출을 통해 이루어집니다 chdir.stat

간단히 말해서 "이 디렉터리에 무엇이 있습니까?"와 "이 디렉터리에 액세스하세요"는 완전히 독립적인 커널 요청이므로 프로그래밍 방식으로 서로 다른 방식으로 작동할 수 있습니다.

따라서 에 나타나지 않는 디렉토리를 생성하려면 ls -a커널에 의 결과에서 이를 무시하도록 요청하면 됩니다 readdir. 그러나 chdir이것은 다른 시스템 호출이기 때문에 여전히 작동합니다.

이는 권한이 있는 디렉토리를 갖는 것과 다르지 않습니다 +x.아니요 -rcd: 그 안에 있는 파일과 디렉터리에 접근하고, 입력하는 등의 작업을 할 수 있지만 ls실패합니다. 나는 다른 것들이 이 배열을 사용한다고 믿습니다 . 예를 들어(이것은 모호한 메모리에서 나온 것이므로 찾아볼 필요가 없습니다) AFS에는 일종의 전역 이름 공간이 있으며 "이름을 입력"하여 모든 AFS 서버에 연결할 /afs수 있습니다 . 전 세계 모든 서버가 표시 되지 않습니다 . FUSE 파일 시스템이 비슷한 작업을 수행하는 것을 본 적이 있습니다(예: 익명 FTP 서버에 연결).cdls/afscd

(zfs의 배열이 POSIX를 엄격하게 준수하는지 확실하지 않습니다.)

관련 정보