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