Comment réparer l'erreur 'sudo: aucun tty présent et aucun programme askpass spécifié'?

438

J'essaye de compiler quelques sources en utilisant un makefile. Dans le makefile, il y a un tas de commandes qui doivent être exécutées en tant que sudo.

Lorsque je compile les sources à partir d'un terminal, tout se passe bien et la création est interrompue la première fois qu'une sudocommande est exécutée en attendant le mot de passe. Une fois que j'ai tapé le mot de passe, faites des CV et terminez.

Mais j'aimerais pouvoir compiler les sources dans NetBeans. J'ai donc commencé un projet et montré à netbeans où trouver les sources, mais quand je compile le projet, il donne l'erreur:

sudo: no tty present and no askpass program specified

La première fois qu'il frappe une sudocommande.

J'ai recherché le problème sur Internet et toutes les solutions que j'ai trouvées pointent vers une chose: désactiver le mot de passe pour cet utilisateur. Puisque l'utilisateur en question ici est root. Je ne veux pas faire ça.

N 'y a-t-il pas une autre solution?

hebbo
la source
3
Je compile un système d'exploitation jouet. J'ai besoin de faire quelques trucs pour configurer la VM, y compris la création d'un disque dur virtuel avec un secteur de démarrage.
hebbo
Comme indiqué dans serverfault.com/a/597268 , a sudo -n my-commandfonctionné pour moi. Salut!
andreyevbr
1
Veuillez choisir une réponse.
ichimaru
1
@andreyevbr je ne pense pas. sudo: a password is required
ichimaru

Réponses:

260

Accorder à l'utilisateur d'utiliser cette commande sans demander de mot de passe devrait résoudre le problème. Ouvrez d'abord une console shell et tapez:

sudo visudo

Modifiez ensuite ce fichier pour l'ajouter à la fin:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

par exemple

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

permettra à l'utilisateur johnde sudo poweroff, startet stopsans être invité pour le mot de passe.

Regardez en bas de l'écran pour les touches que vous devez utiliser dans visudo - ce n'est pas vi d'ailleurs - et quittez sans enregistrer au premier signe de problème. Avertissement de santé: la corruption de ce fichier aura de graves conséquences, modifiez-le avec soin!

nicdaniau
la source
4
Oui, la page de manuel de sudoers m'a ouvert les yeux sur la façon dont sudo est réellement censé être utilisé.
Spencer Williams
6
visudo devrait s'ouvrir dans l'EDITEUR que votre environnement est configuré pour utiliser, ce qui pourrait très bien être (et devrait être ^ _ ^) vi.
Matt Styles
8
Assurez-vous que la ligne de correspondance NOPASSWD est APRÈS toutes les autres lignes sudo qui peuvent correspondre (comme% wheel) qui n'ont pas l'indicateur NOPASSWD.
anthony
27
je ne peux pas "sudo visudo" parce que je ne peux pas sudo en premier lieu!
Gubatron
8
Pensez à ajouter un fichier à /etc/sudoers.d et à laisser le fichier visudo intact.
xlttj
183

Essayer:

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

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  2. Mettez la ligne après toutes les autres lignes du sudoersfichier.

Cela a fonctionné pour moi (Ubuntu 14.04).

