Warum sollten Benutzer niemals normales sudo verwenden, um grafische Anwendungen zu starten?


114

Ich habe die Dokumentation zur Community "RootSudo" gelesen und interessiere mich für diese Zeile:

Sie sollten niemals normales sudo verwenden, um grafische Anwendungen als Root zu starten.

Warum? Was ist der Unterschied? Bitte geben Sie eine einfache Erklärung, da ich nur ein normaler Desktop-Benutzer bin.



Tatsächlich hatte ich kürzlich Schwierigkeiten, MATLAB unter / usr / local zu installieren. Dies erforderte Root-Rechte, um nach / usr / local zu schreiben, aber das Ausführen des Installationsprogramms mit gksu machte es irgendwie unmöglich, das installierte Programm als Nicht-Root auszuführen. Wenn Sie das Installationsprogramm mit sudo ausführen, funktioniert alles einwandfrei.
Bib-lost

Antworten:


129

Grafische Anwendungen speichern häufig Einstellungen und andere benutzerspezifischen Daten in Konfigurationsdateien innerhalb des Benutzers geschrieben Home - Ordner . Der Hauptmechanismus, mit dem Anwendungen bestimmen, was sie als Basisordner des Benutzers verwenden sollen, ist die HOME Umgebungsvariable . (Sie können es selbst mit inspizieren echo $HOME).

Angenommen, Sie verwenden gedit(einen grafischen Texteditor) als root. Wenn Sie ausführen sudo gedit, HOMEwird weiterhin auf Ihr Basisverzeichnis verwiesen, obwohl das Programm als ausgeführt wirdroot . Folglich geditwerden Konfigurationsdateien wieroot in Ihr Home-Verzeichnis geschrieben. Dies führt manchmal in den Konfigurationsdateien werden im Besitz vonroot und somit unzugänglich Sie (wenn Sie das Programm später als selbst betreiben und nicht wie root). Dies geschieht hauptsächlich, wenn die Anwendung eine neue Konfigurationsdatei erstellen muss. Neu erstellte Dateien gehören standardmäßig dem Benutzer, der sie erstellt (in diesem Fall rootnicht Ihnen).

Dies ist der Hauptgrund, warum Sie grafische Anwendungen eher mit einem grafischen sudoFrontend als mit Straight ausführen sollten sudo. In Ubuntu und den meisten Derivaten (einschließlich Xubuntu und Lubuntu) ist das grafische Standard-Frontend gksu/gksudo . In Kubuntu ist es kdesudo. (Dies hängt von der verwendeten Desktop-Umgebung ab .)

Wenn Sie möchten , verwenden Sie sudodirekt eine grafische Anwendung wie zu laufen gedit, können Sie ausführen:

sudo -H gedit

Das -HFlag wird so sudogesetzt HOME, dass es auf rootden Home-Ordner (der ist /root) verweist .

Das wird immer noch nicht automatisch den Besitz von handhaben, .Xauthorityindem es in einen temporären Ordner kopiert wird (dies ist die andere Sache, die grafische sudoFrontends für Sie erledigen ). In dem seltenen Fall, auf den nicht .Xauthorityzugegriffen werden kann, wird jedoch eine Fehlermeldung angezeigt. Anschließend können Sie das Problem beheben, indem Sie es löschen ( sudo rm ~/.Xauthority), da es automatisch neu generiert wird. Daher ist der Schutz .Xauthorityder Eigentumsrechte und Berechtigungen weniger wichtig als der Schutz der Eigentumsrechte und Berechtigungen von Konfigurationsdateien.

Im Gegensatz zu a- rootowned .Xauthorityist rootdas Problem nicht immer so offensichtlich , wenn Konfigurationsdateien als besessen werden (da grafische Programme häufig ausgeführt werden, aber nicht sehr gut funktionieren und nützliche Fehler auf der Konsole ausgeben). Und es ist manchmal ein größerer Aufwand, dies zu beheben, insbesondere wenn Sie möchten, dass eine oder mehrere Dateien in Ihrem Home-Verzeichnis einem anderen Eigentümer gehören (da Sie es dann nicht einfach durch rekursives chownDurchführen aller Ihrer Dateien beheben können) zurück zu dir selbst).

