Perché gli utenti non dovrebbero mai usare il normale sudo per avviare applicazioni grafiche?


114

Ho letto la documentazione della comunità "RootSudo" e sono interessato a questa linea:

Non dovresti mai usare sudo normale per avviare applicazioni grafiche come Root.

Perché? Qual è la differenza? Fornisci una spiegazione semplice, poiché sono solo un normale utente desktop.



In realtà, recentemente ho avuto delle difficoltà a installare MATLAB su / usr / local. Ciò richiedeva i privilegi di root per scrivere su / usr / local, ma l'esecuzione dell'installer usando gksu in qualche modo rendeva impossibile eseguire il programma installato come non root. L'esecuzione del programma di installazione con sudo ha fatto funzionare tutto alla perfezione.
— Bavaglino perso il

Risposte:


129

Le applicazioni grafiche spesso archiviano le impostazioni e altri dati specifici dell'utente in file di configurazione scritti nella cartella principale dell'utente . Il meccanismo principale che le applicazioni usano per determinare cosa dovrebbero usare come cartella home dell'utente è la HOME variabile d'ambiente . (Puoi ispezionarlo da solo echo $HOME).

Supponiamo che tu stia eseguendo gedit(un editor di testo grafico) come root. Se esegui sudo gedit, HOMEcontinuerà a puntare verso la tua home directory, anche se il programma è in esecuzione comeroot . Di conseguenza, geditscriverà i file di configurazione comeroot nella tua home directory. Questo a volte risultare nei file di configurazione di essere posseduti daroot e quindi inaccessibili a voi (quando si esegue il programma in seguito come te stesso e non come root). Ciò accade principalmente quando l'applicazione deve creare un nuovo file di configurazione. I file appena creati, per impostazione predefinita, sono di proprietà dell'utente che li crea (che in questo caso rootnon sei tu).

Questo è il motivo principale per cui dovresti eseguire applicazioni grafiche con un sudofrontend grafico anziché con straight sudo. In Ubuntu e nella maggior parte dei suoi derivati ​​(inclusi Xubuntu e Lubuntu), il frontend grafico standard è gksu/gksudo . In Kubuntu lo è kdesudo. (Dipende dall'ambiente desktop in uso.)

Se si desidera utilizzare sudodirettamente per eseguire un'applicazione grafica come gedit, è possibile eseguire:

sudo -H gedit

Il -Hflag viene sudoimpostato HOMEin modo che punti alla rootcartella home (che è /root).

Che comunque non gestirà automaticamente la proprietà .Xauthoritycopiandola in una cartella temporanea (questa è l'altra cosa di cui sudosi occupano i frontend grafici ). Ma nel caso raro che .Xauthoritysia inaccessibile, riceverai un errore dicendo che lo è, e quindi puoi risolvere il problema eliminandolo ( sudo rm ~/.Xauthority), poiché viene rigenerato automaticamente. Pertanto, proteggere .Xauthorityla proprietà e le autorizzazioni è meno importante della protezione della proprietà e delle autorizzazioni dei file di configurazione.

A differenza di un rootproprietario .Xauthority, quando i file di configurazione diventano di proprietà root, non è sempre così evidente quale sia il problema (perché i programmi grafici spesso vengono eseguiti, ma non funzionano molto bene e generano eventuali errori utili sulla console). Ed a volte è una seccatura più grande da risolvere, specialmente se ti trovi in ​​una situazione in cui vuoi che uno o più file nella tua home directory siano di proprietà di qualcuno diverso da te (perché non puoi ripararlo semplicemente inserendo ricorsivamente chowntutti i tuoi file di nuovo a te stesso).

Pertanto, sudo(almeno senza -H) non dovrebbe essere utilizzato per eseguire un'applicazione grafica a meno che non si abbia una conoscenza approfondita del funzionamento interno dell'app e si sappia per certo che non tenta mai di scrivere alcun file di configurazione.


Posso diventare nuovamente proprietario di tutti i file di configurazione (o di tutti i file) sulla mia directory Home, se questi file sono di proprietà di root?
— Nur

@Nur Supponendo che non ci sono nessun file nella vostra home directory che si desidera essere di proprietà di un altro utente o che si desidera avere qualsiasi altro gruppo di appartenenza (per la condivisione) , è possibile eseguire: sudo chmod -R $USER:$USER ~Purtroppo, tali criteri non si applicano sempre. Se si dispone di file in cui è necessario preservare il proprietario del gruppo, è possibile eseguire sudo chmod -R $USER ~. Questo di solito è sufficiente. (Se hai file devono essere di proprietà di un altro utente nella tua home directory, anche questo sarà un problema.)
— Eliah Kagan

1
@EliahKagan Lo fa chmoddavvero? Ho sempre pensato che fosse chownquello che l'ha fatto. chmodmai fatto per me.
— Wyatt8740,

2
@ Wyatt8740 avrei sicuramente dovuto scrivere chowninvece che chmodnei miei commenti sopra. Mi dispiace per questo - e grazie per averlo sottolineato!
— Eliah Kagan,

2
@TheQuark In sudo -H echo $HOME, la shell - in esecuzione come te, non come root - esegue l'espansione di parametro sul $HOMEottenendo il percorso della vostra home directory, quindi passa a quello sudo, che a sua volta passa il valore già espansa a echo, che lo stampa. sudo -H printenv HOME, sudo -H bash -c 'echo $HOME'e sudo -H sh -c 'echo $HOME'tutte le stampe /root. Questo è concettualmente simile - sebbene con un meccanismo diverso - a come x=a echo "$x"non stampa a(a meno che non abbia xgià avuto il valore a).
— Eliah Kagan,


5

Un'alternativa a gksu nautilused gksu geditè quella di utilizzare nautilus-adminadd-on. Ti permette di sfogliare file e directory con Nautilus e quindi aprirli come root (Amministratore).

L'installazione è semplice:

sudo apt install nautilus-admin

Ora, quando sei in nautilus, avrai un'opzione in più per modificare come amministratore:

nautilus admin.gif


gedit come root non consente le preferenze

Quando esegui geditcome root non puoi utilizzare le preferenze che hai impostato come utente normale per i punti di tabulazione, convertire le schede in spazi, nome del carattere, dimensione del carattere, ritorno a capo, ecc.

Per risolvere questo, ho scritto lo script sgeditper ereditare le preferenze dell'utente e applicarle al root: come posso sincronizzare il mio root gedit con le preferenze del mio utente gedit?

  • Chiama usando sgedit filename1 filename2 ...
  • Ottiene le impostazioni gedit dell'utente per tabulazioni, caratteri, ritorno a capo, ecc.
  • Si eleva per sudo -Hpreservare la proprietà dei file ottenendo i poteri di root.
  • Richiede la password se l'ultimo sudoè scaduto.
  • Ottiene le impostazioni gedit di sudo
  • Confronta le differenze tra le impostazioni utente e sudo gedit
  • Esegue gsettings impostato solo sulle differenze (riduce 174 comandi set a una dozzina o meno. La prossima volta viene eseguito forse solo uno o due cambiamenti ma spesso non cambia nulla.
  • Chiamate geditcome attività in background in modo tale che il prompt del terminale riappaia immediatamente.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.