it-swarm-ru.tech

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

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

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

Тогда я попробовал это:

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

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

175
LanceBaynes

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

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

97
Warren Young

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

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

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

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

139

[~ # ~] предупреждение [~ # ~] : этот ответ считается небезопасным. Смотрите комментарии ниже

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

  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
    

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

Следуйте простым шагам, упомянутым здесь http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/

24
M. Ahmad Zafar

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

myusername ALL=(ALL) NOPASSWD: /path/to/executable
12
musiKk

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

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

Это заставит команду работать от имени root без необходимости Sudo.

6
linuxgnuru

Если у вас есть дистрибутив, такой как Manjaro, вы должны сначала иметь дело с файлом, который переопределяет определение/etc/sudoers, вы можете удалить его или работать непосредственно с этим файлом, чтобы добавить свои новые конфигурации.

Этот файл:

Sudo cat /etc/sudoers.d/10-installer

ЕДИНСТВЕННЫЙ способ увидеть, что он находится под привилегиями root, вы не можете перечислить этот каталог без него, этот файл является специфичным для Manjaro, вы можете найти эту конфигурацию с другим именем, но в том же каталоге.

В выбранном вами файле вы можете добавить следующие строки для получения желаемой конфигурации:

Игнорировать аутентификацию для группы

%group ALL=(ALL) NOPASSWD: ALL

или игнорировать аутентификацию для пользователя

youruser ALL=(ALL) NOPASSWD: ALL

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

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

БЫСТРОЕ ПРИМЕЧАНИЕ: Вы открываете дверь для использования Sudo без аутентификации, это означает, что вы можете запускать все, что изменяет все в вашей системе, и использовать это с ответственностью.

5
Lyoneel

Убедитесь, что в Sudo нет псевдонимов. Беги так

/usr/bin/Sudo /path/to/my/program

Например псевдоним Shell, подобный этому:

alias Sudo="Sudo env PATH=$PATH"

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

4
Sepero

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

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

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

2
Luc

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

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

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

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

2
Caleb

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

super /path/to/your/script

Если вы хотите запустить какой-нибудь двоичный исполняемый файл (например, который вы скомпилировали в [~ # ~] elf [~ # ~] бинарный из некоторого исходного кода C) - который нет скрипт - как корень, вы можете подумать о том, чтобы сделать его setuid (и на самом деле /bin/login, /usr/bin/Sudo а также /bin/su и ​​super все используют эту технику). Однако будьте очень осторожны, вы можете открыть огромную дыру в безопасности .

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

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

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

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

Обратите внимание, что сценарий или любая вещь Шебанга не может быть установлена. Но вы можете закодировать (в C) небольшую setuid-двоичную оболочку.

1
Basile Starynkevitch

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

Пример: Sudo visudo -f /etc/sudoers.d/mynotriskycommand

Вставьте свою строку, предоставляющую разрешение: myuser ALL= NOPASSWD: /path/to/your/program

Затем сохраните и выйдите, и visudo предупредит вас, если у вас есть какие-либо синтаксические ошибки.

Вы можете запустить Sudo -l, Чтобы увидеть разрешения, которые были предоставлены вашему пользователю, если какая-либо из пользовательских команд NOPASSWD появится ПЕРЕД любой %groupyouarein ALL=(ALL) ALL командой в выводе, вы будете запрашивается ваш пароль.

Если вы обнаружите, что создаете много этих файлов sudoers.d, то, возможно, вы захотите создать их по имени для каждого пользователя, чтобы их было проще визуализировать. Имейте в виду, что порядок ИМЕН ФАЙЛОВ и ПРАВИЛ в файле очень важен, выигрывает ПОСЛЕДНЯЯ загрузка, независимо от того, разрешено ли оно БОЛЕЕ или МЕНЬШЕ, чем предыдущие записи.

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

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

0
dragon788

Вы также можете использовать пакет python pudo ).

Установка:

user$ Sudo -H pip3 install pudo # you can install using pip2 also

Ниже приведен фрагмент кода для использования в python автоматизации для запуска команд с привилегиями root:

user$ python3 # or python2
>>> import pudo
>>> (ret, out) = pudo.run(('ls', '/root')) # or pudo.run('ls /root')
>>> print(ret)
>>> 0
>>> print(out)
>>> b'Desktop\nDownloads\nPictures\nMusic\n'

Ниже приведен пример cmd для запуска команд с правами root:

user$ pudo ls /root
Desktop  Downloads  Pictures  Music
0
Madhusudhan Kasula

Чтобы позволить любому пользователю запускать программу как Sudo без запроса пароля, вы можете добавить следующую строку

%Sudo ALL=(root) NOPASSWD: /path/to/your/program

в /etc/sudoers

Обратите внимание, что % Sudo сделать это.

0
ultimatex

Следующее относится к случаю, когда вы хотите запускать команду без пароля, только если она имеет определенный набор параметров, где часть параметров является переменной. AFAIK невозможно использовать переменные или диапазоны значений в объявлениях sudoers, то есть вы можете явно разрешить доступ к _command option1_, но не _command option2_, используя:

user_name ALL=(root) /usr/bin/command option1

но если структура _command option1 value1_, где _value1_ может варьироваться, вам необходимо иметь явные строки sudoers для каждого возможного значения _value1_. Сценарий оболочки предоставляет способ обойти это.

Этот ответ был вдохновлен ответом Ахмада Зафара и устраняет проблему безопасности.

  1. Создайте сценарий оболочки, в котором вы вызываете команду без Sudo.
  2. Сохраните сценарий в папке с правами суперпользователя (например, _/usr/local/bin/_), сделайте файл корневым (например, _chown root:wheel /usr/local/bin/script_name_) без доступа для записи для других (например, _chmod 755 /usr/local/bin/script_name_).
  3. Добавьте исключение для sudoers, используя visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

  4. Запустите ваш скрипт _Sudo script_name_.

Например, я хочу изменить время ожидания отображения в macOS. Это делается с помощью:

_Sudo pmset displaysleep time_in_minutes_

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

Итак, у меня есть следующий скрипт в _/usr/local/bin/ds_:

_#!/bin/bash
if [ $# -eq 0 ]; then
        echo 'To set displaysleep time, run "Sudo ds [sleep_time_in_minutes]"'
else
        if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
                pmset displaysleep $1 
        else
                echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
        fi
fi
_

В конце файла sudoers у меня есть следующая строка:

user_name ALL=(root) NOPASSWD: /usr/local/bin/ds

Чтобы установить тайм-аут на 3 минуты, я запускаю свой скрипт из учетной записи обычного пользователя _user_name_:

_Sudo ds 3_

PS Большая часть моего сценария является проверкой ввода, которая не является обязательной, поэтому также будет работать следующее:

_#!/bin/bash
pmset displaysleep $1 
_
0
Koit Saarevet