x-permission없이 디렉토리의 파일에 액세스합니까?


19

디렉토리에 대한 실행 권한의 의미를 이해하는 데 약간의 어려움이 있습니다. 디렉토리 내의 내용이 사용자에게 특정 권한을 부여하더라도 사용자가 x-rights를 가지고 있지 않은 디렉토리의 내용에 액세스 할 수 없다는 것을 올바르게 이해하고 있습니까?

또는 사용자는 여전히 디렉토리의 내용에 직접 액세스 할 수 있지만 디렉토리의 내용을 간단히 나열 할 수 없습니까?

(실제로 이해하려고하는 것은 디렉토리에 x 권한이없는 다른 사용자의 디렉토리 액세스가 얼마나 안전한지입니다.)

답변:


20

디렉토리의 x 비트는 검색 비트라고도합니다. 실제로 폴더 안에 나열된 파일의 inode에 액세스 할 수 있습니다. 따라서 /home/user/foo/bar.txt에 액세스하려면 bar.txt의 모든 조상에 대한 검색 액세스 권한이 있어야합니다.

페이지에서 인용

디렉토리는 일반 파일과 같은 방식으로 사용되지 않으므로 권한은 약간 (그러나 약간만) 다르게 작동합니다. 디렉토리에있는 파일을 나열하려면 디렉토리에 대한 읽기 권한이 필요하지만 그 안에있는 파일에는 없습니다. 디렉토리에 파일을 추가하거나, 디렉토리에서 파일을 삭제하거나, 파일 이름을 바꾸려면 디렉토리에 대한 쓰기 권한이 필요하지만 파일에 포함되지 않은 파일에 대해서는 쓰기 권한이 필요하지 않습니다. 실행 권한은 디렉토리에 적용되지 않습니다 (디렉토리도 프로그램이 될 수 없음). 그러나 해당 권한 비트는 다른 목적으로 디렉토리에 재사용됩니다.

디렉토리에 CD를 넣으려면 (즉, 일부 디렉토리를 현재 작업 디렉토리로 만들려면) 디렉토리에서 실행 권한이 필요합니다.

디렉토리 내 파일의 inode 정보에 액세스하려면 디렉토리에서 실행이 필요합니다. 디렉토리 내에서 파일의 inode를 읽으려면 디렉토리를 검색해야합니다. 이러한 이유로 디렉토리에 대한 실행 권한을 종종 검색 권한이라고합니다.

많은 일반적인 상황에서 검색 권한이 필요합니다. cat / home / user / foo 명령을 고려하십시오. 이 명령에는 파일 foo에 대한 읽기 권한이 필요합니다. 그러나 /, / home 및 / home / user 디렉토리에 대한 검색 권한이 없으면 cat은 foo의 inode를 찾을 수 없으므로 읽을 수 없습니다! 파일 또는 디렉토리의 inode에 액세스하려면 모든 조상 디렉토리에 대한 검색 권한이 필요하며, inode에 도달 할 수 없으면 파일을 읽을 수 없습니다.

파일 권한 디렉토리 섹션 에서 자세한 내용을 읽으십시오 .

업데이트 : 레오는 매우 좋은 질문을 제기했습니다. inode를 알고 있다면 x 비트가 설정되지 않은 디렉토리에서 파일에 액세스 할 수 있습니까? 나는 그렇게 할 수 없어야한다고 믿는다. 나는 c 프로그램으로 테스트하지 않았지만 편리한 bash 명령을 사용하여 확인했다.

user@user-desktop:~/test$ ls -lart
total 12
drwxr-xr-x 49 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x  3 user user 4096 2011-11-30 22:37 .
drwxr-xr-x  2 user user 4096 2011-11-30 22:38 level1
user@user-desktop:~/test$ ls -lart level1/
total 12
drwxr-xr-x 3 user user 4096 2011-11-30 22:37 ..
drwxr-xr-x 2 user user 4096 2011-11-30 22:38 .
-rw-r--r-- 1 user user    8 2011-11-30 22:38 file1
user@user-desktop:~/test$ stat level1
  File: `level1'
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 808h/2056d  Inode: 95494       Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:46:16.576702105 +0530
Modify: 2011-11-30 22:38:12.386701913 +0530
Change: 2011-11-30 22:46:08.876702102 +0530
user@user-desktop:~/test$ stat level1/file1 
  File: `level1/file1'
  Size: 8           Blocks: 8          IO Block: 4096   regular file
