Перезапуск CUPS пользователем

Всем привет!

Политики cups настроены так, что при сбоях должно удаляться задание.
Иногда, при застревании бумаги в принтере, уходит в режим pending так и не очищая задание, пока не перезапустишь cupsd. Если ждать, то может начать печатать через час-два.
Единственная мысль - это перезапуск службы скриптом с рабочего стола, но ей нужны рутовские права.
Как можно решить проблему?

Нужно установить setuid для этого скрипта. Но поскольку скрипты оболочки не могут быть SUID, есть альтернативное решение. Можно обернуть сценарий в нечто, что может использовать setuid.

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   system( "/path/to/script.sh" );

   return 0;
}

Настроить sudo.
Почитать мануал по нему и сделать разрешение на выполнение определённого скрипта sudo mycoolscript.sh

добавил в /etc/sudoers.d/calculate

user ALL=(ALL) NOPASSWD:/usr/local/sbin/restart-cupsd.sh

и при запуске требует пароль.

А если написать
user ALL=(ALL) NOPASSWD:ALL
то не требует.
Что я делаю не так?

Что-то ты не так приготовил.

$ sudo cat /etc/sudoers.d/test_sudo
Password:
# test_sudo

user ALL=(root) NOPASSWD:/opt/bin/test_sudo

$ cat /opt/bin/test_sudo
#!/bin/bash

echo "test from $(id -u)!!!!"

$ ls -l /opt/bin/test_sudo
-rwxr-xr-x 1 root root 44 Feb  4 10:45 /opt/bin/test_sudo

$ sudo /opt/bin/test_sudo
test from 0!!!!

$ /opt/bin/test_sudo
test from 500!!!!
1 Like