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.
quelle
a
und Ihr System dazu zwingen, sich das Dateisystem in einem EBCDIC-Gebietsschema vorzustellen? ASCIIa
ist 0x61, was/
in EBCDIC (Codepage 37)Antworten:
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
quelle
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 :-)
quelle
fsck
hätte es entfernt.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 zumtr :/ /:
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.)
quelle