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

Jai besoin dexécuter quelque chose en tant que sudo sans mot de passe, jai donc utilisé visudo et ajouté ceci à mon sudoers fichier:

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

Ensuite, je lai 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?

Réponse

Vous avoir 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 après celle-là pour quelle ait la priorité.

Après avoir fait cela, sudo demandera normalement un mot de passe pour toutes les commandes sauf /path/to/my/program, quil vous laissera toujours exécuter sans demander votre mot de passe.

Commentaires

  • cela fonctionnerait-il encore si le /path/to/my/program était un script python?
  • Le programme à la place être un alias, défini pour bash (cest-à-dire dans .bashrc)? Ou même un script shell dans /usr/local/sbin? À essayer.
  • Nikos – non, ce ne peut pas être un alias. Il doit pointer vers un vrai chemin.
  • sudoers? où se trouve? heawy dutiliser votre réponse (
  • @VasiliiSuricov: Il ‘ est généralement dans /etc, mais certains systèmes le mettent ailleurs. Si vous pouvez ‘ t le trouver, essayez man sudoers. Lemplacement local de ce fichier doit être remplacé par man à lépoque sudo a été créée pour ce système.

Réponse

Sil existe plusieurs entrées correspondantes dans /etc/sudoers, sudo utilise la dernière. Par conséquent, si vous pouvez exécuter une commande avec une invite de mot de passe, et vous voulez pouvoir exécuter une commande particulière sans invite de mot de passe, vous avez besoin de lexception en dernier.

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

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

Note pour re les utilisateurs qui nexécutent pas Ubuntu ou qui ont modifié la configuration sudo par défaut (le sudo dUbuntu est correct par défaut) : exécuter des scripts shell avec des privilèges élevés est risqué, vous devez démarrer à partir dun 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 vous en occuper). Assurez-vous que vous avez Defaults env_reset dans /etc/sudoers ou que cette option est la valeur par défaut à la compilation (sudo sudo -V | grep env doit inclure Reset the environment to a default set of variables).

Commentaires

  • ex pour aller root depuis jhon avec sudo su an no pass —– > john ALL = (ALL) NOPASSWD: / bin / su
  • @adrian Si vous voulez autoriser des commandes arbitraires comme root, faites cela john ALL=(ALL) NOPASSWD: all. Il ny a ‘ aucun intérêt à passer par su.
  • Question: dois-je modifier les permissions de mon script shell afin quil puisse être modifié et lu par lutilisateur root uniquement, pour la sécurité? Je ‘ m pense à un attaquant modifiant le script, qui a toutes les permissions accordées sans avoir besoin dun mot de passe, pour quil fasse ce quil / elle veut. De toute évidence, lattaquant peut ‘ même lire le fichier sudoers pour savoir quels scripts ont ce privilège, mais peut toujours essayer avec tous mes scripts personnalisés une fois quil / elle trouve le dossier dans lequel ils se trouvent stockés dans lespoir que certains sont autorisés, ou quelque chose comme ça.
  • @JeffreyLebowski Si vous avez une règle sudo qui exécute le script (directement ou indirectement), alors ‘ Il est essentiel que seul root (ou les personnes qui ont de toute façon les privilèges root) puissent écrire dans le fichier de script, et dans le répertoire contenant le fichier de script, et dans son répertoire parent et ainsi de suite. ‘ importe peu que quiconque puisse lire le fichier de script (à moins qu’il ne contienne un mot de passe ou quelque chose, mais que ‘ est une mauvaise idée, sil y a ‘ un mot de passe, il doit être dans son propre fichier, sinon il y a ‘ trop de risque de le divulguer accidentellement par exemple par copie – coller cette section du code dans une question sur ce site).
  • @alper Non. Très peu de choses nécessitent un redémarrage. Après avoir modifié sudoers, vous navez ‘ rien de spécial à faire: sudo le vérifie chaque fois.

Réponse

AVERTISSEMENT : Cette réponse na pas été jugée sûre. Voir les commentaires ci-dessous

