J'ai besoin d'exécuter quelque chose comme sudo sans mot de passe, alors j'ai utilisé visudo
et ajouté ceci à mon sudoers
fichier:
MYUSERNAME ALL = NOPASSWD: /path/to/my/program
Puis 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?
/path/to/my/program
s'agissait d'un script python?.bashrc
)? Ou même un script shell à l'intérieur/usr/local/sbin
? Essayer./etc
, mais certains systèmes le placent ailleurs. Si vous ne le trouvez pas, essayezman sudoers
. L'emplacement local de ce fichier doit être remplacé par laman
page au moment de lasudo
création de ce système.S'il y a plusieurs entrées correspondantes
/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 que vous souhaitez pouvoir exécuter une commande particulière sans invite de mot de passe, vous avez besoin de l'exception en dernier lieu.Notez l'utilisation de
(root)
, pour permettre au programme d'être exécuté en tant que root mais pas en tant qu'autre utilisateur. (Ne donnez pas plus d'autorisations que le minimum requis, à moins que vous n'ayez réfléchi aux implications.)Remarque pour les lecteurs qui n'exécutent pas Ubuntu ou qui ont modifié la configuration sudo par défaut (le sudo d'Ubuntu est correct par défaut) : L'exécution de scripts de shell avec des privilèges élevés est risquée. Vous devez donc démarrer à partir d'un environnement propre (une fois le shell lancé, 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 avez
Defaults env_reset
dans/etc/sudoers
ou que cette option est la valeur par défaut à la compilation (sudo sudo -V | grep env
devrait inclureReset the environment to a default set of variables
).la source
john ALL=(ALL) NOPASSWD: all
. Il ne sert à rien de passer parsu
.sudoers
, vous n'avez rien de spécial à faire:sudo
vérifiez-le à chaque fois.AVERTISSEMENT : Cette réponse a été jugée peu 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-le
create_dir.sh
par le nom de script souhaité):Le script sera créé dans le répertoire personnel de l'utilisateur.
Ajoutez des commandes que seul un utilisateur
root
ou unsudo
utilisateur peut exécuter, par exemple en créant un dossier au niveau du répertoire racine:Remarque: N'ajoutez pas
sudo
à ces commandes. Sauvegarder et quitter (utiliser:wq!
)Attribuez-lui des autorisations d'exécution en utilisant:
Apportez des modifications pour que ce script ne nécessite pas de mot de passe.
Ouvrez le
sudoers
fichier:Ajoutez la ligne suivante à la fin:
Remplacez
ahmad
par quel que soit 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 ceci: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/
la source
sudo
partie desudo chmod u+x create_dir.sh
est inutile car l'utilisateur est (vraisemblablement) propriétaire de son répertoire personnel. Étant donné que l'utilisateur peut écrire surcreate_dir.sh
, vous lui avez effectivement attribué un shell root libre.chmod
est inutile, puisque vous comptezsudo
surélever vos privilèges.Je pense que votre syntaxe est fausse. Au moins, j'utilise ce qui suit pour moi:
la source
(ALL)
partie est optionnelle, le laisser sortir a exactement le même effet. Ce(root)
serait mieux si, mais son absence n'explique pas le problème.Si vous voulez éviter de devoir utiliser sudo ni modifier le fichier de configuration sudoers, vous pouvez utiliser:
Cela fera exécuter la commande en tant que root sans avoir besoin de sudo.
la source
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:
La SEULE façon de le voir est sous les privilèges root, vous ne pouvez pas lister ce répertoire sans celui-ci, 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 ou les lignes suivantes pour obtenir la ou les configurations souhaitées:
Ignorer l'authentification pour un groupe
ou Ignorer l'authentification pour un utilisateur
ou Ignorer l'authentification d'un exécutable pour un utilisateur spécifique
NOTE RAPIDE: Vous ouvrez une porte à l’utilisation de SUDO sans authentification, ce qui signifie que vous pouvez exécuter tout ce qui est modifié de votre système, et l’utiliser de manière responsable.
la source
Vérifiez que sudo n'est pas aliasé. Courir comme ça
Par exemple, un alias de shell comme celui-ci:
peut causer ce comportement.
la source
sudoers
byo. Ou est-ce que vous parlez de redirigersudo
vers quelque chose qui affiche toujours ce message d'erreur pour récupérer les mots de passe? C'est peu probable ici ...alias sudo="sudo env PATH=$PATH"
dans ma~/.bashrc
. Plutôt que de simplement résoudre le problème pour moi-même et de façon aveugle, je soumettais ma réponse comme une solution possible pour quiconque prend ce fil.Lorsque vous exécutez votre script, vous devez l'exécuter en tant que
sudo /path/to/my/script
.Edit: En fonction 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
une invite visuelle de mot de passe.Vous devriez probablement considérer que l’idée que vous ne devriez pas exécuter les choses en tant que root et que changer le système plus tard pour ne plus avoir besoin d’autorisations root serait une meilleure solution.
la source
Cela a résolu le problème pour moi (j'ai également essayé d'autres réponses qui auraient pu aider):
Le script que j'appelais se trouvait dans
/usr/bin
un répertoire sur lequel je n'ai pas l'autorisation d'écriture (bien que je puisse généralement lire tous les fichiers là-bas). Le script était chmodded + x (autorisation exécutable), mais cela ne fonctionnait toujours pas. En déplaçant ce fichier vers un chemin de mon répertoire personnel,/usr/bin
j'ai finalement pu l'appeler avec sudo sans entrer de mot de passe.De plus, quelque chose me faisait douter (clarifier pour les futurs lecteurs): Vous devez exécuter votre script en tant que sudo. Tapez
sudo
lors de l' appel du script. N'utilisez passudo
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'en avez pas besoin et cela semble être une meilleure solution que de ne pas le faire.la source
sudo
intérieur d'un script est parfaitement correct à condition que vous disposiez des droits appropriés (définis danssudoers
) pour exécuter la commande en question sans mot de passe. Cela sécurise un peu les choses.Une autre possibilité consiste à installer, configurer, puis utiliser la super commande pour exécuter votre script en tant que
Si vous voulez exécuter certains binaire exécutable (par exemple , que vous avez compilé dans ELF binaire à partir du code source C) -qui est pas un Script- en tant que root, vous pourriez envisager d'en faire setuid (et en fait
/bin/login
,/usr/bin/sudo
et/bin/su
etsuper
utilisent tous cette technique ) Cependant, soyez très prudent, vous pourriez ouvrir une énorme faille de sécurité .Concrètement, votre programme doit être codé paranoïaquement (vérifiez donc tous les arguments, ainsi que l’environnement et les conditions extérieures avant de "jouer", en supposant un utilisateur potentiellement hostile), puis vous pouvez utiliser soigneusement seteuid (2) et friends (voir aussi setreuid (2) ) (voir aussi les capacités (7) et les identifiants (7) & execve (2) ...)
Vous utiliserez
chmod u+s
(lisez chmod (1) ) lors de l'installation d'un tel binaire.Mais soyez très prudent .
Lisez beaucoup de choses sur setuid , y compris la programmation Linux avancée , avant de coder une telle chose.
Notez qu'un script, ou tout le tralala chose -ed, ne peuvent pas être setuid. Mais vous pourriez coder (en C) un petit setuid-binary le recouvrant.
la source
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/
plutôt que de les modifiersudoers
directement. Vous devriez également toujours utiliservisudo
pour éditer le (s) fichier (s). Vous ne devriez JAMAIS accorderNOPASSWD
deALL
commandes.Exemple:
sudo visudo -f /etc/sudoers.d/mynotriskycommand
Insérez votre ligne accordant la permission:
myuser ALL= NOPASSWD: /path/to/your/program
Puis enregistrez et quittez et
visudo
vous avertirons si vous avez des erreurs de syntaxe.Vous pouvez exécuter
sudo -l
pour voir les autorisations accordées à votre utilisateur. Si l'une desNOPASSWD
commandes spécifiques à l'utilisateur apparaît AVANT une%groupyouarein ALL=(ALL) ALL
commande dans la sortie, vous serez invité à entrer votre mot de passe.Si vous êtes en train de créer beaucoup de ces fichiers sudoers.d, vous voudrez peut-être les créer nommés par utilisateur pour faciliter leur visualisation. 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 gagne, qu'il soit PLUS ou MOINS permissif que les entrées précédentes.
Essayez de lancer
printf '%s\n' {{0..99},{A-Z},{a-z}} | sort
etprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort
de voir si votre langue actuelle est imprimée,AaBbCc
etc. ouABC
ensuiteabc
de déterminer quel serait le meilleur préfixe de la dernière lettre à utiliser.la source
Pour autoriser tout utilisateur à exé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.
la source
Le cas suivant concerne le cas où vous souhaitez exécuter une commande sans mot de passe uniquement si elle contient un ensemble d'options spécifique, où une partie des options est variable . Autant que je sache, 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 de manière explicite
command option1
mais sanscommand option2
utiliser:user_name ALL=(root) /usr/bin/command option1
mais si la structure est
command option1 value1
, oùvalue1
peut varier, vous devez disposer de lignes sudoers explicites pour chaque valeur possible devalue1
. Le script shell permet 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é.
sudo
./usr/local/bin/
), faites en sorte que le fichier soit la propriété de 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 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 veille de l'affichage sous macOS. Ceci est fait en utilisant:
sudo pmset displaysleep time_in_minutes
Je considère que changer le délai de veille est une action innocente qui ne justifie pas les tracas liés à la saisie d'un mot de passe, mais qui
pmset
peut faire beaucoup de choses et j'aimerais garder ces autres choses derrière le mot de passe sudo.J'ai donc le script suivant sur
/usr/local/bin/ds
:À la fin du
sudoers
fichier, 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 d'utilisateur ordinaire
user_name
:sudo ds 3
PS La majeure partie de mon script est une validation d’entrée, qui n’est pas obligatoire. Par conséquent, les éléments suivants fonctionnent également:
la source