Как запустить определенную программу как root без подсказки пароля?

Мне нужно запустить что-то как sudo без пароля, поэтому я использовал visudo и добавил его в мой файл sudoers:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

Затем я попробовал:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

Почему он запрашивает пароль? Как я могу запускать /использовать команды как root с пользователем без полномочий root, не спрашивая пароль?

125 голосов | спросил LanceBaynes 16 PM00000020000005631 2011, 14:29:56

11 ответов


68

У вас есть еще одна запись в sudoers файл, который также соответствует вашему пользователю. Правило NOPASSWD должно быть после этого, чтобы оно имело приоритет.

Сделав это, sudo будет запрашивать пароль обычно для всех команд, кроме /path/to/my/program, который он всегда позволит вам запускать без запроса для вашего пароля.

ответил Warren Young 16 PM00000030000001831 2011, 15:32:18
101

Если в /etc/sudoers имеется несколько совпадающих записей, sudo использует последний. Поэтому, если вы можете выполнить любую команду с приглашением пароля и хотите иметь возможность выполнить определенную команду без приглашения пароля, вам нужно последнее исключение.

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

Обратите внимание на использование (root), чтобы программа запускалась от имени пользователя root, но не как другие пользователи. (Не давайте больше разрешений, чем минимум, если вы не подумали о последствиях.)

Примечание для читателей, которые не запускают Ubuntu или кто изменил конфигурацию sudo по умолчанию (по умолчанию у sudo у Ubuntu нормально) : запуск сценариев оболочки с повышенными привилегиями является рискованным, вам нужно начать с чистая среда (как только оболочка запущена, уже слишком поздно (см. Разрешить setuid для сценариев оболочки ), поэтому вам нужно sudo, чтобы позаботиться об этом). Убедитесь, что у вас есть Defaults env_reset в /etc/sudoers или что этот параметр является стандартным для времени компиляции (sudo sudo -V | grep env должен включать Reset the environment to a default set of variables).

ответил Gilles 12 Maypm11 2011, 15:36:14
18

ПРЕДУПРЕЖДЕНИЕ . Этот ответ считается небезопасным. См. Комментарии ниже

Полное решение: Следующие шаги помогут вам достичь желаемого результата:

  1. Создайте новый файл сценария (замените create_dir.sh на нужное имя скрипта):

    vim ~/create_dir.sh
    

    Сценарий будет создан в домашнем каталоге пользователя

  2. Добавьте несколько команд, которые могут выполнять только пользовательский root или sudo, например, создание папки на уровне корневого каталога:

    mkdir /abc
    

    Примечание: Не добавляйте sudo к этим командам. Сохранить и выйти (используя :wq!)

  3. Назначьте права на выполнение с помощью:

    sudo chmod u+x create_dir.sh
    
  4. Внесите изменения, чтобы этот скрипт не требовал пароля.

    1. Откройте файл sudoers:

      sudo visudo -f /etc/sudoers
      
    2. Добавьте в конец следующую строку:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      Замените ahmad любым своим именем пользователя. Также убедитесь, что это последняя строка. Сохранить и выйти.

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

    sudo ./create_dir.sh
    

    Это приведет к выполнению команд внутри файла сценария без запроса пароля.

Следуйте простым шагам, указанным здесь

ответил M. Ahmad Zafar 14 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 14 Sep 2013 09:18:41 +0400 2013, 09:18:41
8

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

myusername ALL=(ALL) NOPASSWD: /path/to/executable
ответил musiKk 12 Maypm11 2011, 12:30:31
4

В некоторых дистрибутивах Manjaro в моем случае есть файл, который переопределяет файл /etc /sudoers

sudo cat /etc/sudoers.d/10-installer
  • Единственный способ увидеть, что он находится под привилегиями root, вы не можете перечислить этот каталог без него.

Там вы найдете что-то вроде этого:

youruser ALL=(ALL)

Вы можете удалить этот файл и использовать cfg в файле /etc /sudoers


/и т.д. /sudoers :

В файле sudoers вы должны поставить что-то вроде:

%group ALL=(ALL) NOPASSWD: ALL

или

youruser ALL=(ALL) NOPASSWD: ALL

или

youruser ALL=(ALL) NOPASSWD: /path/to/executable

Надеюсь, это поможет кому-то:).

ответил Lyoneel 17 J0000006Europe/Moscow 2015, 23:48:07
3

Убедитесь, что sudo не является псевдонимом. Запустите как

/usr/bin/sudo /path/to/my/program

Например, псевдоним оболочки, такой как этот:

alias sudo="sudo env PATH=$PATH"

может вызвать такое поведение.

