Выполнить sudo без пароля?

292

Вдохновленный этим вопросом ....

Я единственный человек, использующий мою систему с 12.04.
Каждый раз, когда я даю sudoкоманду; система запрашивает пароль пользователя (который по-своему хорош).
Однако я думал; без активации учетной записи root ; Как я могу выполнить команды sudo, которые не будут запрашивать пароль пользователя для аутентификации.

ПРИМЕЧАНИЕ: я хочу выполнить команду sudo без аутентификации с помощью пароля; только когда они выполняются через терминал.
Я не хочу удалять этот дополнительный уровень безопасности из других функций, например, при использовании «Центра программного обеспечения Ubuntu» или выполнении сценария bash путем перетаскивания файла нечто.sh в терминал.

Бхавеш Диван
источник
2
так что вы хотите, чтобы пароль запрашивался только в терминале, а не для других вещей, или наоборот? в обоих случаях я считаю, что это нарушение безопасности
Dr_Bunsen
Я хочу, чтобы система не запрашивала пароль только в терминале ... для любых других целей система должна запрашивать пароль. Это требование носит временный характер и должно использоваться при настройке n установки новых серверов ... во время установки новых серверов действительно требуется несколько часов для настройки с помощью команд sudo ... выдача пароля каждые 15 минут. это головная боль Я не хочу использовать учетную запись root.
Бхавеш Диван
Вы должны прочитать обсуждение в: askubuntu.com/questions/135428/…
david6
1
Конечно, вы можете продлить тайм-аут. Кроме того, если вы часто делаете новые настройки сервера, вы должны подумать об автоматизации процесса. Вам не платят за ввод текста, вам платят за решение проблем и выполнение заданий.
MauganRa
Связанный: Как запустить команду sudo без пароля?
Элия ​​Каган

Ответы:

82

sudo -i это путь, если вы не хотите вводить пароль каждые 10 минут при внесении изменений в вашу систему (или другие системы), и вы не хотите изменять какие-либо системные файлы.

Он переключит вас на root с использованием вашего sudoпароля пользователя, когда вы закроете консоль или введете пароль, exitвы вернетесь к своему обычному пользователю.

Бруно Перейра
источник
2
Будет ли это верно, что я ввожу пароль только один раз ... и до тех пор, пока я не выйду; погода 5 часов или 15 .... система не будет запрашивать аутентификацию по паролю при выполнении любой команды sudo.
Бхавеш Диван
2
@ Z9iT, пока вы не введете exitили не закроете окно эмулятора терминала.
Бруно Перейра
2
Спасибо. Принял этот ответ, потому что он обслуживает цель выдачи команд sudo без аутентификации по паролю в течение n часов до тех пор, пока мы не выйдем. Не изменять системные файлы - плюс.
Бхавеш Диван
3
Это на самом деле не отвечает на вопрос, потому что вам все еще нужно ввести пароль, чтобы стать пользователем root на этом этапе.
Адам Ф
2
Нет, если вы работаете на виртуальной машине в защищенной среде, и вы просто хотите, чтобы эта вещь что-то сделала немедленно, и вы не хотите иметь дело с паролями. Этот ответ не отвечает на вопрос, хотя это, возможно, полезная информация. Я согласен с Адамом Ф.
Джонатан Комар
573

Вы можете настроить, sudoчтобы никогда не запрашивать пароль.

Откройте окно терминала и введите:

sudo visudo

В нижней части файла добавьте следующую строку:

$USER ALL=(ALL) NOPASSWD: ALL

Где $USERваше имя пользователя в вашей системе. Сохраните и закройте файл sudoers (если вы не изменили редактор терминала по умолчанию (вы узнаете, есть ли у вас), нажмите ctl + x для выхода, nanoи он предложит вам сохранить).

Начиная с Ubuntu 19.04, файл должен выглядеть примерно так:

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults    env_reset
Defaults    mail_badpass
Defaults    secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL:ALL) ALL

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

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

# See sudoers(5) for more information on "#include" directives:

