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


438

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

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

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

sudo: no tty present and no askpass program specified

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

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

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


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


Как указано в serverfault.com/a/597268 , sudo -n my-commandу меня сработало. Е.И.В.!
andreyevbr

1
Пожалуйста, выберите ответ.
Ичимару

1
@andreyevbr я так не думаю. sudo: a password is required
Ичимару

Ответы:


260

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

sudo visudo

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

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

например

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

позволит пользователю johnв Судо poweroff, startи stopбез запроса пароля.

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


4
Да, страница руководства sudoers открыла мне глаза на то, как sudo фактически предполагается использовать.
Спенсер Уильямс

6
visudo должен открываться в любом редакторе, который ваша среда сконфигурирована для использования, что вполне может быть (и должно быть ^ _ ^) vi.
Мэтт Стайлс,

8
Убедитесь, что строка преобразования NOPASSWD находится ПОСЛЕ любых других строк sudo, которые могут совпадать (например,% wheel), у которых нет флага NOPASSWD.
Энтони

27
я не могу "sudo visudo", потому что я не могу sudo в первую очередь!
Губатрон

8
Попробуйте добавить файл в /etc/sudoers.d и оставить файл visudo без изменений.
xlttj

183

Пытаться:

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

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

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


13
Сначала я добавил строку после других пользовательских настроек, но она работала, только когда была помещена как последняя строка в файле на lubuntu 14.04.1.
user77115

Вторая часть была решением, в котором я был тем, что мне было нужно. Существующая строка конфигурации (для группы колес) также соответствовала моей команде sudo, но без записи NOPASSWD :. Размещение моей новой строки после того, как она дала ей приоритет, не позволяя использовать пароль для нужной мне команды.
Энтони

5
Как упомянул @ user77115, это работало, только если вы поместили его в качестве последней строки в файле sudoers, даже с Ubuntu 16.04. Как примечание, предоставление sudo разрешений для jenkins для всех команд является довольно серьезной проблемой безопасности. Подумайте об упаковке ваших сценариев jenkins и предоставьте доступ только к определенным командам, таким как: jenkins ALL=(ALL) NOPASSWD: /var/lib/jenkins/wrapper_script
ivandov

jenkinsэто просто имя пользователя? Это должно быть имя пользователя с хост-машины? Что если имя пользователя на хост-машине совпадает с именем пользователя с удаленного сервера?
mrgloom

это специфично для Дженкинса, похоже на stackoverflow.com/a/22651598/1041319 - более общее решение.
arntg

167

Пытаться:

ssh -t remotehost "sudo <cmd>"

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


7
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-based programs on a remote machineсм. также: sudo-no-tty-present-and-no-askpass-program-специфицированный Также sudo -Aпозволяет установить sudoпрограмму askpass, но я вижу только GUI. Кто-нибудь знает аскспас, чтобы разрешить ssh remotehost sudo -A askpass?
здесь

1
Исправление, -Afor sudoне принимает аргументов и вместо этого требует среды SUDO_ASKPASSили sudo.conf So ssh remotehost sudo -A commandвсе равно будет работать. По-прежнему любопытно узнать о терминальной программе Askpass.
здесь

