Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

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


*注意:全文代码可左右滑动查看

准备工作

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

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

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

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

开机实现思路

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

pi@raspberrypi:~$wakeonlan -i 192.168.1.0.14:dd:a9:ea:0b:96
Sending magic packet to 192.168.1.0:9 with 14:dd:a9:ea:0b:96
程序会通过 ICMP 协议, ping 下需要唤醒的目标主机然后进行过滤,一个正常的 ICMP 包是64字节,过滤打印出这个64。

例如 ping 百度:

→ ~ping www.baidu.com
PING www.a.shifen.com (180.97.33.108):56 data bytes
64 bytes from 180.97.33.108: icmp_seq=0 ttl=53 time=8.865 ms
64 bytes from 180.97.33.108: icmp_seq=1 ttl=53 time=9.206 ms
64 bytes from 180.97.33.108: icmp_seq=2 ttl=53 time=8.246 ms
用一段 Linux 命令去过滤是否有64,这里为啥要用 head -n 1 呢?

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

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

@!/usr/bin/python

-- coding:utf-8 --

import itchat
import paramiko
import os
import time
import sys
reload(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)
def text_reply(msg):
if msg[‘ToTserName‘] != ‘filehelper‘: return
if msg[‘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)
except paramiko.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(parmiko.AutoAddPolicy())
    ssh.connect(hostname=hostname,uername=username,pkey=key,port=port)
    #执行唤醒命令
    stdin,stdout,stderr=ssh.exec_command(‘ping 192.168.1.182 -c 1 | grep 64 | cut -d "" -f 1|head -n 1‘)
    sshCheckOpen = stdout.read()
    sshCheckOpen = sshCheckOpen.strip(‘\n‘)
    print type(sshCheckOpen)
    print sshCheckOpen
    #进行判断,如果为64,则说明 ping 成功,说明设备已经在开机状态,程序结束,否则执行唤醒
    if sshCheckOpen == ‘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 -1 192.168.1.0 14:dd:a9:ea"0b:96‘)
        itchat.send(wakeonlan_time+u‘执行唤醒,等待设备开机联网‘,toUserName=‘filehelper‘)
        #由于开机需要一些时间去启动网络,所以这里等等60s
        time.sleep(60)
        #执行ping命令,-c 1 表示只ping一下,然后过滤有没有64,如果有则获取64传给sshConStatus
        stdin,stdout,stderr=ssh.exec_command(‘ping 192.168.1.182 -c 1c | grep 64 | cut -d "" -f 1|head -n 1‘)
        sshConStatus = stdout.read()
        sshConStatus = sshConStatus.strip(‘\n‘)
        print type(sshConStatus)
        print sshConStatus
        #进行判断,如果为64,则说明ping成功,设备已经联网,可以进行远程连接了,否则发送失败消息
        if sshConStatus == ‘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()
            #在网站根目录创建一个空文件,命名为 shutdown
            os.system(‘touch /www/shutdown‘)
            print ‘执行开机消息成功‘

关机部分实现

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

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

