sudo: brak tty i nie określono programu askpass

73

Podczas próby uruchomienia zdalnego pliku binarnego przy użyciu sudona zdalnym urządzeniu:

ssh remotehost "sudo ./binary"

Widzę ten błąd:

sudo: brak tty i nie określono programu askpass

Jak mogę to obejść?

EDYCJA to zdecydowanie nie jest duplikatem sugerowanego pytania jako takiego. Tamte odpowiedzi są całkowicie nieistotne. W rzeczywistości te zmiany w pliku sudoers zostały już zastosowane do zdalnego hosta.

Drew Noakes
źródło

Odpowiedzi:

78

Prostym sposobem jest określenie -t:

ssh -t remotehost "sudo ./binary"

Ze strony podręcznika:

Wymuś alokację pseudotty. Można to wykorzystać do wykonania dowolnych programów ekranowych na zdalnym komputerze, co może być bardzo przydatne, np. Przy wdrażaniu usług menu. Wiele opcji -t wymusza alokację tty, nawet jeśli ssh nie ma lokalnego tty.

Nie potrafię dokładnie wyjaśnić, dlaczego to działa, i może być lepszy sposób. Chciałbym o tym usłyszeć, jeśli tak :)

@psusi wyjaśnia, dlaczego to działa w komentarzu poniżej.

Drew Noakes
źródło
14
Działa, ponieważ sudowymaga tty, aby poprosić o hasło, a podczas określania poleceń do uruchomienia ssh, domyślnie nie przydziela jednego, ponieważ jest to zwykle używane do uruchamiania nieinteraktywnych poleceń, które mogą przesyłać dane binarne, które mogą wyzwolić tty .
psusi
@psusi Czy znasz odpowiedź na to powiązane pytanie? unix.stackexchange.com/questions/110841
trusktr
Jest również -ttwymagany przy przekazywaniu polecenia za pomocą heredoc
Rufus
26

Pytanie:

Jak mogę to obejść?

sudo: no tty present and no askpass program specified

Alternatywna odpowiedź

Alternatywnie spróbuj:

sudo -S ./binary

Poleca to sudo odczytanie hasła ze standardowego wejścia, stdin.

Scenariusze, w których to pomaga

W środowisku chroot te inne odpowiedzi mogą nie działać poprawnie ... być może dlatego, że:

  1. konflikt / etc / shadow vs / etc / passwd nie pozwala użytkownikowi na wprowadzenie hasła.
  2. W środowisku chroot dostęp do tty1 może być nieco zakłócony, a ctrl-alt f2 - do tty2 jest niewykonalny, ponieważ jest to tty w środowisku nie chroot.

Na przykład: Ręczna instalacja / naprawa systemu Linux lub bootloadera przy użyciu środowiska chroot (takiego jak Archlinux i arch-chroot).

elika kohen
źródło
Dostaję polecenie sudo: ./binary: błąd nie został znaleziony po uruchomieniu sudo -S ./binary, co daje?
Ajit Goel
5

Musisz zdefiniować terminal / aplikację, która będzie czytać hasło. Istnieją dwa warianty:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (Domyślne visiblepw)
użytkownik 282246
źródło
11
Czy nie lepiej jest używać visudozamiast tego vim /etc/sudoers, aby uniknąć potencjalnego zablokowania się na komputerze z powodu błędu w edycji?
Drew Noakes
2

Nie udaje się, ponieważ sudopróbuje wyświetlić monit o hasło roota i nie ma przydzielonego pseudo-tty.

Musisz zalogować się jako root lub skonfigurować następujące reguły w swoim /etc/sudoers (lub sudo visudo:):

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

Następnie upewnij się, że użytkownik należy do admingrupy (lub wheel).

kenorb
źródło
chociaż nie jest to prawdą (nie ma na to dowodów, a użytkownicy w grupie administracyjnej z tym kodem w systemach centos i ubuntu nadal otrzymują błąd), jest to świetna wskazówka dla zdalnego tworzenia grup i reguł opartych na tych grupach dla eskalowane zadania
MrMesees
2

Możesz również utworzyć plik taki jak „sudo_shutdown” w /etc/sudoers.d, z zawartością:

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

Dzięki temu użytkownicy należący do grupy adm mogą zostać wyłączeni bez hasła.

Piotr
źródło
3
Czy zamierzałeś to zredagować, by zawierało „no tty present”
Elder Geek
2

W moim przypadku wystąpił ten błąd, ponieważ nie określiłem polecenia, którego chciałbym użyć jako użytkownika root w sudoers

Coś jak

/etc/sudoers.d/myuser:

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

pracował dla mnie

GarouDan
źródło