Device: 808h/2056d  Inode: 60775       Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Access: 2011-11-30 22:38:19.846701917 +0530
Modify: 2011-11-30 22:38:16.366701915 +0530
Change: 2011-11-30 22:38:16.366701915 +0530
user@user-desktop:~/test$ chmod -x level1
user@user-desktop:~/test$ stat level1/file1 
stat: cannot stat `level1/file1': Permission denied
user@user-desktop:~/test$ ls -lart level1/
ls: cannot access level1/..: Permission denied
ls: cannot access level1/.: Permission denied
ls: cannot access level1/file1: Permission denied
total 0
-????????? ? ? ? ?                ? file1
d????????? ? ? ? ?                ? ..
d????????? ? ? ? ?                ? .
user@user-desktop:~/test$ cat level1/file1
cat: level1/file1: Permission denied
user@user-desktop:~/test$ find . -inum 95494
./level1
user@user-desktop:~/test$ find . -inum 60775
user@user-desktop:~/test$ find ./level -inum 60775
find: `./level': No such file or directory
user@user-desktop:~/test$ find ./level1 -inum 60775

2
따라서 검색 권한이없는 디렉토리에 파일 / 디렉토리의 inode 번호가 있다면 권한이 허용하는 한 액세스 할 수 있습니까? (stat를 할 수없는 상태에서 inode 번호를 얻는 것은 꽤 어렵다고 생각합니다.)
Leo

@ 레오, 우리는 그렇게 할 수 없어야한다고 믿습니다. 답변을 업데이트했습니다. 작은 C 스터브가 있으면 확인하고 알려주십시오.
Amey Jah

1
@AmeyJah, 사실, 나는 당신이 할 수있는 내기. 권한이있는 다른 디렉토리에 파일을 하드 링크 할 때 어떤 일이 발생하는지 고려하십시오. 동일한 inode이지만 읽을 수 있습니다. 다시 말해, 읽기 권한은 시스템이 inode가 속하는 모든 폴더를 찾고 x 비트가 있는지 확인하는 시스템에 의존하지 않습니다. 그래도 좋은 대답입니다. 고마워
user1477

@AmeyJah ls , stat 등은 stat (2) 등을 사용 합니다. 지금까지 모르는 경우를 대비하여. 나는 C 프로그램을 작성할 수는 있지만 테스트는 프로그램이 보여줄 수있는 모든 것을 수행하지만 요점은 동일합니다. 시스템 호출을 사용합니다 (섹션 2). 라이브러리 호출 (섹션 3)은 syscall보다 높지만 아무 것도 변경하지 않습니다 (예 : remove (3)은 디렉토리에 rmdir (2)를 사용하고 파일에 unlink (2)를 사용함).
Pryftan

5

디렉토리를 요청하기 때문에 다음을 수행하십시오.

읽기 의미 : 내용을 읽습니다 (예 : ls로 나열).

쓰기 수단 : 감독 에게 쓰기. 즉, 파일 또는 하위 디렉토리 생성

실행 수단 : 해당 디렉토리에 입력하십시오.

읽기 및 실행 권한은 디렉토리에 약간 까다로울 수 있습니다.

예를 들어 읽기 권한이 있지만 실행하지 않는 경우 디렉토리의 내용을 나열 할 수는 있지만 삭제할 수는 없습니다. 또한 이름을 알고 있어도 특정 파일이나 디렉토리를 나열 할 수 없습니다.

실행 권한이 있지만 읽을 수없는 경우에는 권한을 삭제하지만 파일을 직접 나열 할 수는 없습니다. 그러나 파일 또는 디렉토리의 이름을 알고 있으면이를 나열 할 수 있습니다.


2
읽기 권한이 있지만 실행하지 않은 경우 디렉토리의 내용을 나열 (ls) 할 수는 있지만 디렉토리의 파일에 액세스 (cat) 할 수는 없습니다. 실행 권한이 있지만 읽을 수없고 파일 이름을 알고 있으면 액세스 할 수 있습니다 (cat).
dash17291

2

디렉토리에 대한 실행 권한은 다음을 의미합니다.

이 디렉토리로 들어가서이 디렉토리의 파일에 액세스 할 수 있습니다.

x디렉토리에 권한 이 없으면 다음을 수행 할 수 없습니다.

  • (예 : 디렉토리에 입력 cd)
  • 이름을 알고 있더라도이 디렉토리의 파일에 액세스 할 수 없습니다.

예:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ cd testdir
bash: cd: testdir: Permission denied

$ cat testdir/a
cat: testdir/a: Permission denied

$ chmod 700 testdir
$ cat testdir/a
Some text.

이 주제에 대한 좋은 소개는 Linux File Permission Confusion pt 2 를 읽으십시오 .

x권한이 막을 수없는 유일한 것은 해당 디렉토리의 파일 이름 에 액세스하는 것 입니다.

예:

$ ls -ld testdir
drw------- 2 xxxxxx xxxxxx 14 2011-11-29 19:38 testdir

$ ls testdir
ls: cannot access testdir/a: Permission denied
ls: cannot access testdir/b: Permission denied
a  b
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.