我需要远程关闭和重新启动 Linux (Ubuntu) 机器而不登录它们(否则简单的命令可以完成这项工作)。这些机器只是廉价的 PC,因此没有安装特殊的电源管理硬件(尽管它们可以在 LAN 上唤醒)。我可以在这些盒子上安装某种“电源管理服务器”软件,它会监听远程重启/关机请求并采取相应措施吗?当然,如果它需要一些身份验证(密码)来响应请求,那就太好了。
问问题
47126 次
2 回答
12
正如 jørgensen 所指出的,您可以使用 SYSRQ ( http://en.wikipedia.org/wiki/Magic_SysRq_key ),这是一个直接与内核对话的 API。
请注意,这些都是非常核心的,可能会损害您的硬件。重新启动需要单个 UDP 数据包传输的时间。繁荣。我们只在实时无盘计算机上使用它。
1. xt_SYSRQ(iptables 模块,内核)
有 xt_SYSRQ,它是 xtables-addons-common 提供的 iptables 模块之一: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 监听守护进程,用户空间)
此解决方案仅在您的砖块计算机能够处理 TCP 连接时才有效。
在 debian 上安装
#!/bin/bash
apt-get install -qq sysrqd
echo "yolo" > /etc/sysrqd.secret
service sysrqd restart
Shutgun 重新启动
我制作了一个脚本https://gist.github.com/qolund/1470beaa1a63e034025d但它只是端口 4094 上的 TCP 连接。您需要发送密码和命令,
# 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”重启命令太快,计算机已经在重启。
于 2015-05-19T14:53:24.267 回答