web-dev-qa-db-fra.com

Comment corriger l'erreur 'Sudo: aucun tty présent et aucun programme askpass spécifié'?

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?

315
hebbo

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!

197
nicdaniau

Essayer:

  1. Utilisez la ligne NOPASSWD pour toutes les commandes, je veux dire:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Placez la ligne après toutes les autres lignes dans le fichier sudoers.

Cela a fonctionné pour moi (Ubuntu 14.04).

143
Fatemeh Jabbari

Essayer:

ssh -t remotehost "Sudo <cmd>"

Cela supprimera les erreurs ci-dessus.

132
user262129

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 source

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> 
84
Vingt Cent

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

38
rodrigo

Essaye celui-là:

echo '' | Sudo -S my_command
20
sNICkerssss

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
15
Vasili Pascal

Si par hasard vous êtes venu ici parce que vous ne pouvez pas utiliser Sudo dans Ubuntu fourni avec Windows 10

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

  2. Pour vous débarrasser de l'erreur no tty present, faites toujours Sudo -S <command>

15
Gubatron

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:

  1. Commenter Defaults requiretty

    # Defaults    requiretty
    
  2. Aller à la fin du fichier et ajouter 

    jenkins ALL=(ALL) NOPASSWD: ALL
    
12
Susil Parida

Assurez-vous que la commande que vous êtes Sudoing 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

8
omribahumi

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

8
Ankit Gupta

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
7
Alexander Mills

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

5
kenorb

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:

  1. Sur les systèmes basés sur Ubuntu, exécutez "$ Sudo visudo"

  2. cela ouvrira le fichier/etc/sudoers.

  3. Si votre utilisateur jenkins est déjà dans ce fichier, alors modifiez pour ressembler à ceci:

jenkins ALL = (ALL) NOPASSWD: ALL

  1. sauvegarder le fichier

  2. Relancez votre travail de Jenkins 

  3. vous ne devriez pas voir ce message d'erreur à nouveau :)

2
Chandra Pal

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.")

1
WhiteWinterWolf

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!

1
kihoon han

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

1
lakesare

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

1
dannrob

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.

0
u_Ltd.

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é

0
Abc Xyz

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.

0
JOduMonT

Autres options, non basées sur NOPASSWD:

  • Démarrez Netbeans avec le privilège root ((Sudo netbeans) ou similaire), ce qui entraînera vraisemblablement le processus de construction avec root et donc Sudo réussira automatiquement.
  • Effectuez les opérations dont vous avez besoin pour suexec - attribuez-leur la propriété à root et définissez le mode sur 4755. (Cela permettra bien sûr à tout utilisateur de la machine de l'exécuter.) Ainsi, il n'aura pas besoin de Sudo.
  • La création de fichiers de disque dur virtuel avec des secteurs de démarrage ne devrait pas nécessiter Sudo. Les fichiers ne sont que des fichiers et les secteurs de démarrage ne sont que des données. Même la machine virtuelle ne devrait pas nécessairement avoir besoin de root, sauf si vous effectuez un transfert de périphérique avancé.
0
Jon Watte