Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器。

Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
*注意:全文代码可左右滑动查看

准备工作

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

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

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

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

开机实现思路

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

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
程序会通过 ICMP 协议, ping 下需要唤醒的目标主机然后进行过滤,一个正常的 ICMP 包是64字节,过滤打印出这个64。

例如 ping 百度:

→ ~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
用一段 Linux 命令去过滤是否有64,这里为啥要用 head -n 1 呢?

因为有可能会出现2行,经过测试,我们只需要取64这个值就可以了:

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

@!/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['ToTserName'] != '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(parmiko.AutoAddPolicy())ssh.connect(hostname=hostname,uername=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('\n')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 -1 192.168.1.0 14:dd:a9:ea"0b:96')itchat.send(wakeonlan_time+u'执行唤醒,等待设备开机联网',toUserName='filehelper')#由于开机需要一些时间去启动网络,所以这里等等60stime.sleep(60)#执行ping命令,-c 1 表示只ping一下,然后过滤有没有64,如果有则获取64传给sshConStatusstdin,stdout,stderr=ssh.exec_command('ping 192.168.1.182 -c 1c | grep 64 | cut -d "" -f 1|head -n 1')sshConStatus = stdout.read()sshConStatus = sshConStatus.strip('\n')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()#在网站根目录创建一个空文件,命名为 shutdownos.system('touch /www/shutdown')print '执行开机消息成功'

Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

关机部分实现

当接收关机指令时,程序会去删除网站根目录的 shutdown 文件,客户端我写了几行代码,去通过 Requests 库每隔30s 发送 HTTP head 请求去判断文件是否是404,如果是404 这说明文件不存在,调用系统关机操作,执行关机。

然后 SSH 到树莓派去 ping 目标主机,如果返回为空,则说明关机成功,否则关机失败。这只是针对 Windows 的关机,如果目标主机是 Linux 则简单多了:

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')
paramko.util.log_to_file('ssh_key-login.log')
privatekey = os.path.expanduser(key_file)
try:
key = paramiko.RSAKey.from_privat_key_file(privatekey)
except paramiko.PasswordRepuiredExceptin:
key = paramiko.RSAKey.from_privat_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('\n')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')ssh.close()

itchat.auto_login(hotReload=True,enobleCmdQR=2)
itchat.run()
Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

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

import requests
import os
import time
while 1:
time.sleep(30)
r = requests.head("heep://awen.me/shutdown")
print r.status_code
if r.status_code == 404:
os.system("shutdown -s -t 5")

使用 TeamViewer 连接:

Python黑科技:在家远程遥控公司电脑,python+微信一键连接!

缺点

网页端微信必须一直登录,不方便,这个就需要微信不能断网了。

WakeOnLan 是广播 MAC 地址的,貌似不能返回是否成功没,所以还是要 ping 主机看看通不通,判断下。

需要一个树莓派做跳板机,否则也不能唤醒内网设备。

如果只允许自己控制最好是使用文件助手来发送消息,因为默认情况下,任何人都可以给你发送指令开机。

Windows需要安装TeamViewer并且设置为开机自动启动以及绑定账号设置无人值守模式。这样方便远程,如果是Linux 则不需要开启 ssh 就可以了。

最后,如果你跟我一样都喜欢python,也在学习python的道路上奔跑,欢迎你加入python学习群:839383765 群内每天都会分享最新业内资料,分享python免费课程,共同交流学习,让学习变(编)成(程)一种习惯!

转载于:https://blog.51cto.com/14186420/2359302

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/252206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#通过app.manifest使程序以管理员身份运行

通常我们使用c#编写的程序不会弹出这个提示,也就无法以管理员身分运行。微软的操作系统使用微软的产品方法当然是有的,通过app.manifest配置可以使程序打开的时候,弹出UAC提示需要得到允许才可以继续,这样就获得了管理员的权限来执…

MOS管基本认识(快速入门)

1. 三个极的判定G极(gate)—栅极,不用说比较好认 S极(source)—源极,不论是P沟道还是N沟道,两根线相交的就是 D极(drain)—漏极,不论是P沟道还是N沟道,是单独引线的那边2. N沟道与P沟道判别箭头指向G极的是N沟道 箭头背…

基础构建模块

5 基础构建模块 Java平台类库包含了丰富的并发基础构建模块,例如线程安全的容器类以及各种用于协调多个相互协作的线程控制流的同步工具类(Synchronizer)。本章将介绍其中一些最有用的并发构建模块。 5.1同步容器类 同步容器类包括Vector和Hashtable,二者…

TCP定时器

