sudo: tty отсутствует и не задана программа askpass


73

При попытке запустить удаленный бинарный файл с помощью sudoудаленного блока:

ssh remotehost "sudo ./binary"

Я вижу эту ошибку:

sudo: tty отсутствует и не задана программа askpass

Как я могу обойти это?

РЕДАКТИРОВАТЬ это, безусловно, не дублирует вопрос, предложенный как таковой. Ответы там совершенно неактуальны. Фактически, эти изменения в файле sudoers уже были применены к удаленному хосту.


Ответы:


78

Простой способ - указать -t:

ssh -t remotehost "sudo ./binary"

Со страницы руководства:

Сила псевдо-тты выделения. Это может использоваться для выполнения произвольных программ на экране на удаленной машине, что может быть очень полезно, например, при реализации сервисов меню. Несколько опций -t заставляют tty выделяться, даже если у ssh нет локального tty.

Я не могу точно объяснить, почему это работает, и может быть, есть лучший способ. Я хотел бы услышать об этом, если так :)

@psusi объясняет, почему это работает, в комментариях ниже.


14
Это работает, потому что sudoтребует, чтобы tty запросил пароль, и при указании команд для запуска sshне выделяет его по умолчанию, так как это обычно используется для запуска неинтерактивных команд, которые могут передавать двоичные данные, что может отключить tty ,
psusi

@psusi Знаете ли вы ответ на этот связанный вопрос? unix.stackexchange.com/questions/110841
trusktr

Также -ttтребуется при передаче команды с помощью heredoc
Руфус

26

Вопрос:

Как я могу обойти это?

sudo: no tty present and no askpass program specified

Альтернативный ответ

В качестве альтернативы попробуйте:

sudo -S ./binary

Это заставляет sudo читать пароль из стандартного ввода, stdin.

Сценарии, где это помогает

В средах chroot эти другие ответы могут работать некорректно ... возможно, потому что:

  1. / etc / shadow vs / etc / passwd конфликт не позволяет пользователю ввести пароль.
  2. В среде chroot-ed доступ к tty1 может быть немного затруднительным, и ctrl-alt f2 - к tty2 невозможен, потому что это tty среды без chroot-ed.

Например: установка / восстановление linux или загрузчика вручную с использованием среды chroot (например, Archlinux и arch-chroot).


Я получаю ошибку sudo: ./binary: команда не найдена при запуске sudo -S ./binary, что дает?
Аджит Гоэль

5

Вам необходимо определить терминал / приложение, которое будет читать пароль. Есть два варианта:

  1. export SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass
  2. vim /etc/sudoers (По умолчанию visiblepw)

11
Не лучше ли использовать visudoвместо vim /etc/sudoersтого, чтобы избежать потенциальной блокировки себя из-за ошибки при редактировании?
Дрю Ноакс

2

Не удается, потому что sudoпытается запросить пароль root и псевдо-tty не выделено.

Вы должны войти в систему как пользователь root или настроить следующие правила в вашем /etc/sudoers (или:) sudo visudo:

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

Затем убедитесь, что ваш пользователь принадлежит к adminгруппе (или wheel).


хотя это не так (никаких доказательств этому не дано, а пользователи в группе администраторов с таким кодом в системах centos и ubuntu по-прежнему получают ошибку), это отличный совет для удаленного создания групп и правил на основе этих групп для эскалация задач
MrMesees

2

Вы также можете создать файл типа "sudo_shutdown" в /etc/sudoers.d с содержимым:

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

Это позволяет пользователям из группы adm отключаться без пароля.


3
Вы намеревались отредактировать это так, чтобы оно охватывало «нет подарка»
старейшина Гик

2

В моем случае я получил эту ошибку, потому что я не указал команду, которую я хотел бы использовать в качестве пользователя root в sudoers

Что-то вроде

/etc/sudoers.d/myuser:

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

работал на меня

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.