天猫精灵/小爱同学+巴法云+Openwrt控制局电脑/群晖开关机

news2024/12/25 0:39:29

天猫精灵/小爱同学+巴法云+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容器里面搞

  1. ssh 连接到openwrt 推荐NxShell,其他也可以
  2. vim pc_xxx.sh #xxx为你添加设备的名字,见名知意就行
  3. 输入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

window也可以安装openssh的服务端和客户端 ,百度搜一下,关机需要使用

另外 wolup.log 是日志可以观察一下哪个环节有问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1222652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DeepMind发布新模型Mirasol3B:更高效处理音频、视频数据

Google DeepMind日前悄然宣布了其人工智能研究的重大进展,推出了一款名为“Mirasol3B”的新型自回归模型,旨在提升对长视频输入的理解能力。该新模型展示了一种颠覆性的多模态学习方法,以更综合和高效的方式处理音频、视频和文本数据。 Googl…

Mysql数据备份 —xtrabackup

一 备份介绍 ### 优点: 1. **在线备份:** XtraBackup 支持在线备份,这意味着你可以在 MySQL 服务器运行的同时进行备份,而无需停止数据库服务。这对于生产环境中的数据库是非常关键的,因为可以最小化停机时间。 2. **…

算法:记忆化搜索

文章目录 记忆化搜索斐波那契数列 例题不同路径最长递增子序列猜数字大小矩阵中的最长递增路径 记忆化搜索的原理其实很简单,简单来说就是对暴力搜索的一些优化,因此整体上来讲难度不高 记忆化搜索 所谓记忆化搜索,直白来说就是一个带有备忘…

MATLAB中plotmatrix函数用法

目录 语法 说明 示例 使用两个矩阵输入创建散点图矩阵 使用一个矩阵输入创建散点图矩阵 指定标记类型和颜色 创建并修改散点图矩阵 plotmatrix函数的功能是创建散点图矩阵。 语法 plotmatrix(X,Y) plotmatrix(X) plotmatrix(___,LineSpec) plotmatrix(ax,___) [S,AX,B…

一次显著的接口性能优化,从10s优化到0.9s

最近在登录项目后台的时候,发现当我输入账号和密码后,竟然就卡在了 Loading 页面。。 加载了10S才进后台 等了足足 10S 才进去后台! 通过 F12,打开 Network 网络请求一看,竟然是因为有两个接口返回的数据太慢了&#…

挑战单芯片NOA,这款“All in one”方案或将改变主流市场走向

随着降本增效、电子架构升级(尤其是跨域计算、多域融合等概念)以及供应链减复(降低电子物料的SKU)的需求愈加明确,对于车载计算赛道,也带来新的变化。 比如,去年9月,英伟达率先发布下…

群晖邮件设置,错误535 Authenticate failed问题

设置邮件通知或者报警很方便,群晖内部内置这个功能。在设置的时候遇到错误535 Error:authentication failed。 原因是:这个错误就是认证失败! 但是相信很多的同学明明用户名和密码填的是对的,就是说认证失败&#xf…

RTLS 颠覆制造业方式之——库存管理

跟踪库存对于每个行业(不仅仅是制造业)来说都是一项技术挑战。然而,在计划外停机每小时可能造成数十万美元损失的环境中,智能库存尤其重要,而这通常是由于一两个物体丢失造成的。 1.自动化库存报告 RTLS 提供的最有价…

[HTML]Web前端开发技术1,meta,HBuilder等——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,大大会看到更多有趣的博客哦!!! 喵喵喵,你对我真的…

九. Linux网络命令

网络命令write 网络命令wall 网络命令ping 首先,ping程序会向域名服务器(DNS)发送请求,解析域名www.baidu.com的IP地址。DNS返回域名的一个别名www.a.shifen.com以及对应的IP地址183.2.172.185。之后ping程序开始向这个地址发送请求报文,每1s…

浅谈霍尔电流传感器在UPS蓄电池浮充电流远程监测方案的应用-安科瑞 蒋静

摘要:针对无人平台UPS蓄电池多次出现浮充电流过高的现象,介绍了UPS系统的结构和工作原理,通过应用霍尔电流传感器,DCS组态,实现UPS蓄电池浮充电流远程监控,异常电流故障报警,推动了无人平台的自…

IO流-数据流

一,IO流-数据流 二,数据输出流 三,案例 package BigDecimal;import java.io.DataOutputStream; import java.io.FileOutputStream;public class DATaOutputStreamss {public static void main(String[] args) {try ( //1,创建一个数据输出流…

linuxTcp状态转换

1.TCP状态转换 在TCP进行三次握手,或者四次挥手的过程中,通信的服务器和客户端内部会发送状态上的变化,发生的状态变化在程序中是看不到的,这个状态的变化也不需要程序猿去维护,但是在某些情况下进行程序的调试会去查…

YB203H系列是一组CMOS技术实现的三端低功耗高电压稳压器

概述: YB203H系列是一组CMOS技术实现的三端低功耗高电压稳压器。输出电流为200mA且允许的输入电压可高达80V。具有几个固定的输出电压,范围从2.1V到12.0V.CMOS技术可确保其具有低压降和低静态电流的特性。最高耐压100W.尽管主要为固定电压调节器而设计,…

Spring过滤器和拦截器的区别

📑前言 本文主要Spring过滤器和拦截器的区别的问题,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是青衿🥇 ☁️博客首页:CSDN主页放风讲故事 🌄每日一句&#x…

【Linux】Linux进程间通信(三)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:Linux 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【Linux】…

SMART PLC星三角延时启动功能块(梯形图FC)

这里我们介绍SMART PLC星三角延时启动功能块,SMART PLC的周期定时器功能块请参考下面文章链接: 周期定时器FB_Cycle_time(SCL+梯形图代码)-CSDN博客文章浏览阅读80次。博途PLC定时器指令使用详细介绍请参考下面文章链接:博途PLC IEC定时器编程应用(SCL语言)_scl定时器-CS…

机器学习第6天:线性回归模型正则化

文章目录 机器学习专栏 正则化介绍 岭回归 岭回归成本函数 核心代码 示例 Lasso回归 Lasso回归损失函数 核心代码 弹性网络 弹性网络成本函数 核心代码 结语 机器学习专栏 机器学习_Nowl的博客-CSDN博客 正则化介绍 作用:正则化是为了防止模型过拟合…

ESP32-0.96寸OLED通过低功耗蓝牙BLE通信显示出ESP32-BME280读取到的温湿度值

ESP32-0.96寸OLED通过低功耗蓝牙BLE通信显示出ESP32-BME280读取到的温湿度值 简介ESP32-BME280作为BLE Server手机作为BLE Client与ESP32-BME280 BLE Server通信ESP32-0.96寸OLED作为BLE Client与ESP32-BME280 BLE Server通信总结 简介 两个ESP32开发板,一个ESP32挂…

【Hello Go】Go语言复合类型

复合类型 分类指针基本操作new函数指针作为函数的参数 数组概述操作数据数组初始化数组比较在函数之间传递数组 slice概述切片的创建和初始化切片操作切片和底层数组关系内建函数appendcopy 切片作为函数传参 map概述创建和初始化常用操作赋值遍历 删除map作函数参数 结构体结构…