Solution complète: Les étapes suivantes vous aideront à obtenir le résultat souhaité:

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

    vim ~/create_dir.sh 

    Le script sera créé dans le répertoire personnel de lutilisateur

  2. Ajoutez des commandes que seuls un root ou sudo lutilisateur peut exécuter comme créer un dossier au niveau du répertoire racine:

    mkdir /abc 

    Remarque: Najoutez pas sudo à ces commandes. Enregistrez et quittez (en utilisant :wq!)

  3. Attribuez-lui des autorisations dexé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 sudoers fichier:

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

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

      Remplacez ahmad par quel que soit votre nom dutilisateur. Assurez-vous également quil sagit de la dernière ligne. Enregistrez et quittez.

  5. Maintenant, lors de lexécution de la commande, ajoutez sudo avant comme:

    sudo ./create_dir.sh 

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

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

Commentaires

  • Il serait préférable que vous fournissiez les étapes pertinentes ici et que vous utilisiez le lien comme sauvegarde pour obtenir des informations plus détaillées. De cette façon, votre réponse conserve une valeur possible même si ce lien ne serait plus valide.
  • Ce conseil nest pas sûr. La partie sudo de sudo chmod u+x create_dir.sh est inutile car lutilisateur est (vraisemblablement) propriétaire de son répertoire personnel. Puisque lutilisateur peut écrire dans create_dir.sh, vous avez effectivement donné un shell root gratuit à cet utilisateur.
  • @Lekensteyn Ce qui signifie également à tout programme exécuté en tant quutilisateur . Pourrait tout aussi bien autoriser lutilisateur à exécuter quoi que ce soit avec sudo sans mot de passe.
  • Suis-je en train de manquer quelque chose? Je pense que tout le chmod nest pas nécessaire, car vous comptez sur sudo pour élever vos privilèges.

Réponse

Je pense que votre syntaxe est erronée. Au moins, jutilise ce qui suit qui fonctionne pour moi:

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

Commentaires

  • Le (ALL) partie est facultative, la laisser de côté a exactement le même effet. Avoir (root) serait mieux cependant, mais son absence nexplique pas ‘ le problème.
  • +1 pour sudo pour cette commande et rien dautre! Aucune raison de casser tout le système …
  • @Johan: Cétait déjà dans la question.

Réponse

Si vous voulez éviter davoir à utiliser sudo ni 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 

Ceci rendra la commande exécutée en tant que root sans avoir besoin de sudo.

Commentaires

  • Wow, je nai jamais entendu parler de cette solution auparavant, ahurissant
  • @RyanNerd: Ce nest pas une solution sécurisée. Non seulement lOP peut maintenant exécuter la commande en tant que root sans mot de passe, mais tout le monde peut maintenant exécuter la commande en tant quutilisateur root.
  •  » chmod 4775 filename  » est à sens unique. Deuxièmement, le meilleur moyen de SETUID , sans redéfinir les autorisations du fichier entier, est de  » chmod u + s filename  »
  • sudo chmod 005 est sûr. Vous ne voulez pas ‘ donner des autorisations d’écriture à l’utilisateur actuel. Sinon, nimporte qui dans votre session pourrait faire nimporte quoi avec votre script.

Réponse

Si vous avez une distribution comme Manjaro , vous devez dabord 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 le fichier de votre choix, vous pouvez ajouter la (les) ligne (s) suivante (s) pour obtenir la (les) configuration (s) souhaitée (s):

Ignorer lauthentification pour un groupe

%group ALL=(ALL) NOPASSWD: ALL 

ou Ignorer lauthentification pour un utilisateur

youruser ALL=(ALL) NOPASSWD: ALL 

ou Ignorer lauthentification dun exécutable pour un utilisateur spécifique

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

REMARQUE RAPIDE: vous ouvrez une porte pour utiliser SUDO sans authentification, cela signifie que vous pouvez exécuter tout ce qui modifie tout de votre système, utilisez-le avec responsabilité.

Réponse

Vérifiez que sudo nest pas aliasé. Exécutez comme ceci

/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.

Commentaires

  • Vous avez raison, mon commentaire était hors service ici , désolé pour cela . Néanmoins, je ‘ m intrigué – comment vous attendez-vous à ce que lalias change le traitement de sudoers par sudo. Ou parlez-vous de rediriger sudo vers quelque chose qui affiche toujours ce message derreur pour récupérer les mots de passe? Cest peu probable le cas ici …
  • Javais le même problème que lOP. Cela sest avéré être causé par le fait davoir alias sudo="sudo env PATH=$PATH" dans mon ~/.bashrc. Plutôt que de le résoudre pour moi-même et de vaquer aveuglément à mes affaires, jai soumis ma réponse comme une solution possible pour toute autre personne participant à ce fil de discussion.
  • Cela ‘ cest bien, mais quand ce nest pas évident (ce qui dans ce cas nest pas ‘ t au moins pour certaines personnes), il est bon de mettre une explication dans la réponse pour fournir un contexte et empêcher les gens dutiliser aveuglément des incantations magiques. +2 (- (- 1) + +1). 🙂

