¿Cómo edito / etc / sudoers desde un script?

116

Necesito editar /etc/sudoersdesde un script para agregar / eliminar cosas de las listas blancas.

Suponiendo que tengo un comando que funcionaría en un archivo normal, ¿cómo podría aplicarlo /etc/sudoers?

¿Puedo copiarlo y modificarlo, luego visudoreemplazar el original con la copia modificada? ¿Proporcionando mi propio guión en $EDITOR?

¿O puedo usar las mismas cerraduras y cp?

La pregunta se trata más de problemas potenciales que de simplemente encontrar algo que funcione.

n-alexander
fuente

Respuestas:

146

Hilo antiguo, pero ¿qué pasa con:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Beckerr
fuente
10
Esta es una respuesta genial. Toda la subcapa debe ejecutarse como root, por ejemplo echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
Simon
3
¡Esta respuesta funciona muy bien! Lo uso para skripts postinst en paquetes debian. ¡Gracias! Dado que esto siempre es root, se vuelve corto y práctico:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen
3
Solo quiero señalar un matiz importante a la respuesta de @ BorisDäppen: la -abandera a EDITOR="tee": agregará una línea al archivo, no solo sobrescribirá la primera línea. No capté la diferencia al principio y no pude encontrar la manera de agregar. Espero poder encontrar algunas personas en algún momento señalando eso directamente ;-)
Jean-Philippe Murray
3
¿Alguien puede explicarme cómo este trabajo me refiero no es el punto y coma requerido después de EDITOR = 'tee -a'? Sé que romperá el comando. EDITOR es una variable de shell y visudo es otro comando, así que aquí estamos pasando EDITOR y visudo en la misma línea de comando. ¿Cómo funciona eso realmente?
Sagar
1
Intenté esto x = "algo" echo $ x. Esto no funcionó para mí.
Sagar
43

Utilice visudo para esto con un editor personalizado. Esto resuelve todas las condiciones de carrera y los problemas de "pirateo" con la solución de Brian.

#!/bin/sh
if [ -z "$1" ]; then
  echo "Starting up visudo with this script as first parameter"
  export EDITOR=$0 && sudo -E visudo
else
  echo "Changing sudoers"
  echo "# Dummy change to sudoers" >> $1
fi

Este script agregará la línea "# Cambio ficticio a sudoers" al final de sudoers. Sin hacks y sin condiciones de carrera.

Versión anotada que explica cómo funciona realmente:

if [ -z "$1" ]; then

  # When you run the script, you will run this block since $1 is empty.

  echo "Starting up visudo with this script as first parameter"

  # We first set this script as the EDITOR and then starts visudo.
  # Visudo will now start and use THIS SCRIPT as its editor
  export EDITOR=$0 && sudo -E visudo
else

  # When visudo starts this script, it will provide the name of the sudoers 
  # file as the first parameter and $1 will be non-empty. Because of that, 
  # visudo will run this block.

  echo "Changing sudoers"

  # We change the sudoers file and then exit  
  echo "# Dummy change to sudoers" >> $1
fi
sstendal
fuente
5
Esto requiere que se haya compilado sudo --enable-env-editor; de lo contrario, solo usará respetar la variable del editor si pertenece a un pequeño conjunto de valores conocidos.
Caleb
Me funciona (Ubuntu 12.04), pero no entiendo cómo funciona. ¿Alguien podría explicar cómo usarlo correctamente y cómo funciona realmente? Gracias
MountainX
Me gustaría señalar que esto no parece funcionar para mí en 12.04 precisa. Creé un script bash, le agregué permisos + x y ejecuté el archivo con la siguiente salida: visudo: no se puede ejecutar / tmp / edit_sudoers: error de formato Exec visudo: /etc/sudoers.tmp sin cambios
Jose Diaz-Gonzalez
Esto funcionó muy bien para mí, aunque simplemente inicié sesión como root y eliminé el sudo -Edel primer comando.
merlin2011
Realmente me gusta esta respuesta, pero no funcionó para mí. Creo que mi sudo no se compiló con la bandera necesaria.
Mnebuerquo
30

Debe realizar sus ediciones en un archivo temporal, luego usar visudo -c -f sudoers.temp para confirmar que los cambios son válidos y luego copiarlo en la parte superior de / etc / sudoers

#!/bin/sh
if [ -f "/etc/sudoers.tmp" ]; then
    exit 1
fi
touch /etc/sudoers.tmp
edit_sudoers /tmp/sudoers.new
visudo -c -f /tmp/sudoers.new
if [ "$?" -eq "0" ]; then
    cp /tmp/sudoers.new /etc/sudoers
fi
rm /etc/sudoers.tmp
Brian C. Lane
fuente
Parece que estás usando sudoers.tmp como un archivo de bloqueo, no estoy seguro de cómo eso confirma que los cambios son válidos. ¿No deberíamos comprobar el estado de salida de visudo para asegurarnos de que no haya errores?
converter42
/etc/sudoers.tmp es el archivo de bloqueo verificado por visudo en modo interactivo. visudo -c -f devuelve un 1 si hubo un error, de ahí la verificación del código de retorno.
Brian C. Lane
Me preocupa usar sudoers.tmp, ya que parece usar la interfaz interna de visudo, es decir, un truco. ¿Es estándar, lo que significa que se garantiza que siempre será sudoers.tmp el que se use como bloqueo? ¿O tienen la libertad de cambiar eso en el futuro?
n-alexander
2
Necesito usar lockfile en lugar de test / touch
n-alexander
2
La página de manual dice que usa /tmp/sudoers.tmp, por lo que actualmente es el estándar. Por supuesto que podría cambiar en el futuro. Y sí, tienes razón, hay una condición de carrera.
Brian C. Lane
18

