微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从网络服务中关闭 linux

如何解决如何从网络服务中关闭 linux

用例是旨在作为无外设 RaspBerry Pi 上的设备运行的 Web 服务。操作系统:Raspbian (Debian)。

Web 服务在非 root 服务帐户下运行,使用自定义滚动的基于 Boost Beast 的 Web 服务器(避免!)。

我想要做的是:在 Web 界面中提供一个按钮,在远程用户的浏览器中运行,允许系统关闭或重新启动。

到目前为止我尝试过的......(C/C++)

   system("/usr/sbin/shutdown  -P Now");  // (or -r for reboot)

失败的消息:

... [3460]: Failed to set wall message,ignoring: Interactive authentication required.
... [3460]: Failed to power off system via logind: Interactive authentication required.
... [3460]: Failed to open initctl fifo: Permission denied
... [3460]: Failed to talk to init daemon.

我还尝试创建一个包装器可执行文件,该可执行文件已被 SUID 修改为 root,然后调用 system("/usr/sbin/shutdown ...") 并获得相同的结果。因此,即使使用 root 凭据,关机也会失败。 (也试过 /sbin/reboot,也失败了)。

有问题的服务是用 C++ 编写的,并为 Web 套接字提供服务。 Web 客户端应用程序发送 Web 套接字请求以关闭系统;并且关闭是在 C++ 服务器代码中执行的。当服务器在交互式会话中启动时,一切正常;但它在 systemd 服务中运行时不起作用。

Web 服务器本身作为使用系统帐户的 systemd 服务运行(因此没有登录凭据,我真的不想要服务帐户的登录凭据)。

我非常愿意重新配置系统,或在必要时专门为此目的创建服务,并尽我所能解决安全问题。但我不知道前进的道路是什么。这个问题特别紧迫,因为开箱即用的 RaspBerry Pi 上没有关机按钮(尽管我确实计划为我自己的 Pi 解决这个问题)。可以在 RaspBerry Pi 上安装关机按钮这一事实意味着必须有一些操作。

理想情况下,我想让 R-Pi 处于可用于其他目的的状态。因此,无密码引导到 shell 并不是一个有吸引力的选择。我不认为。基于 rsh 的解决方案没有吸引力,因为它们需要设备预先安装登录帐户和预安装凭据(我们都知道这是怎么回事)。

解决方法

我通过创建 C++ 守护进程解决了同样的问题,以 root 身份运行,并监听本地主机 TCP 端口,负责在 Web 服务联系时关闭系统。

编辑:使用 https://man7.org/linux/man-pages/man2/reboot.2.html 关闭操作系统。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。