유닉스 프로그래밍 환경 에서 Kernighan과 Pike의 유닉스 고전 책에서 다음과 같은 질문 을 받았습니다 (1984 년 판 79 : ISBN : 0-13-937699-2에서 아래 텍스트를 찾았습니다).
운동 3-6. (트릭 질문) /를 파일 이름으로 가져 오는 방법 (예 : 경로의 구성 요소를 분리하지 않는 /)?
나는 최종 사용자와 프로그래머 모두 리눅스와 함께 일해 왔지만이 질문에 대답 할 수는 없다. 파일 이름에 슬래시를 넣을 방법 이 없으며 커널에서 절대로 금지되어 있습니다. 블록 장치 액세스를 통해 파일 시스템을 패치하거나 유니 코드에서 비슷한 모양의 문자를 사용할 수는 있지만 해결책은 아닙니다.
나는 리눅스 ≠ Unix라는 것을 이해하지만, 시스템은 경로에서 디렉토리 계층을 명확하게 추출 할 수 있어야하므로 동일한 원칙이 적용되어야한다.
이 질문을 할 때 Kernighan과 Pike가 정확히 무엇을 생각했는지 아는 사람이 있습니까? 예상되는 답변은 무엇입니까? ‘트릭’은 정확히 무엇입니까? 아니면 오리지널 유닉스 시스템이 단순히이 슬래시를 피할 수 있었을까요?
UPD :
나는 질문에 대해 Brian Kernighan에게 연락했고 그것이 그가 대답 한 것입니다.
대답은 “그렇지 않다”였습니다.
따라서 티모시 마틴은 옳았 고 녹색 진드기를 얻었습니다.
답변
아마도 답은이 속임수 질문에 대한 답의 일부와 동일
할 것입니다 : 코끼리를 어떻게 내릴까요? 당신은하지 않습니다. 거위에서 가져옵니다.
Brian W. Kernighan과 Rob Pike의 “프로그래밍 실습”, Ch. 6, pg. 158 :
Steve Bourne은 자신의 Unix 쉘 (Bourne 쉘로 알려짐)을 작성할 때 ‘\ 0’과 슬래시를 제외한 각 바이트 값당 하나의 문자 이름으로 254 개의 파일 디렉토리를 만들었습니다. Unix 파일 이름에는 나타나지 않습니다.
답변
나는 이것을했다. 이것은 1980 년경 PDP-11에서 실행되는 UNIX 시스템에있었습니다. “WhatXNow?”라는 파일을 만들었습니다. 그런 다음 바이너리 파일 “editor”를 사용하여 디스크 장치를 편집하고 inode에서 “X”를 “/”(파일 시스템이 마운트 해제 된 상태)로 변경했습니다.
피해자는 그것을 제거하는 방법을 찾지 못했습니다.
편집 : 으악, Barmar가 옳습니다. 장치를 패치하지 않는 것에 대한 줄을 보지 못했습니다. 그리고 네, 내가 편집 한 디렉토리가 아니라 inode입니다. 오랜만이야 🙂
답변
/
(더 정확하게는 0x2f 값을 가진 문자가 아닌 바이트-거의 모든 유닉스 커널이 의도적으로 문자 인코딩을 잊어 버린) 모든 시나리오 는 원시 디스크 블록을 손으로 조작하지 않고 디렉토리 항목으로 들어가는 길을 의심 할 여지가 없습니다. 커널의 버그.
이러한 버그는 때때로 발생합니다. 필자가 패치 노트를 읽은 것을 기억하고있는 한 가지 사례는 1990 년대 경에 반복 된 솔라리스에 대해 말하고 싶지만 틀렸을 수도있다. AFP (AppleTalk Filing Protocol)에 대한 서버를 제공했다. . 문제는 클래식 MacOS /
에서는 경로 이름 구성 요소 를 완벽하게 넣을 수 있다는 것 입니다. :
대신 디렉토리 구분자가 있습니다. AFP 통신 서버는 한 가정 의 도덕적 동등 할 tr :/ /:
그 디스크에있는 파일에 클라이언트에 의해 제출 된 경로 이름을 매핑 할 때,하지만 그들은 몇 가지 코드 경로를 놓친, 서버가 커널 내부에 구현 되었기 때문에, 실제로 나쁜 디렉토리 항목을 작성할 수 있습니다.
위의 더 긴 버전에 대해서는 “파일 이름에 ‘/’가 있으면 어떻게됩니까?”하위 섹션 인 comp.unix FAQ # 2.2를 참조하십시오 .