首先声明一下:该点子非本人原创,我只是用它在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)修改sudoers文件,执行命令sudo visudo
进入之后,按“i”进入编辑状态,修改最后一行:
为:
去掉最前面的#号,将users修改为你想执行监控脚本的用户名,比如:yanghua
然后为shutdown设置suid:
以上设置完成之后,基本上大功告成了!
关于代码,你还需要作一些修改,主要是关于pcMonitor中的,因为必须要你自己提供关于邮件地址相关的内容:
#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"
写在最后
由于很久不使用windows的原因(而且windows上也没有安装Python),所以只是给出了Mac OS X上的实现,其实该实现与所有Free BSD系统的实现都是类似的。只有开机启动程序的实现方式不一样。所以在其他平台只需让该程序开机执行即可。
你会告诉我?如果用户不联网,是不是就没有办法了。就目前来看确实是必须要联网才能实现上面的功能,但该程序只要电脑被开启就会不停地允许直到用户关闭,或者联网,如果某人想做什么操作,在未联网状态下进行,而你想知道,你可以试图获取全局的键盘监听事件、鼠标监听事件,甚至可以以一定频率的截屏来作为日志以进行保存!等到联网时,这些日志都将可以作为邮件自动发送给你(因为普通用户根本不知道你的这些幕后行为)。
最后,还是重申:不要恶意地使用你懂得的东西。否则后果自行负责!