Запуск сценария 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 (10.10)
  • Изменение разрешений на пользовательские файлы для автоматизации создания Apache VirtualHost
  • Установка переменных среды для пользователей системы
  • 404 Не Найдено. Файл существует (установлен)
  • Сервер SSH на Ubuntu не работает
  • Как bzip файл с минимальным процентом процессора?
  • Команда Curl PUT
  • Ошибка oem-bt-ar-9462-dkms в Ubuntu
  • Пользовательское приветствие при входе в систему через ssh
  • Установите NFS4-экспорт из Ubuntu на Mac OSX 10.11
  • Как настроить пороги зарядки аккумулятора ноутбука?
  • Linux и Unix - лучшая ОС в мире.