无需密码即可远程关闭/重启 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 机器的主要内容,如果未能解决你的问题,请参考以下文章

windows远程重启

LInux查看是谁重启和关闭机器

linux服务器重启后sshd 服务不能启动

Windows2003服务器远程桌面可以在重启以后连接一次,退出再连接就提示远程桌面连接已关闭。这是怎么回事?

如何在linux下重启oracle数据库

1、Linux系统基本网络