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?
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.
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
).
Solution complète: Les étapes suivantes vous aideront à atteindre la sortie souhaitée:
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
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!
)
Attribuez-lui des autorisations d'exé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 fichier sudoers
:
Sudo visudo -f /etc/sudoers
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.
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/
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
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.
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é.
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.
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.
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.
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.
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.
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
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.
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é.
Sudo
./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
).Ajoutez l'exception 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 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