Dlaczego użytkownicy nigdy nie powinni używać normalnego sudo do uruchamiania aplikacji graficznych?


114

Przeczytałem dokumentację wspólnotową „RootSudo” i jestem zainteresowany tą linią:

Nigdy nie powinieneś używać normalnego sudo do uruchamiania aplikacji graficznych jako root.

Dlaczego? Jaka jest różnica? Proszę podać proste wyjaśnienie, ponieważ jestem zwykłym użytkownikiem pulpitu.



Właściwie ostatnio miałem trudności z instalacją MATLAB-a w / usr / local. Wymagało to uprawnień administratora do zapisu w / usr / local, ale uruchomienie instalatora przy użyciu gksu w jakiś sposób uniemożliwiło uruchomienie zainstalowanego programu jako użytkownik inny niż root. Uruchomienie instalatora za pomocą sudo sprawiło, że wszystko działało dobrze.
Bib-lost

Odpowiedzi:


129

Aplikacje graficzne często przechowują ustawienia i inne dane specyficzne dla użytkownika w plikach konfiguracyjnych zapisanych w folderze domowym użytkownika . Głównym mechanizmem używanym przez aplikacje do określania, czego powinny używać jako folderu domowego użytkownika, jest HOME zmienna środowiskowa . (Możesz to sprawdzić samodzielnie echo $HOME).

Załóżmy, że korzystasz gedit(graficzny edytor tekstu) jako root. Po uruchomieniu sudo gedit, HOMEbędzie w dalszym ciągu wskazują ku swoim katalogu domowym, mimo że program jest uruchomiony jakoroot . W związku z tym geditzapisze pliki konfiguracyjne jakroot w katalogu domowym. To czasami prowadzić w plikach konfiguracyjnych są posiadanych przezroot a więc niedostępne dla ciebie (jeśli później uruchomić program jak siebie samego, a nie root). Dzieje się tak głównie wtedy, gdy aplikacja musi utworzyć nowy plik konfiguracyjny. Nowo utworzone pliki są domyślnie własnością użytkownika, który je tworzy (którym w tym przypadku rootnie jest użytkownik).

To jest główny powód, dla którego powinieneś uruchamiać aplikacje graficzne z graficznym sudofrontendem, a nie z prostym sudo. W Ubuntu i większości jego pochodnych (w tym Xubuntu i Lubuntu) standardową graficzną nakładką jest gksu/gksudo . W Kubuntu tak jest kdesudo. (Zależy to od używanego środowiska pulpitu ).

Jeśli chceszsudo bezpośrednio używać aplikacji graficznej gedit, możesz uruchomić:

sudo -H gedit

-HFlag sprawia sudozestaw HOMEaby wskazywał root„s folderu domowego (co jest /root).

To wciąż nie obsłuży automatycznie własności .Xauthoritypoprzez skopiowanie go do folderu tymczasowego (to sudokolejna rzecz, którą zajmują się tobą nakładki graficzne ). Ale w rzadkich przypadkach, które .Xauthoritysą niedostępne, pojawi się błąd, mówiąc, że tak jest, a następnie możesz naprawić problem, usuwając go ( sudo rm ~/.Xauthority), ponieważ jest on automatycznie regenerowany. Zatem ochrona .Xauthoritywłasności i uprawnień jest mniej ważna niż ochrona własności i uprawnień plików konfiguracyjnych.

W przeciwieństwie do root-owned .Xauthority, gdy pliki konfiguracyjne stać własnością jako root, że nie zawsze jest tak oczywiste, na czym polega problem (ponieważ programy graficzne często biegać, ale nie działa bardzo dobrze, a wyjście żadnych użytecznych błędy konsoli). Czasami jest to większy problem do rozwiązania, zwłaszcza jeśli znajdujesz się w sytuacji, gdy chcesz, aby jeden lub więcej plików w katalogu domowym było własnością kogoś innego niż Ty (ponieważ wtedy nie możesz tego naprawić po prostu rekurencyjnie, chownzapisując wszystkie swoje pliki powrót do siebie).

