Entfernen Sie Dateien aus einem Root-eigenen Verzeichnis mithilfe von Sudo mit Platzhaltern

3270
ffxsam

Nehmen wir an, ich habe einen Ordner, /var/log/nginxder geschützt ist (im Besitz von root, und niemand sonst kann darin lesen oder schreiben). Selbst mit Sudo kann ich nicht auf sudo rm -f /var/log/nginx/ab*"Keine solche Datei oder Verzeichnis" zugreifen. Muss ich dazu tatsächlich eine Root-Shell laden, oder gibt es einen anderen Weg?

2

2 Antworten auf die Frage

6
Anthony Geoghegan

Ursache

Die Shell interpretiert und erweitert alle Glob-Zeichen (Platzhalter), z. B. das Sternchen. Diese Interpretation des Befehls geschieht in der aktuellen Shell (bevor der sudoBefehl ausgeführt wird), die keine Leseberechtigung für das Verzeichnis hat. Da die aktuelle Shell keine Dateien finden kann, die dem Glob-Muster entsprechen, wird die Erweiterung des Pfadnamens nicht ausgeführt, und die Shell rmwird -f(und /var/log/nginx/ab*mit einem literalen Stern) als Argumente für den sudoBefehl übergeben.

Der sudoBefehl startet wiederum den rmBefehl, mit dem versucht wird, eine Datei mit einem Pfad von /var/log/nginx/ab*(ein Sternchen ist ein zulässiges Zeichen für einen Unix-Dateinamen) zu entfernen . Da eine solche Datei nicht existiert, meldet sie den Fehler. Bei GNU rmist diese Fehlermeldung explizit. Die vollständige Fehlermeldung zeigt an, dass die zu entfernende (einzelne) Datei nicht vorhanden ist:

rm: cannot remove `/var/log/nginx/ab*': No such file or directory 

Lösung

Die Lösung besteht darin, eine neue Shell als Superuser mit den erforderlichen Berechtigungen zum Durchführen der Dateinamenerweiterung zu starten:

sudo bash -c "rm -f /var/log/nginx/ab*" 

Der obige Befehl startet eine neue Shell, die als root ausgeführt wird, und die -cOption wird verwendet, um den von der Shell auszuführenden Befehl zu übergeben. Da der Befehl in Anführungszeichen gesetzt ist, wird das Sternchen von der aktuellen Shell nicht interpretiert und unverändert an die neue Root-Shell übergeben, sodass die Pfadnamen vor dem Starten des rmBefehls erweitert werden können.

1
kenorb

Es ist entweder ein Problem mit Ihren Dateinamen oder möglichen Leerzeichen in ihren Dateinamen.

Versuchen Sie also die folgenden Problemumgehungen:

  1. Versuchen Sie --, das Ende der Optionen anzuzeigen, zB:

    sudo rm -vf -- /var/log/nginx/ab* 
  2. Verwenden find:

    sudo find /var/log/nginx -name "ab*" -print -delete 
  3. Wenn Sie der Meinung sind, dass Ihre Dateien unter Linux geschützt sind, entfernen Sie zuerst den Schutz:

    chattr -i ab* 
Hallo. Ich habe das gerade angehoben, da der Befehl 'find' eine gute Antwort ist. Das "-" in der ersten Problemumgehung bedeutet jedoch das Ende der Optionen (was nützlich ist, wenn Dateinamen mit einem "-" beginnen), aber es hilft nicht bei dem Problem, dass die eigene Shell des Benutzers versucht, das Glob-Muster zu erweitern ( wie in meiner Antwort erklärt). Anthony Geoghegan vor 8 Jahren 0