Как исправить 'sudo: no tty present и no askpass program defined' error?

Я пытаюсь скомпилировать некоторые источники, используя make файл. В make файле есть куча команд, которые нужно запускать как sudo.

Когда я скомпилирую источники с терминала, все идет хорошо, и make приостанавливается при первом sudo команды sudo ожидающей пароля. Как только я введу пароль, сделайте резюме и завершите.

Но я хотел бы иметь возможность компилировать источники в NetBeans. Итак, я начал проект и показал netbeans, где можно найти источники, но когда я компилирую проект, он дает ошибку:

sudo: no tty present and no askpass program specified

Первый раз он попадает в команду sudo.

Я искал проблему в Интернете и все решения, которые я нашел, указывают на одно: отключить пароль для этого пользователя. Поскольку пользователь, о котором идет речь, является root. Я не хочу этого делать.

Есть ли другое решение?

Ответ 1

Предоставление пользователю возможности использовать эту команду без запроса пароля должно решить проблему. Сначала откройте консоль консоли и введите:

sudo visudo

Затем отредактируйте этот файл, чтобы добавить к самому концу:

username ALL = NOPASSWD: /fullpath/to/command, /fullpath/to/othercommand

например

john ALL = NOPASSWD: /sbin/poweroff, /sbin/start, /sbin/stop

позволит пользователю john sudo poweroff, start и stop не запрашивая пароль.

Посмотрите на нижнюю часть экрана на нажатия клавиш, которые вы должны использовать в visudo - это, кстати, не vi - и выйдите без сохранения при первом признаке любой проблемы. Предупреждение о вреде для здоровья: повреждение этого файла будет иметь серьезные последствия, отредактируйте с осторожностью!

Ответ 2

Try:

  • Используйте строку NOPASSWD для всех команд, я имею в виду:

    jenkins ALL=(ALL) NOPASSWD: ALL
    
  • Поместите строку после всех других строк в файле sudoers.

Это сработало для меня (Ubuntu 14.04).

Ответ 3

Try:

ssh -t remotehost "sudo <cmd>"

Это приведет к удалению вышеуказанных ошибок.

Ответ 4

После всех альтернатив я нашел:

sudo -S <cmd>

Опция -S (stdin) заставляет sudo читать пароль со стандартного ввода вместо оконечного устройства.

Источник

Приведенная выше команда все еще требует ввода пароля. Чтобы удалить ввод пароля вручную, в таких случаях, как jenkins, эта команда работает:

echo <password> | sudo -S <cmd> 

Ответ 5

sudo по умолчанию будет считывать пароль с подключенного терминала. Ваша проблема в том, что терминал не подключен, когда он запущен с консоли netbeans. Поэтому вам нужно использовать альтернативный способ ввода пароля: это называется программой askpass.

Программа askpass не является конкретной программой, а любой программой, которая может запрашивать пароль. Например, в моей системе x11-ssh-askpass работает нормально.

Для этого вам нужно указать, какую программу использовать, либо с переменной среды SUDO_ASKPASS, либо в файле sudo.conf (подробнее см. man sudo).

Вы можете заставить sudo использовать программу askpass с помощью опции -A. По умолчанию он будет использовать его, только если нет подключенного терминала.

Ответ 6

Попробуйте следующее:

echo '' | sudo -S my_command

Ответ 7

Для пользователей Ubuntu 16.04

Существует файл, который вы должны прочитать:

cat /etc/sudoers.d/README

Размещение файла с режимом 0440 в файле /etc/sudoers.d/myuser со следующим содержимым:

myuser  ALL=(ALL) NOPASSWD: ALL

Должен исправить проблему.

Не забывайте:

chmod 0440 /etc/sudoers.d/myuser

Ответ 8

Если вы случайно пришли сюда, потому что вы не можете суло внутри Ubuntu, который поставляется с Windows10

  • Отредактируйте файл /etc/hosts из Windows (с помощью Notepad), он будет расположен по адресу: %localappdata\lxss\rootfs\etc, добавьте 127.0.0.1 WINDOWS8, это избавится от первой ошибки, которую он не может найти хост.

  • Чтобы избавиться от ошибки no tty present, всегда делайте sudo -S <command>

Ответ 9

Войдите в свой Linux. Прогоните следующие команды. Будьте осторожны, поскольку редактирование sudoer является рискованным предложением.

$ sudo visudo

