Как запустить программу требующую 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 шт):

Автор решения: Pak Uula

Я вижу несколько путей.

  1. Передать приложение руту и выставить UID бит. Тогда процесс запущенного приложения будет выполняться от имени рута. Соответственно, приложение имеет полный доступ ко всем возможностям ОС.
sudo chown root:root my/a.out
sudo chmod u+s my/a.out

Этот способ работает, но считается просто капец каким небезопасным.

  1. Вместо 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

  1. Дать процессу привилегии 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
→ Ссылка