2008-11-27 11 views
74

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

En supposant que j'ai une commande qui fonctionnerait sur un fichier normal, comment pourrais-je l'appliquer à .etc/sudoers? Puis-je copier et modifier, puis remplacer visuellement l'original par la copie modifiée? En fournissant mon propre script en EDITOR?

Ou est-ce que je peux juste utiliser les mêmes serrures et cp?

La question est plus sur les problèmes potentiels que sur la simple recherche de quelque chose qui fonctionne.

Répondre

29

Vous devez faire vos modifications dans un fichier temporaire, puis utilisez visudo -c -f sudoers.temp pour confirmer que les modifications sont valides et puis copiez-le sur le 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 
+0

Il semble que vous utilisiez sudoers.tmp comme fichier de verrouillage, mais vous ne savez pas comment les modifications confirmées sont valides. Ne devrions-nous pas vérifier le statut de sortie de visudo pour nous assurer qu'il n'y a pas d'erreurs? – converter42

+0

/etc/sudoers.tmp est le fichier de verrouillage vérifié par visudo en mode interactif. visudo -c -f renvoie un 1 s'il y avait une erreur, d'où la vérification du code de retour. –

+0

Je suis inquiet à propos de l'utilisation de 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 sudoers.tmp soit toujours utilisé comme verrou? Ou ont-ils la liberté de changer cela à l'avenir? –

8

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

+3

+1 pour mémoriser les autorisations! – wchargin

5

Configurer un éditeur personnalisé. Fondamentalement, ce sera un script qui accepte le nom de fichier (dans ce cas /etc/sudoers.tmp), et modifiez et enregistrez-le en place. Donc, vous pouvez 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 
+0

Ai-je raison de dire que tout le dummy_editor.sh doit contenir quelque chose comme ça? '#!/bin/sh; echo "# mes changements de sudoers" >> $ 1; sortie 0' Ça semble marcher pour moi. – MountainX

42

Utilisez visudo pour cela avec un éditeur personnalisé. Cela résout toutes les conditions de course et "hack" les problèmes 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 « # changement factice à sudoers » à la fin de sudoers. Pas de hacks et pas de conditions de course.

qui explique la version annotée 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 
+4

Cela nécessite que sudo ait été compilé avec '--enable-env-editor', sinon il utilisera uniquement la variable editor si elle fait partie d'un petit ensemble de valeurs connues. – Caleb

+0

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 cela fonctionne réellement? Merci – MountainX

+0

Aimeriez-vous noter que cela ne semble pas fonctionner pour moi sur 12.04 précise. J'ai créé un script bash, ajouté + x autorisations à celui-ci, et exécuté le fichier avec la sortie suivante: visudo: impossible d'exécuter/tmp/edit_sudoers: Exec erreur de format visudo: /etc/sudoers.tmp inchangé –

-1

Cela a fonctionné pour moi de ce que les autres basé affichés ici. Quand j'utilisais le script d'autres peuples, cela ouvrait visudo pour moi mais ne faisait pas l'édition. Cela a fait l'édition dont j'avais besoin 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 

Ceci a ajouté le% bla bla bla au bas du fichier sudoers. Je devais lancer le script comme ça.

sudo sh sudoersedit.sh 

Bonne chance: D

2

Juste pour ajouter une option supplémentaire aux réponses ci-dessus, si la condition de course ne sont pas une préoccupation majeure, la commande suivante peut être utilisée pour éviter de copier manuellement un fichier modifié à /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 fichier /tmp/sudoers.new puis visudo demandera l'entrée d'utilisateur il est donc conseillé de le vérifier avec visudo -c -f /tmp/sudoers.new premier.

+0

bon hack, utilisé que – Aki

11

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

Cela pourrait aider.

+0

N'est-ce pas commenté cependant? –

+1

@TomDworzanski: IMHO pas. Voir [man sudoers (5)] (http://www.sudo.ws/man/1.8.15/sudoers.man.html#x4f74686572207370656369616c206368617261637465727320616e6420726573657276656420776f726473) et [autre commentaire] (http://unix.stackexchange.com/questions/244064/why-are-the-include-et-includedir-directives-in-sudo-prefixed-with-the-pound). – pevik

+0

Vous avez raison! Merci pour les liens et bonne réponse. –

1

Je pense que la solution la plus directe est de:

Créer un script addsudoers.sh

#!/bin/bash 

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

et l'appeler avec les utilisateurs que vous souhaitez ajouter comme:

root prompt> ./addsudoers.sh user1 user2 

Pour l'explication complète voir cette réponse: Adding users to sudoers through shell script

Cordialement!

0

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

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

86

fil vieux, mais qu'en est-:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo 
+6

C'est une excellente réponse. Le sous-shell entier devrait être exécuté en tant que root, par ex. 'echo" $ USER TOUT = NOPASSWD:/usr/bin/rsync "| (sudo su -c 'EDITOR = "tee" visudo -f /etc/sudoers.d/rsync') '. – simon

+1

Cette réponse fonctionne très bien! Je l'utilise pour les skipts postinst dans les paquets debian. Merci! Comme c'est toujours root, il devient court et maniable: 'echo" $ CONFIGLINE "| (EDITOR = "tee -a" visudo) ' –

+1

Je veux simplement souligner une nuance majeure à la réponse de @ BorisDäppen: le drapeau' -a' à 'EDITOR =" tee "': il ajoutera une ligne au fichier, pas seulement écraser la première ligne. Je n'ai pas attrapé les différents au début et je ne pouvais pas trouver le moyen d'ajouter. J'espère pouvoir trouver quelques personnes en pointant cela directement ;-) –

3

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

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

Fondamentalement, vous utilisez visudo pour vérifier le fichier avant de le copier dans sudoers.d, de sorte que vous pouvez être sûr vous ne brisez pas sudo pour quelqu'un.

visudo -c -q -f filename 

Ce qu'il vérifie et renvoie le succès (0) si elle est valide, vous pouvez l'utiliser avec if, && et d'autres opérations booléennes de script. Une fois que vous validez, il suffit de le copier dans /etc/sudoers.d et cela devrait fonctionner. Assurez-vous que son propriétaire est root et non inscriptible par les autres.