web-dev-qa-db-fra.com

Comment exécuter un programme spécifique en tant que root sans invite de mot de passe?

Je dois exécuter quelque chose en tant que Sudo sans mot de passe, j'ai donc utilisé visudo et ajouté ceci à mon fichier sudoers:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Ensuite, je l'ai essayé:

$ Sudo /path/to/my/program
[Sudo] password for MYUSERNAME: 

Pourquoi demande-t-il un mot de passe? Comment puis-je exécuter/utiliser des commandes en tant que root avec un utilisateur non root, sans demander de mot de passe?

175
LanceBaynes

Vous avez une autre entrée dans le fichier sudoers , généralement située à /etc/sudoers, qui correspond également à votre utilisateur. La règle NOPASSWD doit être postérieure à celle-là pour qu'elle soit prioritaire.

Cela fait, Sudo demandera un mot de passe normalement pour toutes les commandes sauf /path/to/my/program, qu'il vous laissera toujours courir sans vous demander votre mot de passe.

97
Warren Young

S'il existe plusieurs entrées correspondantes dans /etc/sudoers, Sudo utilise le dernier. Par conséquent, si vous pouvez exécuter n'importe quelle commande avec une invite de mot de passe et que vous souhaitez pouvoir exécuter une commande particulière sans invite de mot de passe, vous avez besoin de l'exception en dernier.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Notez l'utilisation de (root), pour permettre au programme d'être exécuté en tant que root mais pas en tant que d'autres utilisateurs. (Ne donnez pas plus d'autorisations que le minimum requis, sauf si vous avez réfléchi aux implications.)

Remarque pour les lecteurs qui n'exécutent pas Ubuntu ou qui ont changé la configuration par défaut de Sudo (le Sudo d'Ubuntu est ok par défaut) : Exécution de scripts Shell avec des privilèges élevés est risqué, vous devez partir d'un environnement propre (une fois que le shell a démarré, il est trop tard (voir Autoriser setuid sur les scripts Shell ), vous avez donc besoin de Sudo pour s'en occuper). Assurez-vous que vous disposez de Defaults env_reset dans /etc/sudoers ou que cette option est la valeur par défaut à la compilation (Sudo sudo -V | grep env devrait inclure Reset the environment to a default set of variables).

