'/'에 '..'항목이있는 이유는 무엇입니까?


81

이것은 항상 나를 당혹스럽게 만들었다. 루트 디렉토리에 상위 디렉토리에 대한 참조가 포함되는 이유는 무엇입니까?

bob @ bob : / $ ls -a
. 빌드 홈 lib32 mnt .rpmdb sys vmlinuz
.. cdrom initrd.img lib64 opt sbin tmp vmlinuz.old
bin dev initrd.img.old 로스트 + 발견 proc selinux usr
부팅 등 lib 미디어 루트 srv var

파일 시스템에서 디렉토리를 관리하는 방법을 이해합니다. 각 디렉토리에는 자체에 대한 n + 2 포인터가 있습니다 (n = 디렉토리 내부의 하위 디렉토리 수). 각 직계 서브 디렉토리 당 하나, 상위 디렉토리 및 하나.

그러나 /부모는 무엇입니까?

답변:


73

/..가리킴 /:

$ ls -id /
2 /
$ ls -id /..
2 /..

둘 다 동일한 inode 번호를 가지며이 시스템에서 2가됩니다. (정확한 값은 중요하지 않습니다.)

일관성을 유지합니다. 이런 식으로 커널 ..에서 경로를 처리 할 때 현재 위치를 확인하기 위해 커널에 코드가 없어도됩니다 . 당신은 cd ..영원히 말할 수 있고 뿌리보다 더 깊이 가지 않습니다.


20
@George 나는 상대 경로를 이용하는 익스플로잇이 그것을 사용한다고 믿는다. 현재 폴더를 추측 할 필요는 없습니다.../../../../../../../../../../../../../../../../etc/passwd
Michael Mrozek

21
단순히 / etc / passwd를 사용하면 어떤 차이점이 있습니까?
jlliagre

9
@jlliagre :로 시작하는지 테스트하여 파일이 현재 디렉토리에 있는지 확인하는 프로그램이 있습니다 /. ../(처음에는 아니야!)와 심볼릭 링크 사이 에서, 특히 공격자가 프로그램의 코 아래에서 디렉토리를 이동할 수 있다는 점을 고려하면 매우 어렵습니다.
Gilles

4
나는 적어도 canonicalize_file_name 또는 realpath를 사용해야한다는 것을 알았습니다.
jlliagre

5
@musiphil : 좋은 일입니다. Michael은 코드가 악용에 대응하도록 작성되지 않은 경우 악의적 인 목적으로 악용 될 수있는 기능이라고 지적했습니다. 악용 될 수있는 모든 기능을 제거하면 컴퓨터가 매우 어둡습니다.
Warren Young

38

유닉스가 보증하기 때문에 모든 디렉토리에는 두 개의 항목이 있으며, .그 자체 ..는 부모를 나타냅니다.

현재 네임 스페이스의 루트 디렉토리는 특별합니다. 즉 ..,와 동일 .하지만 OS가 프로그램에 보장 한 것을 깨뜨리는 것은 그리 특별하지 않습니다. 계약이 깨지면 상황이 잘못되고 모든 사람이 손가락을 가리 킵니다.

표시되는 루트 디렉토리는 디스크의 파일 시스템에서 실제로 다른 상위 디렉토리를 가질 수 있습니다. 마운트 된 네임 스페이스에 제공된 파일 시스템의보기는에 대한 .. = .규칙을 적용합니다 /. 당신이에 있다면 그래서 chroot()감옥, 당신은 볼 /.. = /을보고 감옥 외부의 누군가가더라도 /path/to/jail/..볼 수 있습니다 /path/to대신.


1
은 "계약"에 얼마나 많은 프로그램에 따라 /..자신에게 그 점을? 나는 그것을 위해 (또는 그 이상) 동등하게 허용되었을 수 있다고 생각 /해야하는 없습니다 ...
musiphil December

누구 든지이 이론을 확인하는 출처가 있습니까?
Julian Hollmann

1
글쎄, man 5 dirBSD 시스템에서는 문서화 된 API를 안내 할 것이며 API에 명시된 항목은 계약의 일부입니다.
Phil P

1
find에는 n + 2 계약에 의존하는 최적화 기능이 있습니다.
ctrl-alt-delor

2
물론 소스 를 원한다면 사양을 읽으십시오. 4.12 절의 pubs.opengroup.org/onlinepubs/9699919799에 있는 POSIX : "특수 파일 이름 도트는 선행 작업에서 지정한 디렉토리를 참조해야합니다. 특수 파일 이름 도트 도트는 이전 디렉토리의 상위 디렉토리를 참조해야합니다. 루트 디렉토리에서 dot-dot는 루트 디렉토리 자체를 나타낼 수 있습니다. "
Phil P
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.