作者 | 阿文

责编 | 伍杏玲

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

准备工作

本程序主要是实现远程管理 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 百度:�7�4 ~ 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(\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 -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(\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()

#在网站根目录创建一个空文件,命名为 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(\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)

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 就可以了。代码地址:https://github.com/monkey-wenjun/wchatwakeonlan

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

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

声明:本文为作者投稿,版权归对方所有。

python远程安装软件_在家想远程公司电脑?Python + 微信一键连接!相关推荐

  1. python爬虫安装软件_为编写网络爬虫程序安装Python3.5

    1. 下载Python3.5.1安装包 1.1 进入python官网,点击menu->downloads,网址:Download Python 1.2 根据系统选择32位还是64位,这里下载的可 ...

  2. 有没有可以刷python题的软件_你想要的Python面试都在这里了【315+道题】

    第一部分 Python基础篇(80题) 1.为什么学习Python? 1.python是脚本语言,作为程序员至少应该掌握一本通用脚本语言,因为脚本语言与编译语言的开发测试过程不同,可以极大的提高编程效 ...

  3. 免费学python的手机软件_别再说你在学Python,连软件都没“安全”

    选择要安装的版本点击下载,下载完成后按要求安装.安装成功后打开cmd输入Python,如果出现以下提示,证明安装成功. 记得要添加变量环境.如果忘记勾选可以点击[计算机]右键选择[属性] 选择[高级系 ...

  4. 平板电脑安装软件_概述嵌入式工业平板电脑的安装方法和注意事项!

    嵌入式安装是工业平板电脑以及工业显示器这一类的设备的一种安装方式,这种安装方式更节省空间,也更加美观,那么,关于嵌入式工业平板电脑的安装有哪些需要注意的呢? 一.嵌入式工业平板电脑安装 1.先把嵌入式 ...

  5. python插件安装方法_【NUKE教程】Nuke Python 安装插件

    有好几种安装插件,gizmos, python脚本的方法. 最简单的就是用home目录的 ~/.nuke目录,其在nuke第一次启动时创建.但在多用户 环境下不太灵活.因此,自定义的plug-in路径 ...

  6. ipython和python是不是同一个软件_为什么SciPy在IPython和Python中的行为有很大不同?...

    我写了这个测试脚本:import numpy as np import scipy.linalg n = 130 r = np.array(np.random.normal(size=(n, n)), ...

  7. python控制其它软件_从另一个脚本控制python脚本

    我正在尝试学习如何编写一个脚本control.py,它在循环中运行另一个脚本test.py一定次数,在每次运行中,读取其输出并在打印某些预定义输出时暂停它(例如文本'现在停止'),并且循环继续其迭代( ...

  8. python软件安装步骤-初学者python详细安装步骤_编程工具

    前言: 随着人工智能的快速发展,python语言越来越受大家的欢迎,目前Python官网已经更新到了最新版Python 3.7.2,这里详细介绍python安装,希望会对大家有所帮助,欢迎留言提问. ...

  9. 软件_手把手教vscode配置c++,python开发环境

    原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...

最新文章

  1. python3安装setuptools步骤_setuptools、pip的安装
  2. python 基础笔记十一 - random模块
  3. 硬核艿艿,新鲜出炉,直接带你弄懂 Spring Boot Jar 启动原理!
  4. 【Rain in ACStar HDU-3340】
  5. Android 4.0 Launcher源码分析系列(二)
  6. Python练习:快乐的数字
  7. TTL电平与CMOS电平
  8. vue.js+webpack 为 img src 赋值的路径问题解决方法
  9. 如何让pm2支持es6
  10. Ceph FINDING AN OBJECT LOCATION
  11. android矢量地图画法_Android 我们的矢量地图,放大不失真
  12. healthkit简介
  13. 弹幕助手连接不到服务器,小葫芦obs弹幕助手怎么用 OBS弹幕助手使用教程
  14. Eclipse中将package,folder,source folder相互转换
  15. Python版按键精灵基础代码
  16. DllPlugin动态链接库插件
  17. 炫 音乐可视化 html5 在线,HTML5打造的炫酷本地音乐播放器-喵喵Player
  18. linux下开启、关闭、重启mysql服务命令
  19. 堆栈~堆栈~是堆还是栈?
  20. 举个栗子!Tableau 技巧(197):用 Prep 数据去重的三种场景

热门文章

  1. LENOVO服务器批量升级BMC固件
  2. 实习生风采 · 贰 | 张倬胜同学:攻关「孟子」轻量化预训练模型
  3. Arduino控制PCF8574
  4. Android必知必会-Stetho调试工具
  5. matplotlib给某一个点添加注释
  6. Java实现调用摄像头拍照
  7. android 官方bootloader,安卓系统bootloader模式是什么?如何进入bootloader模式
  8. 【202203-4】通信管理系统
  9. AFNetworking(v3.0+)框架学习总结(三框架基本使用)
  10. 安全产品的核心逻辑-杀毒软件