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

Строка вывода, в которой отсутствует tty и программа askpass, является одним из тех сообщений об ошибках ssh, которые на самом деле не так уж и полезны, потому что на самом деле не доходит до того, что вызывает проблему. Скорее всего, вы действительно работаете с каким-либо действующим TTY, когда видите сообщение, и вы, вероятно, отлично справились с вводом пароля sudo через ssh. Скорее всего, вы имеете дело с синтаксической ошибкой, но в сообщении этот факт напрямую не рассматривается.

Поскольку это проблема, связанная с самим ssh, вы, скорее всего, сможете воспроизвести проблему в Linux, FreeBSD, macOS и службах Unix Cygwin в Microsoft Windows. К счастью, исправление должно быть практически одинаковым на всех этих платформах.

Метод 1: поиск терминала для ssh

Хотя вы, скорее всего, уже работаете с терминала, ssh, вероятно, этого не осознает. Возможно, он все еще пытается найти эмулятор терминала TTY, несмотря на то, что вы находитесь внутри окна командной строки. Попробуйте воспроизвести ошибку, чтобы проверить это. Мы настроили виртуальную машину в качестве примера и запустили ssh [email protected] 'sudo /var/mail/startup.sh' в качестве теста. Естественно, вы захотите изменить команду и строку ssh на то, что соответствует тому, что вы пытаетесь сделать.

Вы захотите убедиться, что вы входите на сервер, которым вы себя считали. Тем не менее, проверьте, все ли вы получаете сообщение об ошибке sudo: no tty present и no askpass program. Скорее всего, если вы все еще получаете его, вы увидите его трижды и, возможно, даже получите запрос на ввод пароля, как если бы вы запускали sudo локально в Debian или Ubuntu.

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

Например, если вы получали такую ​​же ошибку при запуске команды, которая была отформатирована как ssh -t [email protected] 'ssh [email protected]', вам придется сохранить параметр -t после первого ssh для предотвратить это. Обратите внимание: если вы позже измените вторую команду для производства или потребления данных, то вы вообще не захотите использовать -t. Например, если вы начали запускать cat вместо сценария, вы могли бы сбросить -t, поскольку вам не нужно было бы выделять для этого терминал.

Метод 2: исправление файла visudo

У вас также может быть проблема конфигурации, которая вызывает эту ошибку. Измените файл visudo , введя команду sudo visudo , и имейте в виду, что вы никогда не захотите редактировать этот файл каким-либо другим способом. Вы должны найти строку, в которой есть ALL = NOPASSWD, за которой следуют типы команд, для запуска которых вам не нужно вводить пароль администратора.

Каждая отдельная команда должна заканчиваться запятой, кроме последней в строке. Таким образом, если у вас есть что-то вроде / sbin / poweroff / sbin / start / sbin / stop, он будет рассматривать все это как одну команду и выдавать вам ошибку. Точно так же, если вам не хватает команды, которую вы пытаетесь запустить через ssh, вы тоже получите эту ошибку. Внесите необходимые настройки и сохраните файл, прежде чем проверять, воспроизводима ли ошибка.

Если у вас все еще есть ошибка даже после того, как вы сделали это и перезапустили службу, попробуйте  следующую команду на изображении ниже  и убедитесь, что в строке PermitTTY после нее есть слово yes. Если это последняя строка в вашем файле, убедитесь, что после нее есть пустая новая строка. GNU nano по умолчанию выполняет эту задачу автоматически.

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