После открытия редактора vi сделайте следующие изменения:

  • Комментарий Defaults requiretty

    # Defaults    requiretty
    
  • Перейдите в конец файла и добавьте

    jenkins ALL=(ALL) NOPASSWD: ALL
    

Ответ 10

В Дженкинсе:

echo '<your-password>' | sudo -S command

Например:-

echo '******' | sudo -S service nginx restart

Вы можете использовать Mask Password Plugin, чтобы скрыть свой пароль.

Ответ 11

Это сработало для меня:

echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

где ваш пользователь "myuser"

для изображения Docker, это было бы просто:

RUN echo "myuser ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers

Ответ 12

Убедитесь, что команда sudo ing является частью вашего PATH.

Если у вас есть одна команда (или несколько, но не ВСЕ) команда sudoers, вы получите sudo: no tty present and no askpass program specified, когда команда не является частью вашего пути (и полный путь не указан).

Вы можете исправить это, добавив команду в свой PATH или вызывая ее с абсолютным путем, т.е.

sudo /usr/sbin/ipset

Вместо

sudo ipset

Ответ 13

Команда sudo терпит неудачу, поскольку она пытается запросить пароль root и нет псевдо-tty, выделенных (как часть script).

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

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

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

В идеале (безопаснее) было бы ограничить права root только конкретными командами, которые могут быть указаны как %admin ALL=(ALL) NOPASSWD:/path/to/program

Ответ 14

Думаю, я могу помочь кому-то в моем деле.

Во-первых, я изменил настройку пользователя в /etc/sudoers ссылаясь на приведенный выше ответ. Но это все еще не сработало.

myuser   ALL=(ALL) NOPASSWD: ALL
%mygroup  ALL=(ALL:ALL) ALL

В моем случае myuser был в mygroup.

И мне не нужны были группы. Итак, удалите эту строку.

(Не следует удалять эту строку, как я, просто отмечая комментарий.)

myuser   ALL=(ALL) NOPASSWD: ALL

Оно работает!

Ответ 15

Запуск сценариев оболочки, которые содержат команды sudo в них от jenkins, может работать не так, как ожидалось. Чтобы исправить это, следуйте

Простые шаги:

  1. В системах на основе ubuntu запустите "$ sudo visudo"

  2. это откроет файл /etc/sudoers.

  3. Если ваш пользователь jenkins уже находится в этом файле, измените его так:

jenkins ALL = (ВСЕ) NOPASSWD: ALL

  1. сохранить файл

  2. Перезапустите работу с дженкинсом

  3. вы не должны снова видеть это сообщение об ошибке :)

Ответ 16

