web-dev-qa-db-fra.com

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

Je dois modifier /etc/sudoers 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 concerne plus les problèmes potentiels que la simple recherche de quelque chose qui fonctionne.

100
n-alexander

Vieux fil, mais qu'en est-il:

echo 'foobar ALL=(ALL:ALL) ALL' | Sudo EDITOR='tee -a' visudo
123
beckerr

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
42
sstendal

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
29
Brian C. Lane

Sur Debian et ses dérivés, vous pouvez insérer un script personnalisé dans/etc/sudoers.d/répertoire, avec droits0440– pour plus d'informations, voir / etc/sudoers.d/README .

Ça pourrait aider.

13
pevik

visudo est censé être l'interface humaine pour l'édition /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. Attention aux r--r----- autorisations.

9
ngn

Si votre Sudo permet d'ajouter des entrées dans /etc/sudoers.d, alors vous pouvez utiliser cette réponse de @ dragon788:

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

Fondamentalement, vous utilisez visudo pour vérifier le fichier avant de le copier dans /etc/sudoers.d, pour être sûr de ne pas casser Sudo pour personne.

visudo -c -q -f filename

Cela le vérifie et renvoie success (0) s'il est valide, vous pouvez donc l'utiliser avec if, && et d'autres opérations booléennes de script. Une fois que vous avez validé, copiez-le simplement dans /etc/sudoers.d et ça devrait marcher. Assurez-vous qu'il appartient à root et n'est pas accessible en écriture par d'autres.

6
Mnebuerquo

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
5
Ali Afshar

Beaucoup de réponses, je travaillais avec Sudo pour les yonks mais je n'avais pas besoin d'automatiser la configuration de configuration jusqu'à présent. J'ai utilisé un mélange de certaines des réponses ci-dessus, en écrivant ma ligne de configuration dans l'emplacement d'inclusion de /etc/sudoers.d afin de ne pas avoir à modifier le fichier sudoers principal, puis j'ai vérifié la syntaxe de ce fichier, exemple simple ci-dessous:

Écrivez votre ligne dans un fichier d'inclusion sudoers:

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

Vérifiez que votre fichier sudoers include a passé les vérifications de la syntaxe visudo:

Sudo visudo -cf /etc/sudoers.d/99_Sudo_include_file
4
Im-Kirk-Dougla-Cus

Juste pour ajouter une option supplémentaire aux réponses ci-dessus, si la condition de concurrence critique n'est pas un problème majeur, la commande suivante peut être utilisée pour éviter de copier manuellement un fichier modifié dans /etc/sudoers

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

Cela garantira que le nouveau fichier est validé et installé correctement avec la mise à jour des autorisations.

Notez que s'il y a une erreur dans le /tmp/sudoers.new fichier puis visudo demandera une entrée utilisateur, il est donc conseillé de le vérifier avec visudo -c -f /tmp/sudoers.new première.

2
zelanix

Je pense que la solution la plus simple consiste à:

Créez un script ajouteudoers.sh

#!/bin/sh

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

et appelez-le avec les utilisateurs auxquels vous souhaitez l'ajouter:

root Prompt> ./addsudoers.sh user1 user2

Pour l'explication complète, voir cette réponse: Ajout d'utilisateurs à sudoers via le script Shell

Cordialement!

1
Albert Vonpupp

Essayez d'en faire écho. Vous devez cependant l'exécuter en sous-shell. Exemple:

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

0
Apollo