ответил Sepero 19 J000000Saturday14 2014, 03:54:29
2

Когда вы выполняете свой скрипт, вам нужно запустить его как sudo /path/to/my/script.

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

Вы также можете использовать gtk-sudo для подсказки визуального пароля.

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

ответил Caleb 12 Maypm11 2011, 12:31:04
2

Это решило проблему для меня (также попробовал некоторые другие ответы, которые могли бы помочь):

Сценарий, который я вызывал, был в /usr/bin, каталоге, в котором у меня нет прав на запись (хотя обычно я могу читать любые файлы там). Скрипт был chmodded + x (исполняемый permisison), но он все еще не работал. Перемещая этот файл к пути в моем домашнем каталоге, вместо /usr/bin, я, наконец, смог вызвать его с помощью sudo без ввода пароля.

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

ответил Luc 18 J000000Thursday13 2013, 21:44:51
1

Если вы хотите избежать использования sudo и не изменять файл конфигурации sudoers, вы можете использовать:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

Это приведет к тому, что команда будет запущена как root без необходимости sudo.

ответил linuxgnuru 25 MarpmSat, 25 Mar 2017 12:10:36 +03002017-03-25T12:10:36+03:0012 2017, 12:10:36
0

В идеале, если вы настраиваете, какие команды могут выполняться через sudo, вы должны вносить эти изменения в отдельный файл в /etc/sudoers.d/ вместо редактирования непосредственно sudoers. Вы также должны всегда использовать sudoers для редактирования файла (ов). НИКОГДА не следует предоставлять visudo в командах NOPASSWD.

Пример: ALL

Вставьте разрешение на предоставление вашей линии: sudo visudo -f /etc/sudoers.d/mynotriskycommand

Затем сохраните и выйдите, а myuser ALL= NOPASSWD: /path/to/your/program предупредит вас, если у вас есть синтаксические ошибки.

Вы можете запустить visudo, чтобы просмотреть разрешения, предоставленные вашим пользователем, если какая-либо из пользовательских команд sudo -l отображается перед любым NOPASSWD на выходе вам будет предложено ввести пароль.

Если вы обнаружите, что создаете много файлов sudoers.d, возможно, вам захочется создать их для каждого пользователя, чтобы их было легче визуализировать. Имейте в виду, что порядок наименований файлов и правил в файле очень важен, побеждает LAST, независимо от того, является ли он более или менее допустимым, чем предыдущие записи.

  

Вы можете управлять упорядочением имени файла, используя префикс 00-99 или aa /bb /cc, но также помните, что если у вас есть ЛЮБЫЕ файлы, которые не имеют числового префикса, они будут загружаться после пронумерованных файлы, переопределяя настройки. Это связано с тем, что в зависимости от ваших языковых настроек «лексическая сортировка» оболочка сначала использует сортировки, а затем может чередовать верхний и нижний регистр при сортировке в порядке «возрастания».

Попробуйте запустить %groupyouarein ALL=(ALL) ALL и printf '%s\n' {{0..99},{A-Z},{a-z}} | sort, чтобы узнать, печатает ли ваш текущий язык printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort и т. Д. Или AaBbCc, а затем ABC, чтобы определить, какие лучшие "последние" префикс письма для использования будет.

ответил dragon788 23 Mayam17 2017, 00:26:32
0

Другой возможностью может быть установка, настройка, а затем использование super для запуска вашего скрипта как

super /path/to/your/script

Если вы хотите запустить несколько двоичных исполняемых файлов (например, которые вы скомпилировали в ELF двоичный код из некоторого исходного кода) - это not скрипт- как root, вы могли бы рассмотреть возможность создания setuid (и фактически /bin /login, /bin/login и /usr/bin/sudo и /bin/su используют эту технику ). Однако будьте очень осторожны, вы можете открыть огромное отверстие безопасности .

Конкретно, ваша программа должна быть параноидально закодирована (так что проверяйте все аргументы и среду и внешние условия до «действия», предполагая потенциально враждебного пользователя), тогда вы можете использовать seteuid (2) и друзья (см. также setreuid (2) ) тщательно (см. также возможности (7) & учетные данные (7) & execve (2) ...)

Вы будете использовать super (читайте chmod (1) ) при установке такого двоичного файла.

Но будьте очень осторожны .

Прочитайте много вещей о setuid , включая Расширенное программирование Linux , прежде чем кодировать такую ​​вещь.

Обратите внимание, что скрипт или любая shebang -ed вещь не может быть УИП. Но вы могли бы закодировать (в C) небольшую битовую бинарную привязку.

ответил Basile Starynkevitch 24 J000000Monday17 2017, 14:00:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132