if msg[‘Text‘] == u‘关机‘:
#删除网站根目录的shutdown 文件
rmfile = os.system(‘rm -rf //www/shutdown‘)
if rmfile == 0:
print ‘执行关机消息成功‘
shutdown_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
itchat.send(shutdown_time+u‘正在关机...‘,toUserName=‘filehelper‘)
paramko.util.log_to_file(‘ssh_key-login.log‘)
privatekey = os.path.expanduser(key_file)
try:
key = paramiko.RSAKey.from_privat_key_file(privatekey)
except paramiko.PasswordRepuiredExceptin:
key = paramiko.RSAKey.from_privat_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(‘ping 192.168.1.182 -c 1 | grep 64 | cut -d "" -f 1|head -n 1‘)
        sshConStatus = stdout.read()
        sshConStatus = sshConStatus.strip(‘\n‘)
        print type(sshConStatus)
        print sshConStatus
        #如果获取的值为空,则说明已经关机,否则关机失败
        if sshConStatus  != ‘64‘
            shutdown_success_err_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
            itchat.send(shutdown_success_err_time+u‘关机失败,请连接桌面检查客户端程序是否正常执行‘,toUserName=‘filehelper‘)
        ssh.close()

itchat.auto_login(hotReload=True,enobleCmdQR=2)
itchat.run()

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

import requests
import os
import time
while 1:
time.sleep(30)
r = requests.head("heep://awen.me/shutdown")
print r.status_code
if r.status_code == 404:
os.system("shutdown -s -t 5")

使用 TeamViewer 连接:

缺点

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

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

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

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

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

最后,如果你跟我一样都喜欢python,也在学习python的道路上奔跑,欢迎你加入python学习群:839383765 群内每天都会分享最新业内资料,分享python免费课程,共同交流学习,让学习变(编)成(程)一种习惯!

原文地址:https://blog.51cto.com/14186420/2359302

时间: 2024-07-29 23:50:38

Python黑科技:在家远程遥控公司电脑,python+微信一键连接!的相关文章

Python黑科技:50行代码运用Python+OpenCV实现人脸追踪+详细教程+快速入门+图像识

嗨,我最亲爱的伙计们,很高兴我们又见面了. 首先先感谢朋友们的关注.当然我更希望认识与计算机相关的领域的朋友咱们一起探讨交流.重点说一下,我是真人,不是那些扒文章的自媒体组织,大家可以相互交流的! 本篇文章我们来讲一下关于AI相关的人脸追踪,人脸识别相关的一些知识.当然本篇教程为(上)部分,讲一下利用python+opencv来实现人脸识别与追踪,明后天出(下)部分,用python来通过指纹对比实现人脸验证.人脸解锁(大家感兴趣的可以提前关注哦). 这两节课呢,代码量都不是很多,鄙人尽量多注释点

python黑科技:还在为没有wifi而烦心吗?这篇文章解决你的困扰

python作为一门高级编程语言,它的定位是优雅.明确和简单.阅读Python编写的代码感觉像在阅读英语一样,这让使用者可以专注于解决问题而不是去搞明白语言本身.Python虽然是基于C语言编写,但是摒弃了C中复杂的指针,使其变得简明易学.并且作为开源软件,Python允许对代码进行阅读,拷贝甚至改进.这些性能成就了Python的高效率,有"人生苦短,我用Python"之说,是一种十分精彩又强大的语言. 在最近的公司项目开发中接触到python语言及wifi相关的一些知识,正好将最近学

Python黑科技程序,还你一块纯洁无暇的移动硬盘

前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 星安果 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef 目 标 场 景 用过 Mac OS 的朋友应该都遇到过,日常的文件操作会在同级目录下产生一些特定的临时文件. 平常将文件夹打包成压缩包或拷贝文件夹到移动

Python黑科技,教你学会Django系统错误监控

来源:http://www.jianshu.com/p/42e4287ffeda 话不多说,直入正题. 先上图,看一下监控的效果. 如下是监控我们网站系统错误的邮件.包含了请求的url地址,以及详细的异常信息. 一.监控所有的request请求 如何实现系统监控,自动发送错误日志的邮件呢?只需配置配置settings文件即可. 1.设置发送邮件配置信息 邮件会发送到ADMINS设定的邮件列表中. SERVER_EMAIL ='[email protected]' DEFAULT_FROM_EMA

试读—增长黑客,创业公司必知的“黑科技”

概述 刚一看到书名,最引起注意的是黑客两个字,那个带着神秘色彩,让无数程序员羡慕嫉妒恨的角色.但仔细一看,增长黑客,创业公司必知的"黑科技",是讲公司如何以切实的依据.低廉的成本.可控的风险来达成用户增长.活跃度上升.收入额增加等知识及案例的,这对于初创公司又没有充足的资金去燃烧以改变用户习惯的情况无疑是雪中送炭.指北之针. 什么是增长黑客? 本书适合哪些读者? 增长 靠原始积累实现增长的时代已经过去,也不适合互联网.移动互联网.互联网+的模式.我们经常能看到类似的新闻"某公

Windows文件系统加密软件哪个好用?公司电脑文档加密应该怎么做呢?山东风奥科技

如何的市场,伴随着信息化技术的推进,企业的日常办公都有赖于对电脑的使用,电脑成为日常数据产生,以及日常数据存储的通道之一.电子化设备的使用,不仅方便了政企机关单位,同时对人们的生产生活也造成了巨大的影响,信息化一方面给企业的办公带来了便利,另一方面也使得电脑文件在生产和使用中面临着数据泄露的风险.因而,对于现阶段的企事业单位以及国内的相关机构来说,采取必要的措施来实现对自身环境下的数据文件加密,是非常有必要的. 为什么说是Windows系统加密?毕竟Windows系统底层是对外开放接口的,能够做

Python3网络爬虫(十一):爬虫黑科技之让你的爬虫程序更像人类用户的行为(代理IP池等)

原文链接: Jack-Cui,http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 1 前言 近期,有些朋友问我一些关于如何应对反爬虫的问题.由于好多朋友都在问,因此决定写一篇此类的博客.把我知道的一些方法,分享给大家.博主属于小菜级别,玩爬虫也完全是处于兴趣爱好,如有不足之处,还望指正. 在互联网上进行自动数据采集(抓取)这件事和互联网存在的时间差不多一样长.今天大众好像更倾向于

Python 黑帽子:黑客与渗透测试编程之道——互动出版网

这篇是计算机类的优质预售推荐>>>><Python 黑帽子:黑客与渗透测试编程之道> 安全畅销书<Python灰帽子>同作者姊妹篇 知道创宇余弦.腾讯胡珀及Keen.蓝莲花等知名黑客战队联合作序盛赞 编辑推荐 本书适合有一定编程基础的安全爱好者.计算机从业人员阅读,特别是对正在学习计算机安全专业,立志从事计算机安全行业,成为渗透测试人员的人来说,这本书更是不可多得的参考. 内容简介 <Python 黑帽子:黑客与渗透测试编程之道>是畅销书<

qt的应用层主要是大型3d,vr,管理软件和器械嵌入软件(有上千个下一代软件黑科技项目是qt的,美国宇航局,欧洲宇航局,超级战舰DDG1000)

作者:Nebula.Trek链接:https://www.zhihu.com/question/24316868/answer/118944490来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. qt的应用层主要是大型3d,vr,管理软件和器械嵌入软件.日常生活中所用的qt产品比较少.也就virtual box,google earth,VLC player等.但是大型系统就正好相反,这是c++决定的,而非qt. 除了Maya之外,包括Houdini,斯特拉电车的系