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

116

J'ai besoin de modifier à /etc/sudoerspartir 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 puis-je l'appliquer /etc/sudoers?

Puis-je le copier et le modifier, puis faire visudoremplacer 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 davantage les problèmes potentiels que la simple recherche de quelque chose qui fonctionne.

n-alexander
la source

Réponses:

146

Vieux fil, mais qu'en est-il:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo
Beckerr
la source
10
C'est une excellente réponse. L'ensemble du sous-shell doit être exécuté en tant que root, par exemple echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync').
simon
3
Cette réponse fonctionne très bien! Je l'utilise pour les skripts postinst dans les packages Debian. Merci! Comme il s'agit toujours de root, cela devient court et pratique:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen
3
Je veux juste souligner une nuance majeure à la réponse de @ BorisDäppen: le -adrapeau à EDITOR="tee": il ajoutera une ligne au fichier, non seulement écrasera la première ligne. Je n'ai pas compris le différent au début et je ne pouvais pas trouver le moyen d'ajouter. J'espère pouvoir trouver des gens quelque temps en le pointant directement ;-)
Jean-Philippe Murray
3
quelqu'un peut-il m'expliquer comment ce travail que je veux dire n'est pas le point-virgule requis après EDITOR = 'tee -a'. Je sais que cela brisera la commande. EDITOR est une variable shell et visudo est encore une autre commande, donc ici nous passons EDITOR et visudo dans la même ligne de commande. comment ça marche vraiment?
Sagar
1
J'ai essayé ce x = "quelque chose" echo $ x. Cela n'a pas fonctionné pour moi.
Sagar
43

Utilisez visudo pour cela avec un éditeur personnalisé. Cela résout toutes les conditions de course et les problèmes de "hack" 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 de 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
sstendal
la source
5
Cela nécessite que sudo ait été compilé avec --enable-env-editor, sinon il utilisera uniquement le respect de la variable de l'éditeur si elle fait partie d'un petit ensemble de valeurs connues.
Caleb
Cela fonctionne pour moi (Ubuntu 12.04), mais je ne comprends pas comment cela fonctionne. Quelqu'un pourrait-il expliquer comment l'utiliser correctement et comment il fonctionne réellement? Merci
MountainX
Je tiens à noter que cela ne semble pas fonctionner pour moi le 12.04 précis. J'ai créé un script bash, ajouté les autorisations + x et exécuté le fichier avec la sortie suivante: visudo: impossible d'exécuter / tmp / edit_sudoers: Erreur de format d'exécution visudo: /etc/sudoers.tmp inchangé
Jose Diaz-Gonzalez
Cela a très bien fonctionné pour moi, même si je me suis simplement connecté en tant que root et ai supprimé le sudo -Ede la première commande.
merlin2011
J'aime vraiment cette réponse, mais cela n'a pas fonctionné pour moi. Je pense que mon sudo n'a pas été compilé avec le drapeau nécessaire.
Mnebuerquo
30

Vous devez apporter vos modifications à un fichier temporaire, puis utilisez visudo -c -f sudoers.temp pour confirmer que les modifications sont valides, puis copiez-le au-dessus 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
la source
Il semble que vous utilisez sudoers.tmp comme fichier de verrouillage, vous ne savez pas comment cela confirme la validité des modifications. Ne devrions-nous pas vérifier l'état de sortie de visudo pour nous assurer qu'il n'y a pas d'erreurs?
convertisseur42
/etc/sudoers.tmp est le fichier de verrouillage vérifié par visudo en mode interactif. visudo -c -f renvoie un 1 s'il y a eu une erreur, d'où la vérification du code retour.
Brian C. Lane
Je suis inquiet d'utiliser sudoers.tmp, car cela ressemble à l'utilisation de l'interface interne de visudo, c'est-à-dire un hack. Est-ce standard, ce qui signifie qu'il est garanti que ce sera toujours sudoers.tmp qui sera utilisé comme verrou? Ou ont-ils la liberté de changer cela à l'avenir?
n-alexander
2
besoin d'utiliser lockfile au lieu de test / touch
n-alexander
2
La page de manuel indique qu'elle utilise /tmp/sudoers.tmp donc c'est actuellement la norme. Bien sûr, cela pourrait changer à l'avenir. Et oui, vous avez raison, il y a une condition de course.
Brian C. Lane
18

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

Cela pourrait aider.

Pevik
la source
N'est-il pas commenté?
2
@TomDworzanski: IMHO non. Voir man sudoers (5) et autres commentaires .
pevik
Vous avez raison! Merci pour les liens et bonne réponse.
3
J'utilise également ce répertoire dans centos 7
Alexander Bird
Je pense que c'est la bonne façon de procéder.
jansohn le
11

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

ngn
la source
9

Si vous sudoautorisez l'ajout d'entrées /etc/sudoers.d, vous pouvez utiliser cette réponse de @ dragon788:

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

Fondamentalement, vous utilisez visudopour vérifier le fichier avant de le copier /etc/sudoers.d, vous pouvez donc être sûr de ne casser sudopour 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 /etc/sudoers.det cela devrait fonctionner. Assurez-vous qu'il appartient à root et qu'il n'est pas accessible en écriture par d'autres.

Mnebuerquo
la source
5

Configurez un éditeur personnalisé. Fondamentalement, ce sera un script qui accepte le nom de fichier (dans ce cas /etc/sudoers.tmp), et le modifie et l'enregistre 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 pour vous.

sudo EDITOR=/path/to/my_dummy_editor.sh visudo
Ali Afshar
la source
Ai-je raison de dire que tout ce que dummy_editor.sh doit contenir est quelque chose comme ça? #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0Il semble fonctionner pour moi.
MountainX
4

Beaucoup de réponses, travaillaient avec sudo pour yonks mais n'avaient pas besoin d'automatiser la configuration d'installation jusqu'à présent. J'ai utilisé un mélange de certaines des réponses ci-dessus, en écrivant ma ligne de configuration à l'emplacement /etc/sudoers.d include 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 vos sudoers include file passé les vérifications de syntaxe visudo:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file
Im-Kirk-Dougla-Cus
la source
Omettez simplement l'astérisque, cela ne devrait pas être là ^^
Sonate
il et retourne le succès (0) - compris
Oleg
2

Juste pour ajouter une option supplémentaire aux réponses ci-dessus, si la condition de concurrence n'est pas une préoccupation majeure, 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.newfichier, il visudodemandera une entrée utilisateur, il est donc conseillé de le vérifier d' visudo -c -f /tmp/sudoers.newabord.

zelanix
la source
1

Je pense que la solution la plus simple consiste à:

Créer un script addudoers.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 que vous souhaitez ajouter comme:

root prompt> ./addsudoers.sh user1 user2

Pour une explication complète, voir cette réponse: Ajout d'utilisateurs aux sudoers via un script shell

Cordialement!

Albert Vonpupp
la source
0

Essayez de lui faire écho. Vous devez cependant l'exécuter dans un sous-shell. Exemple:

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

Apollon
la source
-2

Cela a fonctionné pour moi en fonction de ce que d'autres ont publié ici. Quand j'utilisais le script d'autres personnes, cela ouvrait visudo pour moi mais ne ferait pas l'édition. Cela a rendu la modification nécessaire pour permettre à tous les utilisateurs, y compris les utilisateurs standard, d'installer java 7u17 pour 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

Cela a ajouté le% tout le monde bla bla bla au bas du fichier sudoers. J'ai dû exécuter le script comme ça.

sudo sh sudoersedit.sh

Bonne chance: D

Kamal
la source