台式电脑

电脑微信怎么样联网(在家想远程公司电脑?Python +微信一键连接)

在家想远程公司电脑?Python +微信一键连接

作者|阿文

转载自微信公众号“CSDN(ID:CSDNnews)”

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

准备工作

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

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

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

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

开机实现思路

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

pi@raspberrypi:~$wakeonlan-i192.168.1.014:dd:a9:ea:0b:96Sendingmagicpacketto192.168.1.0:9with14:dd:a9:ea:0b:96

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

例如ping百度:

?~pingwww.baidu.com

PINGwww.a.shifen.com(180.97.33.108):56databytes

64bytesfrom180.97.33.108:icmp_seq=0ttl=53time=8.865ms

64bytesfrom180.97.33.108:icmp_seq=1ttl=53time=9.206ms

64bytesfrom180.97.33.108:icmp_seq=2ttl=53time=8.246ms

用一段Linux命令去过滤是否有64,这里为啥要用head-n1呢?

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

ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1

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

#!/usr/bin/python

#-*-coding:utf-8-*-

importitchat

importparamiko

importos

importtime

importsys

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)

deftext_reply(msg):

ifmsg['ToUserName']!='filehelper':return

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

exceptparamiko.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('ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1')

sshCheckOpen=stdout.read

sshCheckOpen=sshCheckOpen.strip('')

printtype(sshCheckOpen)

printsshCheckOpen

#进行判断,如果为64,则说明ping成功,说明设备已经在开机状态,程序结束,否则执行唤醒

ifsshCheckOpen=='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-i192.168.1.014: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命令,-c1表示只ping一下,然后过滤有没有64,如果有则获取64传给sshConStatus

stdin,stdout,stderr=ssh.exec_command('ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1')

sshConStatus=stdout.read

sshConStatus=sshConStatus.strip('')

printtype(sshConStatus)

printsshConStatus

电脑微信怎么样联网(在家想远程公司电脑?Python +微信一键连接)

#进行判断,如果为64,则说明ping成功,设备已经联网,可以进行远程连接了,否则发送失败消息

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

在家想远程公司电脑?Python +微信一键连接

关机部分实现

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

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

ifmsg['Text']==u'关机':

#删除网站根目录的shutdown文件

rmfile=os.system('rm-rf/www/shutdown')

ifrmfile==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)

exceptparamiko.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('ping192.168.1.182-c1|grep64|cut-d""-f1|head-n1')

sshConStatus=stdout.read

sshConStatus=sshConStatus.strip('')

printtype(sshConStatus)

printsshConStatus

#如果获取的值为空,则说明已经关机,否则关机失败

ifsshConStatus!='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

在家想远程公司电脑?Python +微信一键连接

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

importrequests

importos

importtime

while1:

time.sleep(30)

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

printr.status_code

ifr.status_code==404:

os.system("shutdown-s-t5")

使用TeamViewer连接:

在家想远程公司电脑?Python +微信一键连接

缺点

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

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

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

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

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

代码地址:https://github.com/monkey-wenjun/wchatwakeonlan

文章内的代码如果有Bug,后续更新都在GitHub上,完整代码请参考GitHub,此文章代码不再更新。

原文:https://awen.me/post/3709919605.html

声明:本文转载自微信公众号“CSDN”,版权归原作者:阿文。

推荐阅读

程序设计导论:Python语言实践

作者:[美]罗伯特·塞奇威克

在家想远程公司电脑?Python +微信一键连接

本书介绍Python的基础知识,旨在帮助学生首先掌握概念,之后通过步骤完备的实例培养学生的问题求解能力。这一版采用Python3,并对全书结构进行了优化,既可作为第一门程序设计课的入门教材,也可供Python爱好者自学参考。

在家想远程公司电脑?Python +微信一键连接

什么是横断山?

心情不好时,看这3张图,瞬间豁然开朗

万里挑一!热门机器学习开源资源最强盘点

稻盛和夫:像谈恋爱一样工作,像有钱人一样生活

这个调查刷爆网络:收入越低越爱看电视,收入越高越爱读书!

相关新闻

返回顶部