Як виправити помилку "sudo: не вказано tty присутності та не вказано жодної програми пропуску"?


438

Я намагаюся зібрати деякі джерела за допомогою makefile. У makefile є купа команд, які потрібно виконати як sudo.

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

Але я хотів би мати можливість збирати джерела в NetBeans. Отже, я запустив проект і показав netbeans, де знайти джерела, але коли я складаю проект, він видає помилку:

sudo: no tty present and no askpass program specified

Перший раз потрапляє на sudoкоманду.

Я розглянув проблему в Інтернеті, і всі знайдені нами рішення вказують на одне: відключення пароля для цього користувача. Оскільки тут йдеться про root. Я не хочу цього робити.

Чи є якесь інше рішення?


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

1
Дивіться також stackoverflow.com/q/20248009/873282
koppor

Як вказувалось у 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без запиту пароля.

Подивіться в нижній частині екрана, щоб натиснути клавіші, які потрібно використовувати у візуалі - це, до речі, не, - і вийдіть без збереження при першій ознаці будь-якої проблеми. Попередження про здоров'я: пошкодження цього файлу спричинить серйозні наслідки, редагуйте обережно!


4
Так, сторінка чоловіків із судорів відкрила мені очі на те, як насправді слід використовувати судо.
Спенсер Вільямс

6
visudo має відкриватися в будь-якому EDITOR, у якому налаштовано ваше середовище, що дуже добре може бути (і повинно бути ^ _ ^) vi.
Метт Стайлз

8
Переконайтесь, що лінія сполучення NOPASSWD є ПІСЛЯ будь-яких інших ліній судо, які можуть збігатися (як% колесо), у яких немає прапора NOPASSWD.
антоній

27
я не можу "sudo visudo", тому що я не можу в першу чергу судо!
Губатрон

8
Подумайте про додавання файлу до /etc/sudoers.d і залиште файл візуату недоторканим.
xlttj

183

Спробуйте:

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

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

Це працювало для мене (Ubuntu 14.04).


13
Я вперше додав рядок після інших конфігурацій користувача, але він працював лише тоді, коли розміщувався як абсолютно останній рядок у файлі на lubuntu 14.04.1.
користувач77115

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

5
Як згадував @ user77115, це спрацювало лише в тому випадку, якщо ви розмістили його як останній рядок у файлі sudoers, навіть з Ubuntu 16.04. Як бічна примітка, надання дозволу sudo для джинкінів для всіх команд є досить великою проблемою безпеки. Подумайте, як обгортати сценарії 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-present-and-no-askpass-program. Також sudo -Aдозволяє встановити програму sudoaskpass, але я бачу лише графічні інтерфейси. Хтось знає запит, щоб дозволити ssh remotehost sudo -A askpass?
тут

1
Корекції, -Aдля sudoне приймає аргументів , а замість цього вимагає оточення SUDO_ASKPASSабо sudo.conf Так ssh remotehost sudo -A commandбуде по- як і раніше працювати. Досі цікаво щодо термінальної програми.
тут

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> 

Це, здається, вирішує мою проблему. Але чи є якийсь побічний ефект за допомогою цієї команди?
Xiaodong Qi

3
sudo -S <command>- trueпросто буває фіктивна команда, яка повертає код виходу 0 ( falseце команда, яка повертає 1). Дякую, це єдина правдива відповідь, адже всі інші очікують, що «судо» спрацює!
Адам Плочер

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

Це працює відразу, і судо може працювати до часу очікування, але не вирішує будь-які основні проблеми, і проблема може повернутися.
nealmcb

Я не знаю, чи працює вона, але її показ Password:тоді нічого не відбувається. Я не можу ввести пароль.
ічімару

43

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

Програма запиту - це не конкретна програма, а будь-яка програма, яка може запитати пароль. Наприклад, у моїй системі x11-ssh-askpassчудово працює.

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

Ви можете змусити sudoвикористовувати програму askpass, скориставшись опцією -A. За замовчуванням він використовуватиме його, лише якщо немає приєднаного терміналу.


Поточне рішення вимагає gui. Яка програма askpass працює на терміналі.
тут