#includedir /etc/sudoers.d

YOUR_USERNAME_HERE ALL=(ALL) NOPASSWD: ALL

После этого вы можете ввести sudo <whatever you want>в окне терминала без запроса пароля.

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

запрос пароля графического интерфейса

Октавио Филипе Гонсалвес
источник
15
Рекомендуется использовать sudo visudoвместо непосредственного редактирования. Также изменение прав sudoers может заблокировать себя. При редактировании с vimпомощью используйте :wq!для записи в файлы только для чтения и выйдите из редактора. Таким образом, разрешения 644 не являются необходимыми.
Лекенштейн
8
Это серьезная угроза безопасности, любой, кто завладеет любым аккаунтом с правами sudo, может взять под контроль всю систему и заблокировать любой дальнейший доступ к этому компьютеру, серьезно не рекомендуется.
Бруно Перейра
6
@ wil93 вы упускаете суть: скрипт, который требует sudo install crapware, не будет запрашивать пароль в этом случае и может испортить все, что у вас есть, и вам не нужно находиться рядом с машиной, чтобы распространять скрипты в прошлый раз, когда я проверял. .. Это всего лишь пример.
Бруно Перейра
12
@BrunoPereira Если вы планируете запускать ненадежные сценарии, то это риск для безопасности (даже если sudo запрашивает пароль, вредоносный сценарий всегда может rm -rf ~испортить некоторые вещи). В целом, я бы не назвал «серьезной угрозой безопасности» простое удаление запроса пароля из sudo.
wil93
5
Согласитесь с @ wil93. При запуске ненадежного сценария ввод пароля не более чем шанс отменить процесс, хотя я сомневаюсь, что он бесполезен для большинства людей. Дело в том, что вы знаете, откуда сценарий и что он делает.
Чад
36

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

sudo visudo

Это открывает редактор и указывает его на файл sudoers - Ubuntu по умолчанию использует nano, другие системы используют Vi. Теперь вы супер пользователь, редактирующий один из самых важных файлов в вашей системе. Нет стресса!

(Vi специальные инструкции отмечены с (vi!) . Игнорируйте их, если вы используете nano.)

Используйте клавиши со стрелками, чтобы перейти к концу Defaultsстроки.

(vi!) нажмите клавишу A (заглавную «a»), чтобы переместиться в конец текущей строки и войти в режим редактирования (добавить после последнего символа в строке).

Теперь введите:

,timestamp_timeout=X

где X - истечение времени ожидания в минутах. Если вы укажете 0, вам всегда будет предложено ввести пароль. Если вы укажете отрицательное значение, время ожидания никогда не истечет. Например Defaults env_reset,timestamp_timeout=5.

(vi!) нажмите Escape, чтобы вернуться в командный режим. Теперь, если вы довольны вашим редактированием, наберите, :w Enterчтобы написать файл и :q Enterвыйти из vi. Если вы допустили ошибку, возможно, самый простой способ - повторить с начала, выйти без сохранения (нажмите, Escapeчтобы войти в командный режим), а затем набрать: q! Enter,

Нажмите Ctrl+ X, затем Y, Enterчтобы сохранить файл и выйти из nano.

Возможно, вы захотите прочитать sudoers и vi справочные страницы для получения дополнительной информации.

man sudoers
man vi

Сбросьте значение тайм-аута, используя:

sudo -k

Эти инструкции должны удалить запрос на ввод пароля при использовании команды sudo. Тем не менее, команда sudo по-прежнему должна использоваться для доступа с правами root.

Отредактируйте файл sudoers

Откройте окно терминала. Введите sudo visudo. Добавьте следующую строку в конец файла (если он не в конце, он может быть аннулирован более поздними записями):

<username> ALL=NOPASSWD: ALL

Замените <username>на ваше имя пользователя (без <>). Это предполагает, что Ubuntu создал группу с тем же именем, что и ваше имя пользователя, что типично. Вы можете поочередно использовать группу пользователей или любую другую группу, в которой вы находитесь. Просто убедитесь, что вы в этой группе. Это можно проверить, перейдя в Система -> Администрирование -> Пользователи и группы.

