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)
user282246
источник
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).

kenorb
источник
хотя это не так (никаких доказательств этому не дано, а пользователи в группе администраторов с таким кодом в системах 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

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

GarouDan
источник