1. TCP中7种定时器 TCP中有7中定时器 (1)建立连接定时器(connection-establishment timer) (2)重传定时器(retransmission timer) (3)延迟应答定时器(delayed ACK timer) (4)坚持定时…

软件工程网络15个人阅读作业1 201521123038 游舒婷

软件工程网络15个人阅读作业1 201521123038 游舒婷 1.博客园地址 sakurai3104 2.码云地址 sakurai3104 3.阅读与思考 (1)回想一下你初入大学时对网络工程专业的畅想 当初你是如何做出选择网络工程专业的决定的? 填报志愿的时候,大…

18LaTeX学习系列之---LaTeX的参考文献

目录 目录前言(一)简单的参考文献1.说明2.源代码3.输出效果(二)以文件管理的方式1.说明:2.源代码:3.输出效果(三)直接从源网站获取1.说明2.操作目录 本系列是有关LaTeX的…

Python 基础(常用数据结构)

常用数据结构 1)元组 元组是一种静态的数据结构,无法修改,若要修改只能重新生成新的元组。 输出结果: 元组元素的获取是通过索引值去获得的;例如上面的tup1[0]返回apple;另外你可以直接把tup1一次性赋给多个…

Java IO(二)——RandomAccessFile

一、RandomAccessFile RandomAccessFile类可以说是Java语言中功能最为丰富的文件访问类,它提供了众多的文件访问方法。RandomAccessFile类支持"随机访问"方式,可以跳转到文件的任意位置处读写数据。要访问一个文件的时候,不想把文件…

centos7 安装python3

1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5。 使用 python -V 命令查看一下是否安装Python 然后使用命令 which python 查看一下Python可执行文件的位置 可见执行文件在/usr/bin/ 目录下,切换到该…

centos svn 的搭建

一. SVN 简介 Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏…

软件建模——第3章 项目前期

3.1 项目前期的主要工作 3.1.1 现状分析 1.硬件分析 2.软件分析 3.1.2 需求收集 3.1.3 粗略设计 1.体系结构设计 2.硬件(网络)设计 3.应用系统设计 4.安全设计 5.配套设计 3.1.4 可行性分析 3.2 结构化的项目前期实例 3.2.1 组织分析(自动化…

echarts_部分图表配置_图表click事件

额。。当然其他事件都是支持的,此文仅以click做简单介绍: 请点击“柱子”。。。 官方介绍:http://echarts.baidu.com/tutorial.html#ECharts%20%E4%B8%AD%E7%9A%84%E4%BA%8B%E4%BB%B6%E5%92%8C%E8%A1%8C%E4%B8%BA 1 function bottom_z (thisI…

mysql 5.7.25 的安装与 安装错误修改 适用于5.7解压版

1,根据自己的需求去官网下载 2.解压到自己喜欢的路径 其中date 和 my.ini 在5.7后面的版本 解压后是没有的,需要自己配置。 可以自己创建my.ini文件 ,但是不能自己创建date文件夹。 其中my.ini文件的配置如下(如果报错要将目录文件…

解除服务器端口号占用及服务器端口号的修改

这几天因为面试的原因把SSH的东西重新巩固下,所以用的服务器是Tomcat。但是因为前一个项目用的服务器是Jboss,项目一期迭代完成,转交测试组进行测试,提了很多bug,所以当改bug的时候发现我Jboss的服务器可以允许&#x…

Python 标准类库-Windows特殊服务之msvcrt

标准类库-Windows特殊服务之msvcrt by:授客 QQ:1033553122 广告:出售自研自动化小平台(无需编码也可用),有需要请联系 测试环境 win7 64位 Python 3.4 64bit 控制台I/O 1. 例子 getch演示 假设 1.py脚本内容如下&#…

redis服务器学习一

一:什么是redis服务器 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支…

java项目启动tomcat没报错,然后页面报404无法找到,重新编译后,出现以下状态...

严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListenerorg.springframework.beans.factory.BeanCreationException: Error creating bean with name MapperScannerConfigurer defined in c…

相机与镜头常识

1.焦距(FocalLength)   焦距是从镜头的中心点到胶平面上所形成的清晰影像之间的距离。焦距的大小决定着视角的大小,焦距数值小,视角大,所观察的范围也大;焦距数值大,视角小,观察范…

企业云存储:为什么中大型企业偏爱自建私有云?

“上云?我们通常自建企业私有云。”9102年了,在云存储服务的选择上,中大型企业基本步调一致,统筹规划自建企业私有云。为什么中大型企业都偏爱自建企业私有云?一、长久的成本考量从账面上看,通常私有云初期…