首先聲明一下:該點子非本人原創,我只是用它在Mac OS X上給出了實現。
需要三個檔案,被發布在本人的GitHub上,有需要或想瞭解的請自行參考。
簡單介紹下三個檔案分別的作用:
pcMonitor.py--Python程式檔案,用於實現開機監控以及強制關機的處理邏輯
com.yanghua.pcMonitorService.plist--Apple Mac OS X對於想要開機啟動程式的描述檔案。(在windows 上可能稱之為開機啟動計劃)
pcMonitorService.sh--在com.yanghua.pcMonitorService.plist中描述的,需要被直接執行的程式。(系統開機自執行程式不支援直接執行Python指令碼,所以通過執行執行該sh指令碼,在該sh指令碼中間接執行pcMonitor.py指令碼)。
實現功能
(1)開機未登入 郵件自動提醒
(2)開機登陸後 郵件自動提醒
(3)回複提醒郵件以“shutdown”,則被開啟的Mac 機器會被強制關閉
無論是否串連互連網:
(4)支援開機後,以一定的頻率定時截取當前螢幕作為映像日誌
備忘:這些功能對於個人電腦常被借用、公用來說非常有用,便於個人對自己電腦的使用有即時瞭解。
原理簡介其實很簡單,想要在手機和電腦之間產生互動,需要兩個條件:(1)串連 這個只能依賴於互連網了(2)通訊 通訊離不開協議,這裡選擇的話,雙方都可識別的,並且操作簡便的,沒有比通過郵件來實現更好的選擇了。上面提到了,com.yanghua.pcMonitorService.plist該檔案用於使得該監控程式開機自動啟動,它會間接執行pcMonitor.py指令碼。該指令碼被執行之後,將開啟一個輪詢程式。如果碰巧,它開完機就自動連接上了互連網,那麼它將直接給你預留的郵箱中發送郵件,如果沒有,在你發送郵件就會產生程式異常,此處異常被直接吞噬,只返回Boolean標示,休眠一段時間,繼續發送,直到機器連網發送成功為止。為了達到即時的目的,你可能需要藉助手機的某些工具(比如在手機的中開啟QQ郵箱提醒功能,如果你沒有QQ郵箱,那麼其它郵件供應商很多也跟電訊廠商進行了合作支援了郵箱與手機號碼的綁定,這樣在收到郵件的時候就可以支援簡訊提醒)。至此發送結束,那麼下面會進入內送郵件的偵聽模式。當接收到標題為寄件提醒時發送的郵件標題(因為關機指令只需回複提醒郵件),並且郵件內容包含shutdown關鍵字的時候。將會執行關機命令:關鍵代碼:
if __name__ == '__main__': init() MAIL_TXT = "the computer has started %s" % time.strftime(' at %c') while True: if send_mail(MAIL_TITLE, MAIL_TXT): break else: 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
如何使其開機自動啟動?首先,需要編寫開機啟動程式的描述檔案。請參考:mac os 下設定開機自啟動服務檔案需要放到/Library/下(通過快速鍵:shift+Command+G):進入後,有兩個相關的檔案夾:主要相關的檔案夾就是這兩個,但有什麼區別呢?LaunchAgents--存放在開機並登陸之後才會執行的計劃任務LaunchDaemons--存放在開機之後就會執行的計劃任務註:這兩個檔案夾的區別,也是我上面“實現功能”中的(1)、(2)兩點的關鍵點,這就是取決於你將那個任務描述檔案放在哪個檔案夾內。你可以直接將com.yanghua.xxx.plist檔案直接拖放至兩個檔案夾的其中之一。因為該檔案夾其實是系統相關的檔案,所以需要授予其許可權,所以在你拖放過程中可能需要輸入密碼。或者,通過在Terminal中,通過cp命令來拷貝檔案:上面同時把其他的兩個檔案放到/usr/local/檔案夾下,他們同樣是系統相關檔案,需要你在命令前加上“sudo”,同時有可能會要求鍵入password。在操作某些系統層級相關的檔案夾中的檔案時,非超級管理使用者(root使用者)可能沒有執行許可權,而在我們的程式裡,我們程式的執行者其實就是當前登陸使用者(因為它在使用者登陸成功後,以其身份執行),而它肯定不是超級管理員。所以,必須為pcMonitorService.sh檔案授予“其他使用者可執行檔許可權”:至此,大部分任務都完成了,還有一個非常關鍵的問題。回複的郵件:shutdown,其實只是一個給監控程式執行關機指令的“關鍵字”,它在程式裡,卻會真正執行shutdown的shell命令。眾所周知,shutdown預設情況下只可以被root使用者執行,其他使用者是沒有許可權執行shutdown命令的。所以需要兩個步驟來給予其他使用者以shutdown命令的執行許可權:(1)編輯/sbin/shutdown進入之後,按“i”進入編輯狀態,修改最後一行:為:去掉最前面的#號,將users修改為你想執行監控指令碼的使用者名稱,比如:yanghua然後為shutdown設定suid:以上設定完成之後,基本上大功告成了!關於代碼,你還需要作一些修改,主要是關於pcMonitor中的,因為必須要你自己提供關於郵件地址相關的內容:
#TODO: change the e-mail address which you want to comunicate with monitorMAIL_LIST = ["XXXXXX@qq.com"]#TODO: change the smtp/pop3 server which will serve for the monitorMAIL_HOST = "smtp.exmail.qq.com"MAIL_POP = "pop.exmail.qq.com"#TODO: change the email-addr and pwd which the monitor will useMAIL_USER = "xxxx@qq.com"MAIL_PASS = "xxxxxxxxxx"MAIL_FROM = "xxxx@qq.com"
寫在最後由於很久不使用windows的原因(而且windows上也沒有安裝Python),所以只是給出了Mac OS X上的實現,其實該實現與所有Free BSD系統的實現都是類似的。只有開機啟動程式的實現方式不一樣。所以在其他平台只需讓該程式開機執行即可。你會告訴我?如果使用者不連網,是不是就沒有辦法了。就目前來看確實是必須要連網才能實現上面的功能,但該程式只要電腦被開啟就會不停地允許直到使用者關閉,或者連網,如果某人想做什麼操作,在未連網狀態下進行,而你想知道,你可以試圖擷取全域的鍵盤監聽事件、滑鼠監聽事件,甚至可以以一定頻率的截屏來作為日誌以進行儲存!等到連網時,這些日誌都將可以作為郵件自動發送給你(因為普通使用者根本不知道你的這些幕後行為)。最後,還是重申:不要惡意地使用你懂得的東西。否則後果自行負責!