Fatemeh Jabbari
la source
13
J'ai d'abord ajouté la ligne après d'autres configurations utilisateur, mais cela ne fonctionnait que lorsqu'elle était placée en dernière ligne du fichier sur lubuntu 14.04.1.
user77115
La deuxième partie était la solution dont j'étais ce dont j'avais besoin. Une ligne de configuration existante (pour le groupe de roues) correspondait également à ma commande sudo mais sans l'entrée NOPASSWD :. Placer ma nouvelle ligne après lui a donné la priorité, ne permettant aucun mot de passe pour la commande spécifique dont j'avais besoin.
anthony
5
Comme l'a mentionné @ user77115, cela ne fonctionne que si vous le placez comme dernière ligne dans le fichier sudoers, même avec Ubuntu 16.04. En remarque, donner des autorisations sudo à jenkins pour toutes les commandes est un problème de sécurité assez important. Pensez à envelopper vos scripts jenkins et à ne donner accès qu'à des commandes spécifiques telles que: jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov
jenkinsest juste un nom d'utilisateur? Il doit s'agir du nom d'utilisateur de l'utilisateur de la machine hôte? Que faire si le nom d'utilisateur sur la machine hôte correspond au nom d'utilisateur du serveur distant?
mrgloom
ceci est spécifique à jenkins, ressemble à stackoverflow.com/a/22651598/1041319 est une solution plus générique.
arntg
167

Essayer:

ssh -t remotehost "sudo <cmd>"

Cela supprimera les erreurs ci-dessus.

user262129
la source
7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machinevoir aussi: sudo-no-tty-present-and-no-askpass-program-specifiedsudo -A Permet également de définir un sudoprogramme askpass, mais je ne vois que les interfaces graphiques. Quelqu'un connaît-il un askpass à autoriser ssh remotehost sudo -A askpass?
ici le
1
Correction, le -Afor sudone prend pas d'arguments et nécessite à la place un environnement SUDO_ASKPASSou un sudo.conf So ssh remotehost sudo -A commandfonctionnerait toujours. Toujours curieux d'un programme askpass basé sur un terminal.
ici le
7
cela ne fonctionne pas pour moi (probablement parce que j'appelle ssh à partir d'un script), ce qui me donne l'erreur Pseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte
Fonctionne très bien pour moi. Merci!
xfra35
1
Cela ne répond pas à la question.
bschlueter
126

Après toutes les alternatives, j'ai trouvé:

sudo -S <cmd>

L'option -S (stdin) oblige sudo à lire le mot de passe à partir de l'entrée standard au lieu du terminal.

La source

La commande ci-dessus nécessite toujours la saisie du mot de passe. Pour supprimer la saisie du mot de passe manuellement, dans des cas comme jenkins, cette commande fonctionne:

echo <password> | sudo -S <cmd> 
Vingt Cent
la source
Cela semble résoudre mon problème. Mais y a-t-il un effet secondaire en utilisant cette commande?
Xiaodong Qi
3
sudo -S <command>- truese trouve juste être une commande fictive qui renvoie un code de sortie de 0 ( falseest une commande qui renvoie 1). Merci, c'est la seule vraie réponse, car tous les autres s'attendent à ce que "sudo" fonctionne!
Adam Plocher
1
-S: écrivez l'invite à l'erreur standard et lisez le mot de passe à partir de l'entrée standard au lieu d'utiliser le terminal. Le mot de passe doit être suivi d'un caractère de nouvelle ligne.
fileinster
Cela fonctionne tout de suite et peut faire fonctionner sudo jusqu'à expiration, mais ne résout pas les problèmes sous-jacents qui pourraient exister et le problème peut réapparaître.
nealmcb du
Je ne sais pas si ça marche mais ça se voit Password:alors rien ne se passe. Je ne peux pas taper le mot de passe.
ichimaru
43

sudopar défaut lira le mot de passe depuis le terminal connecté. Votre problème est qu'aucun terminal n'est connecté lorsqu'il est exécuté à partir de la console Netbeans. Vous devez donc utiliser une autre manière d'entrer le mot de passe: c'est le programme askpass .

Le programme askpass n'est pas un programme particulier, mais tout programme pouvant demander un mot de passe. Par exemple, dans mon système x11-ssh-askpassfonctionne bien.

Pour ce faire, vous devez spécifier le programme à utiliser, soit avec la variable d'environnement, SUDO_ASKPASSsoit dans le sudo.conffichier (voir man sudopour 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é.