7
это не работает для меня (предположительно, потому что я вызываю ssh из скрипта), давая мне ошибку Pseudo-terminal will not be allocated because stdin is not a terminal.:(
knocte

Прекрасно работает для меня. Спасибо!
xfra35

1
Это не отвечает на вопрос.
bschlueter

126

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

sudo -S <cmd>

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

Источник

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

echo <password> | sudo -S <cmd> 

Кажется, это решает мою проблему. Но есть ли побочный эффект при использовании этой команды?
Сяодун Ци

3
sudo -S <command>- это trueпросто фиктивная команда, которая возвращает код выхода 0 ( falseэто команда, которая возвращает 1). Спасибо, это единственный верный ответ, так как все остальные ожидают, что "sudo" сработает!
Адам Плохер

1
-S: Напишите подсказку к стандартной ошибке и прочитайте пароль из стандартного ввода вместо использования терминального устройства. За паролем должен следовать символ новой строки.
fileinster

Это работает сразу и может привести к тому, что sudo будет работать до истечения времени ожидания, но не решит какие-либо проблемы, которые могут существовать, и проблема может вернуться.
nealmcb

Я не знаю, работает ли он, но его показ, Password:тогда ничего не происходит. Я не могу ввести пароль.
ичимару

43

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

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

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

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


Текущее решение требует графического интерфейса. Какая программа askpass работает на терминале.
здесь

@ здесь: Ну ... если вы запустите ssh из терминала, он запросит пароль напрямую, вам не нужно ничего особенного ... Или вы спрашиваете о запросе пароля с терминала, отличного от того, который будет запустить сеанс SSH?
Родриго

1
ааа теперь вижу что -Aне принимает аргументов. -Aтребует среды SUDO_ASKPASSили sudo.confфайла. В этом случае ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"все равно будет работать с терминалом на основе Askpass, однако @chandru гораздо более кратким нижеssh -t ...
здесь

Есть некоторые каваты с использованием -A. Во-первых, если используется -A и SUDO_ASKPASS не был установлен, вы получите ошибку. Во-вторых, когда используется ключ -A, ssh не будет использовать кэшированные учетные данные, он всегда будет запрашивать пароль.
Энтони

В качестве дополнения вы можете посмотреть мои заметки о программах ввода пароля ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
Энтони,

26

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

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

cat /etc/sudoers.d/README

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

myuser  ALL=(ALL) NOPASSWD: ALL

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

Не забудь:

chmod 0440 /etc/sudoers.d/myuser

Ницца. Более чистое решение, чем популярное.
Пол Прат

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

25

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

echo '' | sudo -S my_command

Это работает для меня, но кто-нибудь может объяснить, почему это помогает?
ololobus

@ololobus Вы отправляете пустой пароль в первую очередь, чтобы ввести пароль
Никита Кокшаров

Работал! Ни один из ответов с более высоким рейтингом не решил это для меня.
drerD

1
Она возвращает следующее сообщение об ошибке: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
Alper

16

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

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

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


2
Спасибо за предоставление ответа для людей, которые пришли сюда по причине, не связанной с описанием вопроса, но соответствующей названию вопроса. +1
Джаянт Бхавал

3

15

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

$ sudo visudo

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

  1. Закомментировать Defaults requiretty

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

    jenkins ALL=(ALL) NOPASSWD: ALL
    


11

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

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

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

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

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

9

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

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

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

sudo /usr/sbin/ipset

Вместо

sudo ipset


1
Это на самом деле раздвоено для меня. в sudoers %sitd ALL=(lamparna) NOPASSWD: /usr/bin/git_push_to_lamparna.sh, /usr/bin/gitи использовании sudo -u lamparna git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitв git post-update hook no tty, но используя sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitработу без пароля.
Фотон

7

Команда 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


Я знаю, это гораздо более безопасный способ. Хотя я написал следующую команду в sudoersфайле, apache ALL = (ALL) NOPASSWD:/usr/share/apache-tomcat-7.0.61/bin/startup.shно она не работает для меня. выдает следующую ошибкуsudo: >>> /etc/sudoers: syntax error near line 120 <<< sudo: parse error in /etc/sudoers near line 120 sudo: no valid sudoers sources found, quitting sudo: unable to initialize policy plugin
muaaz

1
Кстати, это работает хорошо, apache ALL=(ALL) NOPASSWD: ALLно риск для безопасности. :)
muaaz

6

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

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

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

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

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

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

myuser   ALL=(ALL) NOPASSWD: ALL

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


3

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

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

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

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

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

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

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

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

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


3

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

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

chmod 777 filename

Шаг 2 : Проверьте, какой пользователь имеет разрешение на его выполнение.

Шаг 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

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


2

Эта ошибка также может возникать, когда вы пытаетесь запустить терминальную команду (для которой требуется пароль 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].


2

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


2

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

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

jenkins ALL=NOPASSWD: systemctl

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

jenkins ALL=NOPASSWD: /bin/systemctl

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


1

Никто не сказал, что может вызвать эту ошибку, в случае миграции с одного хоста на другой, помните о проверке имени хоста в файле 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


1

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

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

1

Возможно, вопрос неясен: почему ни один ответ не соответствует ему, но у меня появилось то же сообщение об ошибке, когда я пытался смонтировать 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/usermy.server.tld с:

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

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


0

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


0

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

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

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

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

<USERNAME> ALL=(ALL) NOPASSWD: ALL

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


0

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

Defaults visiblepw

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


0

Использование конвейера:

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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.