[~ # ~] avertissement [~ # ~] : Cette réponse a été jugée non sécurisée. Voir les commentaires ci-dessous

Solution complète: Les étapes suivantes vous aideront à atteindre la sortie souhaitée:

  1. Créez un nouveau fichier de script (remplacez create_dir.sh avec le nom de script souhaité):

    vim ~/create_dir.sh
    

    Le script sera créé dans le répertoire personnel de l'utilisateur

  2. Ajoutez des commandes que seul un utilisateur root ou Sudo peut exécuter comme la création d'un dossier au niveau du répertoire racine:

    mkdir /abc
    

    Remarque: N'ajoutez pas Sudo à ces commandes. Enregistrez et quittez (en utilisant :wq!)

  3. Attribuez-lui des autorisations d'exécution en utilisant:

    Sudo chmod u+x create_dir.sh
    
  4. Apportez des modifications afin que ce script ne nécessite pas de mot de passe.

    1. Ouvrez le fichier sudoers:

      Sudo visudo -f /etc/sudoers
      
    2. Ajoutez la ligne suivante à la fin:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Remplacez ahmad par votre nom d'utilisateur. Assurez-vous également qu'il s'agit de la dernière ligne. Sauvegarder et quitter.

  5. Maintenant, lors de l'exécution de la commande, ajoutez Sudo avant comme:

    Sudo ./create_dir.sh
    

    Cela exécutera les commandes à l'intérieur du fichier de script sans demander de mot de passe.

Suivez les étapes faciles mentionnées ici http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

Je pense que votre syntaxe est erronée. Au moins, j'utilise les éléments suivants qui fonctionnent pour moi:

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

Si vous voulez éviter d'avoir à utiliser Sudo ni de changer le fichier de configuration sudoers, vous pouvez utiliser:

Sudo chown root:root path/to/command/COMMAND_NAME
Sudo chmod 4775 path/to/command/COMMAND_NAME

Cela fera exécuter la commande en tant que root sans avoir besoin de Sudo.

6
linuxgnuru

Si vous avez une distribution comme Manjaro, vous devez d'abord traiter un fichier qui remplace la définition de/etc/sudoers, vous pouvez le supprimer ou travailler directement avec ce fichier pour ajouter vos nouvelles configurations.

Ce fichier est:

Sudo cat /etc/sudoers.d/10-installer

La SEULE façon de le voir est sous les privilèges root, vous ne pouvez pas lister ce répertoire sans lui, ce fichier est spécifique à Manjaro, vous pouvez trouver cette configuration avec un autre nom, mais dans le même répertoire.

Dans votre fichier de choix, vous pouvez ajouter la ou les lignes suivantes pour obtenir la ou les configurations souhaitées:

Ignorer l'authentification pour un groupe

%group ALL=(ALL) NOPASSWD: ALL

ou Ignorer l'authentification pour un utilisateur

youruser ALL=(ALL) NOPASSWD: ALL

ou Ignorer l'authentification d'un exécutable pour un utilisateur spécifique

youruser ALL=(ALL) NOPASSWD: /path/to/executable

NOTE RAPIDE: Vous ouvrez une porte pour utiliser Sudo sans authentification, cela signifie que vous pouvez tout exécuter en modifiant tout depuis votre système, utilisez-le avec responsabilité.

5
Lyoneel

Vérifiez que Sudo n'est pas aliasé. Courez comme ça

/usr/bin/Sudo /path/to/my/program

Par exemple, un alias Shell comme celui-ci:

alias Sudo="Sudo env PATH=$PATH"

peut provoquer ce comportement.

4
Sepero

Cela a résolu le problème pour moi (a également essayé certaines des autres réponses, qui auraient pu aider):

Le script que j'appelais était en /usr/bin, un répertoire sur lequel je n'ai pas de droits d'écriture (bien que je puisse généralement y lire tous les fichiers). Le script était chmodded + x (permission exécutable), mais cela ne fonctionnait toujours pas. Déplacer ce fichier vers un chemin dans mon répertoire personnel, au lieu de /usr/bin, J'ai enfin pu l'appeler avec Sudo sans saisir de mot de passe.

Aussi quelque chose dont je doutais (clarifier pour les futurs lecteurs): Vous devez exécuter votre script en tant que Sudo. Tapez Sudo lorsque appel le script. N'utilisez pas Sudo pour la commande dans votre script qui a réellement besoin de root (changer le rétro-éclairage du clavier dans mon cas). Peut-être que cela fonctionne aussi, mais vous n'en avez pas besoin, et cela semble être une meilleure solution.

2
Luc

Lorsque vous exécutez votre script, vous devez l'exécuter en tant que Sudo /path/to/my/script.

Edit: Sur la base de votre commentaire à une autre réponse, vous souhaitez l'exécuter à partir d'une icône. Vous devrez créer un .desktop fichier qui exécute votre programme avec Sudo, comme sur le terminal.

Vous pouvez également envisager d'utiliser gtk-Sudo pour une invite visuelle de mot de passe.

Vous devriez probablement considérer l'idée que vous ne devriez pas exécuter les choses en tant que root et que changer le système plus loin afin que vous n'ayez pas du tout besoin des autorisations root serait une meilleure façon de procéder.

2
Caleb

Une autre possibilité pourrait être d'installer, de configurer, puis d'utiliser la commande super pour exécuter votre script en tant que

super /path/to/your/script

Si vous voulez exécuter un binaire exécutable (par exemple que vous avez compilé en ELF binaire à partir d'un code source C) -qui est pas un script - en tant que root, vous pourriez envisager de le faire setuid (et en fait /bin/login, /usr/bin/Sudo et /bin/su et super utilisent tous cette technique). Cependant, soyez très prudent, vous pourriez ouvrir un énorme trou de sécurité .

Concrètement, votre programme devrait être codé de façon paranoïaque (alors vérifiez tous les arguments et l'environnement et les conditions extérieures avant "d'agir", en supposant un utilisateur potentiellement hostile), alors vous pourriez utiliser seteuid (2) et amis (voir aussi setreuid (2) ) soigneusement (voir aussi capacités (7) & informations d'identification (7) & execve (2) ...)

Vous utiliserez chmod u+s (lire chmod (1) ) lors de l'installation d'un tel binaire.

Mais soyez très prudent .

Lisez beaucoup de choses sur setuid, y compris Programmation Linux avancée , avant de coder une telle chose.

Notez qu'un script, ou n'importe quoi Shebang - ed, ne peut pas être défini. Mais vous pourriez coder (en C) un petit setuid-binaire qui l'enveloppe.

1

Idéalement, si vous personnalisez les commandes pouvant être exécutées via Sudo, vous devez apporter ces modifications dans un fichier séparé sous /etc/sudoers.d/ Au lieu de modifier directement le fichier sudoers. Vous devez également toujours utiliser visudo pour modifier le ou les fichiers. Vous ne devez JAMAIS accorder NOPASSWD sur ALL commandes.

Exemple: Sudo visudo -f /etc/sudoers.d/mynotriskycommand

Insérez votre ligne accordant l'autorisation: myuser ALL= NOPASSWD: /path/to/your/program

Ensuite, enregistrez et quittez et visudo vous avertira si vous avez des erreurs de syntaxe.

Vous pouvez exécuter Sudo -l Pour voir les autorisations accordées à votre utilisateur, si l'une des commandes NOPASSWD spécifiques à l'utilisateur apparaît AVANT toute commande %groupyouarein ALL=(ALL) ALL dans la sortie, vous serez vous a demandé votre mot de passe.

Si vous vous trouvez en train de créer beaucoup de ces fichiers sudoers.d, alors vous voudrez peut-être les créer nommés par utilisateur afin qu'ils soient plus faciles à visualiser. Gardez à l'esprit que l'ordre des NOMS DE FICHIERS et des RÈGLES dans le fichier est très important, le DERNIER chargé gagne, qu'il soit PLUS ou MOINS permissif que les entrées précédentes.

Vous pouvez contrôler l'ordre des noms de fichiers en utilisant un préfixe 00-99 ou aa/bb/cc, mais gardez également à l'esprit que si vous avez des fichiers qui n'ont pas de préfixe numérique, ils se chargeront après les fichiers numérotés, remplaçant les paramètres. En effet, en fonction de vos paramètres de langue, le "tri lexical" que le shell utilise en premier lieu trie les chiffres, puis peut entrelacer les majuscules et les minuscules lors du tri dans l'ordre "croissant".

Essayez d'exécuter printf '%s\n' {{0..99},{A-Z},{a-z}} | sort Et printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort Pour voir si votre langue actuelle imprime AaBbCc etc ou ABC puis abc pour déterminer quelle est la meilleure "dernière "le préfixe de la lettre à utiliser serait.

0
dragon788

Alternativement, vous pouvez utiliser python pudo package.

Installation:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

Vous trouverez ci-dessous l'extrait de code à utiliser dans python automation pour exécuter des commandes avec le privilège root:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

Voici l'exemple de cmd pour exécuter des commandes avec le privilège root:

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0
Madhusudhan Kasula

Pour permettre à n'importe quel utilisateur d'exécuter le programme en tant que Sudo sans demander de mot de passe, vous pouvez ajouter la ligne suivante

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

dans /etc/sudoers

Notez que % Sudo faites-le.

0
ultimatex

Ce qui suit est pour le cas où vous voulez exécuter une commande sans mot de passe uniquement si elle a un ensemble d'options spécifique, où une partie des options est variable. AFAIK, il n'est pas possible d'utiliser des variables ou des plages de valeurs dans les déclarations sudoers, c'est-à-dire que vous pouvez autoriser l'accès explicitement à command option1 Mais pas à command option2 En utilisant:

user_name ALL=(root) /usr/bin/command option1

mais si la structure est command option1 value1, où value1 peut varier, vous devrez avoir des lignes de sudoers explicites pour chaque valeur possible de value1. Le script shell fournit un moyen de le contourner.

Cette réponse a été inspirée par la réponse de M. Ahmad Zafar et résout le problème de sécurité.

  1. Créez un script Shell dans lequel vous appelez la commande sans Sudo.
  2. Enregistrez le script dans un dossier privilégié root (par exemple /usr/local/bin/), Rendez le fichier appartenant à la racine (par exemple chown root:wheel /usr/local/bin/script_name) Sans accès en écriture pour les autres (par exemple chmod 755 /usr/local/bin/script_name).
  3. Ajoutez l'exception aux sudoers utilisant visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Exécutez votre script Sudo script_name.

Par exemple, je souhaite modifier le délai de mise en veille de l'affichage sur macOS. Cela se fait en utilisant:

Sudo pmset displaysleep time_in_minutes

Je considère que la modification du délai de mise en veille est une action innocente qui ne justifie pas les tracas de la saisie du mot de passe, mais pmset peut faire beaucoup de choses et je voudrais garder ces autres choses derrière le mot de passe Sudo.

J'ai donc le script suivant à /usr/local/bin/ds:

#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "Sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi

À la fin du fichier sudoers, j'ai la ligne suivante:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Pour définir le délai d'expiration à 3 minutes, j'exécute mon script à partir du compte utilisateur ordinaire user_name:

Sudo ds 3

PS La plupart de mon script est la validation des entrées, qui n'est pas obligatoire, donc ce qui suit fonctionnerait également:

#!/bin/bash
pmset displaysleep $1 
0
Koit Saarevet