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.pswp.cn/news/252206.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/252206.shtml
英文地址,請注明出處:http://en.pswp.cn/news/252206.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c#通過app.manifest使程序以管理員身份運行

通常我們使用c#編寫的程序不會彈出這個提示,也就無法以管理員身分運行。微軟的操作系統使用微軟的產品方法當然是有的,通過app.manifest配置可以使程序打開的時候,彈出UAC提示需要得到允許才可以繼續,這樣就獲得了管理員的權限來執…

Oracle 作業

Oracle 作業 dbms_job與 dbms_scheduler 用于安排和管理作業隊列,通過使用作業,可以使ORACLE數據庫定期執行特定的任務。 一. dbms_job 1.1. 創建 variable jobno number; begin dbms_job.submit(:jobno,proce_t;, sysdate, sysdate1/24/60); commit; end; / 1.2. 參數 Job 輸出…

企業級 Spring Boot 教程 (十四)用restTemplate消費服務

構架工程 創建一個springboot工程,去消費RESTFUL的服務。這個服務是 http: ///gturnquist-quoters.cfapps.io/api/random ,它會隨機返回Json字符串。 Spring Cloud大型企業分布式微服務云架構源碼請加一七九一七四三三八零 在Spring項目中,它…

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)堅持定時…

sql優化大全

1. 優化SQL步驟 1. 通過 show status和應用特點了解各種 SQL的執行頻率 通過 SHOW STATUS 可以提供服務器狀態信息,也可以使用 mysqladmin extende d-status 命令獲得。 SHOW STATUS 可以根據需要顯示 session 級別的統計結果和 global級別的統計結果。 如顯示當前s…

Halcon實現邊緣提取

一、邊緣提取 1、設置ROI興趣區域 2、快速二值化,并連接相鄰區域。 這樣做的目的是進一步減少目標區域,通過二值化將目標區域大概輪廓提取出來 3、提取最接近目標區域的輪廓 常用函數有boundary,gen_contour_region_xld 4、根據自己的需求提取…

軟件工程網絡15個人閱讀作業1 201521123038 游舒婷

軟件工程網絡15個人閱讀作業1 201521123038 游舒婷 1.博客園地址 sakurai3104 2.碼云地址 sakurai3104 3.閱讀與思考 (1)回想一下你初入大學時對網絡工程專業的暢想 當初你是如何做出選擇網絡工程專業的決定的? 填報志愿的時候,大…

18LaTeX學習系列之---LaTeX的參考文獻

目錄 目錄前言(一)簡單的參考文獻1.說明2.源代碼3.輸出效果(二)以文件管理的方式1.說明:2.源代碼:3.輸出效果(三)直接從源網站獲取1.說明2.操作目錄 本系列是有關LaTeX的…

Vue 2.0 v-for 響應式key, index及item.id參數對v-bind:key值造成差異研究

Vue 2.0 v-for 響應式key, index及item.id參數對v-bind:key值造成差異研究 在github上閱覽README.md以獲得最佳閱讀體驗,點這里 v-for響應式key, index及item.id參數對v-bind:key值造成差異研究 實驗背景 通常情況下,我們渲染一個li列表,采用…

halcon edges_sub_pix算子

轉載http://blog.51cto.com/juwen/133003 介紹一下Canny算子: 使用累計直方圖計算兩個閥值。凡是大于高閥值的一定是邊緣; 凡是小于低閥值的一定不是邊緣;如果檢測結果大于低閥值但又小于高閥值,那就要看這個像素的鄰接像素中有…

Python 基礎(常用數據結構)

常用數據結構 1)元組 元組是一種靜態的數據結構,無法修改,若要修改只能重新生成新的元組。 輸出結果: 元組元素的獲取是通過索引值去獲得的;例如上面的tup1[0]返回apple;另外你可以直接把tup1一次性賦給多個…

Java IO(二)——RandomAccessFile

一、RandomAccessFile RandomAccessFile類可以說是Java語言中功能最為豐富的文件訪問類,它提供了眾多的文件訪問方法。RandomAccessFile類支持"隨機訪問"方式,可以跳轉到文件的任意位置處讀寫數據。要訪問一個文件的時候,不想把文件…

halcon select_shape_xld按區域大小描繪xld

常用與對xld進行以面積、長、寬進行XLD的選擇操作。 select_shape_xld(XLD : SelectedXLD : Features, Operation, Min, Max : ) XLD:需要選擇的xld SelectedXLD:選擇后的xld Features:面積、長、高等 Operation:and、or等 Min:最小值門…

工業三防手持終端如何選

物聯宇手持終端作為工業級的數據采集器,目前[]()已廣泛應用在物流快遞、生產制造、零售、醫療、公共事業等領域。由于工業環境的復雜性,手持終端在惡劣的環境下作業,在性能、穩定性、電池耐用性上的要求都較高,同時還必須采用一些…

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) 中。 這個檔案庫很像一個普通的文件服務器, 不過它會記住每一次文件的變動。 這樣你就可以把檔案恢復到舊的版本, 或是瀏…

halcon邊緣提取和檢測常用方法

轉自:http://blog.csdn.net/Bob_qiuxu/article/details/46924969 一、邊緣提取 1、設置ROI興趣區域 2、快速二值化,并連接相鄰區域。 這樣做的目的是進一步減少目標區域,通過二值化將目標區域大概輪廓提取出來 3、提取最接近目標區域的輪廓…

oracle sqlplus常用命令

轉自:https://www.cnblogs.com/wdx8927304/p/7927613.html 一、sys用戶和system用戶Oracle安裝會自動的生成sys用戶和system用戶(1)、sys用戶是超級用戶,具有最高權限,具有sysdba角色,有create database的權限,該用戶默…