Python实现对电脑的全程监控
首先聲明一下:該點(diǎn)子非本人原創(chuàng),我只是用它在Mac OS X上給出了實(shí)現(xiàn)。
需要三個(gè)文件,被發(fā)布在本人的GitHub上,有需要或想了解的請(qǐng)自行參考。
簡(jiǎn)單介紹下三個(gè)文件分別的作用:
pcMonitor.py--Python程序文件,用于實(shí)現(xiàn)開(kāi)機(jī)監(jiān)控以及強(qiáng)制關(guān)機(jī)的處理邏輯
com.yanghua.pcMonitorService.plist--Apple Mac OS X對(duì)于想要開(kāi)機(jī)啟動(dòng)程序的描述文件。(在windows 上可能稱之為開(kāi)機(jī)啟動(dòng)計(jì)劃)
pcMonitorService.sh--在com.yanghua.pcMonitorService.plist中描述的,需要被直接執(zhí)行的程序。(系統(tǒng)開(kāi)機(jī)自執(zhí)行程序不支持直接執(zhí)行Python腳本,所以通過(guò)執(zhí)行執(zhí)行該sh腳本,在該sh腳本中間接執(zhí)行pcMonitor.py腳本)。
實(shí)現(xiàn)功能
(1)開(kāi)機(jī)未登錄 郵件自動(dòng)提醒
(2)開(kāi)機(jī)登陸后 郵件自動(dòng)提醒
(3)回復(fù)提醒郵件以“shutdown”,則被開(kāi)啟的Mac 機(jī)器會(huì)被強(qiáng)制關(guān)閉
無(wú)論是否連接互聯(lián)網(wǎng):
(4)支持開(kāi)機(jī)后,以一定的頻率定時(shí)截取當(dāng)前屏幕作為圖像日志
備注:這些功能對(duì)于個(gè)人電腦常被借用、公用來(lái)說(shuō)非常有用,便于個(gè)人對(duì)自己電腦的使用有即時(shí)了解。
原理簡(jiǎn)介
其實(shí)很簡(jiǎn)單,想要在手機(jī)和電腦之間產(chǎn)生交互,需要兩個(gè)條件: (1)連接 ?這個(gè)只能依賴于互聯(lián)網(wǎng)了 (2)通信 通信離不開(kāi)協(xié)議,這里選擇的話,雙方都可識(shí)別的,并且操作簡(jiǎn)便的,沒(méi)有比通過(guò)郵件來(lái)實(shí)現(xiàn)更好的選擇了。 上面提到了,com.yanghua.pcMonitorService.plist該文件用于使得該監(jiān)控程序開(kāi)機(jī)自動(dòng)啟動(dòng),它會(huì)間接執(zhí)行pcMonitor.py腳本。該腳本被執(zhí)行之后,將開(kāi)啟一個(gè)輪詢程序。如果碰巧,它開(kāi)完機(jī)就自動(dòng)連接上了互聯(lián)網(wǎng),那么它將直接給你預(yù)留的郵箱中發(fā)送郵件,如果沒(méi)有,在你發(fā)送郵件就會(huì)產(chǎn)生程序異常,此處異常被直接吞噬,只返回Boolean標(biāo)示,休眠一段時(shí)間,繼續(xù)發(fā)送,直到機(jī)器聯(lián)網(wǎng)發(fā)送成功為止。為了達(dá)到即時(shí)的目的,你可能需要借助手機(jī)的某些工具(比如在手機(jī)的微信中開(kāi)啟QQ郵箱提醒功能,如果你沒(méi)有QQ郵箱,那么其它郵件提供商很多也跟運(yùn)營(yíng)商進(jìn)行了合作支持了郵箱與手機(jī)號(hào)碼的綁定,這樣在收到郵件的時(shí)候就可以支持短信提醒)。 至此發(fā)送結(jié)束,那么下面會(huì)進(jìn)入接收郵件的偵聽(tīng)模式。當(dāng)接收到標(biāo)題為郵件提醒時(shí)發(fā)送的郵件標(biāo)題(因?yàn)殛P(guān)機(jī)指令只需回復(fù)提醒郵件),并且郵件內(nèi)容包含shutdown關(guān)鍵字的時(shí)候。將會(huì)執(zhí)行關(guān)機(jī)命令: 關(guān)鍵代碼: if __name__ == '__main__':init()MAIL_TXT = "the computer has started %s" % time.strftime(' at %c')while True:if send_mail(MAIL_TITLE, MAIL_TXT):breakelse:time.sleep(60)while True:shutdown=receive_mail()if shutdown:shutdown_cmd ="shutdown -h now"print(shutdown_cmd)process=subprocess.Popen(shutdown_cmd, shell=True, universal_newlines=True, stdout=subprocess.PIPE)process.wait()else:print("sleep")time.sleep(60) #sleep 60s如何使其開(kāi)機(jī)自動(dòng)啟動(dòng)?
首先,需要編寫(xiě)開(kāi)機(jī)啟動(dòng)程序的描述文件。 請(qǐng)參考: mac os 下設(shè)置開(kāi)機(jī)自啟動(dòng)服務(wù) 文件需要放到/Library/下(通過(guò)快捷鍵:shift+Command+G):進(jìn)入后,有兩個(gè)相關(guān)的文件夾:
主要相關(guān)的文件夾就是這兩個(gè),但有什么區(qū)別呢? LaunchAgents--存放在開(kāi)機(jī)并登陸之后才會(huì)執(zhí)行的計(jì)劃任務(wù) LaunchDaemons--存放在開(kāi)機(jī)之后就會(huì)執(zhí)行的計(jì)劃任務(wù) 注:這兩個(gè)文件夾的區(qū)別,也是我上面“實(shí)現(xiàn)功能”中的(1)、(2)兩點(diǎn)的關(guān)鍵點(diǎn),這就是取決于你將那個(gè)任務(wù)描述文件放在哪個(gè)文件夾內(nèi)。 你可以直接將com.yanghua.xxx.plist文件直接拖放至兩個(gè)文件夾的其中之一。因?yàn)樵撐募A其實(shí)是系統(tǒng)相關(guān)的文件,所以需要授予其權(quán)限,所以在你拖放過(guò)程中可能需要輸入密碼。 或者,通過(guò)在Terminal中,通過(guò)cp命令來(lái)拷貝文件:
上面同時(shí)把其他的兩個(gè)文件放到/usr/local/文件夾下,他們同樣是系統(tǒng)相關(guān)文件,需要你在命令前加上“sudo”,同時(shí)有可能會(huì)要求鍵入password。 在操作某些系統(tǒng)級(jí)別相關(guān)的文件夾中的文件時(shí),非超級(jí)管理員用戶(root用戶)可能沒(méi)有執(zhí)行權(quán)限,而在我們的程序里,我們程序的執(zhí)行者其實(shí)就是當(dāng)前登陸用戶(因?yàn)樗谟脩舻顷懗晒?#xff0c;以其身份執(zhí)行),而它肯定不是超級(jí)管理員。所以,必須為pcMonitorService.sh文件授予“其他用戶可執(zhí)行的權(quán)限”:
至此,大部分任務(wù)都完成了,還有一個(gè)非常關(guān)鍵的問(wèn)題。回復(fù)的郵件:shutdown,其實(shí)只是一個(gè)給監(jiān)控程序執(zhí)行關(guān)機(jī)指令的“關(guān)鍵字”,它在程序里,卻會(huì)真正執(zhí)行shutdown的shell命令。眾所周知,shutdown默認(rèn)情況下只可以被root用戶執(zhí)行,其他用戶是沒(méi)有權(quán)限執(zhí)行shutdown命令的。 所以需要兩個(gè)步驟來(lái)給予其他用戶以shutdown命令的執(zhí)行權(quán)限: (1)修改sudoers文件,執(zhí)行命令sudo visudo
進(jìn)入之后,按“i”進(jìn)入編輯狀態(tài),修改最后一行:
為: 去掉最前面的#號(hào),將users修改為你想執(zhí)行監(jiān)控腳本的用戶名,比如:yanghua 然后為shutdown設(shè)置suid:
以上設(shè)置完成之后,基本上大功告成了! 關(guān)于代碼,你還需要作一些修改,主要是關(guān)于pcMonitor中的,因?yàn)楸仨氁阕约禾峁╆P(guān)于郵件地址相關(guān)的內(nèi)容: #TODO: change the e-mail address which you want to comunicate with monitor MAIL_LIST = ["XXXXXX@qq.com"]#TODO: change the smtp/pop3 server which will serve for the monitor MAIL_HOST = "smtp.exmail.qq.com" MAIL_POP = "pop.exmail.qq.com"#TODO: change the email-addr and pwd which the monitor will use MAIL_USER = "xxxx@qq.com" MAIL_PASS = "xxxxxxxxxx" MAIL_FROM = "xxxx@qq.com"
寫(xiě)在最后
由于很久不使用windows的原因(而且windows上也沒(méi)有安裝Python),所以只是給出了Mac OS X上的實(shí)現(xiàn),其實(shí)該實(shí)現(xiàn)與所有Free BSD系統(tǒng)的實(shí)現(xiàn)都是類似的。只有開(kāi)機(jī)啟動(dòng)程序的實(shí)現(xiàn)方式不一樣。所以在其他平臺(tái)只需讓該程序開(kāi)機(jī)執(zhí)行即可。 你會(huì)告訴我?如果用戶不聯(lián)網(wǎng),是不是就沒(méi)有辦法了。就目前來(lái)看確實(shí)是必須要聯(lián)網(wǎng)才能實(shí)現(xiàn)上面的功能,但該程序只要電腦被開(kāi)啟就會(huì)不停地允許直到用戶關(guān)閉,或者聯(lián)網(wǎng),如果某人想做什么操作,在未聯(lián)網(wǎng)狀態(tài)下進(jìn)行,而你想知道,你可以試圖獲取全局的鍵盤(pán)監(jiān)聽(tīng)事件、鼠標(biāo)監(jiān)聽(tīng)事件,甚至可以以一定頻率的截屏來(lái)作為日志以進(jìn)行保存!等到聯(lián)網(wǎng)時(shí),這些日志都將可以作為郵件自動(dòng)發(fā)送給你(因?yàn)槠胀ㄓ脩舾静恢滥愕倪@些幕后行為)。 最后,還是重申:不要惡意地使用你懂得的東西。否則后果自行負(fù)責(zé)!總結(jié)
以上是生活随笔為你收集整理的Python实现对电脑的全程监控的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PDF时间戳数字签名
- 下一篇: unity3D埃及探险游戏源码,支持安卓