Wyzwanie Kernighana i Pike'a: jak wstawić slash w nazwie pliku?


23

Właśnie spotkałem następujące pytanie w Unix Programming Environment , klasycznej książce Kernighana i Pike'a na temat Uniksa (znalazłem poniższy tekst na s. 79 wydania z 1984 roku, ISBN: 0-13-937699-2):

Ćwiczenie 3-6. (Podchwytliwe pytanie) Jak uzyskać / w nazwie pliku (tzn., Że / nie rozdziela składników ścieżki?

Pracuję z Linuksem od lat, zarówno jako użytkownik końcowy, jak i programista, ale nie mogę odpowiedzieć na to pytanie. Nie ma sposobu na umieszczanie ukośników w nazwach plików, jest to absolutnie zabronione przez jądro. Możesz załatać system plików poprzez dostęp do urządzenia blokowego lub użyć podobnie wyglądających znaków z Unicode, ale to nie są rozwiązania.

Rozumiem, że Linux ≠ Unix, ale ta sama zasada powinna mieć zastosowanie, ponieważ system musi być w stanie jednoznacznie wyodrębnić hierarchię katalogów ze ścieżek.

Czy ktoś wie, o czym dokładnie myśleli Kernighan i Pike, zadając te pytania? Jaka była rzekoma odpowiedź? Czym dokładnie jest „sztuczka”? A może oryginalny system uniksowy może po prostu uciec przed tym cięciem?

UPD:

Skontaktowałem się z Brianem Kernighanem w sprawie pytania i on odpowiedział:

Odpowiedź brzmi (lub była) „Nie możesz”.

Dlatego Timothy Martin miał rację i dostał zielonego tik.


3
Powiązany (nie duplikowany), przypadek, w którym ktoś faktycznie nim zarządzał: Jak usunąć plik o nazwie „filen / ame” (z ukośnikiem) w systemie plików ext4 w debugfs?
Michael Homer


Hmm Być może mógłbyś utworzyć plik zawierający małe litery ai zmusić swój system do myślenia, że ​​system plików znajduje się w ustawieniach regionalnych EBCDIC? ASCII ato 0x61, co odpowiada /w EBCDIC (strona kodowa 37)
Fox

Czy sama książka mówi, że to podchwytliwe pytanie? Jeśli tak, to uważam, że w przybliżeniu potwierdza to, że nie będziesz w stanie znaleźć sposobu, aby to zrobić, pozostawiając gotowe pomysły, które już powiedziałeś.
ilkkachu 19.04.17

Odpowiedzi:


12

Być może odpowiedź jest taka sama jak część odpowiedzi w tym podstępnym pytaniu:
Jak schodzisz ze słonia? Ty nie. Dostajesz go od gęsi.

Z „The Practice of Programming” Briana W. Kernighana i Roba Pike'a, Ch. 6, str. 158:

Kiedy Steve Bourne pisał swoją powłokę uniksową (która stała się znana jako powłoka Bourne'a), stworzył katalog 254 plików z jednoznakowymi nazwami, po jednym dla każdej wartości bajtu oprócz „\ 0” i ukośnika, dwóch znaków, które nie może pojawić się w nazwach plików Uniksa.


3
Dziękuję za nauczenie mnie tego żartu. Prawdopodobnie może służyć jako test biegłości w języku angielskim (którego właśnie nie zdałem).
firegurafiku,

Miałeś rację. Zobacz UPD.
firegurafiku,

1
@firegurafiku wyjaśnić żart .
Izaak

5

Zrobiłem to. Było to w systemie UNIX działającym na PDP-11 około 1980 roku. Utworzyłem plik o nazwie „WhatXNow?”. Następnie użyłem „edytora” pliku binarnego do edycji urządzenia dyskowego i zmiany „X” na „/” w i-węzle (z odmontowanym systemem plików).

Ofiara nigdy nie wymyśliła, jak ją usunąć.

Edycja: ups, Barmar ma rację, nie widziałem tam linii o nie łataniu urządzenia. I tak, to był katalog, który edytowałem, a nie i-węzeł. Minęło trochę czasu :-)


1
Nazwy plików nie znajdują się w i-węźle, są w specjalnym pliku katalogu.
Barmar 19.04.17

1
Podejrzewam fsck, że usunąłbym to.
Barmar 19.04.17

1
Pytanie mówi, że możesz załatać swój system plików poprzez blokowanie dostępu do urządzenia lub użyć podobnie wyglądających znaków z Unicode, ale to nie są rozwiązania. Czy nie to opisujesz w swojej odpowiedzi?
Barmar 19.04.17

@Barmar: Hmm, może zastanawiam się nad tym i łatanie systemu plików jest rozwiązaniem, które miało na celu? Nie wiem
firegurafiku,

Założę się, że to była odpowiedź. Pamiętam, kiedy mogłeś czytać katalogi. Może przed wiekami root mógł je napisać.
Joshua

1

Każdy scenariusz, w którym /(a dokładniej bajt - nie znak - o wartości 0x2f; prawie wszystkie jądra uniksowe są celowo nieświadome kodowania znaków) trafia do pozycji katalogu, bez ręcznego manipulowania surowymi blokami dysku, jest niewątpliwie błąd w jądrze.

Takie błędy zdarzają się od czasu do czasu. Jednym z przypadków, dla których pamiętam informacje o łatce, jest to, że niektóre iteracje z lat 90. XX wieku… Chcę powiedzieć, że Solaris, ale to może być błąd… oferował serwer dla protokołu AppleTalk Filing Protocol (AFP), który był klasycznym odpowiednikiem NFS dla MacOS . Kłopot polegał na tym, że w klasycznym MacOSie możesz idealnie umieścić /komponent pathname; :zamiast tego jest separator katalogów . Serwer AFP miał robić moralny ekwiwalent tr :/ /:przy mapowaniu ścieżek przesłanych przez klientów do plików na jego dysku, ale pominęli kilka ścieżek kodu, a ponieważ serwer został zaimplementowany w jądrze, mógł faktycznie wypisać złe wpisy katalogu.

(Patrz comp.unix FAQ # 2.2 , podsekcja rozpoczynająca się od „Co jeśli nazwa pliku zawiera„ / ”?), Dla dłuższej wersji powyższego.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.