《在家想远程公司电脑?Python+微信一键连接!.docx》由会员分享,可在线阅读,更多相关《在家想远程公司电脑?Python+微信一键连接!.docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在家想远程公司电脑?Python+微信一键连接!|阿文责编|伍杏玲有时候需要远程家里的台式机使用因为我平时都是用MAC多但是远程唤醒只能针对局域网比拟费事于是我想用微信实现远程唤醒机器。准备工作本程序主要是实现远程管理Windows10操作系统的开机以及关机在Windows机器的一样内网中放一个Linux主机我这里用树莓派代替假如你是用OpenWrt之类的路由器可以以。Linux主机需要可以远程访问我这里是有FRP将树莓派的端口映射到我的公网Linux主机上。所以可以随时远程SSH过去。Windows机器的网卡必须是有线连接支持网络唤醒功能。开机实现思路首先通过微信发送开机指令这里我使用的是i
2、tchat程序会调用Paramiko库去SSH远程到内网的树莓派执行WakeOnLan命令去唤醒Windows主机。piraspberrypi:$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百度pingbaiduPINGa.shifen(180.97.33.108):56databytes64bytesfrom180.97.33.1
3、08:icmp_seq0ttl53time8.865ms64bytesfrom180.97.33.108:icmp_seq1ttl53time9.206ms64bytesfrom180.97.33.108:icmp_seq2ttl53time8.246ms用一段Linux命令去过滤是否有64这里为啥要用head-n1呢因为有可能会出现2行经过测试我们只需要取64这个值就可以了ping192.168.1.182-c1|grep64|cut-d-f1|head-n1假如有那么表示开机成功已经联网了返回开机成功否那么程序继续往下走去唤醒然后在ping一次确认是否开机假如为是那么返回开机成功否那么返回
4、失败。程序执行成功后在我的网站根目录创立一个shutdown文件用于后面的关机操作#!/usr/bin/python#-*-coding:utf-8-*-importitchatimportparamikoimportosimporttimeimportsysreload(sys)sys.setdefaultencoding(utf-8)hostnameusernameportkey_file/home/fangwenjun/.ssh/id_rsafilename/home/fangwenjun/.ssh/known_hostsitchat.msg_register(itchat.conten
5、t.TEXT)deftext_reply(msg):ifmsgToUserName!filehelper:returnifmsgTextu开机:paramiko.util.log_to_file(ssh_key-login.log)privatekeyos.path.expanduser(key_file)try:keyparamiko.RSAKey.from_private_key_file(privatekey)exceptparamiko.PasswordRequiredException:keyparamiko.RSAKey.from_private_key_file(privatek
6、ey,key_file_pwd)sshparamiko.SSHClient()ssh.load_system_host_keys(filenamefilename)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()ssh.connect(hostnamehostname,usernameusername,pkeykey,portport)#执行唤醒命令stdin,stdout,stderrssh.exec_command(ping192.168.1.182-c1|grep64|cut-d-f1|head-n1)sshCheckOpe
7、nstdout.read()sshCheckOpensshCheckOpen.strip(n)printtype(sshCheckOpen)printsshCheckOpen#进展判断假如为64那么讲明ping成功讲明设备已经在开机状态程序完毕否那么执行唤醒ifsshCheckOpen64:connect_ok_timetime.strftime(%Y-%m-%d%H:%M:%S,time.localtime()itchat.send(connect_ok_timeu设备已经开机,toUserNamefilehelper)else:ssh_timetime.strftime(%Y-%m-%d%
8、H:%M:%S,time.localtime()itchat.send(ssh_timeu开场连接远程主机,toUserNamefilehelper)stdin,stdout,stderrssh.exec_command(wakeonlan-i192.168.1.014:dd:a9:ea:0b:96)wakeonlan_timetime.strftime(%Y-%m-%d%H:%M:%S,time.localtime()itchat.send(wakeonlan_timeu执行唤醒等待设备开机联网,toUserNamefilehelper)#由于开机需要一些时间去启动网络所以这里等等60sti
9、me.sleep(60)#执行ping命令-c1表示只ping一下然后过滤有没有64假如有那么获取64传给sshConStatusstdin,stdout,stderrssh.exec_command(ping192.168.1.182-c1|grep64|cut-d-f1|head-n1)sshConStatusstdout.read()sshConStatussshConStatus.strip(n)printtype(sshConStatus)printsshConStatus#进展判断假如为64那么讲明ping成功设备已经联网可以进展远程连接了否那么发送失败消息ifsshConStat
10、us64:connect_ok_timetime.strftime(%Y-%m-%d%H:%M:%S,time.localtime()itchat.send(connect_ok_timeu设备唤醒成功您可以远程连接了,toUserNamefilehelper)else:connect_err_timetime.strftime(%Y-%m-%d%H:%M:%S,time.localtime()itchat.send(connect_err_timeu设备唤醒失败请检查设备是否连接电源,toUserNamefilehelper)ssh.close()#在网站根目录创立一个空文件命名为shutd
11、ownos.system(touch/www/shutdown)print执行开机消息成功关机局部实现当接收关机指令时程序会去删除网站根目录的shutdown文件客户端我写了几行代码去通过Requests库每隔30s发送HTTPhead恳求去判断文件是否是404假如是404这讲明文件不存在调用系统关机操作执行关机。然后SSH到树莓派去ping目的主机假如返回为空那么讲明关机成功否那么关机失败。这只是针对Windows的关机假如目的主机是Linux那么简单多了ifmsgTextu关机:#删除网站根目录的shutdown文件rmfileos.system(rm-rf/www/shutdown)if
12、rmfile0:print执行关机消息成功shutdown_timetime.strftime(%Y-%m-%d%H:%M:%S,time.localtime()itchat.send(shutdown_timeu正在关机.,toUserNamefilehelper)paramiko.util.log_to_file(ssh_key-login.log)privatekeyos.path.expanduser(key_file)try:keyparamiko.RSAKey.from_private_key_file(privatekey)exceptparamiko.PasswordRequi
13、redException:keyparamiko.RSAKey.from_private_key_file(privatekey,key_file_pwd)sshparamiko.SSHClient()ssh.load_system_host_keys(filenamefilename)ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()ssh.connect(hostnamehostname,usernameusername,pkeykey,portport)itchat.send(shutdown_timeu正在确认设备是否完成关
14、机操作大约需要等待60s.,toUserNamefilehelper)#等等60秒后确认因为关机需要一段时间假如设置太短可能网络还没断开time.sleep(60)stdin,stdout,stderrssh.exec_command(ping192.168.1.182-c1|grep64|cut-d-f1|head-n1)sshConStatusstdout.read()sshConStatussshConStatus.strip(n)printtype(sshConStatus)printsshConStatus#假如获取的值为空那么讲明已经关机否那么关机失败ifsshConStatus!
15、64:shutdown_success_err_timetime.strftime(%Y-%m-%d%H:%M:%S,time.localtime()itchat.send(shutdown_success_err_timeu关机成功,toUserNamefilehelper)else:shutdown_err_timetime.strftime(%Y-%m-%d%H:%M:%S,time.localtime()itchat.send(shutdown_err_timeu关机失败请连接桌面检查客户端程序是否正常执行,toUserNamefilehelper)ssh.close()itchat.
16、auto_login(hotReloadTrue,enableCmdQR2)itchat.run()客户端代码写完扔方案任务开机启动importrequestsimportosimporttimewhile1:time.sleep(30)rrequests.head(s:/awen.me/shutdown)printr.status_codeifr.status_code404:os.system(shutdown-s-t5)使用TeamViewer连接缺点网页端微信必须一直登录不方便这个就需要微信不能断网了。WakeOnLan是播送MAC地址的貌似不能返回是否成功没所以还是要ping主机看看
17、通不通判断下。需要一个树莓派做跳板机否那么也不能唤醒内网设备。假如只允许自己控制最好是使用文件助手来发送消息因为默认情况下任何人都可以给你发送指令开机。Windows需要安装TeamViewer并且设置为开机自动启动和绑定账号设置无人值守形式。这样方便远程假如是Linux那么不需要开启ssh就可以了。代码地址s:/github/monkey-wenjun/wchatwakeonlan文章内的代码假如有Bug后续更新都在GitHub上完好代码请参考GitHub此文章代码不再更新。原文s:/awen.me/post/3709919605.html声明本文为投稿版权归对方所有。福利公众号后台回复2018Python获取2018Python开源工程Top100整理资料扫码添加小助手微信回复1参加Python技术沟通群。推荐浏览GitHub上7000Star的Python常用代码合集值得珍藏Python大本营“号内搜功能全新晋级搜索功能更强大请在公众号菜单栏体验