LINUX.ORG.RU
решено ФорумAdmin

запустить скрипт от рута

 , ,


0

1

Я видел этот вопрос тут сто раз, но не смог найти ничего интересного. Надо запустить

echo 1 > /sys/class/leds/input4::scrolllock/brightness

что важно запустить уже после запуска вм (в моем случае как всегда hyprland). Причем c sudo не работает, нужен именно root юзер. Системды сервис был бы решением, но не знаю как запустить его именно после старта hyprland. Hyprland запускается из tty

Перемещено hobbit из general


Я видел этот вопрос тут сто раз, но не смог найти ничего интересного

sudo

Это всё конечно позор.

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

Логинишься за рута.

Создаёшь input4-scrolllock-set.c

#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

static int file_put_contents(char const *fn, char const *value) {
  int fd;
  size_t len;
  ssize_t rlen;
  fd = open(fn, O_WRONLY);
  if(fd<0) { fprintf(stderr, "open(%s) error %d (%s)\n", fn, errno, strerror(errno)); return -1; }
  len = strlen(value);
  rlen = write(fd, value, len);
  if(rlen<0) { fprintf(stderr, "write(%s) error %d (%s)\n", fn, errno, strerror(errno)); close(fd); return -1; }
  close(fd);
  if((size_t)rlen<len) { fprintf(stderr, "write(%s) wrote %u bytes of %u\n", fn, (unsigned)rlen, (unsigned)len); return -1; }
  return 0;
}

int main(int argc, char **argv) {
  if(argc!=2) { fprintf(stderr, "usage: %s <scrollock_status>\n", argv[0]); return -1; }
  return file_put_contents("/sys/class/leds/input4::scrolllock/brightness", argv[1]);
}

Компилируешь и устанавливаешь:

# gcc -o /usr/local/bin/input4-scrolllock-set input4-scrolllock-set.c
# addgroup input4-scrolllock-set
# chgrp input4-scrolllock-set /usr/local/bin/input4-scrolllock-set
# chmod 4750 /usr/local/bin/input4-scrolllock-set

Добавляешь юзера, которому разрешено менять скроллок, в группу input4-scrolllock-set

# usermod -a -G input4-scrolllock-set твой_юзернейм
и можешь пользоваться от него этой прогой:

$ /usr/local/bin/input4-scrolllock-set 1
firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 7)
Ответ на: комментарий от andytux

Работает! Если подправить sudoers для запуска без пароля, то именно этот вариант сработал с sudo. Правда я так и не понял как запускать в Hyprland скрипты с sudo при старте. Все что ни пробовал никакого результата. А такое jtad ALL = (ALL) NOPASSWD: ALL это жесть

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

Правда я так и не понял как запускать в Hyprland скрипты с sudo при старте. Все что ни пробовал никакого результата. А такое jtad ALL = (ALL) NOPASSWD: ALL это жесть

Я тебе дал решение которое будет запускаться безо всяких sudo и запросов паролей. И без побочных дыр. А ты в ответ зафейспалмил мне рандомные комменты.

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

Можно и модулем ядра - который позволит ставить права доступа на файлы в sysfs. Но это сложнее намного.

А чем тебя бинарник пугает? Он маленький, решает ровно поставленную задачу и точно не имеет побочных эффектов. Расходы вычислительной мощности (и электричества) на его запуск во много раз меньше чем расходы их на запуск как шелла, выполняющего одну строчку скрипта, так и sudo, прикостыливающего к шеллу права.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

не, состряпать бинарник интересно, но сколько мороки из-за одной строчки. Несоразмерные затраты времени

Я в sudoers просто добавил правило именно для скрипта

jtad ALL = (root) NOPASSWD: /home/jtad/bin/led.sh

и в старте прописал запуск от sudo

sh -c «sudo /home/jtad/bin/led.sh»

все. Но за идею с бинарником спасибо. Может где пригодится

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

brightness

Правда я так и не понял как запускать в Hyprland скрипты с sudo при старте.

brightnessctl? В описании на гитхабе - brightnessctl выполняет это без использования sudo/su

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

я же не говорил про brightness. У меня led клавиши и они не светятся без вышеназванного хака. А если нет света я вообще ничего не вижу. Странный девайс. Я бы выкинул ее за 17 евро, но уж больно мягкий ход кнопок. Я пальцами еле шевелю

monkdt
() автор топика
Ответ на: комментарий от firkax

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

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

Я ничего не понял кроме «неопакеченого бинарника», но и это левая претензия: неопакеченый бинарник, если считать его плохим, ничем не хуже неопакеченого скрипта.

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

Обычно предполагается что скрипту не нужны сброчные зависимости (да и пакет компиляторов по умолчанию не ставится), а совет запихать в /usr/local/bin/ неправильный. Для этого предусмотрен /bin/ или ~/.local/bin/

