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

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

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

python内网穿透开发

准备工作

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

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

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

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

开机实现思路

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

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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 style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">➜ ~ 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 style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">ping 192.168.1.182 -c 1 | grep 64 | cut -d " " -f 1|head -n 1

</pre>

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

<pre style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">#!/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 style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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 style="-webkit-tap-highlight-color: transparent; box-sizing: border-box; font-family: Consolas, Menlo, Courier, monospace; font-size: 16px; white-space: pre-wrap; position: relative; line-height: 1.5; color: rgb(153, 153, 153); margin: 1em 0px; padding: 12px 10px; background: rgb(244, 245, 246); border: 1px solid rgb(232, 232, 232); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">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学习可以关注我们哦

  • 韭菜盒子怎么用热水和面软(做韭菜盒子别用凉水和面)
  • 2024-05-15做韭菜盒子别用凉水和面导语:做韭菜盒子,别用凉水和面,教你详细做法,外酥里嫩一点不硬韭菜盒子这种面食,你都吃过吧?它又像饺子又像包子,不过韭菜盒子有它独有的特点,外皮酥脆馅料鲜香,只要吃过一定忘不掉我时不时地会给家人做一次。
  • 忆江南渔歌子词牌(忆江南词牌四首)
  • 2024-05-15忆江南词牌四首忆江南.醉秋(词林正韵)作者杨琨红枫舞,银杏映金黄曲水流觞邀雅客,秋风吹画送词章痴笑醉斜阳忆江南.紅柿(新韵)作者杨琨红灯挂,摇曳舞青天雀立枝头争日暖,风吹彤叶怨天寒霜打柿酣甜忆江南落红(词林正韵)作。
  • 海思麒麟芯片有多牛(华为海思麒麟家族的芯片排名情况)
  • 2024-05-15华为海思麒麟家族的芯片排名情况文/小伊评科技由于华为被制裁的缘故,目前已经基本丧失了生产麒麟芯片的能力这也就让在目前市面上现存的配备麒麟芯片的华为手机成为了香饽饽,那么本文就来给大家做一个详细的罗列,来看一看目前麒麟家族中的排名情。
  • 演员徐帆多大(吹爆这部电影里的徐帆)
  • 2024-05-15吹爆这部电影里的徐帆头号电影院懂小姐(topcinema原创,严禁转载)无论外界怎么评价,冯小刚的新片《只有芸知道》都是一部值得回味的电影票房过亿之后,冯小刚发文回忆起《天下无贼》时的往事,感慨“英雄老矣,但仍怀感激”这。
  • 前后鼻音不分纠正错误发音习惯(前后鼻音读不准)
  • 2024-05-15前后鼻音读不准前后鼻音分不清,普通话不标准没关系,今天我们一起来找方法我们先把前后鼻音的舌位置以及发音方法讲清楚,家长学会后,一定要带着孩子一起练习每天按照这个方法练习十分钟,孩子的前后鼻音问题将得到有效的提升说一。
  • 葛优妈妈去世原因(葛优母亲施文心去世)
  • 2024-05-15葛优母亲施文心去世据媒体报道,著名演员葛优的母亲施文心于12月25日晚去世,享年94岁施文心1928年出生于重庆江津,毕业于北京电影学校(956年改制为北京电影学院),1954年至1956年曾在中央电影局剧本创作室担任。
  • 网上办理营业执照怎么操作(网上申请营业执照)
  • 2024-05-15网上申请营业执照根据相关统计数据显示,今年上半年,全国网上零售额达63007亿元,同比增长3.1%其中实物商品网上零售额达到54493亿元,增长5.6%,占社会消费品零售总额的25.9%,为拉动整体经济发展持续发力电。
  • 歌曲相思的诗(感怀红豆曲)
  • 2024-05-15感怀红豆曲编者按本版是我们与北京众多热爱写作的中学生们的互动平台我们会以各中学为单位逐校呈现,并借一线语文老师的角度和笔触,品一品作文中的文学滋味,评一评文坛新星们的文字品质盘点了海淀、西城、东城及朝阳区这些传。
  • 植树节是不是清明节(清明植树好时节)
  • 2024-05-15清明植树好时节清明植树好时节,何故选在三月初?清明节时节插柳植树一直是千百年流传下的传统贾思勰《齐民要术》讲到:“取柳著户上,百鬼不入家”人们纷纷在门前插柳辟邪清明前后全国各地(尤其北方地区)气温回暖,水热充足,利。
  • 韭菜盒子怎么用热水和面软(做韭菜盒子别用凉水和面)
  • 2024-05-15做韭菜盒子别用凉水和面导语:做韭菜盒子,别用凉水和面,教你详细做法,外酥里嫩一点不硬韭菜盒子这种面食,你都吃过吧?它又像饺子又像包子,不过韭菜盒子有它独有的特点,外皮酥脆馅料鲜香,只要吃过一定忘不掉我时不时地会给家人做一次。
  • 忆江南渔歌子词牌(忆江南词牌四首)
  • 2024-05-15忆江南词牌四首忆江南.醉秋(词林正韵)作者杨琨红枫舞,银杏映金黄曲水流觞邀雅客,秋风吹画送词章痴笑醉斜阳忆江南.紅柿(新韵)作者杨琨红灯挂,摇曳舞青天雀立枝头争日暖,风吹彤叶怨天寒霜打柿酣甜忆江南落红(词林正韵)作。
  • 海思麒麟芯片有多牛(华为海思麒麟家族的芯片排名情况)
  • 2024-05-15华为海思麒麟家族的芯片排名情况文/小伊评科技由于华为被制裁的缘故,目前已经基本丧失了生产麒麟芯片的能力这也就让在目前市面上现存的配备麒麟芯片的华为手机成为了香饽饽,那么本文就来给大家做一个详细的罗列,来看一看目前麒麟家族中的排名情。
  • 演员徐帆多大(吹爆这部电影里的徐帆)
  • 2024-05-15吹爆这部电影里的徐帆头号电影院懂小姐(topcinema原创,严禁转载)无论外界怎么评价,冯小刚的新片《只有芸知道》都是一部值得回味的电影票房过亿之后,冯小刚发文回忆起《天下无贼》时的往事,感慨“英雄老矣,但仍怀感激”这。
  • 前后鼻音不分纠正错误发音习惯(前后鼻音读不准)
  • 2024-05-15前后鼻音读不准前后鼻音分不清,普通话不标准没关系,今天我们一起来找方法我们先把前后鼻音的舌位置以及发音方法讲清楚,家长学会后,一定要带着孩子一起练习每天按照这个方法练习十分钟,孩子的前后鼻音问题将得到有效的提升说一。
  • 葛优妈妈去世原因(葛优母亲施文心去世)
  • 2024-05-15葛优母亲施文心去世据媒体报道,著名演员葛优的母亲施文心于12月25日晚去世,享年94岁施文心1928年出生于重庆江津,毕业于北京电影学校(956年改制为北京电影学院),1954年至1956年曾在中央电影局剧本创作室担任。
  • 网上办理营业执照怎么操作(网上申请营业执照)
  • 2024-05-15网上申请营业执照根据相关统计数据显示,今年上半年,全国网上零售额达63007亿元,同比增长3.1%其中实物商品网上零售额达到54493亿元,增长5.6%,占社会消费品零售总额的25.9%,为拉动整体经济发展持续发力电。
  • 歌曲相思的诗(感怀红豆曲)
  • 2024-05-15感怀红豆曲编者按本版是我们与北京众多热爱写作的中学生们的互动平台我们会以各中学为单位逐校呈现,并借一线语文老师的角度和笔触,品一品作文中的文学滋味,评一评文坛新星们的文字品质盘点了海淀、西城、东城及朝阳区这些传。
  • 植树节是不是清明节(清明植树好时节)
  • 2024-05-15清明植树好时节清明植树好时节,何故选在三月初?清明节时节插柳植树一直是千百年流传下的传统贾思勰《齐民要术》讲到:“取柳著户上,百鬼不入家”人们纷纷在门前插柳辟邪清明前后全国各地(尤其北方地区)气温回暖,水热充足,利。
  • 张星泽美好的意外(爱上海的理由张星泽)
  • 2024-05-15爱上海的理由张星泽大家好,我是张星蕴,我是张星泽我们来自上海市静安区闸北第三中心小学在居家隔离期间,就有一群对上海这座城市充满希望的音乐家们,他们通过云合奏的方式,用音乐唤醒由于疫情沉睡的上海今天,我就来到了上海交响音。
  • 秦霄贤个人资料几岁(秦霄贤最讨厌被叫富二代怎么回事)
  • 2024-05-15秦霄贤最讨厌被叫富二代怎么回事9月17日晚间,德云社团综《德云斗笑社》播出第4期节目作为一档专门为德云女孩打造的垂直化、粉丝向精品综艺,节目组几乎找来德云社全部年轻顶流艺人根据赛制规则,上期张九龄三期得分最低,被淘汰出局,杨九郎无。
  • 马拉松进入精耕细作时代(转型是一场马拉松)
  • 2024-05-15转型是一场马拉松荷兰保险集团执行委员会的一位成员介绍该公司如何先对健康险部门实施转型,然后再把变革推广到整个公司Eureko是一家在荷兰运营的大型保险集团公司,其品牌为Achmea,该公司在2006年曾面临艰难的抉择。
  • 所有直播平台最火主播排名(谁才是直播界的一哥一姐)
  • 2024-05-15谁才是直播界的一哥一姐如今,观看直播已经成为我们生活中重要的娱乐活动,对于很多人来说,电视可以不看,游戏可以不打,直播却必不可少比如小编,工作再忙也会抽空看看直播放松一下经过前几年的野蛮生长和激励厮杀,虎牙已成为直播行业的。
  • 教师编制考异地要去归属地考试么(教师编制怎么考)
  • 2024-05-15教师编制怎么考计划考教师编制的人很多,但是相当一部分考生都处于迷茫之中,教师编制怎么考?教师编制能不能异地跨考?1.什么是教师编制考试?我们拿到了教师资格证后,只是有了做教师的资格,还并不是一名真正的老师要想成为真。
  • 膝关节软弱无力治疗方法(为啥上了年纪总容易膝关节无力)
  • 2024-05-15为啥上了年纪总容易膝关节无力作为人体最“忍辱负重”的关节大家对膝关节的状态总是缺少关注注重日常维护关节是不可能“历久弥新”的不要在膝痛发作时才意识到问题的严重为此,有网友询问母亲今年八十八岁,其右膝关节总是没力气,看了多家医院也。
  • 精诚所至金石为开出自哪位思想家(精诚所至出自哪里)
  • 2024-05-15精诚所至出自哪里精诚所至出自庄子的《庄子·渔父》:“真者,精诚之至也,不精不诚,不能动人”意思是人的诚心所到,能感动天地,使金石为之开裂比喻只要专心诚意去做,什么疑难问题都能解决庄子,战国中期思想家、哲学家、文学家姓。
  • 国企中层管理之道(总裁无为中层有为)
  • 2024-05-15总裁无为中层有为导读:“无用而有用,无能而有能,无为而无为”让自己无用,团队有用,是领导者最重要的战略部署;让自己无能,团队有能,是领导者最重要的能力所在;让自己无为,团队有为,是领导者在企业最大的作为无为和大有所为。
  • 红薯泥怎么做如何做好吃
  • 2024-05-15红薯泥怎么做如何做好吃原料:红薯1个水适量做法:1准备一个红薯,清洗干净2去皮后切成小块3放进蒸锅里蒸熟4给宝宝吃要蒸的软软面面的,用筷子一扎就透的程度5红薯晾凉后放进搅拌机,加入少量凉开水搅拌成细腻的糊糊。
  • 粉红女郎会翻拍吗(粉红女郎将被翻拍)
  • 2024-05-15粉红女郎将被翻拍朱德庸《涩女郎》再翻拍!时隔26年的恋爱婚姻家庭观能被现代的观众接受吗?万人迷、结婚狂、哈妹、男人婆谁来演呢?台湾漫画家朱德庸风靡一时的作品《涩女郎》确定再翻拍2003年,根据这部漫画翻拍的电视剧《粉。