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

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

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

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学习可以关注我们哦

    推荐阅读
  • 索尼a55怎么导入歌词(索尼a55怎么导入歌词教程)

    索尼a55导入歌词的方法:1、如果是电脑,直接用自带的数据线插入电脑粘贴复制到内存卡music文件夹下,或用mediago软件传。索尼A55发布日期为2010年08月,机身特性:APS-C规格数码单电操作方式;全手动操作传感器类型:ExmorAPSHDCMOS;传感器尺寸:23.5*15.6mm;最大像素数为1670万。

  • 鸭肉咖喱汤(风味家常菜鸭肉咖喱汤做法分享)

    下面内容希望能帮助到你,我们来一起看看吧!鸭肉咖喱汤原料:鸭肉400克、元葱1个、胡萝卜400克、土豆400克、黄油20克、咖喱酱2勺、牛奶400克、高汤500克、清水适量、盐适量。热锅融化黄油,加入咖喱酱离火炒香。转文火煮45分钟。最后加适量盐调味即可。

  • 寄快递怎么寄才快(寄快递怎么寄会很麻烦吗)

    如果千辛万苦把大件搬到快递网点,结果发现价格无法接受,又得重新找其它快递网点,那简直就是一种折磨。所以必须要知道寄件过程中一些小知识。当然是先在快递官网上核实对比各个公司的价格,选择一个最优惠最近的快递站点,一次性搞定。这里也要注意到,如果寄件的东西价值比较高,或者是易碎之类的物品,建议要购买保险或者保价,避免出现损伤的时候损失惨重,有了这两个即使快递物品有问题,也会得到相应的补偿。

  • 银行股怎么分红?什么时间分红?是持股一年给分红吗?(银行股分红简述)

    下面希望有你要的答案,我们一起来看看吧!银行股怎么分红什么时间分红是持股一年给分红吗大多数银行股每年都分红1次,有的分红两次。第一次分红在年报后,大约在七月份前后。第二次分红在半年报后,大约9月或10月。能否得到分红款与持股时间无关。只要你在股权登记日收盘时持有该股票,分红就属于你。哪怕你是股权登记日当天买入,第二天卖出,分红款照样会到你的帐户上。

  • python自动打开pdf文件(Python如何一键给PDF文件加密)

    新生成的pdf文件在您的桌面')breakwindow.close()带包代码我们通过调用Pyinstaller模块来讲Python代码打包,操作指令如下pyinstaller-F-w文件名.py部分参数含义如下-F表示生成单个可执行文件-W表示去掉控制台窗口,这在GUI界面时非常有用-i表示可执行文件的图标最后出来的效果如下图PDF文件也被添加上了密码,如下图获取本次的可执行文件可以后台私信“333”,感谢您的关注!!!

  • 宝妈抱宝宝的正确姿势(专家支招妈妈们)

    产房里的医护人员立刻将刚出生的宝宝送进妈妈的怀里,让妈妈的第一次拥抱伴随着宝宝的第一次呼吸。除了爱,还有什么理由要“第一次拥抱”?让宝宝胸贴着妈妈的胸,皮肤挨着皮肤,刺激宝宝的觅乳反射,帮助宝宝吸到第一口珍贵的母乳。增强新生儿觅乳反应早接触还能刺激新生儿的觅乳反射,大约生后40-50分钟左右,新生儿会出现流口水、寻找乳头、吸吮等觅乳反射动作,这些都证明宝宝想要吃第一口奶了,这时候要让他进行早吸吮。

  • 安卓4.4可不可以玩我的世界(终于安卓机也可以玩我的世界了)

    在网易代理《我的世界》后,国际服被封,很多人玩不了,尤其对安卓用户来说,更是等的辛苦。《我的世界》中国版将于今天11点开启全平台公测,终于安卓机也可以下载免费玩官方正版的《我的世界》啦。手游安卓版本地存档导入、手游离线模式等玩家期待的实用功能也将于今日同步上线。在《我的世界》里有隐身药水,虽然有时效,但是还是可以利用起来干点什么“坏事”的。

  • 新媒体运营该怎么做到以下几点(新媒体运营包含哪些内容)

    新媒体运营包含哪些内容伴随着5G时期的来临,互联网的发展得愈来愈快速新媒体也十分受大家的关注在这种环境下,有一种声音“新媒体行业门坎低,薪酬高”,使很多刚大学毕业的在校大学生和想改行的小伙伴们都看准了新媒体行业但新媒体行业。

  • 识别翡翠原石(如何识别翡翠原石)

    识别翡翠原石翡翠原石可以通过看颜色、看手感、看打灯的情况进行识别。天然翡翠原石开窗的位置颜色都是比较具有光泽感的,而且颜色翡翠的纯正,而假的在灯光照射下是蜡状光泽并且颜色不自然。其次,翡翠原石上手摸质感是较为平稳没有咯手的感觉,其次就是在手上掂量的时候都是较为中的,而假的通常都是较为轻。另外,翡翠原石在打灯的情况下看起来色调是较为自然有美感的,而且绿色的走向较为清楚,而假的通常是较为模糊,看不清。

  • 防晒霜在护肤步骤什么时候用(防晒霜是在哪个步骤涂)

    切记不要多此一举的按摩哟,这样很有可能会引起肌肤出现搓泥现象哟~防晒霜涂多少妹子们在涂防晒霜的时候,一定要注意用足量!因为防晒霜没有用足量的话,是并不能发挥出最好的防晒效果的!妹子们在涂防晒霜的时候,至少要保证每平方厘米的肌肤上有2mg的防晒霜,大概一个硬币大小的量,这样才能保证防晒霜发挥出效果!