Kernighan und Pike Challenge: Wie kann ein Dateiname mit einem Schrägstrich versehen werden?

23

Ich bin gerade auf die folgende Frage in Unix Programming Environment gestoßen , dem klassischen Buch von Kernighan und Pike über Unix (ich fand den folgenden Text auf S. 79 der Ausgabe von 1984, ISBN: 0-13-937699-2):

Übung 3-6. (Trickfrage) Wie bekommt man ein / in einen Dateinamen (dh ein /, das keine Bestandteile des Pfades trennt?

Ich arbeite seit Jahren mit Linux, sowohl als Endbenutzer als auch als Programmierer, aber ich kann diese Frage nicht beantworten. Es gibt keine Möglichkeit , Schrägstriche in Dateinamen einzufügen, dies ist vom Kernel absolut verboten. Sie können Ihr Dateisystem über den Zugriff auf Blockgeräte patchen oder ähnlich aussehende Unicode-Zeichen verwenden, dies sind jedoch keine Lösungen.

Ich verstehe, dass Linux ≠ Unix, aber das gleiche Prinzip sollte gelten, da das System in der Lage sein muss, Verzeichnishierarchie eindeutig aus Pfaden zu extrahieren.

Weiß jemand, woran Kernighan und Pike genau dachten, als sie diese Fragen stellten? Was war die angebliche Antwort? Was genau ist der "Trick"? Oder darf sich das originale Unix-System diesem Schrägstrich einfach irgendwie entziehen?

UPD:

Ich habe Brian Kernighan wegen der Frage kontaktiert und er antwortete:

Die Antwort lautet (oder lautete) "Sie können nicht."

Somit hatte Timothy Martin recht und bekommt das grüne Häkchen.

firegurafiku
quelle
3
Verwandte (nicht doppelte), ein Fall, in dem es tatsächlich jemand verwaltet hat: Wie lösche ich eine Datei mit dem Namen "filen / ame" (mit Schrägstrich) auf einem ext4-Dateisystem in debugfs?
Michael Homer
1
Ein weiterer verwandter unix.stackexchange.com/questions/328928/…
Philip Kirkbride
Hmm. Vielleicht könnten Sie eine Datei mit Kleinbuchstaben erstellen aund Ihr System dazu zwingen, sich das Dateisystem in einem EBCDIC-Gebietsschema vorzustellen? ASCII aist 0x61, was /in EBCDIC (Codepage 37)
Fox
Sagt das Buch selbst, dass das eine Trickfrage ist? In diesem Fall wird meiner Meinung nach bestätigt, dass Sie nicht in der Lage sind, eine Möglichkeit zu finden, dies zu tun, ohne die von Ihnen bereits erwähnten Standardideen zu berücksichtigen.
Ilkkachu

Antworten:

12

Vielleicht ist die Antwort dieselbe wie die Antwort in dieser Trickfrage:
Wie kommt man von einem Elefanten herunter? Das tust du nicht. Du bekommst es von einer Gans.

Aus "The Practice of Programming" von Brian W. Kernighan und Rob Pike, Ch. 6, pg. 158

Als Steve Bourne seine Unix-Shell schrieb (die später als Bourne-Shell bezeichnet wurde), erstellte er ein Verzeichnis mit 254 Dateien mit Namen aus einem Zeichen, einer für jeden Bytewert außer '\ 0' und Schrägstrich, den beiden Zeichen, die darf nicht in Unix-Dateinamen vorkommen.

Timothy Martin
quelle
3
Danke, dass du mir diesen Witz beigebracht hast. Es kann wahrscheinlich als Englischtest dienen (was ich gerade nicht bestanden habe).
firegurafiku
Du hattest Recht. Siehe UPD.
firegurafiku
1
@ FireGurafiku erklären Witz .
Isaac
5

Ich habe das getan. Dies war auf einem UNIX-System, das irgendwann um 1980 auf einem PDP-11 lief. Ich erstellte eine Datei mit dem Namen "WhatXNow?". Ich habe dann eine Binärdatei "editor" verwendet, um das Plattengerät zu bearbeiten und das "X" in ein "/" im Inode zu ändern (wobei das Dateisystem nicht gemountet ist).

Das Opfer hat nie herausgefunden, wie es entfernt werden kann.

Edit: whoops, Barmar hat recht, ich konnte die Zeile nicht sehen, in der es darum geht, das Gerät nicht zu patchen. Und ja, es war das von mir bearbeitete Verzeichnis, nicht die Inode. Es ist eine Weile her :-)

Topher Eliot
quelle
1
Dateinamen befinden sich nicht im Inode, sondern in der Verzeichnis-Spezialdatei.
Barmar
1
Ich vermute, fsckhätte es entfernt.
Barmar
1
Die Frage besagt, dass Sie Ihr Dateisystem über den Zugriff auf Blockgeräte patchen oder ähnlich aussehende Unicode-Zeichen verwenden können, dies sind jedoch keine Lösungen. Beschreiben Sie das nicht in Ihrer Antwort?
Barmar
@Barmar: Hmm, vielleicht überdenke ich die Frage und beim Patchen des Dateisystems ist die Lösung gemeint? Ich weiß es nicht.
Firegurafiku
Ich wette das war die Antwort. Ich erinnere mich, wann man Verzeichnisse lesen konnte. Vielleicht konnte root sie schon vor Ewigkeiten schreiben.
Joshua
1

Jedes Szenario, in dem /(genauer gesagt, ein Byte - kein Zeichen - mit dem Wert 0x2f; fast alle Unix-Kernel die Zeichencodierung absichtlich nicht kennen) in einen Verzeichniseintrag gelangt, ohne dass die unformatierten Plattenblöcke von Hand manipuliert wurden, ist fraglos ein Fehler im Kernel.

Solche Bugs kommen von Zeit zu Zeit vor. Ein Fall, für den ich die Patchnotes gelesen habe, ist, dass einige Iterationen aus den 1990er Jahren von… Ich möchte sagen, Solaris, aber das könnte falsch sein… einen Server für das AppleTalk Filing Protocol (AFP) angeboten haben, das klassische MacOS-Äquivalent von NFS . Das Problem war, dass man unter klassischen MacOS durchaus /eine Pfadname-Komponente eingeben darf . Das Verzeichnis-Trennzeichen lautet :stattdessen. Der AFP-Server sollte das moralische Äquivalent zum tr :/ /:Zuordnen von Pfadnamen, die von Clients gesendet wurden, zu Dateien auf seiner Festplatte tun , aber sie haben einige Codepfade übersehen, und da der Server im Kernel implementiert war, konnte er tatsächlich fehlerhafte Verzeichniseinträge ausgeben.

(Siehe comp.unix FAQ # 2.2 , der Unterabschnitt, der mit "Was ist, wenn der Dateiname ein '/' enthält?" Beginnt, für eine längere Version des oben genannten.)

zwol
quelle