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
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 parsu
. - 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é:
-
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
-
Ajoutez des commandes que seuls un
root
ousudo
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!
) -
Attribuez-lui des autorisations dexécution en utilisant:
sudo chmod u+x create_dir.sh
-
Apportez des modifications afin que ce script ne nécessite pas de mot de passe.
-
Ouvrez le
sudoers
fichier:sudo visudo -f /etc/sudoers
-
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.
-
-
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
desudo chmod u+x create_dir.sh
est inutile car lutilisateur est (vraisemblablement) propriétaire de son répertoire personnel. Puisque lutilisateur peut écrire danscreate_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 sursudo
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 redirigersudo
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 danssudoers
) 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é.
- Créez un script shell dans lequel vous appeler la commande sans
sudo
. - Enregistrez le script dans un dossier privilégié à la racine (par exemple
/usr/local/bin/
), faites le fichier appartenant à la racine (par exemplechown root:wheel /usr/local/bin/script_name
) sans accès en écriture pour les autres (par exemplechmod 755 /usr/local/bin/script_name
). -
Ajoutez lexception aux sudoers utilisant visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
. -
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.
/path/to/my/program
était un script python?.bashrc
)? Ou même un script shell dans/usr/local/sbin
? À essayer./etc
, mais certains systèmes le mettent ailleurs. Si vous pouvez ‘ t le trouver, essayezman sudoers
. Lemplacement local de ce fichier doit être remplacé parman
à lépoquesudo
a été créée pour ce système.