rodrigo
la source
La solution actuelle nécessite un gui. Quel programme askpass fonctionne sur le terminal.
ici le
@ici: Eh bien ... si vous exécutez ssh à partir d'un terminal, il vous demandera un mot de passe directement, vous n'avez besoin de rien de spécial ... Ou demandez-vous de demander le mot de passe à un terminal différent de celui qui le fera exécuter la session ssh?
rodrigo
1
ahh maintenant je vois que -Aça ne prend pas d'arguments. -Anécessite un environnement SUDO_ASKPASSou un sudo.conffichier. Dans ce cas, ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"fonctionnerait toujours avec un askpass basé sur un terminal, mais @chandru est beaucoup plus concis ci-dessous avecssh -t ...
ici le
Il y a quelques cavats avec l'utilisation de -A. Tout d'abord, si -A est utilisé et que SUDO_ASKPASS n'a pas été défini, vous obtiendrez une erreur. Deuxièmement, lorsque -A est utilisé, ssh n'utilisera pas les informations d'identification mises en cache, il demandera toujours un mot de passe.
anthony
Comme adendum, vous aimerez peut-être consulter mes notes sur les programmes de saisie de mot de passe ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
anthony
26

Pour les utilisateurs d'Ubuntu 16.04

Il y a un fichier avec lequel vous devez lire:

cat /etc/sudoers.d/README

Placer un fichier avec le 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
Vasili Pascal
la source
Agréable. Solution plus propre que la populaire.
Paul Praet
2
Ne suivez pas cela aveuglément. J'ai créé un nouveau fichier dans /etc/sudoers.d comme décrit ici et j'ai fini par ne plus pouvoir utiliser sudo. J'ai dû supprimer le fichier via le mode de récupération.
Stian
25

Essaye celui-là:

echo '' | sudo -S my_command
sNICkerssss
la source
Cela fonctionne pour moi, mais quelqu'un peut-il expliquer pourquoi cela aide?
ololobus
@ololobus vous envoyez un mot de passe vide à la première invite pour entrer le mot de passe
Nikita Koksharov
Travaillé! Aucune des réponses les mieux notées ne l'a résolu pour moi.
drerD
1
Il renvoie l'erreur suivante: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
alper
16

Si par hasard vous êtes venu ici parce que vous ne pouvez pas sudo à l'intérieur d'Ubuntu fourni avec Windows10

  1. Modifiez le fichier / etc / hosts à partir de Windows (avec le Bloc-notes), il sera situé dans %localappdata\lxss\rootfs\etc:, ajoutez 127.0.0.1 WINDOWS8, cela supprimera la première erreur selon laquelle il ne peut pas trouver l'hôte.

  2. Pour vous débarrasser de l' no tty presenterreur, faites toujourssudo -S <command>

Gubatron
la source
2
Merci d'avoir fourni une réponse aux personnes qui sont venues ici pour une raison sans rapport avec la description de la question, mais correspondant au titre de la question. +1
Jayant Bhawal
15

Connectez-vous à votre Linux. Déclenchez les commandes suivantes. Soyez prudent, car l'édition sudoer est une proposition risquée.

$ sudo visudo

Une fois l'éditeur vi ouvert, apportez les modifications suivantes:

  1. Commenter Defaults requiretty

    # Defaults    requiretty
    
  2. Allez à la fin du fichier et ajoutez

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

À Jenkins :

echo '<your-password>' | sudo -S command

Par exemple : -

echo '******' | sudo -S service nginx restart

Vous pouvez utiliser le plugin Mask Password pour masquer votre mot de passe

Ankit Gupta
la source
11

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
Alexander Mills
la source
9

Assurez-vous que la commande que vous utilisez sudofait partie de votre PATH.

