LINUX.ORG.RU

Как правильно запускать программу-сервис, требующую права root?


0

1

Здравствуйте!


Пишу сейчас кастомный переключатель клавиатуры. Это обычная программа, которая в бесконечном цикле следит за файлом устройства клавиатуры, и переключает язык при определенных действиях пользователя.

Пробема в том, что для доступа к файлу устройства клавиатуры /dev/input/event0 нужны права рута.

Вопрос. Как правильно запускать эту программу так, чтобы она имела права рута, и при этом знала рабочую директорию пользователя чтобы из нее считать пользовательский конфиг?

Я могу конечно прописать программу в /etc/sudoers, и потом стартовать ее через sudo myprogram. Но это как-то неправильно. Назначать файлу устройства права доступа «всем» тоже как-то неправильно.

Программу планируется распространять как OpenSource, поэтому нужно выбрать сразу правильный метод. Какой?

Ответ на: комментарий от Deleted

> Ты изобретаешь xneur?

Я его уже изобрел. В xneur не нашел нужного мне функционала.

webhamster ()

chmod 777 /dev/input/event0 - и будет тебе счастье.

Программу планируется распространять как OpenSource

Не надо, пожааааааааалуйста.

segfault ★★★★★ ()

>и при этом знала рабочую директорию пользователя чтобы из нее считать пользовательский конфиг

если у меня запущено несколько терминалов с разными пользователями, то что он должен знать? может просто посмотреть UID чего-нибудь типа myXstart/gnome-session ?

Anonymous ★★★★★ ()
Ответ на: комментарий от webhamster

> Пробема в том, что для доступа к файлу устройства клавиатуры /dev/input/event0 нужны права рута.

После «chmod 777 /dev/input/event0» они требоваться не будут //К.О.

segfault ★★★★★ ()
Ответ на: комментарий от segfault

> После «chmod 777 /dev/input/event0» они требоваться не будут //К.О.

Кстате, по результатам этого обсуждения (и еще на opennet.ru), я и буду делать настройку программы. Естественно со ссылками на советчиков, рекомендующих те или иные действия.

То-то будет смеху, что такой грамотный и матерый segfaulьt советует такую жуету.

webhamster ()
Ответ на: комментарий от Anonymous

>> и при этом знала рабочую директорию пользователя чтобы из нее считать пользовательский конфиг

если у меня запущено несколько терминалов с разными пользователями, то что он должен знать? может просто посмотреть UID чего-нибудь типа myXstart/gnome-session ?

Честно говоря, на такие конфигурации я программу не расчитывал.

Программа - просто микроскопическая низкоуровневая переключалка (возможности которой, впрочем, определяются возможностями RegExp для отлова нужных событий по маскам), которая по-хорошему должна запускаться отдельно для каждого пользователя.

Я вот думаю, может sudo можно с каким-то ключем запустить, чтобы пользовательский каталог остался прежним. Пока на ум приходит только использовать опцию -H и городить скрипт, который будет генерировать команду запуска с рабочим каталогом текущего пользователя. Правда, это не избавит от ввода пароля. Поэтому нужно будет прописывать и в /etc/sudoers. Но мне такой подход не нравится, надо что-то попрощще и более правильное.

webhamster ()
Ответ на: комментарий от segfault

> Вау... я, оказывается, уже «грамотный и матерый». Звезду мне, срочно!

Грамотный и матерый тролль я имел в виду.

webhamster ()

Прописываешь /dev/input/event0 в некую группу. Добавляешь пользователя в эту группу. Профит.

geekless ★★ ()
Ответ на: комментарий от Anonymous

Можно переформулировать вопрос:

Как организовать запуск программы от пользователя так, чтобы она имела доступ к файлу с правами 600:root:root.

Ограничения: менять права файла нельзя, требовать ввода пароля нельзя.

webhamster ()
Ответ на: комментарий от webhamster

> Как организовать запуск программы от пользователя так, чтобы она имела доступ к файлу с правами 600:root:root.

Ограничения: менять права файла нельзя, требовать ввода пароля нельзя.

Запускать созданный тобой бинарник с взведенным битом SUID лично я бы не рискнул.

менять права файла нельзя

Это еще почему?

geekless ★★ ()
Ответ на: комментарий от geekless

Как организовать запуск программы от пользователя так, чтобы она имела доступ к файлу с правами 600:root:root. Ограничения: менять права файла нельзя, требовать ввода пароля нельзя.

Запускать созданный тобой бинарник с взведенным битом SUID лично я бы не рискнул.

Так OpenSource же. Исходники я открою. Ты как настоящий тру должен провести аудит перед сборкой, и с чистой совестью запустить. И так с каждой программой, включая LibreOffice. А то мало ли.


менять права файла нельзя

Это еще почему?

Потому что не просто так создатели дистрибутива установили права:

$ pwd
/dev/input

$ ls -l
итого 0
drwxr-xr-x 2 root root     80 Авг 30 11:24 by-id
drwxr-xr-x 2 root root    120 Авг 30 11:24 by-path
crw------- 1 root root 13, 64 Авг 30 11:24 event0
crw------- 1 root root 13, 65 Авг 30 11:24 event1
crw------- 1 root root 13, 66 Авг 30 11:24 event2
crw------- 1 root root 13, 67 Авг 30 11:24 event3
crw------- 1 root root 13, 68 Авг 30 11:24 event4
crw------- 1 root root 13, 63 Авг 30 11:24 mice
crw------- 1 root root 13, 32 Авг 30 11:24 mouse0
webhamster ()
Ответ на: комментарий от webhamster

