¿Por qué los usuarios nunca deberían usar sudo normal para iniciar aplicaciones gráficas?

114

He leído la documentación de la comunidad "RootSudo" y estoy interesado en esta línea:

Usted debe nunca se use sudo normales para iniciar aplicaciones gráficas como root.

¿Por qué? ¿Cuál es la diferencia? Proporcione una explicación simple, ya que solo soy un usuario de escritorio normal.

Nur
fuente
En realidad, recientemente tuve dificultades para instalar MATLAB en / usr / local. Esto requería privilegios de root para escribir en / usr / local, pero ejecutar el instalador usando gksu de alguna manera hacía imposible ejecutar el programa instalado como no root. Ejecutar el instalador usando sudo hizo que todo funcionara bien.
Babero perdido el

Respuestas:

129

Las aplicaciones gráficas a menudo almacenan configuraciones y otros datos específicos del usuario en archivos de configuración escritos dentro de la carpeta de inicio del usuario . El principal mecanismo que usan las aplicaciones para determinar qué deben usar como carpeta de inicio del usuario es la HOME variable de entorno . (Puede inspeccionarlo usted mismo echo $HOME).

Supongamos que está ejecutando gedit(un editor de texto gráfico) como root. Si ejecuta sudo gedit, HOMEcontinuará apuntando hacia su directorio de inicio, aunque el programa se esté ejecutando comoroot . En consecuencia, geditescribirá los archivos de configuración comoroot en su directorio de inicio. Esto a veces dará como resultado que los archivos de configuración sean de su propiedadroot y, por lo tanto, inaccesibles para usted (cuando luego ejecute el programa como usted mismo y no como root). Esto sucede principalmente cuando la aplicación tiene que crear un nuevo archivo de configuración. Los archivos recién creados, por defecto, son propiedad del usuario que los crea (quien en este caso es rootusted, no usted).

Esa es la razón principal por la que debe ejecutar aplicaciones gráficas con una interfaz sudográfica en lugar de una recta sudo. En Ubuntu y la mayoría de sus derivados (incluidos Xubuntu y Lubuntu), la interfaz gráfica estándar es gksu/gksudo . En Kubuntu lo es kdesudo. (Depende del entorno de escritorio que se use).

Si desea usar sudodirectamente para ejecutar una aplicación gráfica como gedit, puede ejecutar:

sudo -H gedit

El -Hindicador sudoestablece HOMEque apunte a rootla carpeta de inicio de (que es /root).

Eso todavía no manejará automáticamente la propiedad .Xauthoritycopiándola en una carpeta temporal (esto es otra cosa que las interfaces gráficas sudose encargan de usted). Pero en el caso poco frecuente que .Xauthorityes inaccesible, recibirá un error que dice que sí, y luego puede solucionar el problema eliminándolo ( sudo rm ~/.Xauthority), ya que se regenera automáticamente. Por lo tanto, proteger .Xauthorityla propiedad y los permisos es menos importante que proteger la propiedad y los permisos de los archivos de configuración.

A diferencia de una rootparticipada .Xauthority, cuando los archivos de configuración se convierten en propiedad como root, no siempre es tan evidente cuál es el problema (ya que los programas gráficos a menudo se ejecutarán, pero no funciona muy bien, y la salida de los errores útiles a la consola). Y a veces es una molestia más grande solucionarlo, especialmente si se encuentra en una situación en la que desea que uno o más archivos en su directorio principal sean propiedad de otra persona que no sea usted (porque entonces no puede solucionarlo simplemente recursivamente chowntodos sus archivos de vuelta a ti mismo).

Por lo tanto, sudo(al menos sin -H) no debe usarse para ejecutar una aplicación gráfica a menos que esté muy familiarizado con el funcionamiento interno de la aplicación y sepa con certeza que nunca intentará escribir ningún archivo de configuración.

Eliah Kagan
fuente
¿Puedo volver a ser el propietario de todos los archivos de configuración (o cualquier archivo) en mi directorio de inicio, si este archivo ha sido propiedad de root?
Nur
@Nur Suponiendo que no hay archivos en su directorio personal que desee que sea propiedad de otro usuario o que desee tener otra membresía de grupo (para compartir) , puede ejecutar: sudo chmod -R $USER:$USER ~Desafortunadamente, esos criterios no siempre se aplican. Si tiene archivos donde necesita preservar al propietario del grupo, puede ejecutarlos sudo chmod -R $USER ~. Esto suele ser suficiente. (Si tiene archivos, debe ser propiedad de otro usuario en su directorio de inicio, incluso eso será un problema).
Eliah Kagan
1
@EliahKagan ¿ chmodRealmente lo hace? Siempre pensé que fue lo chownque lo hizo. chmodnunca lo hizo por mi
Wyatt8740
2
@ Wyatt8740 Definitivamente debería haber escrito en chownlugar de chmoden mis comentarios anteriores. Lo siento, ¡y gracias por señalar esto!
Eliah Kagan
2
En @TheQuark sudo -H echo $HOME, su shell - funcionando como usted, no como root - realiza la expansión de parámetro en $HOME, obteniendo el camino de su directorio de inicio, a continuación, pasa a que sudo, a su vez, pasa el valor expandido ya a echoque lo imprime. sudo -H printenv HOME, sudo -H bash -c 'echo $HOME'Y sudo -H sh -c 'echo $HOME'todos los de impresión /root. Esto es conceptualmente similar, aunque por un mecanismo diferente, a cómo x=a echo "$x"no se imprime a(a menos que xya tenga el valor a).
Eliah Kagan
5

Una alternativa gksu nautilusy gksu gedites usar un nautilus-admincomplemento. Le permite examinar archivos y directorios con Nautilus y luego abrirlos como root (Administrador).

La instalación es sencilla:

sudo apt install nautilus-admin

Ahora, cuando esté en nautilus, tendrá una opción adicional para Editar como administrador:

nautilus admin.gif


gedit como root no permite preferencias

Cuando se ejecuta geditcomo root, no puede usar las preferencias que ha configurado como usuario habitual para tabulaciones, convertir pestañas en espacios, nombre de fuente, tamaño de fuente, ajuste de línea, etc.

Para resolver esto, he escrito el script sgeditpara heredar las preferencias del usuario y aplicarlas a la raíz: ¿Cómo puedo sincronizar mi root gedit con las preferencias de mi usuario gedit?

  • Llamar usando sgedit filename1 filename2 ...
  • Obtiene la configuración gedit del usuario para tabulaciones, fuentes, ajuste de línea, etc.
  • Se eleva a sudo -Hpara preservar la propiedad del archivo mientras se obtienen poderes de raíz.
  • Solicita contraseña si la última vez sudoha expirado.
  • Obtiene la configuración de gedit de sudo
  • Compara las diferencias entre la configuración de usuario y sudo gedit
  • Ejecuta gsettings establecidos solo en las diferencias (reduce 174 comandos set a una docena o menos. La próxima vez se ejecuta quizás solo uno o dos cambios, pero a menudo no hay cambios.
  • Llamadas geditcomo una tarea en segundo plano, de modo que el indicador de terminal reaparece inmediatamente
WinEunuuchs2Unix
fuente