Seit wann löschen die POSIX und GNU nicht mehr /?

23

Seit einigen Jahren wird das GNU- rmDienstprogramm nur gelöscht, /wenn es mit der --no-preserve-rootOption aufgerufen wird . Das Kommando rm -rf /ist jedoch schon seit langer Zeit im kollektiven Unterbewusstsein als gefährlich eingestuft und wird immer noch häufig als "beängstigendes" Kommando bezeichnet.

Ich habe mich gefragt, wann diese Regel, rmdie nicht gelöscht werden kann, zum /ersten Mal angezeigt wurde . Ich habe die POSIX-Spezifikationen überprüft und kann feststellen, dass POSIX: 2008 diese Sicherheitsfunktion enthält, POSIX: 2001 jedoch nicht. Da die Online-Versionen der POSIX-Spezifikationen von Zeit zu Zeit mit jeder neuen Unterversion aktualisiert werden, habe ich auch die Wayback-Maschine überprüft und die entsprechende Seite von POSIX: 2008 aus dem Jahr 2010 gefunden und konnte bestätigen, dass die Regel rmnicht entfernt werden kann /war damals schon gelistet.

Meine Fragen lauten also:

  • Wann wurde die Regel, rmdie nicht entfernt werden kann, /zu den POSIX-Spezifikationen hinzugefügt? War es in der ursprünglichen Ausgabe 2008 der Single UNIX Specification Version 4 oder wurde es in einer Revision hinzugefügt?
  • Wann wurde diese Einschränkung zu GNU hinzugefügt rm? Ich bin mir ziemlich sicher, dass es war, bevor es zu POSIX hinzugefügt wurde, aber wann ist es passiert?
terdon
quelle
1
Siehe auch: Austin Group Interpretation # 019 (2003), in der die Änderung beschrieben (aber nicht implementiert) wurde.
Michael Homer
4
09.11.2003 git.savannah.gnu.org/gitweb/…
ilkkachu

Antworten:

28

Die HTML-Version aller Ausgaben von POSIX 2008 finden Sie online:

Das wurde in der Ausgabe 2008 hinzugefügt.

Technische Berichtigungen fügen im Allgemeinen keine neuen Funktionen hinzu.

In der vorherigen Version ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) war dieser Text nicht enthalten.

Der neue Text wurde auf der austin group conference 2003-05-09 zur Aufnahme in eine spätere Überarbeitung des Standards angenommen.

Es wurde im März desselben Jahres von John Beck von Sun Microsystems angefordert (Link erfordert Opengroup-Registrierung, siehe auch Enhancement Request Nr. 5 hier ).

John Beck schrieb am 11. März 2003:

@ page 820 line 31681-31683 section rm comment {JTB-1}

Problem:

Defect code :  3. Clarification required

An occasional user mistake, with devastating consequences, is to
write a shell script with a line such as:
      rm -rf $VARIABLE1/$VARIABLE2
or
      rm -rf /$VARIABLE1
without verifying that either variable is set, which can lead to
      rm -rf /
being the resulting command.  Since there is no plausible
circumstance under which this is the desired behavior, it seems
reasonable to disallow this.  Such a safeguard would, however,
violate the current specification.

Action:

Either extend the exceptions for . and .. on the noted lines
to list / as well, or specify that the behavior of rm if an
operand resolves to / is undefined.

GNU rmhinzugefügt --preserve-rootund --no-preserve-rootOptionen in diesem Commit vom 09.11.2003, wurden jedoch --preserve-rooterst in diesem Commit vom 03.09.2006 zum Standard , also in coreutils 6.2

FreeBSD behält seit dem Commit vom 04.10.2004 einen Schrägstrich bei (mit dem Commit-Protokoll "Finde heraus, wie schwer entflammbar meine Unterwäsche wirklich ist" ), aber zunächst nicht , bis sie sich daran erinnerten, ein Jahrzehnt später zu prüfen, ob POSIX jetzt ist Geben Sie an, zu welchem ​​Zeitpunkt dies auch im POSIX-Modus geschehen ist .POSIXLY_CORRECT

Die anfängliche Zusage von FreeBSD besagt, dass Solaris dies bereits zu diesem Zeitpunkt tat.

@JdePB (im Kommentar unten) stellte fest, dass der Link zu einer Insider-Story von Sun weitere Details zum Solaris-Ursprung untermauert und angibt, dass Solaris die Sicherheitsvorkehrungen bereits getroffen hat, bevor die Anfrage an die Austin-Gruppe gestellt wurde.

Es erklärt die Gründe für das Hinzufügen dieses Ausschlusses. Während man sich nur die Schuld, wenn sie es tun rm -rf /, gibt es einen Fall , in dem ein Skript könnte es tun , wenn dadurch , rm -rf -- "$1/$2"dass ohne Prüfung $1/ $2wurden zur Verfügung gestellt , welche die Sache , die einige Kunden von Sun schlecht getroffen ist , wenn ein Solaris Patch falsche Anwendung (gemäß diesem Link).

Das Verbot der Löschung von .und ..wurde schon lange vorher hinzugefügt , um sich gegen mögliche Pannen abzusichern. rmist immer noch ein gefährlicher Befehl. Es macht, was es tun soll: Entfernen Sie, was Sie ihm sagen.

rm -rf /*
cd /tmp &&  rm -rf .*/   # on some systems where rm -rf ../ still removes
                         # the content of ../ and shells that still
                         # may include . and .. in glob expansions.
rm -rf -- "$diretcory"/* # note the misspelled variable name
dir='foo '; rm -rf $dir/*

Würde auch alles entfernen. Es ist bekannt, dass die Vervollständigung von Shell-Dateinamen solche Probleme verursacht

rm -rf someth<Tab>/*

Erweitert auf:

rm -rf something /*

Denn somethingso geschah es nicht, ein Verzeichnis zu sein.

Shells wie tcshoder zshfügen eine zusätzliche Eingabeaufforderung hinzu, wenn Sie versuchen, rmmit einem *Platzhalter anzurufen ( tcshnicht standardmäßig).

Stéphane Chazelas
quelle
1
Als junge Genossenschaft habe ich versucht, die versteckten Dateien in einem Benutzerverzeichnis auf SunOS w / rm -rf .*von seinem Heimatverzeichnis aus zu löschen . Kurz darauf leuchteten alle Telefonleitungen auf ...
Aaron D. Marasco
Ich wette mit $ rm -rf. * = Rm -rf / auf verschlungene Weise, um dorthin zu gelangen.
Escoce
@GuruAdrian sicher, * bedeutet alles so abgleichen. * = .Dateiname aber auch ../ und damit ../ .. und ../../ .. unendlich, bis Ihnen der Bitraum für den Befehl ausgeht.
Escoce
vielleicht in modernen Muscheln. Das war nicht immer so. Ich habe diese Tiefe der Systemadministration und -entwicklung vor mehr als 15 Jahren verlassen
Escoce