Пример:

michael ALL=NOPASSWD: ALL

Введите ^ X ( Ctrl+ X), чтобы выйти. Это должно запросить вариант сохранения файла, введите Y для сохранения.

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

Корневой аккаунт

Включение учетной записи root

Включение учетной записи root редко требуется. Почти все, что вам нужно сделать как администратор системы Ubuntu, можно сделать с помощью sudo или gksudo. Если вам действительно нужен постоянный root-вход, лучше всего смоделировать Root-оболочку входа с помощью следующей команды:

sudo -i

Однако, если вам нужно включить root-логины, вы можете сделать это так:

sudo passwd root

Повторное отключение вашей учетной записи root

Если по какой-либо причине вы включили свою учетную запись root и хотите снова ее отключить, используйте в терминале следующую команду:

sudo passwd -dl root

Общесистемная группа sudo

root$ echo "%sudo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

Выйдите, а затем вернитесь.

Сбросить sudo timeout

Вы можете убедиться, что sudo запросит пароль в следующий раз, запустив:

sudo -k
user209328
источник
Я опубликовал это до того, как добавил, для общесистемного способа сделать это, и другие читайте здесь:
user209328
Это был поздний ответ, но он является наиболее полным с точки зрения возможных вариантов.
jenming
1
Хм, в Ubuntu 18.04 MATE это работает отлично, в то время как при использовании Ubuntu 18.04 GNOME я вызывал морщины из-за проблемы «имя пользователя не в файле sudoers ...». Вот почему многие pple просто ненавидят Linux - потому что это редко "причинно-следственная связь": D На всякий случай, если вы столкнетесь
Peter
Переменная окружения EDITOR может установить используемый редактор ... например, sudo env EDITOR=/bin/nano visudoдля надежного редактирования sudoersв nano. (альтернативы обновления также могут быть использованы для установки редактора)
Герт ван ден Берг,
29

Предпочтительным способом предоставления индивидуальных (или групповых) разрешений будет добавление файлов в /etc/sudoers.d

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

Чтобы сделать вошедшего в систему пользователя aa sudoer и sudoне запрашивать у него пароль, используйте

echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/$USER

это создаст файл с именем /etc/sudoers.d/$USER(где $USERнаходится имя пользователя, в который вы вошли, как при запуске этой команды), что позволит понять, каким пользователям предоставлено разрешение.

Если вы хотите сделать это для другого пользователя, просто замените оба экземпляра $USERдругим именем пользователя в приведенной выше команде.

echo "otheruser ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/otheruser

Точно так же один файл может использоваться для управления несколькими директивами:

echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoers.d/local

Смотрите /etc/sudoers.d/READMEи man sudoersдля получения дополнительной информации.

user1656671
источник
команда echo не выполнена, хотя я root. но я добавил файл и отредактировал его напрямую, и это сработало в последней версии Ubuntu (тогда как добавление пользователя в sudoers напрямую не сделало!)
scape
1
Правильный путь - сделать это с помощью teeкоманды.
ВТО
1
Это лучший способ, который работает:, sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)'а затемsudo chmod 440 /etc/sudoers.d/$(logname)
paradroid
В sudo ... >fileоболочке перенаправление выполняется в исходной оболочке, поэтому оно может работать только в корневой оболочке.
Константин Пелепелин
метод тройника, без разрешений:echo "username ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/username
Карсон Ип
7

Хорошая однострочная строка для удаления запросов sudo для текущего пользователя

