科百科
当前位置: 首页 范文大全

python内网穿透开发(实现微信远程控制唤醒内网机器和远程关闭windows)

时间:2023-08-21 作者: 小编 阅读量: 3 栏目名: 范文大全

python内网穿透开发?准备工作本程序,主要是实现远程管理 Windows10操作系统的开机和关机:,现在小编就来说说关于python内网穿透开发?下面内容希望能帮助到你,我们来一起看看吧!

python内网穿透开发

准备工作

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

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

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

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

开机实现思路

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

<pre >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

</pre>

接下来,程序会通过 icmp 协议,也就是 ping 下需要唤醒的目标主机然后过滤下,一个正常的 icmp 包是64字节,过滤打印出这个64

例如 ping 百度

<pre >➜ ~ 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

</pre>

我这里用一段 linux 命令去过滤是否有64,这里为啥要用 head -n 1 呢,因为有可能会出现2行,经过测试,我们只需要取64这个值就可以了

<pre >ping 192.168.1.182 -c 1 | grep 64 | cut -d " " -f 1|head -n 1

</pre>

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

<pre >#!/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['ToUserName'] != '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(paramiko.AutoAddPolicy())

ssh.connect(hostname=hostname,username=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('

')

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 -i 192.168.1.0 14:dd:a9:ea:0b:96')

wakeonlan_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

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 1 | grep 64 | cut -d " " -f 1|head -n 1')

sshConStatus = stdout.read()

sshConStatus =sshConStatus.strip('

')

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 '执行开机消息成功'

</pre>

关机部分实现

当接收关机指令时,程序会去删除网站根目录的 shutdown 文件,客户端我写了几行代码,去通过 requests 库每隔30s 发送 http head 请求去判断文件是否是404,如果是404 这说明文件不存在,调用系统关机操作,执行关机,然后还是 ssh 到树莓派去 ping 目标主机,如果返回为空,则说明关机成功,否则关机失败。这只是针对 Windows 的关机,如果目标主机是 linux 则简单多了。

<pre >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')

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(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('

')

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')

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()

</pre>

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

<pre >import requests

import os

import time

while 1:

time.sleep(30)

r = requests.head("http://awen.me/shutdown")

print r.status_code

if r.status_code == 404:

os.system("shutdown -s -t 5")

</pre>

使用 teamviewer 连接!

结语,更多python学习可以关注我们哦

    推荐阅读
  • 世界地理地形地图高清版可放大(世界基础地理高清地图)

    板块张裂分离地带为生长边界,造就大裂谷、海洋、海底中脊等地形形态。冬季,等温线相对夏季密集。

  • dr钻戒为什么一生只能定制一枚(一生仅能定一枚)

    文/羊城晚报全媒体记者孙绮曼宣称“男士一生仅能定制一枚”的DR钻戒,你买过吗?9月25日,DR迪阿股份有限公司发布官方声明对此进行回应。官方声明称,“DR钻戒可删购买记录”为不实传言,发布不实消息的淘宝店铺已被淘宝官方处理下架。所有购买记录不可篡改,永久不可删除。知识产权信息显示,该公司共有46项专利信息,但其中40项专利已处于“权利终止”的状态,商标信息注册信息共515项,其中336个商标完成注册。

  • 动词语法详细讲解(动词之常用易混动词辨析)

    1)say表示讲话,作为及物动词使用,后跟宾语或宾语从句。3)talk表示“谈话”,是不及物动词,与to,about,with等连用,才可以接宾语。2)see指“看见”某物,强调的是结果。3)watch指的是“观看”,“注视”之意。1)borrow意思为“借入”,常常与from连用,是非延续性动词,表示瞬间即能完成的动作。3)keep是“保存”的意思,动作可以延续。指将某物或某人从别处“带来”。着重于穿戴的动作。作“穿着”解时,只用于穿衣服,不用于穿鞋、戴帽、戴手套。

  • 母乳性黄疸就是病理性黄疸吗(母乳性黄疸也是病理性黄疸吗)

    如何检测母乳性黄疸目前母乳性黄疸的发病机制尚不完全明确,所以是缺乏实验室检测手段确诊母乳性黄疸的,一般母乳性黄疸要根据它的临床表现来诊断,主要诊断标准包括:第一.足月儿多见,纯母乳喂养或以母乳喂养为主的新生儿。

  • 红香椿炒蛋香椿没焯水可以吗(到底要不要焯水)

    ——香椿炒鸡蛋的正确做法——准备食材:香椿一小把,土鸡蛋四个,精盐,白醋,酱油,食用油。操作步骤:1.首先准备新鲜的绿叶香椿一小把将其摘洗干净,这里大家做香椿炒鸡蛋的时候最好选择绿叶香椿哦。在家里做香椿炒鸡蛋的时候,香椿一定要记得焯水哦。喜欢吃香椿炒鸡蛋的朋友赶紧去试一试吧。作为南方的朋友,你还对香椿炒鸡蛋有其他不同的做法吗?

  • 我和向日葵是朋友作文300字(我和向日葵是朋友作文范文)

    我和向日葵是朋友作文300字?金黄金黄的向日葵真漂亮啊!山坡上、田野里都有向日葵的影子,在阳光的照耀下,那耀眼的花瓣显得更加金灿灿,美丽极了!只要有向日葵的地方,那儿就一定会散发出淡淡的清香。向日葵有比较粗壮的茎,毛茸茸的,好像撒了一层层粉一样。这大片的向日葵引来了许多蜜蜂和蝴蝶,是因为它有引诱昆虫前来采蜜授粉的作用。我很喜欢我的植物朋友,我要学习向日葵阳光灿烂的精神,努力散发出自己的光芒。

  • 钢化膜附带的液体是什么(钢化膜送的液体怎么使用)

    钢化膜其实是贴在手机上了一个保护套很多朋友在购买了手机以后都会选择购买钢化膜。他们都认为贴上钢化膜手机就能够得到很好的保护。现在有很多的厂商在销售钢化膜以后都会送一些液体。钢化膜是用于保护手机屏幕的而且赠送的液体只是为了去白边。所以,钢化膜送的液体是用来消除屏幕与钢化膜之间白边的效果的,虽然有效果,但是其存在严重的隐患,会导致手机触控屏不灵敏,甚至损坏手机的零部件。建议钢化膜送的液体最好不要用。

  • 新出的三国卡牌有哪些 新出的三国卡牌手游

    不同的武将在能力上各有千秋,就算是最低级的武将也是有不错战斗力的。队伍的搭配对于战斗胜负有直接影响,大家要合理操作。游戏中的武将造型非常的酷炫,尤其是一些高级武将。

  • 佳能m6拍摄样片(星空摄影佳能M6一样轻松搞定)

    佳能EOSM6本身就十分轻便,机身重量仅约343克,大小与普通的护照、钱包差不多,放在包中,或将其随身携带都不会感觉到负担或占地方。因为星空拍摄需要使用高感光度进行长时间曝光拍摄,这就会放大画面中的噪点。DIGIC7处理器让星空美景更清晰佳能EOSM6拥有约2420万的有效像素可提供精致的画面细节。对用户来说,触摸操作已经十分习惯,因此M6会用起来更顺手。如果拍摄环境会有更多的阻碍,可以使用10秒倒计时功能。