Unterschied zwischen dem Löschen von Ordnern mit sudo oder als Root

Unterschied zwischen dem Löschen von Ordnern mit sudo oder als Root

Heute ist mir ein interessanter Unterschied aufgefallen, ob ein Befehl mit „sudo“ oder als Root ausgeführt wird.

Mit sudo rm -rf /opt/nextcloud/*werden keine Ordner gelöscht

vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud  nextcloud-16.0.4

Wenn ich zuerst root werde und dann den Befehl ausführe, werden die Ordner gelöscht

vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~# 

Warum ist das so? Wie lösche ich die Ordner richtig mit sudo?

Antwort1

Der Befehl sudo rm -rf /opt/nextcloud/*wird von der Shell interpretiert, die als Ihr normaler Benutzer ausgeführt wird. Die Shell versucht, den Befehl zu erweitern, *bevor sudosie überhaupt ausgeführt wird. Wenn dies aus irgendeinem Grund *nicht möglich ist, lautet der Befehl:

  • entweder sudo rm -rf /opt/nextcloud/*wobei sudo(und dann rm) /opt/nextcloud/*wörtlich mit dem Literalwert genommen wird *und keine weitere Erweiterung erfolgt; das ist POSIX-Verhalten; /opt/nextcloud/*existiert offensichtlich nicht.
  • oder sudo rm -rfunter bestimmten Umständen (z. B. in Bash, wenn die nullglobOption gesetzt ist).

Es gibt andere Möglichkeiten (z. B. Vergleichen failglobin Bash), aber sie scheinen nicht auf Ihren Fall zuzutreffen.

In jedem Fall wird die -fOption rmrelevant. Es bedeutet

-f
Fordern Sie nicht zur Bestätigung auf. Schreiben Sie keine Diagnosemeldungen und ändern Sie den Beendigungsstatus nicht, wenn keine Dateioperanden vorhanden sind oder wenn Operanden nicht existieren. […]

(Quelle)

Tatsächlich haben Sie einen „Operanden angegeben, der nicht existiert“ oder „keine Dateioperanden“, sodass der Befehl nichts bewirkte und ohne Rückmeldung erfolgreich ausgeführt wurde.


Meine Hypothese ist, dass die Shell ohne erhöhte Rechte nicht erweitert werden konnte, /opt/nextcloud/*weil der normale Benutzer keine Leseberechtigung für hat /opt/nextcloud/. Eine andere Möglichkeit ist, dass Sie einen Tippfehler gemacht haben /opt/nextcloud/*und dies nicht bemerkt haben, weil keine Fehlermeldung angezeigt wurde. Es gab keine Fehlermeldung, weil es so rm -ffunktioniert.

sudo ls /opt/nextcloud/erfordert keine Erweiterung durch die Shell. Der Befehl wird lsals Root ausgeführt. Der lsselbst hatte Zugriff auf das angegebene Verzeichnis und dessen Inhalt, daher funktionierte er.

Nachdem sudo su -Sie sich in einer Shell als Root befanden. Diese Shell konnte erweitert werden und funktionierte /opt/nextcloud/*daher rm -rf /opt/nextcloud/*wie erwartet.

verwandte Informationen