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.