通过 REST URL 关闭系统

通过 REST URL 关闭系统

如何通过 REST URL 触发关机?我这样调用“http://192.168.1.20/command/shutdown“并且系统关闭。这应该可以在同一个子网中的任何其他计算机上进行。我该怎么做?我想避免为此运行 Apache 服务器。

(请不要给出任何无用、危险或愚蠢的建议)

答案1

由于您使用的是 Ubuntu,如果您有一个带有 systemd 的版本,那么您可以使用它来监听端口,并在有传入请求时运行服务和脚本。例如,为了进行测试,作为普通用户创建一个单元来监听端口 5000:

cat <<\! >~/.config/systemd/user/my.socket
[Unit]
Description=my socket
[Socket]
ListenStream=5000
Accept=true
!

创建一个具有相同前缀名称(“my”)的用户服务来运行~/myscript

cat <<\! >~/.config/systemd/user/[email protected]
[Unit]
Description=my service
[Service]
ExecStart=/home/meuh/myscript
StandardInput=socket
StandardOutput=socket
StandardError=syslog
!

创建脚本来读取/写入 http 协议的 stdin/stdout:

cat <<\! >/home/meuh/myscript
#!/bin/bash
printf 'Content-Type: text/plain\r\n'
printf 'Status: 200\r\n'
printf '\r\n'
matched=false
while read input
do [[ "$input" =~ ^$'\r'?$ ]] && break
   [[ "$input" =~ ^'GET /command/shutdown HTTP/' ]] && matched=true
done
if $matched
then echo "shutdown"
else echo "hello"
fi
exit 0
!
chmod +x myscript

启动套接字:

systemctl --user daemon-reload
systemctl --user start my.socket

使用 curl 连接到它,例如:

$ curl -v http://127.0.0.1:5000/command/stuff
> GET /command/stuff HTTP/1.1
> Host: 127.0.0.1:5000
> User-Agent: curl/7.51.0
> Accept: */*
> 
Content-Type: text/plain
Status: 200

hello

或关闭:

$ curl http://127.0.0.1:5000/command/shutdown
Content-Type: text/plain
Status: 200

shutdown

将 echo shutdown 替换为适当的内容,并将端口号替换为 80,就像 Web 服务器通常使用的那样。显然,您可以执行此操作的非用户版本,并将服务单元的 uid 设置为具有关机权限的某个人。


如果您将上述内容转换为系统单位,并将它们放在标准位置,例如/etc/systemd/system/my.socket,为了使其在启动时自动启动,您将需要让套接字等到网络准备就绪;添加到 .socket 文件[Unit]部分:

After=network-online.target

最后

[Install]
WantedBy=multi-user.target

这样您就可以启用它

systemctl --user enable my.socket

我不是 systemd 专家,所以您可能需要就此部分发布新的问题,特别是如果您继续使用--user单元,因为它们需要在启动时付出更多努力(而不是默认的用户登录)。

相关内容