> Так OpenSource же. Исходники я открою. Ты как настоящий тру должен провести аудит перед сборкой, и с чистой совестью запустить. И так с каждой программой, включая LibreOffice. А то мало ли.

LibreOffice я тоже от рута не запущу. Плохо троллишь, негодный пример.

Потому что не просто так создатели дистрибутива установили права

Они что, боги, чья воля не подлежит обсуждению, а только повиновению?

geekless ★★ ()
Ответ на: комментарий от geekless

Если бы /dev/input/event* были бы доступны первому встречному, то кейлоггер под линукс писался бы очень просто.

PolarFox ★★★★★ ()
Ответ на: комментарий от PolarFox

> Если бы /dev/input/event* были бы доступны первому встречному, то кейлоггер под линукс писался бы очень просто.

1. Назначаешь /dev/input/event* отдельную группу.
2. Добавляешь аккаунт в эту группу.
3. Запускаешь под этим аккаунтом (можно через SUID-бит) сабжевую программу.
4. Больше ничего под ним не зупускаешь.

В чем проблема? В незнании матчасти, разве что?

кейлоггер под линукс писался бы очень просто


Вы так говорите, будто в иксах кейлогрер и так не пишется легко и просто. Пусть тот, кто не использует иксы на десктопе, первый бросит в меня камень.

geekless ★★ ()

suid на файл программы уже предлагали?

anarquista ★★★★★ ()
Ответ на: комментарий от geekless

В gksu есть вроде какие-то средства от подобных кейлоггеров. Правда в фоксике их, к сожалению, нет.

PolarFox ★★★★★ ()
Ответ на: комментарий от geekless

В иксах можно читать клавиши только своей клавиатуры, какой в этом смысл?

Читать, что печатают на своих клавиатурах другие пользователи — этого конечно нельзя.

anarquista ★★★★★ ()
Ответ на: комментарий от webhamster

>Как организовать запуск программы от пользователя так, чтобы она имела доступ к файлу с правами 600:root:root.

это тебе надо писать не в General, и даже не в Development, а в Security...

а вообще очевидно, что такие вещи делаются не через доступ к устройству, а через функции иксов - тогда все вопросы решатся сами собой

Anonymous ★★★★★ ()
Ответ на: комментарий от Anonymous

> а вообще очевидно, что такие вещи делаются не через доступ к устройству, а через функции иксов - тогда все вопросы решатся сами собой

В иксах, к сожалению, нет события удерживания клавиши, которое возникает после нажатия примерно через 0,5 сек. Есть только нажатие и с каких-то пор отжатие.

А устройство генерит все события полностью, само собой.

webhamster ()
Ответ на: комментарий от Anonymous

> а вообще очевидно, что такие вещи делаются не через доступ к устройству, а через функции иксов - тогда все вопросы решатся сами собой

ППКС.

ТС, прямое чтение с устройства клавиатуры категорически не будет работать при 'Xorg -query another.host.in.net' или через ssh-соединение. Потому что такая переключалка будет запущена не на локальной машине, а на ремотной :)

Slavaz ★★★★★ ()
Ответ на: комментарий от Slavaz

> ТС, прямое чтение с устройства клавиатуры категорически не будет работать при 'Xorg -query another.host.in.net' или через ssh-соединение. Потому что такая переключалка будет запущена не на локальной машине, а на ремотной :)

Для хомяка типа меня прямое чтение с устройства клавиатуры подходит без возражений.

Удаленная работа через Xorg - это извращение для одминов, и то время от времени. Пользуется этим нольцелыххрендесятых процента луноходов.

Переключалка предназначена для иксов, так что само собой разумеется не будет работать в консоли. А для SSH кстати ненужно переключение языка на удаленной машине, по нему же только символы гонятся. А переключение должно поисходить на локальной машине.

Я щас правда попытался попробовать брать события не напрямую, а через иксовые функции. И столкнулся с тем, что чтобы отслеживать события, нужно иметь окно. Да, можно отследить и нажатие, и отжатие клавиши, да вот только события в окно поступают только те, которые предназначены для окна. А как подписаться на события во всей системе, разобраться не могу.

О, щас новую тему создам по этому вопросу.

webhamster ()
Ответ на: комментарий от webhamster

> А как подписаться на события во всей системе, разобраться не могу.

Если мне не изменяет склероз, в иксах есть так называемое «главное окно» или RootWindow. Надо найти его хэндл и повеситься на его события.

Slavaz ★★★★★ ()
Ответ на: комментарий от Slavaz

> Если мне не изменяет склероз, в иксах есть так называемое «главное окно» или RootWindow. Надо найти его хэндл и повеситься на его события.

Вот сматри, я подключаюсь к корневому окну, и события вообще не приходят:

[X11] Как отлавливать события во всей системе (а не только в своем окне)? (комментарий)
(Полный код см. в ТС сообщении)

При создании окна события приходят, но только те, которые возникают внутри окна.

webhamster ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.