Dlatego sudo(przynajmniej bez -H) nie należy używać do uruchamiania aplikacji graficznej, chyba że dobrze znasz wewnętrzne działanie aplikacji i masz pewność, że nigdy nie próbuje ona pisać żadnych plików konfiguracyjnych.


Czy mogę ponownie stać się właścicielem wszystkich plików konfiguracyjnych (lub dowolnych plików) w moim katalogu domowym, jeśli plik ten był własnością root?
Nur

@Nur Zakładając, że w twoim katalogu domowym nie ma żadnych plików, które chciałbyś posiadać każdy inny użytkownik lub które chcesz mieć inne członkostwo w grupie (do udostępniania) , możesz uruchomić: sudo chmod -R $USER:$USER ~Niestety, te kryteria nie zawsze mają zastosowanie. Jeśli masz jakieś pliki, w których musisz zachować właściciela grupy, możesz uruchomić sudo chmod -R $USER ~. To zwykle wystarcza. (Jeśli masz pliki, które muszą być własnością innego użytkownika w twoim katalogu domowym, nawet to będzie stanowić problem).
Eliah Kagan

1
@EliahKagan Czy chmodfaktycznie to robi? Zawsze myślałem, że to właśnie chownto zrobiło. chmodnigdy mi tego nie zrobił.
Wyatt8740,

2
@ Wyatt8740 Zdecydowanie powinienem napisać chownzamiast chmodw moich komentarzach powyżej. Przepraszam za to - i dziękuję za zwrócenie na to uwagi!
Eliah Kagan

2
@TheQuark W sudo -H echo $HOMETwój shell - działa jak ty, nie jako root - wykonuje ekspansję parametru na $HOME, uzyskanie ścieżkę swoim katalogu domowym, a następnie przechodzi do, że sudo, który z kolei przekazuje już rozszerzoną wartość echo, która drukuje go. sudo -H printenv HOME, sudo -H bash -c 'echo $HOME'i sudo -H sh -c 'echo $HOME'wszystkie drukowane /root. Jest to koncepcyjnie podobne - choć za pomocą innego mechanizmu - do sposobu, w jaki x=a echo "$x"nie drukuje a(chyba że ma xjuż wartość a).
Eliah Kagan


5

Alternatywą gksu nautilusi gksu geditjest użycie nautilus-admindodatku. Pozwala przeglądać pliki i katalogi za pomocą Nautilus, a następnie otwierać je jako root (Administrator).

Instalacja jest prosta:

sudo apt install nautilus-admin

Teraz, gdy jesteś w nautilusie, będziesz mieć dodatkową opcję edycji jako administrator:

nautilus admin.gif


gedit ponieważ root nie zezwala na preferencje

Podczas uruchamiania geditjako root nie możesz używać preferencji, które ustawiłeś jako zwykły użytkownik dla tabulatorów, konwertowania tabulatorów na spacje, nazwę czcionki, rozmiar czcionki, zawijanie wiersza itp.

Aby rozwiązać ten problem, napisałem skrypt sgeditdo dziedziczenia preferencji użytkownika i zastosowania ich do katalogu głównego: Jak mogę zsynchronizować mój katalog główny z preferencjami mojego użytkownika?

  • Zadzwoń za pomocą sgedit filename1 filename2 ...
  • Pobiera ustawienia gedit użytkownika dla tabulatorów, czcionek, zawijania linii itp.
  • Podnosi się, sudo -Haby zachować własność pliku, jednocześnie uzyskując uprawnienia roota.
  • Żąda hasła, jeśli sudoupłynął limit czasu ostatniego .
  • Pobiera ustawienia gedit sudo
  • Porównuje różnice między ustawieniami użytkownika i sudo gedit
  • Uruchamia zestawy ustawień tylko dla różnic (redukuje 174 zestawów poleceń do kilkunastu lub mniej. Następnym razem jest uruchamiane może tylko jedna lub dwie zmiany, ale często nie ma zmian.
  • Połączenia geditjako zadanie w tle, dzięki czemu monit terminalu natychmiast się pojawia.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.