sudo bash -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" | (EDITOR="tee -a" visudo)'
Эрик Лэндри
источник
2
Я думаю, что вы могли бы просто сделать:, нужно echo "$USER ALL=(ALL:ALL) NOPASSWD: ALL" | sudo env EDITOR="tee -a" visudoтолько в конце концов (и даже не понадобится в конфигурации по умолчанию, IIRC). visudosudoenv
Муру
здесь столько всего может пойти не так (конечно, все пользовательские ошибки), что, по моему скромному мнению, предпочтительно редактировать файл sudoer напрямую ( sudo visudo), тестируя результат (с открытым редактором), для тех новых пользователей, у которых может возникнуть желание попробовать этот «однострочный».
Майкл
Спасибо за ответ! Я просто быстро пытался выполнить сценарий удаления запроса пароля sudo на моих тестируемых виртуальных машинах. Не стесняйтесь предлагать улучшения :)
Eric Landry
Вам все еще нужно sudo chmod 440 /etc/sudoers.d/$(logname)исправить права доступа к файлам, как указано в README в этом каталоге.
paradroid
6

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

Другой подход заключается в том, чтобы оставить файл sudoers без изменений и, введя что-то сложное для своих сотен серверов, ввести sudo bash. Это даст вам оболочку, которая будет аутентифицироваться как root, пока вы не выйдете из нее.

Джон С. Грубер
источник
12
sudo -sили sudo -i, возможно, оба являются лучшими идеями, чем sudo bash, потому что они гарантируют, что окружающая среда нормальна и вещи.
Дараэль
2
«Нормальный и прочее», как правило, не относится к сфере «лучших идей». Может ли кто-нибудь дать техническое объяснение того, почему sudo -s или sudo -i лучше, чем sudo bash? (Изменить: Вот соответствующий вопрос askubuntu.com/questions/376199/… )
Nuzzolilo
2
ряд sudoкоманд (особенно учитывая sudo pip ...) требуют sudo -H(установите HOME) для правильного выполнения команды. В других случаях sudo -Eможет потребоваться (сохранить env). Запуск, sudo bashвероятно, будет работать в большинстве случаев, но не во всех, и когда это не так, неясно, почему.
Майкл
1
sudo su - это традиционный способ поменяться ролями и начать действовать от имени администратора системы.
user1656671
3

От Super User приходит хороший ответ:

Используйте ключ -S, который читает пароль из STDIN:

echo <password> | sudo -S <command>

Замените <password>своим паролем.

WinEunuuchs2Unix
источник
2
Это не рекомендуется, потому что пароль остается в cleartype в файле истории оболочки. Вместо этого примените любое другое решение.
HappyCactus
1
@HappyCactus Вы можете поставить один раз пробел перед ним, echoчтобы он не появлялся в истории?
WinEunuuchs2Unix
Да, это позволит избежать раскрытия пароля открытым текстом в файле истории. Но вы всегда помните, чтобы добавить его? :-)
HappyCactus
@HappyCactus Я, как правило, добавляю пробел случайно, а потом раздражаюсь, когда история не может быть вызвана :) В любом случае, у Суперпользователя 129 голосов, поэтому я думаю, что это хороший ответ - уйти отсюда. Люди будут читать наши комментарии и знать о рисках и шагах неприятия риска.
WinEunuuchs2Unix
Я абсолютно согласен. Хорошего дня!
HappyCactus
2

Один лайнер

sudo sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g'

upteryx
источник
2

Это однострочное решение, которое также изменяет права доступа к файлам, как указано в /etc/sudoer.d/README:

sudo sh -c 'echo "$(logname) ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/$(logname)' & sudo chmod 440 /etc/sudoers.d/$(logname)
Paradroid
источник
0
  • Расширение идеи @upteryx.

  • Вот как я реализовал пользователя без полномочий root в эфемерном образе Docker для использования в конвейере CICD:

RUN \
    groupadd -g 999 foo && useradd -u 999 -g foo -G sudo -m -s /bin/bash foo && \
    sed -i /etc/sudoers -re 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^root.*/root ALL=(ALL:ALL) NOPASSWD: ALL/g' && \
    sed -i /etc/sudoers -re 's/^#includedir.*/## **Removed the include directive** ##"/g' && \
    echo "foo ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
    echo "Customized the sudoers file for passwordless access to the foo user!" && \
    echo "foo user:";  su - foo -c id
Сет Бергман
источник