C ++, Linux, команда выключения без рута - PullRequest
0 голосов
/ 27 сентября 2019

Можно ли создать сценарий выключения, который будет запускаться от имени пользователя без использования привилегий root?

Я нашел этот код, но он, похоже, ничего не делает:

#include <unistd.h>
#include <sys/reboot.h>

int main () {
    sync();    // If reboot() not preceded by a sync(), data will be lost.
    setuid(0); // set uid to root, the running uid must already have the
               // appropriate permissions to do this.
    reboot(RB_AUTOBOOT); // note, this reboots the system, it's not as
    return(0);           // graceful as asking the init system to reboot.
}

Информация о системе:

Linux hosek 4.15.0-48-generic #51-Ubuntu SMP Wed Apr 3 08:28:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Во-первых, не делай этого.Неважно, насколько вы думаете, что хотите сделать это, вы не делаете.Шутки в сторону.Делая это, вы главным образом балуетесь с безопасностью системы.Эти системы трудно исправить, даже люди, которые действительно хорошо их знают.Так что не делай этого.Если вам нужно дать кому-то разрешение на выключение вашей системы, выясните, как настроить sudo, чтобы разрешить это.Не идите по пути, по которому вы идете.

Если вы абсолютно настаиваете на этом или просто играете на тестовой виртуальной машине, которую вы собираетесь стереть после окончания игры, узнайте, какустановить бит «setuid» для исполняемого файла.

Выполните следующие три команды:

$ chmod a-w name_of_executable
$ sudo chown root name_of_executable
$ sudo chmod u+s name_of_executable

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

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

0 голосов
/ 27 сентября 2019

Настольная система с systemd и соответствующими разрешениями может взаимодействовать с systemd из консоли:

systemctl poweroff

https://wiki.debian.org/UserShutdown

Или путем удаления API-интерфейса systemd из c / c ++

Простой C или C ++ API для управления услугами systemd

...