Réponse

Lorsque vous exécutez votre script, vous devez lexécuter en tant que sudo /path/to/my/script.

Modifier: En fonction de votre commentaire sur une autre réponse, vous souhaitez lexécuter à partir dune icône. Vous devrez créer un fichier .desktop qui exécute votre programme avec sudo, tout comme sur le terminal.

Vous pouvez également envisager dutiliser gtk-sudo pour une invite de mot de passe visuelle.

Vous devriez probablement considérer lidée que vous ne devriez pas exécuter les choses en tant que root et que changer le système plus loin sur la route pour que vous ne le fassiez pas. avoir besoin dautorisations root serait une meilleure façon de procéder.

Commentaires

  • Ne faites pas de scripts shell setuid . Voir Autoriser setuid sur les scripts shell .
  • Jai même envisagé de ne pas le mentionner car ‘ est une si mauvaise option. Je viens de le supprimer parce que ‘ je craignais que ce demandeur utilise le conseil même avec lavertissement quil sagissait dun mauvais conseil!

Réponse

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

Le script que jappelais se trouvait dans /usr/bin, un répertoire sur lequel je nai pas les droits décriture (même si je peux généralement y lire tous les fichiers). Le script était chmodded + x (autorisation exécutable), mais il ne fonctionnait toujours pas. En déplaçant ce fichier vers un chemin dans mon répertoire personnel, au lieu de /usr/bin, jai finalement pu lappeler avec sudo sans entrer de mot de passe.

Aussi quelque chose que je douté (clarification pour les futurs lecteurs): Vous devez exécuter votre script en tant que sudo. Tapez sudo lors de l appel du script. Nutilisez 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). Cela fonctionne peut-être aussi, mais vous n’avez pas besoin de le faire, et cela semble être une meilleure solution pour ne pas le faire.

Commentaires

  • Le deuxième paragraphe avait la réponse à mon problème
  • @MuhammadAhmadZafar Glad ça a aidé!
  • En fait, utiliser sudo à lintérieur dun script est parfaitement bien à condition que vous ayez les droits appropriés (définis dans sudoers) pour exécuter la commande en question sans mot de passe. Cela rend les choses un peu plus sûres.
  • pourrait vraiment utiliser cette réponse réécrite étape par étape ‘ voici comment procéder ‘ plutôt que comme un dialogue avec les autres réponses
  • @WalrustheCat Bon point. En relisant ma réponse, je pense que jaurais pu être un peu confus moi-même. Pour le moment, je ne me souviens ‘ pas de la situation exacte pour pouvoir ‘ faire une meilleure rédaction. Si vous le comprenez, peut-être une combinaison de plusieurs réponses, soumettez certainement une nouvelle réponse!

Réponse

Une autre possibilité pourrait être dinstaller, de configurer, puis dutiliser le super commande pour exécuter votre script en tant que

super /path/to/your/script 

Si vous voulez exécuter du binaire exécutable (par exemple, que vous avez compilé en binaire ELF à partir dun code source C) -qui est pas un script – en tant que root, vous pourriez envisager de le créer 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 une énorme faille de sécurité .

Concrètement, votre programme devrait être codé paranoïaque (vérifiez donc tous les arguments et lenvironnement et les conditions extérieures avant  » agissant « , en supposant un utilisateur potentiellement hostile), alors vous pourrait utiliser seteuid (2) et vos amis (voir aussi setreuid (2) ) avec précaution ( voir aussi capacités (7) & informations didentification (7) & execve (2) …)

Vous « ll utilisez chmod u+s (lisez chmod (1) ) lors de linstallation dun tel binaire.

Mais soyez très prudent .

Lisez beaucoup de choses sur setuid , y compris Advanced Linu x Programmation , avant de coder une telle chose.

Notez quun script, ou tout shebang -ed chose, ne peut pas être définie. Mais vous pouvez coder (en C) un petit setuid-binary qui lencapsule.