@here: Ну ... якщо ви запускаєте ssh з терміналу, він запитає пароль прямо, вам не потрібно нічого особливого ... Або ви питаєте про запит пароля з іншого терміналу, ніж той, який буде запустити сеанс ssh?
rodrigo

1
ах тепер я бачу, що -Aаргументи не беруть. -Aпотрібне середовище SUDO_ASKPASSабо sudo.confфайл. У такому випадку ssh host "export SUDO_ASKPASS=askpass;sudo -A cat /etc/passwd"все одно буде працювати з терміналом, що базується на терміналі, проте @chandru є набагато більш стислим нижчеssh -t ...
тут

Є кілька каватів із використанням -A. По-перше, якщо використовується -A і не встановлено SUDO_ASKPASS, ви отримаєте помилку. По-друге, коли -A використовується, ssh не використовуватиме кешовані облікові дані, він завжди запитуватиме пароль.
Антоні

Як додаток, ви можете побачити мої замітки про програми введення пароля ... ict.griffith.edu.au/anthony/info/crypto/passwd_input.txt
anthony

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 .. довелося видалити файл у режимі відновлення.
Стіан

25

Спробуйте це:

echo '' | sudo -S my_command

Це працює для мене, але чи може хтось пояснити, чому це допомагає?
ололобус

@ololobus Ви надсилаєте порожній пароль, щоб спочатку підказати пароль
Микита Кокшаров

Працювали! Жодна з вище оцінених відповідей не вирішила мене.
drerD

1
Повертається така помилка: [sudo] password for alper: Sorry, try again. [sudo] password for alper: sudo: 1 incorrect password attempt @sNICkerssss
alper

16

Якщо ви випадково прийшли сюди, тому що не можете вступити в Ubuntu, що постачається з Windows10

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

  2. Щоб позбутися no tty presentпомилки, завжди робітьsudo -S <command>


2
Дякуємо, що надали відповідь людям, які приїхали сюди з причини, не пов’язаної з описом питання, але відповідної назви питання. +1
Джаянт Бхауль


15

Увійдіть у свій Linux. Створюйте наступні команди. Будьте обережні, оскільки редагування судора є ризикованою пропозицією.

$ sudo visudo

Після відкриття редактора vi внесете такі зміни:

  1. Коментуйте Defaults requiretty

    # Defaults    requiretty
    
  2. Перейдіть до кінця файлу та додайте

    jenkins ALL=(ALL) NOPASSWD: ALL
    


11

Це працювало для мене:

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

де ваш користувач "myuser"

для зображення Докера це було б просто:

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 після оновлення гачка повернення no tty, але з використанням sudo -u lamparna /usr/bin/git push --mirror ssh://lamparna@REDMINE/home/lamparna/repos/git/jine/lamparna.gitроботи без пароля.
Фотон

7

Команда sudoне вдається, оскільки вона намагається підказати пароль для кореневого пароля і не виділено псевдо-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 вже знаходиться у цьому файлі, змініть його таким чином:

jenkins ALL = (ВСІ) NOPASSWD: ALL

  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-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

Дякую тобі!


2

Ця помилка також може виникнути, коли ви намагаєтеся запустити команду термінала (що вимагає кореневого пароля) з якогось скрипту без оболонки, наприклад 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

[тут використовується одна з альтернатив очікуванню розширення TCL: 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 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 присутності та жодної програми пропуску


1

Інші параметри, не засновані на NOPASSWD:

  • Запустіть Netbeans з привілеєм root ((sudo netbeans) або подібним), який, імовірно, роздрібнить процес збирання з root і, таким чином, sudo автоматично матиме успіх.
  • Зробіть операції, необхідні виконувати suexec - зробіть їх власністю root та встановіть режим 4755. (Це, звичайно, дозволить будь-якому користувачеві на машині виконувати їх.) Таким чином, їм взагалі не потрібно судо.
  • Створення віртуальних файлів на жорсткому диску з завантажувачами взагалі не повинно потребувати судових процесів. Файли - це лише файли, а завантажувачі - це лише дані. Навіть віртуальна машина не обов'язково повинна мати 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/userна my.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.