python内网穿透开发(实现微信远程控制唤醒内网机器和远程关闭windows)
python内网穿透开发(实现微信远程控制唤醒内网机器和远程关闭windows)
2024-09-26 06:43:42  作者:千年之光  网址:https://m.xinb2b.cn/know/qcl521582.html

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


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-09-27玫瑰花茶的正确泡法人们都熟悉玫瑰花,可是很多人喝了很久,都作用不大,那是因为什么呢,那是因为没有掌握正确的泡制方法,那么今天我就交大家怎样泡玫瑰花茶玫瑰花不要太多,就3---4个就好了,先把玫瑰花放在一个容器里,加一点。
  • 迪士尼真人版白雪王后(真人版白雪公主等多部迪士尼新片定档)
  • 2024-09-27真人版白雪公主等多部迪士尼新片定档1905电影网讯作为好莱坞的巨无霸制片商,迪士尼的一举一动都备受关注日前,迪士尼公司官宣了一大批影片的档期,其中不乏真人版《白雪公主》、《狮子王:木法沙》以及《头脑特工队2》等等重点影片宣布档期的影片。
  • 我的世界tnt炸不掉什么方块(Minecraft什么方块TNT炸不掉)
  • 2024-09-27Minecraft什么方块TNT炸不掉有很多得益于Minecraft游戏中所有东西都可以看作是一种方块,所以有很多特殊的方块也炸不掉黑曜石方块、基岩方块、命令方块这三种是纯方块空气方块、空气墙方块,水方块,TNT七格以外的所有方块箭等武器。
  • 姚晓光会编程吗(姚晓光掌舵QQ10个宇宙)
  • 2024-09-27姚晓光掌舵QQ10个宇宙4月15日,腾讯平台与内容事业群(PCG)内部发文宣布进行新一轮的组织架构和人事调整除了整合腾讯视频、微视、应用宝业务,组建“在线视频BU(On-lineVideoBusinessUnit,OVB)”。
  • 柿子怎么去涩又脆?大家都知道硬柿子是涩的
  • 2024-09-27柿子怎么去涩又脆?大家都知道硬柿子是涩的一、温水浸泡法:采收后的涩柿浸泡在清洁的温水内,水温及浸泡时间要根据采收时柿子的成熟度而定很生的青果,水温应保持在40℃~50℃,浸泡18小时以上可脱去涩味;黄熟期的柿子,水温应保持25℃~30℃,浸。
  • 贾玲票房破30亿瘦成一道闪电(贾玲首部电影都50亿票房)
  • 2024-09-27贾玲首部电影都50亿票房文|令狐伯光贾玲首度导演的《你好李焕英》彻底爆了某平台预测本片的总票房,达到了惊人的51亿不管如何,贾玲首当导演的就取得如此成绩,真可谓是可喜可贺因为《你好李焕英》取得如此巨大的成功,现在整个中国电影。
  • 自曝出演扶摇原因全在杨幂身上(扶摇中参演过三生三世的演员)
  • 2024-09-27扶摇中参演过三生三世的演员继三生三世十里桃花之后,杨幂的又一部古装大剧正在热播中,它就是由杨幂阮经天等人主演的古装励志爱情剧《扶摇》而在这部剧中,最大的看点不是杨幂饰演的扶摇和阮经天饰演的长孙无极之间的爱情故事,而是杨幂饰演的。
  • 内行对杨紫评价(笑杨紫土的可以闭嘴了)
  • 2024-09-27笑杨紫土的可以闭嘴了这几集《亲爱的,热爱的》,童颜夫妇分手合好,终于又开始发糖了看了这段突然出现的吻戏,李现我要严肃批评你,亲女朋友身体这么僵硬的吗?另一只手垂着不动,是废掉了吗?还是杨紫更自然,面对事先没打招呼,突如其。
  • 记忆中的时间在哪里(记忆深处时间都去哪了)
  • 2024-09-27记忆深处时间都去哪了时间从来不语,转眼间我的女儿长大了,九年的时光就这么一晃而过陪她走过春夏秋冬,从她咿呀学语,蹒跚走路,到现在的一个小大人,日复一日,年复一年,她成长的点点滴滴、一切美好的回忆像是就在昨天不禁感叹,时间。
  • 薅羊毛是什么意思(薅羊毛的含义)
  • 2024-09-27薅羊毛的含义所谓薅羊毛就是指网赚一族利用各种网络金融产品或红包活动推广下线抽成赚钱,又泛指搜集各个银行等金融机构及各类商家的优惠信息,以此实现盈利的目的这类行为就被称之为薅羊毛就目前来说,“薅羊毛”的定义已经不仅。
  • 世界排行第二的山峰是什么山(乔戈里峰简介)
  • 2024-09-27乔戈里峰简介世界上第二高的山峰是乔戈里峰乔戈里峰,塔吉克语,意为“高大雄伟”,为巴基斯坦的最高峰,也是中国和世界的第二高峰,海拔8611米,仅次于珠穆朗玛峰乔戈里峰坐落在喀喇昆仑山的中段其属中国的一侧,在新疆维吾。
  • 破酆都为什么是鬼城(酆都凭什么是鬼城)
  • 2024-09-27酆都凭什么是鬼城丰都(古称酆都)是国内“鬼城”的所在地位于重庆版图的中心,有两千多年的历史三峡大坝建造后,因为水位上涨,老丰都县被淹没,现在的丰都县是新修的至于为什么称这里为鬼城有很多种说法,最普遍被人们所接受的是东。