Sachez que sous Linux, le code de lapplication interagit avec le noyau Linux à laide de appels système (2) . La plupart dentre eux pourraient échouer, voir errno (3) . Beaucoup dapplications Linux (par exemple GNU bash , GNU make , GNU gdb , GNOME ) sont open source: vous êtes autorisé à télécharger puis étudier et contribuer à leur code source.

Commentaires

  • La programmation Linux avancée est un lien mort.

Réponse

Idéalement, si vous personnalisez les commandes qui peuvent être exécutées via sudo, vous devriez effectuer 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 (s) fichier (s). Vous ne devez JAMAIS accorder NOPASSWD sur les commandes ALL.

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

Insérez votre ligne en accordant lautorisation: myuser ALL= NOPASSWD: /path/to/your/program

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

Vous pouvez exécuter sudo -l pour voir les autorisations qui ont été accordées à votre utilisateur, le cas échéant Les commandes NOPASSWD apparaissent AVANT toute commande %groupyouarein ALL=(ALL) ALL dans la sortie, vous serez invité à entrer votre mot de passe.

Si vous trouvez vous créez vous-même beaucoup de ces fichiers sudoers.d, alors peut-être voudrez-vous les créer nommés par utilisateur afin quils soient plus faciles à visualiser. Gardez à lesprit que lordre des NOMS DE FICHIER et des REGLES dans le fichier est très important, le DERNIER chargé lemporte, quil soit PLUS ou MOINS permissif que les entrées précédentes.

Vous pouvez contrôler lordre des noms de fichiers en utilisant un préfixe de 00-99 ou aa / bb / cc, mais gardez également à lesprit que si vous avez des fichiers qui nont pas de préfixe numérique, ils se chargera 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 » le shell utilise dabord les nombres de tri et peut ensuite entrelacer les majuscules et les minuscules lors du tri dans lordre « croissant ».

Essayez dexé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 quel serait le meilleur préfixe de « dernière » lettre à utiliser be.

Réponse

Pour permettre à nimporte quel utilisateur dexécuter un 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 le fait.

Commentaires

  • Bien que ce ‘ soit lun des moyens daccomplir une règle sudo, il ne ‘ t répondez à la question de savoir pourquoi la définition de lindicateur NOPASSWD sur cette règle entraînait toujours une invite de mot de passe. Voir la réponse acceptée pour savoir pourquoi cela sest produit.

Réponse

Ce qui suit est pour le cas où vous souhaitez exécuter une commande sans mot de passe uniquement si elle a un ensemble doptions spécifique, où une partie des options est la variable . AFAIK il nest pas possible dutiliser des variables ou des plages de valeurs dans les déclarations sudoers, cest-à-dire que vous pouvez autoriser laccè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 auriez besoin davoir des lignes sudoers explicites pour chaque valeur possible de value1. Le script Shell fournit un moyen de contourner le problème.

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

  1. Créez un script shell dans lequel vous appeler la commande sans sudo.
  2. Enregistrez le script dans un dossier privilégié à la racine (par exemple /usr/local/bin/), faites 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 lexception 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 laffichage sous macOS. Pour ce faire, utilisez:

sudo pmset displaysleep time_in_minutes

Je considère que modifier le 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 jaimerais garder ces autres choses derrière le mot de passe sudo.

Jai donc ce qui suit script à /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, jai la ligne suivante:

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

Pour définir le délai dexpiration à 3 minutes, jexécute mon script à partir du compte dutilisateur ordinaire user_name:

sudo ds 3

PS La plupart de mon script est la validation dentrée, ce qui nest pas obligatoire, donc ce qui suit fonctionnerait également:

 #!/bin/bash pmset displaysleep $1  

Réponse

Vous pouvez également utiliser python paquet pudo .

Installation:

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

Voici lextrait de code à utiliser dans lautomatisation python pour exécuter des commandes sous 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 lexemple cmd pour exécuter des commandes sous le privilège root:

user$ pudo ls /root Desktop Downloads Pictures Music 

Réponse

Dans le script sudoers qui se trouve à lintérieur de / etc / décommentez la ligne ci-dessous:

#includedir /etc/sudoers.d

Créez un fichier avec nimporte quel nom dans le répertoire /etc/sudoers.d/ et ajoutez le contenu comme indiqué dans le nombre maximum de réponses. Comme pour tous les utilisateurs en tant que root

#!/bin/bash ALL ALL = NOPASSWD: /path/of/the/script/which/you/want/to/run/as/root 

Cest le moyen le plus sûr dexécuter le script avec lautorisation root.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *