Как исправить '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, может работать не так, как ожидалось. Чтобы исправить это, следуйте
Простые шаги:
-
В системах на основе ubuntu запустите "$ sudo visudo"
-
это откроет файл /etc/sudoers.
- Если ваш пользователь jenkins уже находится в этом файле, измените его так:
jenkins ALL = (ВСЕ) NOPASSWD: ALL
-
сохранить файл
-
Перезапустите работу с дженкинсом
-
вы не должны снова видеть это сообщение об ошибке :)
Ответ 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
Спасибо!