天猫精灵/小爱同学+巴法云+Openwrt控制局电脑/群晖开关机
- 事情的起因
- 实战环境
- 开始发车
- 1.天猫精灵/小爱同学 连接 八法云
- 2.openwrt
- 3.docker环节
- 注意:`sshpass 要先使用 ssh命令登陆一下你要唤醒或者远程关机的设备,不然可能因为一个登陆提示你是否登陆的yes/no导致程序没有反应,然后使用sshpass -p 密码 ssh root@openwrt的ip 登陆看看是否成功到目标设备,代码中这句话后面是要执行的命令,如果到不了目标设备就没有下一步了`
- `注意: 把ps -aux | grep wolup.py | grep -v grep | awk '{print $2}' | xargs 输入控制台先看看是不是把pid给弄出来了,如果不是吧$后面的数字改成1,2,3...一个一个实验,不然程序没干掉就无法重启`
- window也可以安装openssh的服务端和客户端 ,百度搜一下,关机需要使用
- 另外 wolup.log 是日志可以观察一下哪个环节有问题
事情的起因
因为设备多,还怕费电,所以懒得手动开关机
实战环境
1.天猫精灵/小米音响 都可以
2.openwrt路由器,所有设备在同一个局域网(ping通,当然不在一个也可以,不过麻烦一点,但是必须能ping通,百度如何ping通,走网上说的组网通道,例如向日葵x1组的网也行)
3.设备需要支持 wol ,用openwrt里的网络唤醒试一下,能唤醒再接着看下文
4.注册 巴法云 ,能免费使用的都很牛x,感谢!!!
开始发车
1.天猫精灵/小爱同学 连接 八法云
1.巴法云 https://cloud.bemfa.com/
2.添加主题
添加完成到 天猫精灵/小爱同学app 添加巴法云,具体不再赘述,百度知道
2.openwrt
由于稳定需要害怕把openwrt给高挂,在路由器里只添加几个脚本,其他在docker里拉一个50多md的Ubuntu容器里面搞
- ssh 连接到openwrt 推荐NxShell,其他也可以
vim pc_xxx.sh
#xxx为你添加设备的名字,见名知意就行- 输入i 进入插入模式 粘贴
#!/bin/bash
echo "xxx电脑,这里只是输出看一下,改成你的设备名字"
echo "magic package is ready to sent"
# br-lan 你的的设备所在的接口
etherwake -D -i "br-lan" "MAC地址,这里要修改啊!!!!!!"
echo "magic package has been sent"
ESC键,输入 :wq
回车
4.给与执行操作权限 chmod +x pc_xxx.sh
xxx是你自己起的名字
5.输入 ./pc_xxx.sh
试一下 注意: etherwake软件要有 没有的话 opkg install etherwake
或者百度知道… 不能唤醒的话就 game over 了
有几个电脑就见几个启动文件,实际上一个也行不过哪有复制粘贴来三个快,一个的话需要接受mac作为参数,具体百度一下…
3.docker环节
1.拉取镜像 xxx你的端口,不能用就换一个 -p xxx:22
docker run -e TZ=Asia/Shanghai -p 8022:22 -it --name ubuntuserver ubuntu:latest /bin/bash
进入终端,openwrt上的docker
其他的docker UI都有类似功能,或者刚刚拉镜像时别出去,直接就到控制台了
su root
passwd 123456 #密码自己设置
# 安装 ssh 方便以后链接
apt install openssh-server
# 启动ssh
service ssh restart
# 设置ssh开机启动
systemctl enable ssh
systemctl enable ssh
能用最好,可惜docker里不能用systemctl 着实恶心
解决方案
vim /root/startup_run.sh
startup_run.sh脚本内容:
#!/bin/bash
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$LOGTIME] startup run..." >>/root/startup_run.log
service ssh start >>/root/startup_run.log
给执行权限 chmod +x /root/startup_run.sh
将脚本加入到启动文件中
vim /root/.bashrc
在.bashrc末尾增加如下语句
# startup run
if [ -f /root/startup_run.sh ]; then
./root/startup_run.sh
fi
修改ssh配置允许登陆
vim /etc/ssh/sshd_config
PermitRootLogin前的#好去掉,后面改成yes
PermitRootLogin yes
重启Ubuntu容器,用ssh工具链接,不成功尝试百度解决
Ubuntu安装需要的环境
apt update
apt upgrade
apt install python3 sshpass
# 不成功尝试换源
脚本上传到 /root
下,就是NxShell登陆后上传的地方
上传 wolup.py
文件 ,注意一定要按需,有几台设备修改几台
此处代码参考 https://www.bilibili.com/read/cv23088336/ 这个大神
还有https://cloud.bemfa.com/docs/#/
一定要改成自己的
注意:sshpass 要先使用 ssh命令登陆一下你要唤醒或者远程关机的设备,不然可能因为一个登陆提示你是否登陆的yes/no导致程序没有反应,然后使用sshpass -p 密码 ssh root@openwrt的ip 登陆看看是否成功到目标设备,代码中这句话后面是要执行的命令,如果到不了目标设备就没有下一步了
# -*- coding: utf-8
import socket
import threading
import time
import os
import datetime
# 巴法云私钥
client_id = "巴法云私钥"
# 主题值
top_id = "PC1001,PC2001,PC3001"
# 华硕电脑
wol1 = 'sshpass -p 密码 ssh root@openwrt的ip ./pc_huashuo.sh'
# 联想电脑
wol2 = 'sshpass -p 密码 ssh root@openwrt的ip ./pc_lianxiang.sh'
# pc3指的是黑群晖
wol3 = 'sshpass -p 密码 ssh root@openwrt的ip ./pc_san.sh'
# 局域网连接openssh服务器,进行关机操作
# 注意一定要是root登陆,不然没有权限关机
# 华硕电脑
shutdown1 = 'sshpass -p 密码 ssh cpc@设备的ip "shutdown -s -t 0"'
# 联想电脑
shutdown2 = 'sshpass -p 密码 ssh cpc@设备的ip "shutdown -s -t 0"'
# 群晖或者linux
shutdown3 = 'sshpass -p 密码 ssh root@设备的ip "sudo shutdown -h now"'
def connTCP():
global tcp_client_socket
# 创建socket
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# IP 和端口
server_ip = 'bemfa.com'
server_port = 8344
try:
# 连接服务器
tcp_client_socket.connect((server_ip, server_port))
# 发送订阅指令
substr = 'cmd=1&uid=' + client_id + '&topic=' + top_id + '\r\n'
tcp_client_socket.send(substr.encode("utf-8"))
except():
time.sleep(2)
connTCP()
# 心跳
def Ping():
# 发送心跳
try:
keep_live = 'ping\r\n'
tcp_client_socket.send(keep_live.encode("utf-8"))
except():
time.sleep(2)
connTCP()
# 开启定时,30秒发送一次心跳
t = threading.Timer(30, Ping)
t.start()
# 获取当前时间
def nowTime():
now = datetime.datetime.now()
formatted_time = now.strftime("%Y-%m-%d %H:%M:%S")
return formatted_time
connTCP()
Ping()
while True:
# 接收服务器发送过来的数据
recvData = tcp_client_socket.recv(1024)
if len(recvData) != 0:
try:
# 返回的参数 cmd=2&uid=xxx&topic=PC001&msg=on
res = recvData.decode('utf-8')
if res.endswith('\r\r\n'):
res = res.replace('\r\r\n', '')
print("时间:{}-->服务启动".format(nowTime()))
print('时间:{}-->接收到数据:{}'.format(nowTime(),res))
if 'topic=PC1001' in res:
sw = str(res.split('&')[3].split('=')[1]).strip()
if str(sw) == str("on"):
try:
print("时间:{}-->正在打开电脑1".format(nowTime()))
os.system(wol1)
except():
time.sleep(2)
print("打开电脑1失败")
elif str(sw) == str("off"):
try:
print("时间:{}-->正在关闭电脑1".format(nowTime()))
os.system(shutdown1)
except():
time.sleep(2)
print("关闭电脑1失败")
elif 'topic=PC2001' in res:
sw = str(res.split('&')[3].split('=')[1]).strip()
if str(sw) == str("on"):
try:
print("时间:{}-->正在打开电脑2".format(nowTime()))
os.system(wol2)
except():
time.sleep(2)
print("打开电脑2失败")
elif str(sw) == str("off"):
try:
print("时间:{}-->正在关闭电脑2".format(nowTime()))
os.system(shutdown2)
except():
time.sleep(2)
print("关闭电脑2失败")
if 'topic=PC3001' in res:
sw = str(res.split('&')[3].split('=')[1]).strip()
if str(sw) == str("on"):
try:
print("时间:{}-->正在打开电脑3".format(nowTime()))
os.system(wol3)
except():
time.sleep(2)
print("打开电脑3失败")
elif str(sw) == str("off"):
try:
print("时间:{}-->正在关闭电脑3".format(nowTime()))
os.system(shutdown3)
except():
time.sleep(2)
print("关闭电脑3失败")
except():
time.sleep(2)
else:
print("conn err")
connTCP()
启动脚本 vim wolSetup.sh
#!/bin/bash
nohup /usr/bin/python3 -u /root/wolup.py 1>/root/wolup.log 2>&1 &
给与执行权限chmod +x wolSetup.sh
加入开机启动
vim .bashrc
后面加上
# wol run
if [ -f /root/wolSetup.sh ]; then
./root/wolSetup.sh
fi
以为链接可能会断加入定时任务
安装 cron
apt install cron
加入定时任务
crontab -e
最后插入
# 每2小时启动一次
0 */2 * * * ps -aux | grep wolup.py | grep -v grep | awk '{print $2}' | xargs kill -15; nohup /usr/bin/python3 -u /root/wolup.py 1>/root/wolup.log 2>&1 &
注意: 把ps -aux | grep wolup.py | grep -v grep | awk '{print $2}' | xargs 输入控制台先看看是不是把pid给弄出来了,如果不是吧$后面的数字改成1,2,3...一个一个实验,不然程序没干掉就无法重启
查看定时任务
service cron status
由于容器的原因定时任务未能开机启动,模仿ssh和wolup.py的方式加入开机启动
vim .bashrc
在 ./root/wolSetup.sh
后面加上
service cron start