Zeilenumbrüche in Dateinamen

24

Ich verstehe und akzeptiere die Prämisse, dass defensives 1- Shell-Scripting umsichtig und langfristig nachhaltiger ist.

Viele der hier gestellten Antworten auf Textverarbeitungsfragen folgen diesem Prinzip, indem sie die Antwortmöglichkeiten für unorthodoxe Dateinamen berücksichtigen. Das kann Leerzeichen, Bindestriche und neue Zeilen enthalten.

Wie häufig sind neue Zeilen in Dateinamen? Speziell:

  • Erstellen Anwendungen standardmäßig Dateinamen mit Zeilenumbrüchen?
  • Gibt es Situationen, in denen es wünschenswert wäre, solche Dateinamen zu erstellen?
  • Oder handelt es sich überwiegend um einen Benutzerfehler?

[1] Das heißt, eine möglichst breite Palette von Szenarien und Eventualitäten planen und verwalten ...

Frage inspiriert durch den (eher klagenden) Kommentar zu dieser Frage .

jasonwryan
quelle
4
Die kurze Antwort ist, dass bizarre Dateinamen mit Zeilenumbrüchen und / oder nicht druckbaren Zeichen niemals eine gute Praxis sind, sinnvolle Apps sie nicht erstellen und Sie sie nur dann wirklich sehen, wenn jemand versucht, Ihre Shell-Skripte oder Programme zu brechen, die solche Namen nicht korrekt verarbeiten. Ich lasse andere Leute detailliertere Antworten mit Referenzen und dergleichen geben.
jw013

Antworten:

26

Ich habe noch nie einen Dateinamen mit einem anderen Zeilenumbruch als dem gesehen, der absichtlich erstellt wurde, um Anwendungen zu testen, die Dateinamen manipulieren. Dateinamen mit Zeilenumbrüchen können auftreten, weil:

  • Ein Fehler oder ein Benutzerfehler (z. B. fehlerhaftes Einfügen beim Kopieren) führte zu einem unbeabsichtigten Dateinamen.
  • Einige Dateisystembeschädigungen betrafen einen Dateinamen.
  • Jemand hat absichtlich einen „seltsamen“ Dateinamen erstellt, um eine Sicherheitslücke auszunutzen, in der eine Anwendung den übergebenen Dateinamen mehr vertraut, als sie haben sollte.

POSIX definiert einen Dateinamen als „einen Namen, der aus 1 bis {NAME_MAX} Bytes besteht und zum Benennen einer Datei verwendet wird. Die Zeichen, aus denen der Name besteht, können aus dem Satz aller Zeichenwerte mit Ausnahme des Schrägstrichs und des Nullbytes ausgewählt werden. Die Dateinamen Punkt und Punkt-Punkt besondere Bedeutung haben.“Es gibt keine Garantie, dass jedes Dateisystem akzeptieren‚fremde‘Dateinamen (die nur garantiert Zeichen sind ASCII - Buchstaben, Ziffern, Periode, Bindestrich und Unterstrich , dh A-Z, a-z, 0-9und ._-, mit Bindestrich in der ersten Position verboten), aber die meisten nativen Dateisysteme auf modernen Unices tun dies.

Gilles 'SO - hör auf böse zu sein'
quelle
Also spacesin Dateinamen sind nicht garantiert portabel? Es wäre hilfreich, wenn Sie klarstellen würden, dass es sich um die letzten drei Zeichen handelt period, underscore, and hyphen. Mit dem unterstrichenen Link ist es schwer zu sagen.
Toxalot
4
@toxalot Nein, es wird nicht garantiert, dass Leerzeichen portabel sind oder ,(von RCS verwendet), :(von X.org verwendet), ~(von vielen Programmen für Sicherungsdateien verwendet),… Aber sie werden von fast allen modernen Systemen unterstützt.
Gilles 'SO - hör auf böse zu sein'
22

Beim Schreiben einer Arbeit sammle ich oft eine Bibliographie von PDF-Dateien aus verschiedenen Quellen. Nicht alle enthalten die richtigen Metadaten. Das bedeutet, dass ich manchmal den Titel des Papiers aus dem PDF-Viewer in den Dateinamen kopiere. Dies führt häufig zu Zeilenumbrüchen innerhalb des Dateinamens, war jedoch noch nie ein Problem mit den von mir verwendeten Tools.

IMHO gibt es nichts "defensives" an der Codierung nach einem Standard. Ein Standard, der besagt, dass Zeilenumbrüche in Dateinamen erlaubt sind. Wenn Ihr Skript nicht alle im Standard zulässigen Dateinamen verarbeitet, ist Ihr Skript fehlerhaft.

sml
quelle
2
Danke für das reale Beispiel; Es unterstreicht Ihren Standpunkt über den Standard ziemlich beredt ...
Jasonwryan
6
+1 für „Wenn Ihr Skript nicht verarbeiten hat Namen aller Datei im Standard erlaubt, dann wird das Skript gebrochen “ (Hervorhebung hinzugefügt)
jw013
3
Hier ist das Argument eines Mannes, warum wir ändern sollten, welche Zeichen in Dateinamen akzeptiert werden, und ich stimme ihm persönlich zu.
Chris Magnuson
⁺¹, ich bin auf diesen Post aus genau demselben Grund gestoßen! Ich versuche nur herauszufinden, wie man einen Befehl zum Konvertieren von Zeilenumbrüchen in Leerzeichen schreibt.
Hi-Angel
2

Ich habe noch nie gesehen, dass NORMALE Benutzer Zeilenumbrüche in Dateinamen verwenden. Es scheint, dass ihr Hauptzweck darin besteht, (1) Angreifern das Untergraben Ihres Systems zu erleichtern und (2) das Schreiben sicherer Programme zu erschweren :-(. Moderne Unix-Systeme (wie Linux) erlauben dies jedoch Sie müssen sich also darauf vorbereiten, wenn Sie ein Programm wollen, das Angriffen widersteht.

"Dateinamen und Pfadnamen in der Shell: So machen Sie es richtig" zeigt, wie Sie damit richtig umgehen.

user45404
quelle
Ich bin ein normaler Benutzer und habe Zeilenumbrüche in meinen Dateinamen. Das in der Antwort von @sml angegebene Szenario ist mir mehr als einmal passiert. Was mich interessiert ist, wie kann eine neue Zeile in einem Dateinamen verwendet werden, um "das System zu untergraben"? Haben Sie Quellen, die das erklären?
Joseph R.
@ JosephR. Ich kann mir keine Möglichkeit vorstellen, ein System zu kompromittieren, aber Sie könnten es als DOS für Anwendungen verwenden, die keine neuen Zeilen verarbeiten (und stattdessen abstürzen)
strugee 22.10.13