Эта ошибка также может возникнуть, если вы пытаетесь запустить команду терминала (которая требует пароль root) из некой оболочки script, например sudo ls (в обратном направлении) из программы Ruby. В этом случае вы можете использовать утилиту Ожидание (http://en.wikipedia.org/wiki/Expect) или ее альтернативы.
 Например, в Ruby для выполнения sudo ls без получения sudo: no tty present and no askpass program specified вы можете запустить это:

require 'ruby_expect'

exp = RubyExpect::Expect.spawn('sudo ls', :debug => true)
exp.procedure do
    each do
        expect "[sudo] password for _your_username_:" do
            send _your_password_
        end
    end
end

[это использует один из альтернатив Ожидание Расширение TCL: ruby_expect gem].

Ответ 17

Для справки, если кто-то другой столкнулся с одной и той же проблемой, я застрял в течение хорошего часа с этой ошибкой, которая не должна произойти с тех пор, как я использовал параметр NOPASSWD.

То, что я НЕ знал, это то, что sudo может поднять то же самое сообщение об ошибке, когда нет tty, а команда, которую пользователь пытается запустить, не является частью разрешенной команды в файле /etc/sudoers.

Здесь приведен упрощенный пример содержимого моего файла с моей проблемой:

bguser ALL = NOPASSWD: \
    command_a arg_a, \
    command_b arg_b \
    command_c arg_c

Когда bguser попытается запустить "sudo command_b arg_b" без какого-либо tty (bguser используется для какого-то демона), тогда он столкнется с ошибкой "нет tty присутствует и не запросит запрограммированную программу".

Почему?

Поскольку запятая отсутствует в конце строки в файле /etc/sudoers...

(Я даже задаюсь вопросом, является ли это ожидаемым поведением, а не ошибкой в ​​sudo, поскольку правильное сообщение об ошибке для такого случая будет "Извините, пользователю bguser не разрешено выполнять и т.д." )

Ответ 18

Я получал эту ошибку, потому что я ограничил моего пользователя только одним исполняемым файлом systemctl и неправильно сконфигурировал файл visudo.

Вот что у меня было:

jenkins ALL=NOPASSWD: systemctl

Однако вам нужно включить полный путь к исполняемому файлу, даже если он по умолчанию по умолчанию, например:

jenkins ALL=NOPASSWD: /bin/systemctl

Это позволяет моему пользователю jenkins перезапускать службы, но не иметь полного доступа root

Ответ 19

Никто не сказал, что может вызвать эту ошибку, в случае перехода от одного узла к другому помните о проверке имени хоста в файле sudoers:

Итак, это моя /etc/sudoers config

User_Alias      POWERUSER = user_name
Cmnd_Alias SKILL = /root/bin/sudo_auth_wrapper.sh
POWERUSER hostname=(root:root) NOPASSWD: SKILL

если он не соответствует

uname -a
Linux other_hostname 3.10.17 #1 SMP Wed Oct 23 16:28:33 CDT 2013 x86_64 Intel(R) Core(TM) i3-4130T CPU @ 2.90GHz GenuineIntel GNU/Linux

появится эта ошибка:

нет tty присутствует и не указана запрошенная программа

Ответ 20

Другие варианты, не основанные на NOPASSWD:

  • Запустите Netbeans с привилегиями root ((sudo netbeans) или аналогичными), которые предположительно откроют процесс сборки с помощью root и, следовательно, sudo автоматически удастся.
  • Сделайте операции, необходимые для выполнения suexec - сделайте их принадлежащими root, и установите режим на 4755. (Это, конечно же, позволит любому пользователю на машине запустить их.) Таким образом, им не нужно sudo at все.
  • Создание виртуальных файлов на жестком диске с помощью bootsectors не должно быть вообще sudo. Файлы - это просто файлы, а bootsectors - это просто данные. Даже виртуальная машина не обязательно должна иметь root, если только вы не продвигаете переадресацию устройства.

Ответ 21

Может быть, вопрос непонятно, почему ни один ответ не соответствовал ему, но у меня было такое же сообщение об ошибке, когда я пытался установить sshfs, который требовал sudo: команда выглядит примерно так:

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

добавив опцию -o debug

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" [email protected]:/var/www /mnt/sshfs/www

У меня было такое же сообщение этого вопроса:

sudo: no tty present and no askpass program specified

Поэтому, прочитав другие ответы, я стал делать файл в /etc/sudoer.d/user на my.server.tld с:

user ALL=NOPASSWD: /usr/lib/openssh/sftp-server

и теперь я могу смонтировать диск, не предоставляя слишком много дополнительного права моему пользователю.

Ответ 22

Хотя этот вопрос старый, он все еще актуален для моей более или менее современной системы. После включения режима отладки sudo (Debug sudo /var/log/sudo_debug [email protected] в /etc/sudo.conf) я указал на /dev: "/dev is world writable". Таким образом, вам может понадобиться проверить разрешения для tty файла, особенно те из каталога, в котором находится узел tty/pts.

Ответ 23

Мне удалось это сделать, но, пожалуйста, убедитесь, что вы правильно следовали инструкциям. Это для тех, кто получает ошибки импорта.

Шаг 1: проверьте, есть ли у файлов и папок проблема с разрешением на выполнение. Пользователь Linux использует:

chmod 777 filename

Step2. Проверьте, у какого пользователя есть разрешение на его выполнение.

Шаг 3: откройте терминал, введите эту команду.

sudo visudo

добавьте эти строки в приведенный ниже код

www-data ALL=(ALL) NOPASSWD:ALL
nobody ALL=(ALL) NOPASSWD:/ALL

это дает разрешение на выполнение скрипта и позволяет использовать все библиотеки. Обычно пользователь - это "никто" или "www-данные".

теперь измените ваш код как

echo shell_exec('sudo -u the_user_of_the_file python your_file_name.py 2>&1');

зайдите в терминал, чтобы проверить, запущен ли процесс введите это там...

ps aux | grep python

это выведет весь процесс, запущенный в python.

Добавить дополнения: используйте приведенный ниже код для проверки пользователей в вашей системе

cut -d: -f1 /etc/passwd

Спасибо!