0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Python+微信一键连接实现远程管理Windows10操作系统的开机和关机

电子工程师 来源:lq 2019-02-25 09:17 次阅读

有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器。

准备工作

本程序主要是实现远程管理 Windows10操作系统的开机和关机:

在 Windows机器的相同内网中放一个 Linux 主机,我这里用树莓派代替,如果你是用 OpenWrt 之类的路由器也可以。

Linux 主机需要能够远程访问,我这里是有 FRP 将树莓派的端口映射到我的公网 Linux 主机上。所以可以随时远程 SSH 过去。

Windows 机器的网卡必须是有线连接,支持网络唤醒功能。

开机实现思路

首先通过微信发送开机指令,这里我使用的是 itchat 程序会调用 Paramiko 库去 SSH 远程到内网的树莓派执行 WakeOnLan 命令去唤醒 Windows 主机。

pi@raspberrypi:~$wakeonlan-i192.168.1.014:dd:a9:ea:0b:96Sendingmagicpacketto192.168.1.0:9with14:dd:a9:ea:0b:96

程序会通过 ICMP 协议, ping 下需要唤醒的目标主机然后进行过滤,一个正常的 ICMP 包是64字节,过滤打印出这个64。

例如 ping 百度:

➜~pingwww.baidu.comPINGwww.a.shifen.com(180.97.33.108):56databytes64bytesfrom180.97.33.108:icmp_seq=0ttl=53time=8.865ms64bytesfrom180.97.33.108:icmp_seq=1ttl=53time=9.206ms64bytesfrom180.97.33.108:icmp_seq=2ttl=53time=8.246ms

用一段 Linux 命令去过滤是否有64,这里为啥要用 head -n 1 呢?

因为有可能会出现2行,经过测试,我们只需要取64这个值就可以了:

ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1

如果有则表示开机成功已经联网了,返回开机成功,否则程序继续往下走,去唤醒,然后在 ping 一次确认是否开机,如果为是则返回开机成功,否则返回失败。程序执行成功后,在我的网站根目录创建一个 shutdown 文件,用于后面的关机操作:

#!/usr/bin/python#-*-coding:utf-8-*-importitchatimportparamikoimportosimporttimeimportsysreload(sys)sys.setdefaultencoding('utf-8')hostname=''username=''port=key_file='/home/fangwenjun/.ssh/id_rsa'filename='/home/fangwenjun/.ssh/known_hosts'@itchat.msg_register(itchat.content.TEXT)deftext_reply(msg):ifmsg['ToUserName']!='filehelper':returnifmsg['Text']==u'开机':paramiko.util.log_to_file('ssh_key-login.log')privatekey=os.path.expanduser(key_file)try:key=paramiko.RSAKey.from_private_key_file(privatekey)exceptparamiko.PasswordRequiredException:key=paramiko.RSAKey.from_private_key_file(privatekey,key_file_pwd)ssh=paramiko.SSHClient()ssh.load_system_host_keys(filename=filename)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=hostname,username=username,pkey=key,port=port)#执行唤醒命令stdin,stdout,stderr=ssh.exec_command('ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1')sshCheckOpen=stdout.read()sshCheckOpen=sshCheckOpen.strip(' ')printtype(sshCheckOpen)printsshCheckOpen#进行判断,如果为64,则说明ping成功,说明设备已经在开机状态,程序结束,否则执行唤醒ifsshCheckOpen=='64':connect_ok_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(connect_ok_time+u'设备已经开机',toUserName='filehelper')else:ssh_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(ssh_time+u'开始连接远程主机',toUserName='filehelper')stdin,stdout,stderr=ssh.exec_command('wakeonlan-i192.168.1.014:dd:a9:ea:0b:96')wakeonlan_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(wakeonlan_time+u'执行唤醒,等待设备开机联网',toUserName='filehelper')#由于开机需要一些时间去启动网络,所以这里等等60stime.sleep(60)#执行ping命令,-c1表示只ping一下,然后过滤有没有64,如果有则获取64传给sshConStatusstdin,stdout,stderr=ssh.exec_command('ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1')sshConStatus=stdout.read()sshConStatus=sshConStatus.strip(' ')printtype(sshConStatus)printsshConStatus#进行判断,如果为64,则说明ping成功,设备已经联网,可以进行远程连接了,否则发送失败消息ifsshConStatus=='64':connect_ok_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(connect_ok_time+u'设备唤醒成功,您可以远程连接了',toUserName='filehelper')else:connect_err_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(connect_err_time+u'设备唤醒失败,请检查设备是否连接电源',toUserName='filehelper')ssh.close()#在网站根目录创建一个空文件,命名为shutdownos.system('touch/www/shutdown')print'执行开机消息成功'

