выключить систему через REST URL

Как я могу вызвать отключение через REST URL? Я звоню чем-нибудь как « http://192.168.1.20/command/shutdown », и система выключается. Это должно работать с любого другого компьютера в той же подсети. Как я могу это сделать? Я хотел бы избежать запуска сервера Apache для этого.

(пожалуйста, не давайте никаких советов, что это не полезно, опасно или глупо)

0
задан 8 June 2019 в 17:32

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/my@.service
[Unit]
Description=my service
[Service]
ExecStart=/home/meuh/myscript
StandardInput=socket
StandardOutput=socket
StandardError=syslog
!

Создайте скрипт для чтения / записи stdin / stdout для протокола http:

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" =~ ^ 

Запустите сокет:

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

Замените отключение эха на что-то подходящее и номер порта на 80, как обычно для веб-сервера. Очевидно, что вы можете сделать это не для пользователя, а также установить uid сервисного подразделения кому-то, у кого есть права на отключение.


Если вы преобразуете вышеперечисленное в системные блоки и поместите их в стандартное место, например /etc/systemd/system/my.socket, то, чтобы включить автоматический запуск при загрузке, вы должны заставить сокет ждать, пока сеть не будет готова ; добавьте в раздел .socket file [Unit]:

After=network-online.target

и в конце

[Install]
WantedBy=multi-user.target

, чтобы вы могли включить его с помощью

systemctl --user enable my.socket

I Я не эксперт по systemd, поэтому вам может потребоваться опубликовать новые вопросы по этой части, особенно если вы продолжаете использовать блоки --user, так как им требуется больше усилий для запуска при загрузке (а не по умолчанию при входе пользователя в систему).

\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

Замените отключение эха на что-то подходящее и номер порта на 80, как обычно для веб-сервера. Очевидно, что вы можете сделать это не для пользователя, а также установить uid сервисного подразделения кому-то, у кого есть права на отключение.


Если вы преобразуете вышеперечисленное в системные блоки и поместите их в стандартное место, например /etc/systemd/system/my.socket, то, чтобы включить автоматический запуск при загрузке, вы должны заставить сокет ждать, пока сеть не будет готова ; добавьте в раздел .socket file [Unit]:

After=network-online.target

и в конце

[Install]
WantedBy=multi-user.target

, чтобы вы могли включить его с помощью

systemctl --user enable my.socket

I Я не эксперт по systemd, поэтому вам может потребоваться опубликовать новые вопросы по этой части, особенно если вы продолжаете использовать блоки --user, так как им требуется больше усилий для запуска при загрузке (а не по умолчанию при входе пользователя в систему).

4
ответ дан 8 June 2019 в 17:32

Другие вопросы по тегам:

Похожие вопросы: