Мне нужно дистанционно завершить работу и перезагрузить Linux (Ubuntu) машины без входа в них (иначе простые команды могут выполнять задание). Машины - это просто дешевые ПК, поэтому нет специального оборудования для управления электропитанием (хотя они могут разбудить-на-лане). Есть ли какое-то "программное обеспечение сервера управления питанием", которое я могу установить на этих ящиках, который слушает удаленные запросы на перезагрузку/завершение работы и действует соответственно? Конечно, было бы неплохо, если для ответа на запросы требуется некоторая аутентификация (пароль).
Удаленное завершение работы/перезагрузка Linux-боксов без SSH?
Ответ 1
Как указано jørgensen, вы можете использовать SYSRQ (http://en.wikipedia.org/wiki/Magic_SysRq_key), API, напрямую говорящий с ядром.
Остерегайтесь, это довольно хардкор и может нанести вред вашему оборудованию. Для перезагрузки требуется однократная передача пакета UDP. Boom. Мы используем его только на живых бездисковых компьютерах.
1. xt_SYSRQ (модули iptables, ядро)
Существует xt_SYSRQ, один из модулей iptables, предоставляемый xtables-addons-common: http://manpages.ubuntu.com/manpages/oneiric/man8/xtables-addons.8.html
Установка на debian
#!/bin/bash
apt-get install -qq xtables-addons-common iptables
echo -n "yolo" >/sys/module/xt_SYSRQ/parameters/password
iptables -A INPUT -p udp --dport 9 -j SYSRQ
Перезагрузка дробовика
#!/bin/bash
sysrq_key="sub" # the SysRq key(s), Sync, Unmount, reBoot
password="yolo"
seqno="$(date +%s)"
salt="$(dd bs=12 count=1 if=/dev/urandom 2>/dev/null | openssl enc -base64)"
ipaddr="$1"
req="$sysrq_key,$seqno,$salt"
req="$req,$(echo -n "$req,$ipaddr,$password" | sha1sum | cut -c1-40)"
echo "$req" | socat stdin udp-sendto:$ipaddr:9
2. sysrqd (tcp 4094 прослушивающий демон, userland)
Это решение работает, только если ваш кирпичный компьютер способен обрабатывать TCP-соединения.
Установка на debian
#!/bin/bash
apt-get install -qq sysrqd
echo "yolo" > /etc/sysrqd.secret
service sysrqd restart
Перезагрузка Shutgun
Я сделал script, https://gist.github.com/qolund/1470beaa1a63e034025d, но его просто соединение TCP на порту 4094. Вам необходимо отправить пароль и команды,
# telnet 172.16.42.180 4094
Trying 172.16.42.180...
Connected to 172.16.42.180.
Escape character is '^]'.
sysrqd password: nope
Go away!
Connection closed by foreign host.
# telnet 172.16.42.180 4094
Trying 172.16.42.180...
Connected to 172.16.42.180.
Escape character is '^]'.
sysrqd password: yolo
sysrq> sub
[..]
Соединение неправильно закрыто, потому что команда перезагрузки "b" выполняется слишком быстро, компьютер уже перезагружается.
Ответ 2
Несколько вариантов:
Эти инструменты не совсем подходят для выключения компьютеров (но они могут это сделать), они представляют собой системы управления конфигурацией для администрирования множества компьютеров, они могут обрабатывать изменения конфигурации, устанавливать пакеты и обновления и запускать все команды, которые вы хотите, в одной машине, в наборе машин или во всей сети.