无需密码即可远程关闭/重启 Linux 机器
Posted
技术标签:
【中文标题】无需密码即可远程关闭/重启 Linux 机器【英文标题】:Remotely shutdown/restart a Linux machine without password 【发布时间】:2011-12-26 17:31:50 【问题描述】:我正在编写一个远程重启/关闭 PC 的 pyQt 客户端-服务器应用程序。receivers 正在监听网络以获取传入消息,sender 向选定的接收者发送重启/关闭消息。
以下部分代码在接收器上运行:
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,作为替代。
【问题讨论】:
供参考,Linux和Windows都可以使用shutdown -r -t 1
。在 Windows 上,-t 1
意味着 -f
,因此您不必指定该选项(这意味着在 Linux 上完全不同)。
@cHao 不正确。 Windows 中的-f
表示强制关机。不等于-t 1
。见:microsoft.com/resources/documentation/windows/xp/all/proddocs/…
@Shivan:我现在正在看shutdown -?
。它对 /t 明确表示,“如果超时期限 [-t
] 大于 0,则隐含 /f 参数。”它也说对于/f,“当为/t参数指定大于0的值时,隐含了/f参数。”
【参考方案1】:
重启 Linux 机器需要 root 权限。一些桌面环境使用守护进程来解决这个问题......但我建议编辑 sudoers 文件
https://help.ubuntu.com/community/Sudoers 获取操作指南。基本上,您会希望允许在没有密码的情况下运行重新启动命令 - 并且只允许重新启动命令。
类似:
ALL ALL=(ALL) NOPASSWD: /usr/sbin/shutdown
将让机器上的任何用户在不使用密码的情况下重新启动它。您可能需要在系统命令中的“shutdown”前面加上“sudo”,尽管它看起来像是以某种方式自动调用的。如果这还不够安全,您可以创建一个组,让您的程序作为该组运行,然后允许该组重新启动。
编辑:显然这可以用 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 方式更干净,维护此代码的任何人也会如此。
【讨论】:
谢谢罗伯特。关于密码的使用,编辑 sudoers 看起来很有希望。另外,我刚刚发现了一个叫做dbus
(见编辑)的东西,有人甚至不用密码也能做到这一点。
这就是我提到的守护进程。
对不起,我对 Linux 的了解非常有限。我的程序中是否包含一个库,或者我必须在目标机器上安装一些东西?我问是因为当我尝试执行 dbus-send 命令时出现错误。
这两种方法都不需要任何额外的工作。两者都只是执行特定的命令。 sudo 方法更容易移植,而且肯定更简单,而 dbus 方法在您没有 root 权限(编辑 sudoers 文件)时有效。【参考方案2】:
使用sudo python
运行脚本。例如,如果您的文件名为 remotesd.py,sudo python remotesd.py
【讨论】:
不安全,尤其是对于网络监听器。至少如果他可以在没有广泛的根权限的情况下逃脱,他应该这样做。 最好使用sudo(8)
运行特定的shutdown
命令。【参考方案3】:
除了sudoers
文件更改给用户额外的(有时是不需要的)机器上的权限,你可以使用setuid
。
即通过调用sudo chown root:<caller's username> thefile
将可执行文件的所有者更改为root,然后将文件的权限更改为4750。这样任何有执行该文件的权限的人在执行时都将被视为root。
【讨论】:
以上是关于无需密码即可远程关闭/重启 Linux 机器的主要内容,如果未能解决你的问题,请参考以下文章