По поводу «ничего не понял кроме»: Вот ты решил вопрос конкретно с скролллоком и подсветкой клавиатуры. Но ты не решил вопроса с монтированием флешек, настройкой звуковухи и разрешением экрана. Под каждую эту задачу надо писать свой собственный код. Ну или взять одну типовую строчку в конфиге, как предложил @monkdt. Конечно, умение писать код это круто, но скрипт решает почти все проблемы в почти любых руках.

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

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

А потом бац переполнение и клавиатура, вместо того чтобы переключить индикатор, пишет на тебя донос в НКВД.

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

Обычно предполагается что скрипту не нужны сброчные зависимости

И что?

да и пакет компиляторов по умолчанию не ставится

Не представляю как можно иметь систему без gcc или на худой конец шланга. У меня везде есть.

а совет запихать в /usr/local/bin/ неправильный. Для этого предусмотрен /bin/ или ~/.local/bin/

Вот совет класть суидный бинарник в home это определённо бред. Класть кастомные бинарники в /bin - явно хуже чем в /usr/local/bin.

Вот ты решил вопрос конкретно с скролллоком и подсветкой клавиатуры. Но ты не решил вопроса с монтированием флешек,

Конечно не решил, автор ведь не про флешки спрашивал а про скроллок на четвёртном устройстве ввода.

Под каждую эту задачу надо писать свой собственный код.

Верно.

Ну или взять одну типовую строчку в конфиге

А это уже плохой подход. Плохо тут не то, что это строчка в конфиге, а детали реализации этого конфига: это конфиг полностью дефективной программы sudo, где доступ выдаётся методом текстового сравнивания команды с образцом по регуляркам, которая содержит кучу мусорного функционала и регулярно позорится всяческими дырами.

Если всю эту дефективность исправить, приходим в всё тому же варианту: написание индивидуального кода под каждую задачу: для подсветки клавы - свой, для флешек - свой, для разрешения - свой. У этих специализированных прог уже могут быть специализированные конфиги, и скорее всего их формат будет чуть отличаться друг от друга потому что задачи то разные.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Конечно не решил, автор ведь не про флешки спрашивал а про скроллок на четвёртном устройстве ввода.

Не, автор спрашивал про запуск рутового скрипта от юзера в нужный ему момент. Команду по скроллоку на четвёртом устройстве он и сам нашёл.

Плохо тут не то, что это строчка в конфиге, а детали реализации этого конфига: это конфиг полностью дефективной программы sudo

Я её тоже не люблю, но это как-никак стандартное решение задачи и альтернативы без ввода пароля мне как то не известны. Повторюсь: любой типовой задачи вида «вот эту рутовую команду от юзера, хоть скроллок, хоть частоты цпу подправить».

Если всю эту дефективность исправить

Просто root должен где то держать отдельную /sbin-user, все файлы из которой может править только root, а запускть любой. Ну нельзя без такого инструмента в современном сложном десктопе.

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

Не выдумывай, тема именно про скролллок. Просто её название недостаточно подробное.

это как-никак стандартное решение задачи

У кого стандартное? Это совершенно идиотский аргумент.

альтернативы без ввода пароля мне как то не известны

Я привёл выше нормальное решение.

любой типовой задачи вида «вот эту рутовую команду от юзера, хоть скроллок, хоть частоты цпу подправить».

Для разных задач нужны разные решения. Попытка натянуть всё на какой-то комбайн общего назначения изначально дефективна и ничего кроме дефективных результатов из неё не выйдет.

Просто root должен где то держать отдельную /sbin-user, все файлы из которой может править только root, а запускть любой. Ну нельзя без такого инструмента в современном сложном десктопе.

Это назвается setuid-root бинарники. Повторюсь, я как раз его и привёл как решение. И незачем его в какой-то /sbin-user сувать, для такого всегда был bin. Например /usr/bin/passwd

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

тут 5.3

тут Л - логика, при старте расскладка английская - скрол не горит, переключаешь в русский - скрол загорается, лучше просто не придумаешь… не понимаю зачем предварительно скрол зажигать?

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

Я привёл выше нормальное решение.

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

натянуть всё на какой-то комбайн

Наоборот, разбить по простым инструментам и операциям.

Это назвается setuid-root бинарники. Повторюсь, я как раз его и привёл как решение.

Принципиальная разница в том, что вы написали 1 такой бинарник, а не дали способ сделать таким любой произвольный скрипт.

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

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

Что ты несёшь? Читать доки нужно чтоб найти этот файл в sysfs, и автор с этим и так справился. Путь к файлу заменить никаких проблем не будет ни у кого. Что там ещё менять надо? Если речь про логику работы, то да - нужен «квалифицированный программист (c)», чтоб не получилась дырявая скриптота, сдобренная нелепым sudo. Но ты почему-то считаешь этот второй вариант как раз желательным.

Наоборот, разбить по простым инструментам и операциям.

Что я и сделал - простой инструмент для простой операции.

Принципиальная разница в том, что вы написали 1 такой бинарник, а не дали способ сделать таким любой произвольный скрипт.

