Как исправить ошибку 'sudo: отсутствует tty и не определена программа askpass'?

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

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

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

sudo: no tty present and no askpass program specified

В первый раз sudo команда.

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

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

30 ответов

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

sudo visudo

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

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

например

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

позволит пользователю 'john' выключать, запускать и останавливать sudo без запроса пароля.

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

Пытаться:

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

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

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

Пытаться:

ssh -t remotehost "sudo <cmd>"

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

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

sudo -S <cmd>

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

Источник

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

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

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

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

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

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

cat /etc/sudoers.d/README

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

myuser  ALL=(ALL) NOPASSWD: ALL

Следует исправить проблему.

Не забудь:

chmod 0440 /etc/sudoers.d/myuser

Попробуй это:

echo '' | sudo -S my_command

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

$ sudo visudo

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

  1. Закомментируйте Defaults requiretty

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

    jenkins ALL=(ALL) NOPASSWD: ALL
    

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

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

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

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

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

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

для образа Docker это было бы просто:

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

В Дженкинс:

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

Например:-

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

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

Убедитесь, что команда, которую вы sudoИнг является частью вашего PATH,

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

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

sudo /usr/sbin/ipset

Вместо

sudo ipset

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

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

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

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

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

Я думаю, что могу помочь кому-то с моим делом.

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

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

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

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

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

myuser   ALL=(ALL) NOPASSWD: ALL

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

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

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

chmod 777 filename

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

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

sudo visudo

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

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

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

теперь отредактируйте свой код как

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

Благодарю вас!

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

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

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

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

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

Дженкинс ВСЕ =(ВСЕ) НОПАССВД: ВСЕ

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

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

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

Используя трубопровод:

echo your_pswd | sudo -S your_cmd

Используя здесь-документ:

sudo -S cmd <<eof
pwd
eof
#remember to put the above two lines without "any" indentations.

Откройте терминал, чтобы спросить пароль (в зависимости от того, что работает):

gnome-terminal -e "sudo cmd"
xterm -e "sudo cmd"

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

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

jenkins ALL=NOPASSWD: systemctl

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

jenkins ALL=NOPASSWD: /bin/systemctl

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

Эта ошибка также может возникать, когда вы пытаетесь запустить терминальную команду (для которой требуется пароль root) из какого-либо сценария без оболочки, например sudo ls (в кавычках) из программы Ruby. В этом случае вы можете использовать утилиту Expect ( 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

[это использует одну из альтернатив Expect TCL extension: ruby_expect gem].

Для справки, в случае, если кто-то еще столкнулся с той же проблемой, я застрял в течение хорошего часа с этой ошибкой, которая не должна происходить, так как я использовал параметр 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 присутствует и не задана программа askpass".

Зачем?

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

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

Я не уверен, является ли это более поздним изменением, но у меня была эта проблема, и sudo -Sработал на меня.

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

sshfs -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/var/www /mnt/sshfs/www

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

sshfs -o debug -o sftp_server="/usr/bin/sudo /usr/lib/openssh/sftp-server" user@my.server.tld:/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

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

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

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

Решение проблемы

Если вы столкнулись с этой проблемой где-либо еще, кроме экземпляра Jenkins, следуйте этому со 2-го шага. Первый шаг предназначен для пользователя, у которого возникла проблема с экземпляром Jenkins.

Перейдите к экземпляру Jenkins в Google Cloud Console. Введите команды sudo su

visudo -f /etc / sudoers

Добавить следующую строку в конце

jenkins ALL= NOPASSWD: ALL

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

Если вы добавите эту строку в свой /etc/sudoers (через visudo) он решит эту проблему без необходимости отключать ввод пароля и когда псевдоним для sudo -S не будет работать (вызов скриптов sudo):

Defaults visiblepw

Конечно, прочтите руководство самостоятельно, чтобы понять его, но я думаю, что для моего случая использования запуска в контейнере LXD черезlxc exec instance -- /bin/bash это довольно безопасно, поскольку он не печатает пароль по сети.

Я столкнулся с этой проблемой при работе на сервере Ubuntu 20.04 .

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

      sudo: no tty present and no askpass program specified
The remote script failed with exit code 1

Вот как я это исправил :

Проблема вызвана выполнением команды, которая пытается запросить пароль, но не имеет доступа к a, чтобы запросить у пользователя парольную фразу. Поскольку он не может найти tty, возвращается к методу, но не может найти askpass команда настроена, поэтому команда не выполняется.

Чтобы исправить это, вам нужно иметь возможность запускать sudoдля этого конкретного пользователя без требований к паролю. В файле настроено отсутствие требований к паролю . Чтобы настроить его, выполните одну из следующих команд:

      sudo nano /etc/sudoers

ИЛИ ЖЕ

      sudo visudo

Примечание . Откроется /etc/sudoers файл с помощью редактора по умолчанию.

Затем добавьте следующую строку в конец файла:

      # Allow my_user to run all commands without password
my_user ALL=(ALL) NOPASSWD:ALL

Примечание : заменить my_user с вашим фактическим пользователем

Если вы хотите, чтобы пользователь запускал определенные команды, вы можете указать их

      # Allow my_user to run specific commands without password
my_user ALL=(ALL) NOPASSWD:/bin/myCommand

ИЛИ ЖЕ

      # Allow my_user to run specific commands without password
my_user ALL=(ALL) NOPASSWD: /bin/myCommand, /bin/myCommand, /bin/myCommand

Сохраните изменения и выйдите из файла.

Для получения дополнительной помощи прочтите ресурс по этой ссылке: sudo: нет tty и не указана программа askpass

Вот и все.

надеюсь, это поможет

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

Так что это мой конфиг /etc/sudoers

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 и не задана программа askpass

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

1 открыть /etc/sudoers

тип sudo vi /etc/sudoers. Это откроет ваш файл в режиме редактирования.

2 Добавить / изменить пользователя linux

Найдите запись для пользователя Linux. Измените, как показано ниже, если найдете, или добавьте новую строку.

<USERNAME> ALL=(ALL) NOPASSWD: ALL

3 Сохранить и выйти из режима редактирования

Ниже действия работают на ubuntu20

  1. редактировать / etc / sudoers
      visudo

или же

      vi /etc/sudoers
  1. добавить ниже контент
      userName   ALL=(ALL) NOPASSWD: ALL
%sudo   ALL=(ALL:ALL) NOPASSWD:ALL
Другие вопросы по тегам