无需密码即可远程关闭/重启Linux机器

时间:2011-11-11 03:53:05

标签: linux qt python-3.x pyqt dbus

我正在编写一个pyQt客户端 - 服务器应用程序,它远程重启/关闭PC 接收器正在监听网络中的消息,发送者会向所选接收者发送重启/关闭消息。

以下部分代码在接收器上运行:

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是唯一的方式,还是我可以采用另一种方式(更直接)?

编辑: 在this问题中,使用了名为dbus的内容,并且没有密码,我正在搜索dbus,作为替代方案。

3 个答案:

答案 0 :(得分:7)

重新启动Linux计算机需要root权限。一些桌面环境使用守护进程来解决这个问题....但我建议编辑sudoers文件

https://help.ubuntu.com/community/Sudoers了解了一个方法。基本上你会想要在没有密码的情况下运行restart命令 - 只有restart命令。

类似的东西:

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

将允许计算机上的任何用户重新启动它而不使用密码。您可能需要在系统命令中使用'sudo'作为'shutdown'的前缀,尽管它看起来像是以某种方式自动调用。如果这不够安全,您可以创建一个组,使程序作为该组运行,然后允许该组重新启动。

编辑:显然这可以用DBus完成(注意:我没有测试过这个):

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 :(得分:1)

使用sudo python运行脚本。例如,如果您的文件名为remotesd.py,则为sudo python remotesd.py

答案 2 :(得分:0)

除了sudoers文件更改(为用户提供额外(有时是不需要的)权限)之外,您可以使用setuid。 即通过调用sudo chown root:<caller's username> thefile将可执行文件的所有者更改为root。然后将文件的权限更改为4750.这样,任何有权执行该文件的人都将被视为执行时的root。

相关问题