Придумал (может быть, я не первый) такой способ выключения и перезагрузки с использованием cron, без sudo:
https://studio.youtube.com/video/0VsXXP5t80I/
- Пользователь сохраняет в домашней директории файл с управляющим символом, используя для этого скрипт или просто команду, например:
echo 1 > shutdown.txt
- Cron от пользователя root выполняет свой скрипт и читает файл пользователя, выполняет выключение или перезагрузку.
*Примерная реализация
crontab -e: */1 * * * * sh /root/shutdown_1.sh
В /root/shutdown_1.sh
Как написали ниже, у такого способа имеется уязвимость:
SHUTDOWN_COMP=`md5sum /home/user/shutdown.txt | grep -o 1`;
if [ "$SHUTDOWN_COMP" = "b026324c" ]
then
echo 0 > /home/user/shutdown.txt & SHUTDOWN_COMP="0" & /sbin/poweroff;
fi
Update
Скрипт от root меняется на такой:
SHUTDOWN_COMP=`grep -o 098 /home/user/shutdown.txt`;
if [ "$SHUTDOWN_COMP" = "098" ]
then
/sbin/poweroff;
fi
Пользовательский (не root) cron после перезагрузки меняет состояние файла /home/user/shutdown.txt или удаляет его. То есть, crontab -e:
@reboot echo 0 > /home/user/shutdown.txt
Post Scriptum
Пробую. Пока работает корректно.
-
*
Update *
-
*
Последнее обновление. Финальное. *
-
*
Система перезагрузки и выключения без sudo *
-
*
-
*
Прислушался к советам в комментариях и пока получилась такая система: 1) две программы на языке C. Обе работают через cron. Первая проверяет наличие файла /run/shudown.txt только при старте системы. Если его нет, то создаёт его. Проверерку, вероятно, можно удалить.
Запись в cron:
@reboot /usr/local/bin/check
Файл: check.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main ()
{
FILE *file;
/*Проверим сущестование файла: если нет, то создадим,
установим права и владельца.*/
if (fopen("/run/shutdown.txt", "r") == NULL) {
creat("/run/shutdown.txt", 0644);
chown("/run/shutdown.txt", 1000, 0);
return 0;
}}
Вторая программа для проверки управляющих символов. Запись в cron:
*/1 * * * * /usr/local/bin/shutdownreboot
Второй файл: shutdownreboot.c
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char c;
FILE *file;
/*Откроем файл, прочитаем управляющий символ, перезагрузим или выключим.*/
file = fopen("/run/shutdown.txt", "r");
c = getc (file);
if (c == '4')
system("/sbin/reboot");
if (c == '2')
system("/sbin/poweroff");
fclose(file);
}
И два пользовательских скрипта (кнопки), содержащих команды для записи в /run/shutdown.txt:
echo 4 > /run/shutdown.txt
и
echo 2 > /run/shutdown.txt
P.S. Код на git: https://gitflic.ru/project/dcc0/system-reboot-control
Решил сделать статью на habr: https://habr.com/ru/post/703924/