Si vous avez une seule sudoersentrée de commande (ou plusieurs, mais pas TOUS) , vous obtiendrez le sudo: no tty present and no askpass program specifiedlorsque la commande ne fait pas partie de votre chemin (et que le chemin complet n'est pas spécifié).

Vous pouvez le corriger en ajoutant la commande à votre PATHou en l'invoquant avec un chemin absolu, c'est-à-dire

sudo /usr/sbin/ipset

Au lieu de

sudo ipset

omribahumi
la source
1
C'est en fait fourchu pour moi. in sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/gitet en utilisant sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitin git post-update hook return no tty, mais en utilisant sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitwork sans mot de passe.
Foton
7

La commande sudoéchoue car elle essaie de demander le mot de passe root et aucune pseudo-tty n'est allouée (car elle fait partie du script).

Vous devez vous connecter en tant que root pour exécuter cette commande ou 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 admingroupe (ou wheel).

Idéalement (plus sûr), il faudrait limiter les privilèges root uniquement à des commandes spécifiques qui peuvent être spécifiées comme %admin ALL=(ALL) NOPASSWD:/path/to/program

kenorb
la source
Je sais, c'est une façon beaucoup plus sûre de le faire. Bien, j'ai écrit la commande suivante dans le sudoersfichier apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shmais cela ne fonctionne pas pour moi. cela donne l'erreur suivantesudo: >>> /etc/sudoers: syntax error near line 120 <<< sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
muaaz
1
BTW, cela fonctionne bien apache ALL=(ALL) NOPASSWD: ALLmais un risque pour la sécurité. :)
muaaz
6

Je pense que je peux aider quelqu'un avec mon cas.

Tout d'abord, j'ai changé le paramètre utilisateur en me /etc/sudoersréférant à la réponse ci-dessus. Mais cela n'a toujours pas fonctionné.

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL

Dans mon cas, myuserétait dans le 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!

kihoon han
la source
3

L'exécution de scripts shell contenant des commandes sudo à partir de jenkins peut 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, modifiez-le pour qu'il ressemble à ceci:

jenkins ALL = (ALL) NOPASSWD: TOUS

  1. enregistrez le fichier

  2. Relancez votre travail jenkins

  3. vous ne devriez plus voir ce message d'erreur :)

Chandra Pal
la source
3

J'ai pu le faire, mais assurez-vous de suivre les étapes correctement. C'est pour toute personne qui obtient des erreurs d'importation.

Étape 1 : Vérifiez si les fichiers et les dossiers ont un problème de permission d'exécution. Utilisation utilisateur Linux:

chmod 777 filename

Étape 2 : vérifiez quel utilisateur est autorisé à l'exécuter.

Étape 3 : ouvrez le terminal, tapez cette commande.

sudo visudo

ajoutez ces lignes au code ci-dessous

www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL

il s'agit d'accorder la permission d'exécuter le script et de lui permettre d'utiliser toutes les bibliothèques. L'utilisateur est généralement «personne» ou «www-data».

éditez maintenant votre code comme

echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');

allez au terminal pour vérifier si le processus est en cours, tapez ceci ici ...

ps aux | grep python

cela affichera tout le processus en cours d'exécution en python.

Modules complémentaires : utilisez le code ci-dessous pour vérifier les utilisateurs de votre système

cut -d: -f1 /etc/passwd

Merci!

3rdi
la source
2

Cette erreur peut également survenir lorsque vous essayez d'exécuter une commande de terminal (qui nécessite un mot de passe root) à partir d'un script non shell, par exemple sudo ls(dans les raccourcis) à 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 lssans 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].

Lakesare
la source
2

Pour référence, au cas où quelqu'un d'autre rencontrerait le même problème, j'étais coincé 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 exactement le même message d'erreur lorsqu'il n'y a pas de tty et que la commande que l'utilisateur essaie de lancer ne fait pas partie de la commande autorisée dans le fichier / etc / sudoers.

Voici un exemple simplifié du contenu de mon fichier avec mon problème:

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

Lorsque bguser tentera de lancer "sudo command_b arg_b" sans aucun tty (bguser étant utilisé pour certains démons), il rencontrera l'erreur "no tty present and no askpass program specified".

