Как запустить программу требующую sudo с рабочего стола кликом мыши по иконке?
Простая задача: есть программа на C++ которая работает с mmap и с графической оболочкой (создает окно). Программа создается для ограниченных в познании компьютеров людей и нужно чтобы она запускалась с рабочего стола кликом мыши по иконке.
Я создал на рабочем столе start.sh и прописал ему chmod ugo+x
#!/bin/bash
cd my
sudo ./a.out
Если написать в терминале sudo ./start.sh то все работает. А если с рабочего стола мышью нажать на иконку, то 3 кнопки: Open, Execute, Execute in Terminal. То есть а где кнопка типо Execute with sudo? При запуске с рабочего стола mmap ругается и требует sudo. Подскажите пожалуйста как решить эту проблему. Система Debian 9.9 оболочка lxqt.
Можно ли запустить скрипт с рабочего стола с sudo?
Или если нельзя, то может можно сделать чтобы система запускалась от root и не требовала sudo для mmap?
Или вообще как то сделать чтобы mmap не требовал sudo?
Или может можно хотя бы запускать программу с sudo при старте системы и как это сделать чтобы при этом окно успевало появляться в графической оболочке?
Ответы (1 шт):
Я вижу несколько путей.
- Передать приложение руту и выставить UID бит. Тогда процесс запущенного приложения будет выполняться от имени рута. Соответственно, приложение имеет полный доступ ко всем возможностям ОС.
sudo chown root:root my/a.out
sudo chmod u+s my/a.out
Этот способ работает, но считается просто капец каким небезопасным.
- Вместо
sudoиспользовать графическую обёртку, которая спросит пароль при запуске.
Debian у меня нет. В Ubuntu последних версий это pkexec.
$ pkexec env DISPAY=$DISPLAY XAUTHORITY=$XAUTHORUTY /full/path/to/a.out
Эта команда спросит пароль (графически) и запустит ваш a.out от имени root.
Пример:
user$ pkexec env DISPLAY=$DISPLAY XAUTHORITY=$XAUTHORUTY /usr/bin/xterm
Работает, открывает xterm от имени root
- Дать процессу привилегии
cap_sys_rawioиcap_dac_override(ХЗ как capability переводят русских мануалах, я перевёл как привилегия)
sudo setcap cap_sys_rawio,cap_dac_override+ep ./my/a.out
С этими двумя фичам ваш процесс сможет открыть любой файл. В том числе /dev/mem. Если open("/dev/mem") - единственная операция, которая требует привилегий, то процесс работать будет.
Пример:
cp /usr/bin/head .
sudo setcap cap_sys_rawio,cap_dac_override+ep ./head
./head -c 32 /dev/mem | hexdump -C
Этот скрипт выводит первые 32 байта /dev/mem
Если же взять исходный head без привилегий
/usr/bin/head -c 32 /dev/mem | hexdump -C
то будет ошибка
/usr/bin/head: cannot open '/dev/mem' for reading: Permission denied