148 votes

Comment éditer / etc / sudoers à partir d'un script?

J'ai besoin de modifier / etc / sudoers à partir d'un script pour ajouter / supprimer des éléments des listes blanches.

En supposant que j'ai une commande qui fonctionnerait sur un fichier normal, comment pourrais-je l'appliquer à .etc / sudoers?

Puis-je le copier et le modifier, puis demander à visudo de remplacer l'original par la copie modifiée? En fournissant mon propre script dans EDITOR?

Ou puis-je simplement utiliser les mêmes verrous et cp?

La question porte davantage sur les problèmes potentiels que sur la recherche de quelque chose qui fonctionne.

46voto

sstendal Points 2019

Utilisez visudo pour cela avec un éditeur personnalisé. Cela résout toutes les conditions de course et les problèmes de «piratage» avec la solution 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
 

Ce script ajoutera la ligne "# Dummy change to sudoers" à la fin des sudoers. Pas de hacks et pas de conditions de course.

Version annotée qui explique comment cela fonctionne réellement:

 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
 

31voto

Brian C. Lane Points 2258

Vous devez apporter vos modifications à un fichier temporaire, puis utiliser visudo -c -f sudoers.temp pour confirmer que les modifications sont valides, puis les copier par-dessus / 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
 

25voto

pevik Points 521

Sur Debian et ses dérivés, vous pouvez insérer un script personnalisé dans le répertoire /etc/sudoers.d/, avec les droits 0440 - plus d'informations dans /etc/sudoers.d/README.

Ça pourrait aider.

11voto

ngn Points 2820

visudo est censé être l'interface humaine pour éditer /etc/sudoers . Vous pouvez obtenir le même résultat en remplaçant directement le fichier, mais vous devez vous occuper vous-même de l'édition simultanée et de la validation de la syntaxe. Faites attention aux autorisations r--r----- .

4voto

Ali Afshar Points 22836

Configurez un éditeur personnalisé. Fondamentalement, ce sera un script qui accepte le nom de fichier (dans ce cas /etc/sudoers.tmp), et le modifier et l'enregistrer en place. Vous pouvez donc simplement écrire dans ce fichier. Lorsque vous avez terminé, quittez le script et visudo se chargera de modifier le fichier sudoers réel pour vous.

 sudo EDITOR=/path/to/my_dummy_editor.sh visudo
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X