Python黑科技:在家远程遥控公司电脑,python+微信一键连接!
有時(shí)候需要遠(yuǎn)程家里的臺(tái)式機(jī)使用,因?yàn)槲移綍r(shí)都是用 MAC 多,但是遠(yuǎn)程喚醒只能針對局域網(wǎng),比較麻煩,于是我想用微信實(shí)現(xiàn)遠(yuǎn)程喚醒機(jī)器。
*注意:全文代碼可左右滑動(dòng)查看
準(zhǔn)備工作
本程序主要是實(shí)現(xiàn)遠(yuǎn)程管理 Windows10操作系統(tǒng)的開機(jī)和關(guān)機(jī):
在 Windows機(jī)器的相同內(nèi)網(wǎng)中放一個(gè) Linux 主機(jī),我這里用樹莓派代替,如果你是用 OpenWrt 之類的路由器也可以。
Linux 主機(jī)需要能夠遠(yuǎn)程訪問,我這里是有 FRP 將樹莓派的端口映射到我的公網(wǎng) Linux 主機(jī)上。所以可以隨時(shí)遠(yuǎn)程 SSH 過去。
Windows 機(jī)器的網(wǎng)卡必須是有線連接,支持網(wǎng)絡(luò)喚醒功能。
開機(jī)實(shí)現(xiàn)思路
首先通過微信發(fā)送開機(jī)指令,這里我使用的是 itchat 程序會(huì)調(diào)用 Paramiko 庫去 SSH 遠(yuǎn)程到內(nèi)網(wǎng)的樹莓派執(zhí)行 WakeOnLan 命令去喚醒 Windows 主機(jī)。
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
程序會(huì)通過 ICMP 協(xié)議, ping 下需要喚醒的目標(biāo)主機(jī)然后進(jìn)行過濾,一個(gè)正常的 ICMP 包是64字節(jié),過濾打印出這個(gè)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 呢?
因?yàn)橛锌赡軙?huì)出現(xiàn)2行,經(jīng)過測試,我們只需要取64這個(gè)值就可以了:
ping 192.168.1.182-c 1 | grep 64 | cut -d "" -f 1|head -n 1
如果有則表示開機(jī)成功已經(jīng)聯(lián)網(wǎng)了,返回開機(jī)成功,否則程序繼續(xù)往下走,去喚醒,然后在 ping 一次確認(rèn)是否開機(jī),如果為是則返回開機(jī)成功,否則返回失敗。程序執(zhí)行成功后,在我的網(wǎng)站根目錄創(chuàng)建一個(gè) shutdown 文件,用于后面的關(guān)機(jī)操作:
@!/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'開機(jī)':
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)
關(guān)機(jī)部分實(shí)現(xiàn)
當(dāng)接收關(guān)機(jī)指令時(shí),程序會(huì)去刪除網(wǎng)站根目錄的 shutdown 文件,客戶端我寫了幾行代碼,去通過 Requests 庫每隔30s 發(fā)送 HTTP head 請求去判斷文件是否是404,如果是404 這說明文件不存在,調(diào)用系統(tǒng)關(guān)機(jī)操作,執(zhí)行關(guān)機(jī)。
然后 SSH 到樹莓派去 ping 目標(biāo)主機(jī),如果返回為空,則說明關(guān)機(jī)成功,否則關(guān)機(jī)失敗。這只是針對 Windows 的關(guān)機(jī),如果目標(biāo)主機(jī)是 Linux 則簡單多了:
if msg['Text'] == u'關(guān)機(jī)':
#刪除網(wǎng)站根目錄的shutdown 文件
rmfile = os.system('rm -rf //www/shutdown')
if rmfile == 0:
print '執(zhí)行關(guān)機(jī)消息成功'
shutdown_time = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
itchat.send(shutdown_time+u'正在關(guān)機(jī)...',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)
itchat.auto_login(hotReload=True,enobleCmdQR=2)
itchat.run()
客戶端代碼,寫完扔計(jì)劃任務(wù),開機(jī)啟動(dòng):
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 連接:
缺點(diǎn)
網(wǎng)頁端微信必須一直登錄,不方便,這個(gè)就需要微信不能斷網(wǎng)了。
WakeOnLan 是廣播 MAC 地址的,貌似不能返回是否成功沒,所以還是要 ping 主機(jī)看看通不通,判斷下。
需要一個(gè)樹莓派做跳板機(jī),否則也不能喚醒內(nèi)網(wǎng)設(shè)備。
如果只允許自己控制最好是使用文件助手來發(fā)送消息,因?yàn)槟J(rèn)情況下,任何人都可以給你發(fā)送指令開機(jī)。
Windows需要安裝TeamViewer并且設(shè)置為開機(jī)自動(dòng)啟動(dòng)以及綁定賬號(hào)設(shè)置無人值守模式。這樣方便遠(yuǎn)程,如果是Linux 則不需要開啟 ssh 就可以了。
最后,如果你跟我一樣都喜歡python,也在學(xué)習(xí)python的道路上奔跑,歡迎你加入python學(xué)習(xí)群:839383765 群內(nèi)每天都會(huì)分享最新業(yè)內(nèi)資料,分享python免費(fèi)課程,共同交流學(xué)習(xí),讓學(xué)習(xí)變(編)成(程)一種習(xí)慣!
轉(zhuǎn)載于:https://blog.51cto.com/14186420/2359302
總結(jié)
以上是生活随笔為你收集整理的Python黑科技:在家远程遥控公司电脑,python+微信一键连接!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac下加速下载百度云资源
- 下一篇: python 创建类_python 用t