Запуск сценария Python Portio как обычного пользователя без доступа root

Я знаю, что есть риск запуска корневого скрипта как обычного пользователя, но в этом случае у меня нет выбора, а то, что я делаю, связано с машиной. У меня есть Small Board Computer с портами GPIO, и мне нужно использовать один из выходов для сброса устройства путем переключения линии выключения. Эта часть работает нормально, и устройство сбрасывается так, как должно.

Моя проблема в том, что я написал скрипт python для сброса устройства, и он работает, но я должен запустить его как root или «sudo program name, enter password». Но мне нужно, чтобы он работал как обычный пользователь без прав root. Другими словами, я добавил обычного пользователя, и я не могу запустить скрипт независимо от того, что я делаю.

Я попытался добавить пользователя в файл sudoer, но это не сработало и полностью игнорировалось. Я изменил разрешения, установил бит SUID и все остальное, о чем я могу думать, но все же он запрашивает пароль root. Единственное, что работало, это когда я открыл пользователей и группы и добавил пользователя в группу Sudo, но тогда у пользователя был доступ к программам, которые я бы предпочел, поскольку это было так же, как мой администратор по умолчанию. Это не то, чего я хочу. Я хотел бы как-то ограничить доступ к этому пользователю, одному сценарию или программе.

У меня были другие люди, которые предположили, что мне нужно написать драйвер, но я действительно не знаю, как это сделать или что они означают, и обычно они не хотят разрабатывать. Хотя я использовал Linux, я бы не стал рассматривать себя и эксперта особенно в этой области. У кого-нибудь есть идеи, как это сделать?

2 Solutions collect form web for “Запуск сценария Python Portio как обычного пользователя без доступа root”

Нашел решение здесь .

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

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

 #include <stdio.h> #include <stdlib.h> #include <sys/io.h> #define DESIRED_PORT 0x300 #define NUM_BYTES 8 int main(int argc, char*argv[]) { if (argc < 2) { printf("Error: no target program specified.\n"); exit(1); } if (ioperm(DESIRED_PORT, NUM_BYTES, 1)) { printf("Error: couldn't set port permissions.\n"); exit(1); } // Set uid to current user's id before executing the script setgid(getgid()); setuid(getuid()); if (execvp(argv[1], &argv[1]) < 0) { printf("Error: target program execution error.\n"); exit(1); } } 

Назовем его io_enable.c, затем скомпилируем и setuid root:

 $ gcc io_enable.c -o io_enable $ sudo chown root io_enable $ sudo chmod u+s io_enable 

Затем мы можем протестировать его со следующим скриптом python:

 #!/usr/bin/python import portio ADDR = 0x300 fd = open('/tmp/portio.log', 'w') for i in range(10): portio.outb(i, ADDR) fd.write('Wrote %d, read %d.\n' % (i, portio.inb(ADDR))) fd.close() 

Я называю его io_test.py, а затем запускаю его так:

 $ ./io_enable python io_test.py 

Похоже, он работает:

 $ cat /tmp/portio.log Wrote 0, read 0. Wrote 1, read 1. Wrote 2, read 2. Wrote 3, read 3. Wrote 4, read 4. Wrote 5, read 5. Wrote 6, read 6. Wrote 7, read 7. Wrote 8, read 8. Wrote 9, read 9. 

Добавьте эту строку в файл sudoers (используйте программу visudo , никогда не редактируйте файл sudoers напрямую), где bob – это имя пользователя, которому должно быть позволено запускать скрипт:

 bob ALL = (root) NOPASSWD: /path/to/my/script 

Если вы хотите это для нескольких пользователей, поместите их в группу resetters и сделайте эту линию sudoers

 %resetters ALL = (root) NOPASSWD: /path/to/my/script 

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

  • Почему Ubuntu 16.04 исполняет ограниченное изображение C # после 90 секунд, а другие - 24X7?
  • Capstone для Python не работает
  • рекурсивно удалять все файлы, пустые каталоги и каталоги с файлами из нескольких имен в текущем каталоге, включая текущий каталог
  • Изменение размера экрана VirtualBox?
  • dnsmasq вызывает невозможность разрешить DNS-запросы, сделанные хостом
  • Apache Reverse Proxy - Как отключить SSL-фронт, но разрешить защиту SSL
  • Как использовать цвета в MOTD?
  • Как установить статический IP-адрес в Ubuntu
  • Как разрешить traceroute запускаться с правами root на ubuntu
  • Как выполнить команду источника из файла sh
  • Проблема единства: нет пусковой установки и других баров (Ubuntu 16.04)
  • Interesting Posts

    Ускорение команды поиска rm с проверкой путем распараллеливания

    Bash – ожидаемое целочисленное выражение

    В чем разница между optirun и primusrun (шмель)

    Есть ли способ узнать частоту кадров файла субтитров?

    Насколько стабильны оболочки Unix «API-интерфейсы stdin / stdout»?

    Странная аутентификация с сервером Exchange

    На самом деле нужно понимать вывод CENTOS fdisk -l

    Как отобразить цепочку зависимостей из одного пакета в другой?

    PID процесса, вызывающего ошибку

    Как ограничить установку xorg одним видеодрайвером?

    Как выполнить программу, когда вызывается текстовый файл и по-прежнему возвращает правильный текст

    не распознал мой текущий раздел на внешнем диске. Как исправить, не теряя данные?

    Настройка принтера для использования только формата A4

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

    Удаление цветовых кодов из вывода

    Linux и Unix - лучшая ОС в мире.