Удаленно выключите / перезапустите компьютер с Linux без пароля - PullRequest
5 голосов
/ 11 ноября 2011

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

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

import os

self.currentOS = calling a function to determine the current OS

if self.currentOS == "Win":
    os.system("shutdown -r -f -t 1")
elif self.currentOS == "Lin":
    os.system("shutdown -r now")

У меня есть 2 виртуальные машины, выступающие в качестве получателей, одна в Windows, а другая в Linux.

Когда я отправляю сообщение о перезагрузке на приемник Windows, аппарат перезагружается.
Когда я отправляю сообщение перезапуска на приемник Linux , запрашивает пароль

Incoming:EXEC_OP_RESTART
[sudo] password for jwalker: 

Что мне нужно изменить, чтобы преодолеть это?
shutdown -r now единственный путь, или я могу сделать это по-другому (более прямо)?

EDIT: В этом вопросе использовалось то, что называется dbus, и это было сделано без пароля, я ищу dbus, как альтернативу.

Ответы [ 3 ]

7 голосов
/ 11 ноября 2011

Для перезагрузки компьютера с Linux требуются права суперпользователя.Некоторые окружения рабочего стола используют демон, чтобы обойти это .... но я предлагаю отредактировать файл sudoers

https://help.ubuntu.com/community/Sudoers для получения инструкции.По сути, вы захотите разрешить запуск команды restart - и только команды restart - без пароля.

Что-то вроде:

ALL ALL=(ALL) NOPASSWD: /usr/sbin/shutdown

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

РЕДАКТИРОВАТЬ: Очевидно, это можно сделать с помощью DBus (примечание: у меня нетt проверял это):

dbus-send --system --print-reply --dest="org.freedesktop.Hal" /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Restart int32:0

Это работает, потому что dbus работает как root (или имеет привилегии root) и поэтому может принимать запросы на перезапуск от непривилегированных процессов и действовать на них.Я все еще думаю, что способ sudo чище, как и любой, кто поддерживает этот код.

1 голос
/ 11 ноября 2011

Запустите скрипт с sudo python. Например, если ваш файл был назван remotesd.py, sudo python remotesd.py

0 голосов
/ 11 ноября 2011

Кроме изменения файла sudoers, которое дает пользователю дополнительные (иногда нежелательные) привилегии на машине, вы можете использовать setuid.т.е. измените владельца исполняемого файла на root, вызвав sudo chown root:<caller's username> thefile, затем измените разрешение файла на 4750. Таким образом, тот, кто имеет разрешение на выполнение файла, будет считаться корневым при выполнении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...