J'essaye de compiler certaines sources en utilisant un fichier makefile. Dans le fichier makefile, il y a un tas de commandes qui doivent être exécutées en tant que Sudo
.
Quand je compile les sources depuis un terminal, tout se passe bien et la marque est mise en pause la première fois qu'une commande Sudo
est exécutée en attente d'un mot de passe. Une fois le mot de passe saisi, assurez-vous de reprendre et de terminer.
Mais j'aimerais pouvoir compiler les sources dans NetBeans. J'ai donc démarré un projet et montré aux netbeans où trouver les sources, mais lorsque je compile le projet, cela donne l'erreur:
Sudo: no tty present and no askpass program specified
La première fois qu'il frappe une commande Sudo
.
J'ai examiné le problème sur Internet et toutes les solutions que j'ai trouvées indiquent une chose: désactiver le mot de passe pour cet utilisateur. Depuis l'utilisateur en question ici est la racine. Je ne veux pas faire ça.
N 'y a-t-il pas une autre solution?
Autoriser l'utilisateur à utiliser cette commande sans demander de mot de passe devrait résoudre le problème. Commencez par ouvrir une console Shell et tapez:
Sudo visudo
Puis éditez ce fichier pour l'ajouter à la toute fin:
username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand
par exemple
john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop
permettra à l'utilisateur john
to Sudo poweroff
, start
et stop
sans être invité à entrer un mot de passe.
Regardez au bas de l'écran les touches que vous devez utiliser dans visudo - ce n'est pas le cas d'ailleurs - et quittez sans enregistrer au premier signe d'un problème. Avertissement de santé: la corruption de ce fichier aura des conséquences graves, éditez-le avec précaution!
Essayer:
Utilisez la ligne NOPASSWD
pour toutes les commandes, je veux dire:
jenkins ALL=(ALL) NOPASSWD: ALL
Placez la ligne après toutes les autres lignes dans le fichier sudoers
.
Cela a fonctionné pour moi (Ubuntu 14.04).
Essayer:
ssh -t remotehost "Sudo <cmd>"
Cela supprimera les erreurs ci-dessus.
Après toutes les alternatives, j'ai trouvé:
Sudo -S <cmd>
L'option -S (stdin) amène Sudo à lire le mot de passe à partir de l'entrée standard au lieu du terminal.
La commande ci-dessus a toujours besoin d'un mot de passe. Pour supprimer manuellement le mot de passe, dans des cas similaires à jenkins, cette commande fonctionne:
echo <password> | Sudo -S <cmd>
Sudo
lira par défaut le mot de passe du terminal connecté. Votre problème est qu’aucun terminal n’est connecté lorsqu’il est exécuté à partir de la console Netbeans. Donc, vous devez utiliser un autre moyen pour entrer le mot de passe: cela s'appelle le programme askpass .
Le programme askpass n'est pas un programme en particulier, mais tout programme pouvant demander un mot de passe. Par exemple, dans mon système, x11-ssh-askpass
fonctionne bien.
Pour ce faire, vous devez spécifier le programme à utiliser, soit avec la variable d'environnement Sudo_ASKPASS
, soit dans le fichier Sudo.conf
(voir man Sudo
pour plus de détails).
Vous pouvez forcer Sudo
à utiliser le programme askpass en utilisant l'option -A
. Par défaut, il ne l'utilisera que s'il n'y a pas de terminal connecté.
Essaye celui-là:
echo '' | Sudo -S my_command
Pour les utilisateurs d'Ubuntu 16.04
Il y a un fichier que vous devez lire avec:
cat /etc/sudoers.d/README
Placer un fichier en mode 0440 dans /etc/sudoers.d/myuser avec le contenu suivant:
myuser ALL=(ALL) NOPASSWD: ALL
Devrait résoudre le problème.
N'oublie pas de:
chmod 0440 /etc/sudoers.d/myuser
Si par hasard vous êtes venu ici parce que vous ne pouvez pas utiliser Sudo dans Ubuntu fourni avec Windows 10
Modifiez le fichier/etc/hosts à partir de Windows (avec le Bloc-notes). Il se trouvera à l'emplacement suivant: %localappdata\lxss\rootfs\etc
, ajoutez 127.0.0.1 WINDOWS8
. Cela éliminera la première erreur selon laquelle il ne peut pas trouver l'hôte.
Pour vous débarrasser de l'erreur no tty present
, faites toujours Sudo -S <command>
Connectez-vous à votre linux. Feu suivant les commandes. Soyez prudent, car éditer sudoer est une proposition risquée.
$ Sudo visudo
Une fois que vi editor s'ouvre, apportez les modifications suivantes:
Commenter Defaults requiretty
# Defaults requiretty
Aller à la fin du fichier et ajouter
jenkins ALL=(ALL) NOPASSWD: ALL
Assurez-vous que la commande que vous êtes Sudo
ing fait partie de votre PATH
.
Si vous avez une seule entrée (ou plusieurs, mais pas ALL) dans la commande sudoers
, vous obtiendrez le Sudo: no tty present and no askpass program specified
lorsque la commande ne fait pas partie de votre chemin (et que le chemin complet n'est pas spécifié).
Vous pouvez résoudre ce problème en ajoutant la commande à votre PATH
ou en l'invoquant avec un chemin absolu, c'est-à-dire.
Sudo /usr/sbin/ipset
Au lieu de
Sudo ipset
En Jenkins:
echo '<your-password>' | Sudo -S command
Par exemple:-
echo '******' | Sudo -S service nginx restart
Vous pouvez utiliser Mask Password Plugin pour cacher votre mot de passe
Cela a fonctionné pour moi:
echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
où votre utilisateur est "myuser"
pour une image Docker, ce serait juste:
RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
La commande Sudo
échoue car elle tente de demander le mot de passe root et aucun pseudo-tty n'est alloué (car cela fait partie du script).
Vous devez soit vous connecter en tant que root pour exécuter cette commande, soit configurer les règles suivantes dans votre /etc/sudoers
(ou: Sudo visudo
):
# Members of the admin group may gain root privileges.
%admin ALL=(ALL) NOPASSWD:ALL
Assurez-vous ensuite que votre utilisateur appartient au groupe admin
(ou wheel
).
Idéalement (plus sûr), il serait de limiter les privilèges root uniquement à des commandes spécifiques pouvant être spécifiées en tant que %admin ALL=(ALL) NOPASSWD:/path/to/program
L'exécution de scripts Shell contenant des commandes Sudo de Jenkins risque de ne pas s'exécuter comme prévu. Pour résoudre ce problème, suivez
Étapes simples:
Sur les systèmes basés sur Ubuntu, exécutez "$ Sudo visudo"
cela ouvrira le fichier/etc/sudoers.
jenkins ALL = (ALL) NOPASSWD: ALL
sauvegarder le fichier
Relancez votre travail de Jenkins
vous ne devriez pas voir ce message d'erreur à nouveau :)
Pour référence, si quelqu'un d'autre rencontrait le même problème, j'étais bloqué pendant une bonne heure avec cette erreur qui ne devrait pas se produire puisque j'utilisais le paramètre NOPASSWD.
Ce que je ne savais PAS, c’est que Sudo peut générer le même message d’erreur lorsqu'il n’ya pas de tty et que la commande que l’utilisateur tente de lancer ne fait pas partie de la commande autorisée du fichier/etc/sudoers.
Voici un exemple simplifié du contenu de mon fichier avec mon numéro:
bguser ALL = NOPASSWD: \
command_a arg_a, \
command_b arg_b \
command_c arg_c
Lorsque bguser essaiera de lancer "Sudo command_b arg_b" sans aucun tty (bguser étant utilisé pour un démon), il rencontrera l'erreur "no tty present et aucun programme askpass spécifié".
Pourquoi?
Parce qu'une virgule est manquante en fin de ligne dans le fichier/etc/sudoers ...
(Je me demande même s'il s'agit d'un comportement attendu et non d'un bogue dans Sudo puisque le message d'erreur correct pour ce type de cas doit être "Désolé, l'utilisateur bguser n'est pas autorisé à s'exécuter, etc.")
Je pense que je peux aider quelqu'un avec mon cas.
D'abord, j'ai changé le paramètre utilisateur dans /etc/sudoers
en faisant référence à la réponse ci-dessus. Mais ça n'a toujours pas marché.
myuser ALL=(ALL) NOPASSWD: ALL
%mygroup ALL=(ALL:ALL) ALL
Dans mon cas, myuser
était dans la mygroup
.
Et je n'avais pas besoin de groupes. Donc, supprimé cette ligne.
(Ne devrait pas supprimer cette ligne comme moi, juste marquer le commentaire.)
myuser ALL=(ALL) NOPASSWD: ALL
Ça marche!
Cette erreur peut également survenir lorsque vous essayez d'exécuter une commande de terminal (nécessitant un mot de passe root) à partir d'un script non-shell, par exemple Sudo ls
(en guillemets) à partir d'un programme Ruby. Dans ce cas, vous pouvez utiliser l'utilitaire Expect ( http://en.wikipedia.org/wiki/Expect ) ou ses alternatives.
Par exemple, dans Ruby pour exécuter Sudo ls
sans obtenir Sudo: no tty present and no askpass program specified
, vous pouvez exécuter ceci:
require 'Ruby_expect'
exp = RubyExpect::Expect.spawn('Sudo ls', :debug => true)
exp.procedure do
each do
expect "[Sudo] password for _your_username_:" do
send _your_password_
end
end
end
[ceci utilise l'une des alternatives à l'extension Expect TCL: Ruby_expect gem].
J'avais cette erreur parce que j'avais limité mon utilisateur à un seul exécutable 'systemctl' et que j'avais mal configuré le fichier visudo.
Voici ce que j'ai eu:
jenkins ALL=NOPASSWD: systemctl
Cependant, vous devez inclure le chemin complet de l'exécutable, même s'il se trouve par défaut sur votre chemin, par exemple:
jenkins ALL=NOPASSWD: /bin/systemctl
Cela permet à mon utilisateur de jenkins de redémarrer les services sans avoir un accès root complet
Bien que cette question soit ancienne, elle reste pertinente pour mon système plus ou moins à jour. Après avoir activé le mode de débogage de Sudo (Debug Sudo /var/log/Sudo_debug all@info
dans /etc/Sudo.conf
), on m'a dirigé vers/dev: "/dev is world writable
". Donc, vous aurez peut-être besoin de vérifiez les permissions du fichier tty, en particulier celles du répertoire où réside le nœud tty/pts.
Personne n'a dit ce qui pourrait causer cette erreur. En cas de migration d'un hôte à un autre, n'oubliez pas de vérifier le nom d'hôte dans le fichier sudoers
C’est donc ma configuration/etc/sudoers
User_Alias POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/Sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL
si cela ne correspond pas
uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux
il va s'ouvrir cette erreur:
pas de tty présent et pas de programme askpass spécifié
Peut-être que la question ne dit pas clairement pourquoi aucune réponse ne lui correspondait, mais j'avais le même message d'erreur lorsque j'essayais de monter sshfs, ce qui nécessitait Sudo: la commande ressemble à ceci:
sshfs -o sftp_server="/usr/bin/Sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www
en ajoutant l'option -o debug
sshfs -o debug -o sftp_server="/usr/bin/Sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www
J'ai eu le même message de cette question:
Sudo: no tty present and no askpass program specified
Donc, en lisant d'autres réponses, je suis devenu un fichier dans /etc/sudoer.d/user
sur my.server.tld avec:
user ALL=NOPASSWD: /usr/lib/openssh/sftp-server
et maintenant je peux monter le disque sans donner trop de droit supplémentaire à mon utilisateur.
Autres options, non basées sur NOPASSWD: