Ignorar sudo en script bash

9

Tengo un pequeño script bash:

#!/bin/bash

touch dummy.txt

Si ejecuto este script con sudo, creará el dummy.txtque estará protegido por la raíz .

Lo que quiero hacer es:

Independientemente de si este script se ejecuta con sudoun usuario normal o no, el archivo nodummy.txt debe estar protegido por root.

Anónimo
fuente
44
Independientemente de lo que quiera decir con "protección de raíz", puede usar chowny chmoden su secuencia de comandos para establecer la propiedad y los permisos que desee.
fkraiem
1
No está claro qué quiere decir con "protegido por root". ¿Quiere decir que solo el usuario raíz puede leer / escribir (por ejemplo, los permisos de archivo están configurados en algo así como 700), o que el usuario raíz es el propietario del archivo?
1
@DoritoStyle perdón por la confusión. Por root protegido , quise decir que el usuario root es el propietario del archivo.
Anónimo

Respuestas:

22

Se podría probar si el script se ejecuta mediante sudoel uso de los EUIDy SUDO_USERlas variables, y luego ejecutar touchcomo SUDO_USERsi es verdad - algo así como

#!/bin/bash

if [[ $EUID -eq 0 ]] && [[ -n $SUDO_USER ]]; then
  sudo -u "$SUDO_USER" touch dummy.txt
else
  touch dummy.txt
fi
conductor de acero
fuente
2
Tenga en cuenta que se ==utiliza para la comparación de cadenas. Como $EUIDse supone que devuelve un valor entero, le recomiendo que use la -edcomparación. Se permiten espacios en los nombres de usuario , por lo que probablemente cite la $SUDO_USERvariable. De lo contrario, buena respuesta: esto es algo que personalmente usaría.
Sergiy Kolodyazhnyy
@steeldriver esto es lo que estaba buscando. ¡¡Gracias!!
Anónimo
1
Puede hacer que el script se vuelva a ejecutar solo sudo -usi detecta que se está ejecutando como root. El OP habló sobre tener múltiples comandos en un script. Pero tenga cuidado para evitar un bucle infinito en los errores.
Peter Cordes
1
No hay división de palabras dentro de [[...]]lo que no es estrictamente necesario citar la variable dentro de la declaración si gues @Serg y yo -edera un error tipográfico para-eq
Arronical
@Arronical sí, ese fue un error tipográfico -eq. No sabía [[que no tiene división de palabras. Gracias. Personalmente, todavía citaría por el bien de los buenos hábitos de scripting
Sergiy Kolodyazhnyy,
9

Si su script no debe ejecutarse como root, la forma más segura de resolver el problema es abortar la ejecución del script desde el principio:

if [ "$EUID" = 0 ]; then
   echo "This script must NOT be run as root" 
   exit 1
fi

Opcionalmente, puede volver a ejecutar su script como usuario alternativo (por ejemplo sudo -u FALLBACK_USER "$0") en lugar de simplemente abortar.

Intentar corregir las peculiaridades de los comandos individuales hará que su script sea innecesariamente complejo y difícil de depurar. Cada vez que lo modifique, tendrá que hacer todas las pruebas dos veces (como usuario habitual, luego como root) y corregir todos los rooterrores relacionados que surjan. No es una solución a prueba de futuro, por así decirlo.

Dmitry Grigoryev
fuente
6

De forma predeterminada, los archivos creados con root root tienen permisos como este:

-rw-r--r-- 1 root root 0 11 17 23:25 rootfile.txt

Aquí el archivo pertenece al usuario raíz y al grupo raíz, y puede leerse y escribirse desde la raíz, pero solo otros pueden leerlo.

El enfoque más simple sería volver al chownarchivo al usuario original.

chown username:group_name dummy.txt

Puede usar una $SUDO_USERvariable a la que solo se puede acceder cuando sudose llama, de esta manera:

chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Si está ejecutando el script como usuario normal, la chownparte no es necesaria en absoluto, por lo que es posible que desee considerar el uso de la instrucción if o la &&prueba para probar el caso cuando el script se ejecuta como raíz y hacer algo en este sentido:

#!/bin/bash
touch dummy.txt
[ $UID -eq 0 ] && chown "$SUDO_USER":"$SUDO_USER" dummy.txt

Lo anterior es un enfoque recomendado. Hay otros, como usar chmodpara cambiar los permisos de lectura-escritura-ejecución para usuarios y grupos, pero no se recomienda.

Sergiy Kolodyazhnyy
fuente
gracias por su respuesta. Pero en QI acabo de explicar un escenario simple en el caso real, el script original creará muchos archivos. En Linux, ¿no podemos simplemente ignorar sudo?
Anónimo
1
@Anónimo si está ejecutando todo el script con sudo, entonces no, no puede ignorarlo. Su opción es ejecutar el script como usuario normal (que no entiendo por qué no lo hace, ya que simplemente está creando un archivo para su usuario aquí) o cambiar la propiedad del archivo como lo muestro en mi respuesta.
Sergiy Kolodyazhnyy
Esta es la solución más correcta y no debería ser tan difícil de escalar.
pollitos