Pourquoi?

Parce qu'il manque une virgule à la fin de la 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 car le message d'erreur correct pour un tel cas devrait être "Désolé, l'utilisateur bguser n'est pas autorisé à s'exécuter, etc.")

WhiteWinterWolf
la source
2

J'obtenais cette erreur parce que j'avais limité mon utilisateur à un seul «systemctl» exécutable et j'avais mal configuré le fichier visudo.

Voici ce que j'avais:

jenkins ALL=NOPASSWD: systemctl

Cependant, vous devez inclure le chemin d'accès complet à l'exécutable, même s'il se trouve sur votre chemin par défaut, par exemple:

jenkins ALL=NOPASSWD: /bin/systemctl

Cela permet à mon utilisateur jenkins de redémarrer les services mais ne pas avoir un accès root complet

dannrob
la source
1

Personne n'a dit ce qui pouvait provoquer 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:

Voici 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

s'il 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 affichera cette erreur:

aucun tty présent et aucun programme askpass spécifié

Abc Xyz
la source
1

Autres options, non basées sur NOPASSWD:

  • Démarrez Netbeans avec le privilège root ((sudo netbeans) ou similaire) qui va vraisemblablement bifurquer le processus de construction avec root et donc sudo réussira automatiquement.
  • Faites les opérations dont vous avez besoin pour faire suexec - faites-les appartenir à root et définissez le mode sur 4755. (Cela permettra bien sûr à n'importe quel utilisateur de la machine de les exécuter.) De cette façon, ils n'ont pas du tout besoin de sudo.
  • La création de fichiers de disque dur virtuel avec des secteurs de démarrage ne devrait pas du tout avoir besoin de 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, à moins que vous ne fassiez un transfert de périphérique avancé.
Jon Watte
la source
1

Peut-être que la question n'est pas claire: pourquoi aucune réponse ne la correspondait, mais j'ai eu le même message d'erreur lorsque j'essayais de monter sshfs, ce qui nécessitait sudo: la commande est quelque chose comme 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 les autres réponses, je suis devenu un fichier /etc/sudoer.d/usersur my.server.tld avec:

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

et maintenant je peux monter le disque sans donner trop de droits supplémentaires à mon utilisateur.

JOduMonT
la source
0

Bien que cette question soit ancienne, elle est toujours d'actualité 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@infoin /etc/sudo.conf), j'ai été pointé sur / dev: " /dev is world writable". Vous devrez donc peut-être vérifier les autorisations du fichier tty , en particulier celles du répertoire dans lequel réside le nœud tty / pts.

u_Ltd.
la source
0

1 ouvrez / etc / sudoers

type sudo vi /etc/sudoers. Cela ouvrira votre fichier en mode édition.

2 Ajouter / modifier un utilisateur Linux

Recherchez l'entrée pour l'utilisateur Linux. Modifiez comme ci-dessous si trouvé ou ajoutez une nouvelle ligne.

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 Enregistrer et quitter le mode édition

Maulik Kakadiya
la source
0

Si vous ajoutez cette ligne à votre /etc/sudoers(via visudo) cela résoudra ce problème sans avoir à désactiver la saisie de votre mot de passe et quand un alias pour sudo -Sne fonctionnera pas (appels de scripts sudo):

Defaults visiblepw

Bien sûr, lisez le manuel vous-même pour le comprendre, mais je pense que pour mon cas d'utilisation de l'exécution dans un conteneur LXD via lxc exec instance -- /bin/bashson assez sûr car il n'imprime pas le mot de passe sur un réseau.

salotz
la source
0

Utilisation du pipeline:

echo your_pswd | sudo -S your_cmd

En utilisant ici-document:

sudo -S cmd <<eof
pwd
eof
#remember to put the above two lines without "any" indentations.

Ouvrez un terminal pour demander le mot de passe (celui qui fonctionne):

gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"
Himanshu Tanwar
la source