En Debian y sus derivados, puede insertar un script personalizado en el /etc/sudoers.d/directorio, con derechos 0440; para obtener más información, consulte /etc/sudoers.d/README .

Podría ayudar.

pevik
fuente
Sin embargo, ¿no está comentado?
2
@TomDworzanski: En mi humilde opinión, no. Ver man sudoers (5) y otro comentario .
pevik
¡Tienes razón! Gracias por los enlaces y la gran respuesta.
3
También uso ese directorio en centos 7
Alexander Bird
Creo que esta es la forma correcta de hacerlo.
jansohn
11

Se supone que visudo es la interfaz humana para la edición /etc/sudoers. Puede lograr lo mismo reemplazando el archivo directamente, pero debe tener cuidado con la edición simultánea y la validación de sintaxis. Cuidado con los r--r-----permisos.

ngn
fuente
9

Si sudopermite agregar entradas /etc/sudoers.d, puede usar esta respuesta de @ dragon788:

https://superuser.com/a/1027257/26022

Básicamente, usas visudopara verificar el archivo antes de copiarlo /etc/sudoers.d, para que puedas estar seguro de que no estás rompiendo sudopara nadie.

visudo -c -q -f filename

Esto y el éxito devuelve (0) si es válida, por lo que se puede utilizar con los cheques if, &&y otras operaciones de escritura de Boole. Una vez que lo haya validado, simplemente cópielo /etc/sudoers.dy debería funcionar. Asegúrese de que sea propiedad de root y no pueda ser escrito por otros.

Mnebuerquo
fuente
5

Configure un editor personalizado. Básicamente será un script que acepta el nombre del archivo (en este caso /etc/sudoers.tmp), lo modifica y lo guarda en su lugar. Así que podría escribir en ese archivo. Cuando haya terminado, salga del script y visudo se encargará de modificar el archivo sudoers real por usted.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
Ali Afshar
fuente
¿Estoy en lo cierto de que todo lo que dummy_editor.sh necesita contener es algo como esto? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Parece funcionar para mí.
MountainX
4

Muchas respuestas, he estado trabajando con sudo para yonks pero no tuve la necesidad de automatizar la configuración de instalación hasta ahora. Usé una combinación de algunas de las respuestas anteriores, escribiendo mi línea de configuración en la ubicación de inclusión /etc/sudoers.d para no tener que modificar el archivo principal de sudoers, luego verifiqué ese archivo para ver la sintaxis, ejemplo simple a continuación:

Escriba su línea en un archivo de inclusión de sudoers:

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

Compruebe que el archivo de inclusión de sudoers haya pasado las comprobaciones de sintaxis visual:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
Im-Kirk-Dougla-Cus
fuente
Simplemente omita el asterisco, que no debería estar allí ^^
Sonata
y devuelve éxito (0) - lo tengo
Oleg
2

Solo para agregar una opción adicional a las respuestas anteriores, si la condición de carrera no es una preocupación importante, entonces se puede usar el siguiente comando para evitar copiar manualmente un archivo modificado a /etc/sudoers

sudo EDITOR="cp /tmp/sudoers.new" visudo

Esto asegurará que el nuevo archivo esté validado e instalado correctamente con la actualización de permisos.

Tenga en cuenta que si hay un error en el /tmp/sudoers.newarchivo, se visudole solicitará al usuario que ingrese, por lo que es recomendable verificarlo visudo -c -f /tmp/sudoers.newprimero.

zelanix
fuente
1

Creo que la solución más sencilla es:

Crea un script addudoers.sh

#!/bin/sh

while [ -n "$1" ]; do
    echo "$1    ALL=(ALL:ALL) ALL" >> /etc/sudoers;
    shift # shift all parameters
done

y llámelo con los usuarios que desea agregar como:

root prompt> ./addsudoers.sh user1 user2

Para obtener una explicación completa, consulte esta respuesta: Agregar usuarios a sudoers a través del script de shell

¡Saludos!

Albert Vonpupp
fuente
0

Intenta repetirlo. Sin embargo, debe ejecutarlo en una subcapa. Ejemplo:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"

Apolo
fuente
-2

Esto funcionó para mí basado en lo que otros publicaron aquí. Cuando usaba el script de otras personas, me abría visudo, pero no hacía la edición. Esto hizo la edición que necesitaba para permitir a todos los usuarios, incluidos los usuarios estándar, instalar java 7u17 para safari / firefox.

#!/usr/bin/env bash
rm /etc/sudoers.new
cp /etc/sudoers /etc/sudoers.new
echo "%everyone   ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new
cp /etc/sudoers.new /etc/sudoers

Esto agregó el% todos bla, bla, bla al final del archivo sudoers. Tuve que ejecutar el script así.

sudo sh sudoersedit.sh

Buena suerte: D

Kamal
fuente