sudo: keine tty vorhanden und kein askpass programm angegeben


73

Wenn Sie versuchen, eine Remote-Binärdatei mit sudoder Remote-Box auszuführen :

ssh remotehost "sudo ./binary"

Ich sehe diesen Fehler:

sudo: keine tty vorhanden und kein askpass programm angegeben

Wie kann ich das umgehen?

BEARBEITEN Dies ist definitiv kein Duplikat der als solche vorgeschlagenen Frage. Die Antworten dort sind völlig irrelevant. Tatsächlich wurden diese Änderungen an der sudoers-Datei bereits auf den Remote-Host angewendet.


Antworten:


78

Eine einfache Möglichkeit besteht darin, Folgendes anzugeben -t:

ssh -t remotehost "sudo ./binary"

Von der Manpage:

Pseudotty-Zuweisung erzwingen. Hiermit können beliebige bildschirmbasierte Programme auf einem entfernten Rechner ausgeführt werden, was zB bei der Implementierung von Menüdiensten sehr hilfreich sein kann. Mehrere -t-Optionen erzwingen die Zuweisung von tty, auch wenn ssh kein lokales tty hat.

Ich kann nicht genau erklären, warum dies funktioniert, und es könnte einen besseren Weg geben. Ich würde gerne davon hören, wenn ja :)

@psusi erklärt in einem Kommentar unten, warum dies funktioniert.


14
Dies funktioniert, weil sudoein tty zur Eingabe eines Kennworts aufgefordert wird. Wenn Befehle zum Ausführen angegeben werden ssh, wird standardmäßig kein Kennwort zugewiesen, da dies normalerweise zum Ausführen nicht interaktiver Befehle verwendet wird, die möglicherweise Binärdaten übertragen und das tty auslösen können .
Psusi

@psusi Kennen Sie die Antwort auf diese verwandte Frage? unix.stackexchange.com/questions/110841
trusktr

Es ist auch -tterforderlich, wenn das Kommando mit heredoc übergeben wird
Rufus

26

Frage:

Wie kann ich das umgehen?

sudo: no tty present and no askpass program specified

Alternative Antwort

Versuchen Sie alternativ Folgendes:

sudo -S ./binary

Dadurch wird sudo angewiesen, das Kennwort von der Standardeingabe stdin zu lesen.

Szenarien, in denen dies hilft

In Chroot-Umgebungen funktionieren diese anderen Antworten möglicherweise nicht richtig. Vielleicht, weil:

  1. / etc / shadow vs / etc / passwd Konflikt, der es dem Benutzer nicht erlaubt, ein Passwort einzugeben.
  2. In einer chroot-Umgebung kann der Zugriff auf tty1 ein bisschen problematisch sein, und Strg-Alt-F2 - bis tty2 ist nicht möglich, da es sich um eine Tty der nicht-chroot-Umgebung handelt.

Beispiel: Manuelles Installieren / Reparieren von Linux oder des Bootloaders unter Verwendung einer Chroot-Umgebung (z. B. Archlinux und Arch-Chroot).


Beim Ausführen von sudo -S ./binary wird der Befehl sudo: ./binary nicht gefunden. Was gibt es?
Ajit Goel

5

Sie müssen ein Terminal / eine Anwendung definieren, das / die das Passwort liest. Es gibt zwei Varianten:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (Standardeinstellung visiblepw)

11
Ist es nicht besser, visudostatt zu verwenden, vim /etc/sudoersum zu vermeiden, dass Sie sich möglicherweise aufgrund eines Fehlers in Ihrer Bearbeitung aus Ihrem Computer ausschließen?
Drew Noakes

2

Es schlägt fehl, weil sudoversucht wird, das root-Passwort einzugeben, und keine Pseudotty zugewiesen wurde.

Sie müssen sich entweder als root anmelden oder die folgenden Regeln in Ihrem /etc/sudoers (oder :) einrichten sudo visudo:

# Members of the admin group may gain root privileges
%admin  ALL=(ALL) NOPASSWD:ALL

Stellen Sie dann sicher, dass Ihr Benutzer zur adminGruppe (oder wheel) gehört.


Dies ist zwar nicht der Fall (es gibt keine Beweise dafür, und Benutzer in der Administratorgruppe mit diesem Code in Centos- und Ubuntu-Systemen erhalten weiterhin den Fehler), es ist jedoch ein guter Tipp für Remoting, Gruppen und Regeln basierend auf diesen Gruppen für zu erstellen
Eskalierte

2

Sie können auch eine Datei wie "sudo_shutdown" in /etc/sudoers.d mit folgendem Inhalt erstellen:

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

Auf diese Weise können Benutzer in der Gruppe adm ohne Kennwort heruntergefahren werden.


3
Wollten Sie dies bearbeiten , um "no tty present"
Elder Geek

2

In meinem Fall habe ich diesen Fehler erhalten, weil ich keinen Befehl angegeben habe, den ich als root in den sudoers verwenden möchte

So etwas wie

/etc/sudoers.d/myuser:

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

arbeitete für mich

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.