Sudo: no tty present and no askpass program specified

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

ssh remotehost "sudo ./binary"

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

sudo: no tty present and no askpass program specified

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

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

ssh -t remotehost "sudo ./binary"

Со справочной страницы:

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

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

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

Вопрос:

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

sudo: no tty present and no askpass program specified

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

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

sudo -S ./[yourExecutable]

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

Сценарии, в которых это помогает

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

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

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

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

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

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

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

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

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

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

Что-то вроде

/etc/sudoers.d/myuser:

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

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

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

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

Это позволяет пользователям, входящим в группу adm, завершать работу без ввода пароля.