在家想远程公司电脑?Python + 微信一键连接!
作者 | 阿文
责编 | 伍杏玲
有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器。
快速挑战Python全栈工程师:
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
准备工作
本程序主要是实现远程管理 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['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 '执行开机消息成功'
关机部分实现
当接收关机指令时,程序会去删除网站根目录的 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')
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()
客户端代码,写完扔计划任务,开机启动:
import requests
import os
import time
while 1:
time.sleep(30)
r = requests.head("https://awen.me/shutdown")
print r.status_code
if r.status_code == 404:
os.system("shutdown -s -t 5")
使用 TeamViewer 连接:
缺点
网页端微信必须一直登录,不方便,这个就需要微信不能断网了。
WakeOnLan 是广播 MAC 地址的,貌似不能返回是否成功没,所以还是要 ping 主机看看通不通,判断下。
需要一个树莓派做跳板机,否则也不能唤醒内网设备。
如果只允许自己控制最好是使用文件助手来发送消息,因为默认情况下,任何人都可以给你发送指令开机。
Windows需要安装TeamViewer并且设置为开机自动启动以及绑定账号设置无人值守模式。这样方便远程,如果是Linux 则不需要开启 ssh 就可以了。
全面学python的时代,作为程序员你怎么看?
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
代码地址:https://github.com/monkey-wenjun/wchatwakeonlan
文章内的代码如果有 Bug,后续更新都在 GitHub 上,完整代码请参考 GitHub ,此文章代码不再更新。
原文:https://awen.me/post/3709919605.html
声明:本文为作者投稿,版权归对方所有。
热 文 推 荐
WinRAR 曝 19 年前重大漏洞,可完全控制电脑!| 附解决方法
字节跳动(今日头条),战斗力为何如此凶猛?| 畅言
技术头条
☞ 那些简历造假拿 Offer 的程序员,后来都怎么样了?
☞ 被V神点赞, 我是如何用五子棋打败以太坊排名最高的应用的? |人物志
☞ 50个最有价值的数据可视化图表(推荐收藏)
一键免费自动AI抠图,效果连PS大哥也点赞!
史上最难的一道Java面试题
print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"
点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。
喜欢就点击“好看”吧!
在家想远程公司电脑?Python + 微信一键连接!相关推荐
- 在家想远程公司电脑?Python +微信一键连接
作者 | 阿文 转载自 CSDN(ID:CSDNnews) 有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工 ...
- 在家想远程公司电脑?Python+微信一键连接!
作者 | 阿文 责编 | 伍杏玲 有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管 ...
- python远程安装软件_在家想远程公司电脑?Python + 微信一键连接!
作者 | 阿文 责编 | 伍杏玲 有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管 ...
- python 执行ping命令_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!...
有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管理 Windows10操作系统的开 ...
- Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. *注意:全文代码可左右滑动查看 准备工作 本程序主要是实现远程管理 ...
- 远程连接电脑_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管理 Windows10操作系统的开 ...
- 远程唤醒_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管理 Windows10操作系统的开 ...
- python 远程控制电脑开机_Python黑科技:在家远程遥控公司电脑,python+微信一键连接!...
有时候需要远程家里的台式机使用,因为我平时都是用 MAC 多,但是远程唤醒只能针对局域网,比较麻烦,于是我想用微信实现远程唤醒机器. 准备工作 本程序主要是实现远程管理 Windows10操作系统的开 ...
- 记一次在家办公远程公司数据库的解决方案
记一次在家办公远程公司数据库的解决方案 参考文章: (1)记一次在家办公远程公司数据库的解决方案 (2)https://www.cnblogs.com/jkguo/p/11188706.html 备忘 ...
最新文章
- 精品网摘:大内核锁将何去何从
- ios 两个 TableView 之间的联动, TableView 与 CollectionView 之间的联动
- 1.1 对象的概念及面向对象的三个基本特征
- Node Capital生态布局初成,部分项目差强人意
- 0-10不断循环的js
- EBB-23、DNS服务
- Java使用循环创建多个线程
- C语言——机器平台对强制类型转换的影响
- 第四章OFDM(1)
- 政府采购和招标投标常见问题:评标的依据是什么?
- Python基础7:文件操作
- 苹果账户登录_开心,安卓手机支持和iPhone内APP账户互通
- java设计模式(13-19节)
- ios苹果机系统 的1px边框不显示
- 斐波那契问题——上台阶问题
- ENVI-IDL中国官方微博
- 2010年Oracle大事记
- 数字化赋能,助推微电网高质量发展
- INF安装信息文件⑥
- 使用TypeScript开发微信小程序的方法
热门文章
- 顺序表之元素位置互换(改进版)
- 记录——《C Primer Plus (第五版)》第十一章编程练习第三题
- 中国特威兹勒行业市场供需与战略研究报告
- 水烟炭行业调研报告 - 市场现状分析与发展前景预测
- 2021级C语言大作业 - 小鸡弹跳
- mysql1040_解决mysql 1040错误Too many connections的方法
- mysql login_HOW to login MYSQL, Help, and Select Database
- DEEPNOVA 技术荟系列公开课回顾:释放海量数据价值,尽显数据智能之美
- 超400万用户的Chrome截图插件下架始末
- CSDN插件限时内测,新用户抢永久免费去广告特权