Редактирование файла sudoers по-прежнему запрашивает пароль

Я пытаюсь получить доступ к контактам GPIO скрипта Python на Odroid XU4, для чего требуется sudo. Я хочу просто мигать выводом GPIO от выключенного до включенного, а затем снова выключаться. Скрипт python в порядке, но при запуске запрашивает пароль.

Я отредактировал свой файл sudoers, используя visudo, чтобы не требовать паролей для доступа к GPIO. Из предыдущих блогов я обнаружил, что порядок директив sudoers важен, и принял это во внимание. Мой текущий файл sudoers выглядит следующим образом:

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/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
username ALL=NOPASSWD: /sys/class/gpio/export
username ALL=NOPASSWD: /sys/class/gpio/gpio174/direction
username ALL=NOPASSWD: /sys/class/gpio/gpio174/value

Почему мне все еще предлагается ввести пароль при попытке доступа к контакту 174 GPIO? Я добавил директивы NOPASSWD после строк %admin и %sudo, как предлагалось в других сообщениях.


person M. Bedross    schedule 08.04.2016    source источник


Ответы (1)


/sys/class/gpio/export (и другие) — это псевдофайлы, а не программа. Sudo работает над ограничением доступа к программам, а не к файлам.

Я бы посоветовал посмотреть на https://serverfault.com/questions/641483/how-to-grant-user-modify-only-specific-protected-file-by-sudo (или, точнее, должен быть способ использовать расширенные разрешения для предоставления доступа пользователю к 3 системным файлам, которые вам нужны, таким образом, что не требуется root.

В качестве альтернативы, и это, вероятно, проще, вы можете сделать username ALL=NOPASSWD: /usr/bin/blinkscript

(где /usr/bin/blinkscript — ваша программа на Python с #!/usr/bin/python и установленными разрешениями, чтобы имя пользователя не могло перезаписать файл и т. д.)

Конкретная демонстрация для ясности: Дан файл blinkscript, который состоит из:

#!/usr/bin/python
print ("Hello World")

который помещается в /usr/bin, принадлежащий пользователю root, с правами доступа 700 (как при выполнении ls -l /usr/bin/blinkscript возвращается что-то вроде:

-rwx------. 1 корень корень 40 8 апр 19:52 /usr/bin/blinkscript

)

а затем иметь строку в нижней части вашего файла sudoers в форме:

user1 ВСЕ=NOPASSWD: /usr/bin/blinkscript

Если я, как пользователь1, делаю: blinkscript я получаю: "отказано в доступе"

Если я, как user1, делаю: sudo blinkscript, я получаю: "Hello World" (без запроса пароля) (обратите внимание, что мне не нужно явно указывать /usr/bin/blinkscript, но это тоже работает)

Если я как пользователь2 (у которого нет никаких привилегий sudo) сделаю: sudo blinkscript мне будет предложено ввести пароль, а затем я попаду в список плохих парней

(Также обратите внимание, что я использовал разрешения 700, чтобы четко показать разрешения; сделать что-то вроде 755 также было бы хорошо, и дело в том, что если ваш скрипт попытается коснуться файлов /sys, он будет работать при запуске с sudo, а не без ; я пытался подчеркнуть, что если вы сделаете разрешения 777 или принадлежащие пользователю user1, то user1 сможет редактировать файл для запуска любых команд, которые они хотят, что лишает цели не просто выполнять user1 all=all nopasswd: all в первую очередь)

person Foon    schedule 08.04.2016
comment
Спасибо за быстрый ответ! Что именно вы имеете в виду, устанавливая #!/usr/bin/python и разрешение, чтобы имя пользователя не могло перезаписать его? Кроме того, попытка вставить username ALL=NOPASSWD: /usr/bin/blinkscript в мой файл sudoers приводит к синтаксической ошибке, и я не знаю, почему. Должен ли я включать расширение .py? - person M. Bedross; 09.04.2016
comment
ОБНОВЛЕНИЕ: мне удалось добавить username ALL=NOPASSWD: /usr/bin/blinkscript в файл sudoers, но он ВСЕ ЕЩЕ запрашивает пароль в терминале. - person M. Bedross; 09.04.2016
comment
@ M.Bedross Я обновил проверенный пример; просто чтобы проверить: ваш blinkscript делает что-нибудь, что вызывает sudo внутри скрипта? - person Foon; 09.04.2016
comment
Спасибо за наглядный пример, и да, мой скрипт blink вызывает sudo внутри скрипта. Скрипт работает именно так, как задумано, единственная проблема в том, что он запрашивает пароль. Сейчас пробую ваш пример. - person M. Bedross; 09.04.2016
comment
Я только что не только закончил прогон вашего примера, но и включил его в свой настоящий скрипт на Python, и он работает безупречно. Что изменилось, так это то, что у меня были неправильные права доступа к самому файлу. Владение файлом и его исполняемый файл root позволяли ему запускаться без запроса пароля через терминал. СПАСИБО! - person M. Bedross; 09.04.2016