关机部分实现

当接收关机指令时,程序会去删除网站根目录的 shutdown 文件,客户端我写了几行代码,去通过 Requests 库每隔30s 发送 HTTP head 请求去判断文件是否是404,如果是404 这说明文件不存在,调用系统关机操作,执行关机。

然后 SSH 到树莓派去 ping 目标主机,如果返回为空,则说明关机成功,否则关机失败。这只是针对 Windows 的关机,如果目标主机是 Linux 则简单多了:

ifmsg['Text']==u'关机':#删除网站根目录的shutdown文件rmfile=os.system('rm-rf/www/shutdown')ifrmfile==0:print'执行关机消息成功'shutdown_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(shutdown_time+u'正在关机....',toUserName='filehelper')paramiko.util.log_to_file('ssh_key-login.log')privatekey=os.path.expanduser(key_file)try:key=paramiko.RSAKey.from_private_key_file(privatekey)exceptparamiko.PasswordRequiredException:key=paramiko.RSAKey.from_private_key_file(privatekey,key_file_pwd)ssh=paramiko.SSHClient()ssh.load_system_host_keys(filename=filename)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect(hostname=hostname,username=username,pkey=key,port=port)itchat.send(shutdown_time+u'正在确认设备是否完成关机操作,大约需要等待60s.',toUserName='filehelper')#等等60秒后确认,因为关机需要一段时间,如果设置太短,可能网络还没断开time.sleep(60)stdin,stdout,stderr=ssh.exec_command('ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1')sshConStatus=stdout.read()sshConStatus=sshConStatus.strip(' ')printtype(sshConStatus)printsshConStatus#如果获取的值为空,则说明已经关机,否则关机失败ifsshConStatus!='64':shutdown_success_err_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(shutdown_success_err_time+u'关机成功',toUserName='filehelper')else:shutdown_err_time=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())itchat.send(shutdown_err_time+u'关机失败,请连接桌面检查客户端程序是否正常执行',toUserName='filehelper')ssh.close()itchat.auto_login(hotReload=True,enableCmdQR=2)itchat.run()

客户端代码,写完扔计划任务,开机启动:

importrequestsimportosimporttimewhile1:time.sleep(30)r=requests.head("https://awen.me/shutdown")printr.status_codeifr.status_code==404:os.system("shutdown-s-t5")

使用 TeamViewer 连接:

缺点

网页端微信必须一直登录,不方便,这个就需要微信不能断网了。

WakeOnLan 是广播 MAC 地址的,貌似不能返回是否成功没,所以还是要 ping 主机看看通不通,判断下。

需要一个树莓派做跳板机,否则也不能唤醒内网设备。

如果只允许自己控制最好是使用文件助手来发送消息,因为默认情况下,任何人都可以给你发送指令开机。

Windows需要安装TeamViewer并且设置为开机自动启动以及绑定账号设置无人值守模式。这样方便远程,如果是Linux 则不需要开启 ssh 就可以了。

代码地址:https://github.com/monkey-wenjun/wchatwakeonlan

文章内的代码如果有 Bug,后续更新都在 GitHub 上,完整代码请参考 GitHub ,此文章代码不再更新。

