web-dev-qa-db-fra.com

Su sans mot de passe dans un script Bash?

J'ai rencontré un dilemme lors de la migration d'une installation Hadoop d'Oracle Enterprise Linux vers Ubuntu. Le développeur précédent a placé la commande suivante dans rc.local dans OEL:

su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

J'ai besoin du serveur Web ci-dessus pour démarrer (et arrêter) automatiquement sous Ubuntu en tant qu'utilisateur spécifié reporter. (Le matériel d'automatisation est beaucoup moins important que d'exécuter correctement ce script en tant que reporter _ utilisateur, mais est une fonctionnalité "agréable à avoir".)

Ce processus doit commencer en dernier, car il me reste à configurer quelques autres scripts liés à Hadoop pour qu'ils démarrent automatiquement avant celui-ci (le serveur Web réside dans le système de fichiers Hadoop, qui ne sera monté qu'une fois dans le système d'exploitation. ) Chaque fois que j'émets la commande su, on me demande un mot de passe. Cela se produit quel que soit l'utilisateur actuellement "actif" et cela ne pose pas de problème dans OEL puisque l'utilisateur racine est réellement utilisé. Voici ma tentative actuelle de fichier/etc/sudoers, mais cela ne fonctionne toujours pas (je ne sais pas si les modifications que j'ai apportées en bas sont correctes):

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults        env_reset

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification

# Allow members of group Sudo to execute any command after they have
# provided their password
# (Note that later entries override this, so you might need to move
# it further down)
%Sudo ALL=(ALL) ALL
#
#includedir /etc/sudoers.d

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

# User privilege specification
root    ALL=(ALL) ALL
user3 ALL=(ALL)NOPASSWD:/bin/su
user2 ALL=(ALL)NOPASSWD:/bin/su
user1 ALL=(ALL)NOPASSWD:/bin/su
reporter ALL=(ALL)NOPASSWD:/bin/su

Ceci est une copie d'un fil que j'ai posté sur UbuntuForums.org ( http://ubuntuforums.org/showthread.php?p=12040341#post12040341 ), mais je commence à avoir désespérément besoin d'une réponse. = P. Veuillez noter que ma connaissance de Linux est encore faible (je ne connaissais presque pas Linux avant que ce projet ne soit abandonné sur mes genoux). Toute aide est grandement appréciée car il s’agit actuellement d’un obstacle majeur!

Merci, -Snipe

1
Sniperm4n

Vos modifications actuelles de /etc/sudoers permettent effectivement à user1, user2, user3 et reporter d'effectuer toute action comme root (puisque su vous permet de devenir root)! Vous ne voulez certainement pas cela. Et cela n’aide en rien votre problème actuel, car vous ne voulez pas que ces utilisateurs exécutent quelque chose avec une autre identité, vous voulez que root exécute quelque chose avec une autre identité. Avant de continuer, je vous recommande de supprimer ces lignes de /etc/sudoers (éditez-le avec visudo bien sûr) à moins que vous ne soyez absolument sûr que ce soit ce que vous voulez.

Si vous êtes un utilisateur non -root et que vous l'exécutez, un mot de passe vous sera toujours demandé:

su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

Mais lorsque root l'exécute, il doit simplement y parvenir (en supposant que cela fonctionnait auparavant sur Oracle Enterprise Server et que la seule différence importante est que root login est désactivé sur Ubuntu).

Lorsque vous mettez cette ligne dans rc.local, quelle que soit la distribution GNU/Linux, y compris Ubuntu, elle est exécutée sous la forme root. Ça devrait marcher. Lorsque vous l'exécutez à partir de la ligne de commande, cela ne fonctionnera pas. Mais dans rc.local, cela devrait fonctionner.

Si vous voulez le tester depuis la ligne de commande, donnez-vous un shell root assez similaire à l'environnement de rc.local:

Sudo -i

(Ceci simule un shell de connexion root initial. Normalement, pour un shell root, utilisez Sudo -s. Et bien sûr, pour exécuter une commande ... avec Sudo , utilisez simplement Sudo ....)

su -c et Sudo utilisent une syntaxe différente. Par conséquent, si vous souhaitez que cette commande utilise la méthode Sudo au lieu de su, vous devez effectuer des modifications supplémentaires. Le moyen le plus simple est probablement:

Sudo -u reporter bash -c "cd /path/to/directorywithscript && ./runwebserver.sh >> /dev/null 2>&1&"

Cependant, j'insiste sur le fait que vous n'avez pas besoin de convertir les commandes su en Sudo pour qu'elles s'exécutent correctement sur rc.local.

Sous Ubuntu, contrairement à Oracle Enterprise Server, la connexion en tant que root est désactivée par défaut (et vous ne devriez certainement pas l'activer). Mais su fonctionne toujours lorsqu'il est exécuté par root. su fonctionne également pour un utilisateur non -root qui change d'identité en un autre utilisateur non -root.

Si vous avez cette ligne dans rc.local et que cela ne fonctionne pas, la raison en est différente de Sudo par rapport à su. Dans ce cas, quelque chose ne va pas. Pour que nous puissions résoudre ce problème, vous devez fournir le contenu de runwebserver.sh.

Enfin, veuillez noter que bash runwebserver.sh >> /dev/null 2>&1& est plutôt inélégant. Il est plus simple de comprendre (et, beaucoup moins important, d'avoir l'air plus joli) d'utiliser bash runwebserver.sh &>> /dev/null. Vous avez dit que cela fonctionnait en dernier dans rc.local, vous n'avez donc pas besoin d'utiliser & pour le mettre en arrière-plan.

Cependant, vous devriez envisager si vous voulez vraiment supprimer l'erreur type ainsi que la sortie standard (comme vous le faites actuellement). Vraisemblablement, si quelque chose est écrit en erreur standard, c'est soit important, soit il peut être supprimé en modifiant les paramètres de verbosité de votre serveur Web.

2
Eliah Kagan

Si vous ne voulez pas qu'on vous demande un mot de passe, vous devrez utiliser pour exécuter su en tant que root, vous devrez donc utiliser:

Sudo su reporter -c "cd /path/to/directorywithscript && bash runwebserver.sh >> /dev/null 2>&1&"

Cependant, je pense que ce que vous essayez de faire est une très mauvaise idée: vous autorisez tous les utilisateurs à se connecter comme n'importe qui, y compris root.

0
konairius