🤦 НЕ НУЖНО произвольный скрипт делать setuid. Виндузятно-sudo-привычки так и лезут. Но вообще (хорошо что нубы об этом не знают), любой бинарник можно сделать setuid с помощью chmod, но перед этим этот бинарник нужно проверить на отсутствие уязвимостей, а для этого надо быть «квалифицированным программистом (c)». Просто запускать абы как сделанную скриптоту от рута - ни в коем случае не надо.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Читать доки нужно чтоб найти этот файл в sysfs, и автор с этим и так справился.

Нет, читать доки нужно для чего то вроде (это вы там что, функционал echo > реализовали что ли?)

static int file_put_contents(char const *fn, char const *value) {
  int fd;
  size_t len;
  ssize_t rlen;
  fd = open(fn, O_WRONLY);
  if(fd<0) { fprintf(stderr, "open(%s) error %d (%s)\n", fn, errno, strerror(errno)); return -1; }
  len = strlen(value);
  rlen = write(fd, value, len);
  if(rlen<0) { fprintf(stderr, "write(%s) error %d (%s)\n", fn, errno, strerror(errno)); close(fd); return -1; }
  close(fd);
  if((size_t)rlen<len) { fprintf(stderr, "write(%s) wrote %u bytes of %u\n", fn, (unsigned)rlen, (unsigned)len); return -1; }
  return 0;
} 

А для замещения переменной в одном файле sysfs используется как раз скрипт с echo - тут накосячить в милион раз сложнее чем в написании С-программы на более чем 10 строк. Или вы думаете, что пишете лучше чем дистрибутивный binutils? А почему тогда у вас путь к файлу прямо в коде захардкожен?

НЕ НУЖНО произвольный скрипт делать setuid

Нужно вот этот конкретный, про который известно что он всего лишь крутит яркость или включает скроллок. А уметь надо произвольный. Ваша программа конечно сильно экономит машинное время и срезает углы, но принципиально она делает то же самое что и echo в скрипте. Причём echo прописан в хэндбуках для чайников и требует квалификации школьника-самоучки а не прогера. И при этом ещё и безопастней!

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

функционал echo > реализовали что ли?

Разумеется.

тут накосячить в милион раз сложнее

Конкретно с echo именно сделать дыру - пожалуй, да. Но неожиданное поведение вполне возможно если забыть про то, что echo не просто выводит строку, а ещё и интерпретирует некоторые аргументы особенным способом.

А почему тогда у вас путь к файлу прямо в коде захардкожен?

Как раз затем, что он должен быть захардкожен, и юзеру не положено задавать другой. В этом главное отличие этой проги от echo. Можно было бы сделать туда поддержку разных индикаторов (caps, num, scroll) и разных номеров клавиатур, но тогда бы заодно пришлось городить конфиг (и парсер к нему) о том, какому юзеру какие именно индикаторы разрешено менять, а это всё лишнее - нам нужен только четвёртый скролллок, его и делаем без лишних ухищрений.

А уметь надо произвольный.

Ну я ж написал - chmod. Тот, кто в состоянии грамотно написать программу, точно знает и про chmod. А кто не в состоянии - лучше чтоб и не знал.

требует квалификации школьника-самоучки а не прогера

Вот именно. Сначала ты пишешь echo, потом начинаешь считать себя хакером и пишешь что-то сложнее, устраивая дыры. Нет, сначала надо научиться а потом уже писать. Простые школьные скрипты для себя запускай от своего юзера где они не создадут дыр. Причём, даже с echo нуб может устроить дыру, например он решит передавать номер или название индикатора аргументом, разумеется не проверит, что там что-то валидное:

#!/bin/sh
DEVNUM=$1
KEYNAME=$2
VALUE=$3
echo $VALUE > /sys/class/leds/input$DEVNUM::$KEYNAME/brightness

и исполнит в итоге строку вида

echo chown 0:0 /home/hacker/crack.bin ; chmod 4755 /home/hacker/crack.bin > /sys/class/leds/input4::scrolllock/../../../../../../../../../../../tmp/qwer/brightness
ну а в /tmp/qwer/brightness взломщик заботливо подложит симлинк на /etc/rc.local или ещё что-нить похожее.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Нет, сначала надо научиться а потом уже писать.

Нет уж, таким макаром все те 5-10 лет пока ты будешь учиться, у тебя не будет включаться четвёрный скролллок. Лучше косячить со скриптами и учиться делать бэкапы.

и исполнит в итоге строку вида

Но если ваш бинарник решает один конкретный маленький вопрос самым правильным образом, и только его один, то таких в день нужно штук по 10 (условно, в среднем конечно меньше...). А так как ты сам не умеешь писать на С, то вынужден тянуть, собирать, и запускать от рута чужой код хз откуда. Что собственно и является эталонным решетом, ещё худшим, чем мамкин хакер, дорвавшийся до баша. В случае баша ты по крайней мере видишь цепочку действий и можешь разобраться в ней на порядок быстрее. А, ну и справка к каждой команде ещё, а бинарник или работает, или нет.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)