原文:https://awen.me/post/3709919605.html

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • WINDOWS
    +关注

    关注

    3

    文章

    3523

    浏览量

    88356
  • 路由器
    +关注

    关注

    22

    文章

    3699

    浏览量

    113457
  • python
    +关注

    关注

    55

    文章

    4777

    浏览量

    84397

原文标题:在家想远程公司电脑?Python +微信一键连接

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一键还原_一键还原精灵等系统还原软件集合

    一键还原程序功能:实现MGhost一键还原程序功能:实现一键备份还原系统
    发表于 03-12 18:20

    远程管理系统定制

    远程管理系统定制型号:HBTZ------821产品品牌:河北泰泽产品型号:HBTZ-821版本号:8.1 语言版本:中文 支持平台:windows平台 软件简介:远程管理
    发表于 08-17 15:31

    python黑客操作远程开机关机

    前言用 python 关机相信大家肯定听过或者实践过吧,那么用 Python 开机呢?这是个神奇的方法,教你如何用
    发表于 01-19 20:22

    有什么办法可以实现电脑一键长按开关机功能吗?

    查了下资料,发现很多实现一键长按开机或者关机电路的实现都是MOS管开关,加上MCU控制的方式,
    发表于 08-08 01:59

    windows系统是怎样去设置定时开关机

    windows系统设置定时开关机的方法文章目录:windows设置定时`开机`1、
    发表于 10-29 06:37

    ROC-RK3328-CC板是怎样连接Windows远程管理可视化桌面的

    ROC-RK3328-CC板是怎样连接Windows远程管理可视化桌面的?有哪些操作流程?
    发表于 03-09 07:42

    如何远程管理windows2003服务器

    如何远程管理windows2003服务器 我目前远程管理着多台服务器,并且经常需要远程连接到客户的系统
    发表于 01-27 13:34 1732次阅读

    微软Windows10值得升级吗?给你八个升级Windows10的理由!

    微软公司于2015年7月29日发布了全新的Windows10操作系统,并宣布开展长达年的免费升级期,笔者在第时间就进行了升级。现在距离Win10
    发表于 07-14 16:13 1003次阅读

    Linux操作系统实用教程之如何Linux系统远程管理

    本文档的主要内容详细介绍的是Linux操作系统实用教程之如何Linux系统远程管理 主要内容是:1 远程管理简介2 终端方式的字符界面远程管理
    发表于 10-31 18:04 0次下载

    windows10操作系统安全模式的使用技巧

    谈到系统的安全模式大家并不陌生,在安全模式下可以解决相关的电脑问题。windows操作系统的安全模式也是非常实用的。不管是winxp、win7时代,还是现在的windows10
    发表于 06-12 17:25 1114次阅读

    一键关机电路图解析

    按键电路在我们的电路设计中非常常见,其中有种比较特殊,就是一键关机电路,顾名思义,就是只用个按键实现
    发表于 05-02 16:08 6.5w次阅读
    <b class='flag-5'>一键</b>开<b class='flag-5'>关机</b>电路图解析

    微软表态:Windows10操作系统是“最后代”

    早在2015年Windows 10发布时,微软就表态,这是Windows操作系统的“最后代”,即没有所谓的
    的头像 发表于 11-06 11:10 5990次阅读

    windows系统设置定时开关机的方法

    windows系统设置定时开关机的方法文章目录:windows设置定时`开机`1、
    发表于 10-22 13:51 5次下载
    <b class='flag-5'>windows</b><b class='flag-5'>系统</b>设置定时开<b class='flag-5'>关机</b>的方法

    软件配合实现的“一键关机电路

    软件配合实现的“一键关机电路”一键关机电路仅使用个按键,就可以
    发表于 12-09 10:36 30次下载
    软件配合<b class='flag-5'>实现</b>的“<b class='flag-5'>一键</b>开<b class='flag-5'>关机</b>电路

    如何使用windows10远程连接虚拟机桌面

    本文介绍了如何使用 windows10 远程连接虚拟机桌面(已使用远程连接工具连接了虚拟机,如
    的头像 发表于 07-12 11:18 2846次阅读