Daher sollte sudo(zumindest ohne -H) keine grafische Anwendung ausgeführt werden, es sei denn, Sie sind mit der Funktionsweise der App bestens vertraut und wissen, dass sie niemals versucht, Konfigurationsdateien zu schreiben.


Kann ich wieder Eigentümer aller Konfigurationsdateien (oder aller Dateien) in meinem Ausgangsverzeichnis werden, wenn diese Dateien root gehören?
Nur

@Nur Vorausgesetzt, es gibt keine Dateien in Ihrem Home-Verzeichnis, deren Eigentümer ein anderer Benutzer sein soll, oder die Sie einer anderen Gruppenmitgliedschaft (zum Teilen) hinzufügen möchten , können Sie Folgendes ausführen: Leider gelten diese Kriterien nicht immer. Wenn Sie Dateien haben, in denen der Gruppeneigentümer erhalten bleiben soll, können Sie sie ausführen . Dies ist normalerweise ausreichend. (Wenn Sie Dateien haben, die einem anderen Benutzer in Ihrem Home-Verzeichnis gehören müssen, wird auch das ein Problem sein.)sudo chmod -R $USER:$USER ~sudo chmod -R $USER ~
Eliah Kagan

1
@EliahKagan Tut es chmodeigentlich? Ich dachte immer, dass es das war chown. chmodhabe es nie für mich getan.
Wyatt8740,

2
@ Wyatt8740 hätte ich auf jeden fall schreiben sollen chownanstatt chmodin meinen kommentaren oben. Tut mir leid - und vielen Dank für diesen Hinweis!
Eliah Kagan

2
@TheQuark In sudo -H echo $HOMEführt Ihre Shell, die als Sie und nicht als Root ausgeführt wird, eine Parametererweiterung durch $HOME, ermittelt den Pfad Ihres Basisverzeichnisses und übergibt diesen an sudo, der wiederum den bereits erweiterten Wert an übergibt echound ihn ausgibt. sudo -H printenv HOME, sudo -H bash -c 'echo $HOME'und sudo -H sh -c 'echo $HOME'alle drucken /root. Dies ist konzeptionell ähnlich - allerdings durch einen anderen Mechanismus - wie x=a echo "$x"nicht gedruckt wird a(es sei denn, xder Wert war bereits vorhanden a).
Eliah Kagan


5

Eine Alternative zu gksu nautilusund gksu geditist die Verwendung eines nautilus-adminAdd-Ons. Es ermöglicht Ihnen, Dateien und Verzeichnisse mit Nautilus zu durchsuchen und sie dann als root (Administrator) zu öffnen.

Die Installation ist einfach:

sudo apt install nautilus-admin

Wenn Sie sich jetzt in Nautilus befinden, haben Sie eine zusätzliche Option zum Bearbeiten als Administrator:

nautilus admin.gif


gedit als root erlaubt keine Einstellungen

Wenn Sie geditals Root ausgeführt werden, können Sie die von Ihnen als normaler Benutzer festgelegten Einstellungen für Tabstopps, Konvertieren von Tabstopps in Leerzeichen, Schriftname, Schriftgröße, Zeilenumbruch usw. nicht verwenden.

Um dies zu lösen, habe ich das Skript geschrieben sgedit, um die Benutzereinstellungen zu erben und sie auf root anzuwenden: Wie kann ich mein root-gedit mit den Einstellungen meines Benutzers gedit synchronisieren?

  • Mit anrufen sgedit filename1 filename2 ...
  • Ruft die gedit-Einstellungen des Benutzers für Tabulatoren, Schriftarten, Zeilenumbruch usw. ab.
  • Erhöht, sudo -Hum den Dateieigentum zu erhalten und gleichzeitig Root- Rechte zu erhalten.
  • Fordert das Passwort an, wenn die letzte Zeit sudoabgelaufen ist.
  • Ruft die gedit-Einstellungen von sudo ab
  • Vergleicht die Unterschiede zwischen Benutzer- und Sudo Gedit-Einstellungen
  • Führt gsettings nur für die Unterschiede aus (reduziert 174 festgelegte Befehle auf ein Dutzend oder weniger. Beim nächsten Mal werden möglicherweise nur ein oder zwei Änderungen ausgeführt, häufig jedoch keine.
  • Ruft geditals Hintergrundaufgabe auf, sodass die Eingabeaufforderung des Terminals sofort wieder angezeigt wird.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.