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


73

Lors de la tentative d'exécution d'un fichier binaire distant à l'aide sudode la boîte distante:

ssh remotehost "sudo ./binary"

Je vois cette erreur:

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

Comment puis-je contourner cela?

EDIT, ce n’est certainement pas un double de la question suggérée en tant que telle. Les réponses sont totalement hors de propos. En fait, ces modifications apportées au fichier sudoers ont déjà été appliquées à l'hôte distant.


Réponses:


78

Un moyen simple est de spécifier -t:

ssh -t remotehost "sudo ./binary"

De la page de manuel:

Forcer l'allocation de pseudo-tty. Cela peut être utilisé pour exécuter des programmes d'écran arbitraires sur une machine distante, ce qui peut s'avérer très utile, par exemple lors de la mise en œuvre de services de menu. Les options -t multiples forcent l'allocation tty, même si ssh n'a pas de tty local.

Je ne peux pas expliquer exactement pourquoi cela fonctionne, et il pourrait y avoir un meilleur moyen. J'aimerais en entendre parler si oui :)

@psusi explique pourquoi cela fonctionne dans un commentaire ci-dessous.


14
Cela fonctionne car il sudodemande à un tty de demander un mot de passe, et lorsqu’il spécifie les commandes à exécuter ssh, il n’en attribue pas un par défaut, car il est normalement utilisé pour exécuter des commandes non interactives susceptibles de transférer des données binaires, ce qui peut provoquer le déclenchement du tty. .
Psusi

@ psusi Connaissez-vous la réponse à cette question? unix.stackexchange.com/questions/110841
trusktr

Il est également -ttnécessaire de passer un commandement en utilisant heredoc
Rufus

26

Question:

Comment puis-je contourner cela?

sudo: no tty present and no askpass program specified

Réponse alternative

Au lieu de cela, essayez:

sudo -S ./binary

Ceci oblige sudo à lire le mot de passe à partir de l'entrée standard, stdin.

Scénarios où cela aide

Dans les environnements chrootés, ces autres réponses peuvent ne pas fonctionner correctement ... peut-être parce que:

  1. / etc / shadow vs / etc / passwd n’empêchent pas l’utilisateur de saisir un mot de passe.
  2. Dans un environnement chrooté, l'accès à tty1 peut être un peu complexe, et ctrl-alt f2 - to tty2 est irréalisable, car il s'agit d'un tty de l'environnement non chrooté.

Par exemple: Installation / réparation manuelle de Linux ou du chargeur de démarrage, à l'aide d'un environnement chroot (tel que Archlinux et arch-chroot).


Je reçois une erreur sudo: ./binary: command not found lorsque je lance sudo -S ./binary, que donne-t-il?
Ajit Goel

5

Vous devez définir un terminal / une application qui lira le mot de passe. Il y a deux variantes:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (Par défaut visiblepw)

11
N’est-il pas préférable d’utiliser visudoplutôt que vim /etc/sudoerspour éviter d’être bloqué en dehors de votre machine à cause d’une erreur de montage?
Drew Noakes

2

Il échoue car il sudoessaie de demander le mot de passe root et aucun pseudo-tty n'est alloué.

Vous devez soit vous connecter en tant que root, 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

Ensuite, assurez-vous que votre utilisateur appartient au admingroupe (ou wheel).


Bien que ce ne soit pas vrai (aucune preuve n’est donnée à ce sujet, et les utilisateurs du groupe admin avec ce code dans les systèmes centos et ubuntu obtiennent toujours l’erreur), c’est un bon conseil pour la communication à distance de créer des groupes et des règles basées sur ces groupes. escalade des tâches
MrMesees

2

Vous pouvez également créer un fichier du type "sudo_shutdown" dans /etc/sudoers.d, avec le contenu:

# Allow admins to shutdown without pass
%adm ALL=(ALL) NOPASSWD: /sbin/shutdown

Cela permet aux utilisateurs du groupe adm de s’arrêter sans mot de passe.


3
Aviez-vous l'intention de modifier cela pour couvrir "aucun cadeau présent"
Elder Geek Le

2

Dans mon cas, j'ai reçu cette erreur parce que je ne spécifiais pas de commande que je voudrais utiliser comme racine dans sudoers

Quelque chose comme

/etc/sudoers.d/myuser:

myuser ALL=(root) NOPASSWD: \
    /bin/ls -la

a travaillé pour moi

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.