python监听windows程序进程并响应http接口参数动作
手头有台电脑装的win2008系统开了远程桌面,一直是使用frp做内网穿透来实现远程访问的,frp服务需要在一台有公网ip的服务器上搭建,可以参考我之前的教程。
但是最近查看系统日志总是发现有人每天24小时都在不断的尝试远程登录,天天登录错误日志一大堆,虽然我把密码改的很复杂了,但是不怕贼偷就怕贼惦记,想着在有需要的情况下再让win2008开启frp客户端进程,没有需要就关闭,减少暴露的风险。初步的想法是用python写一个进程每个几秒去获取远程服务器url的返回参数,如果open=1则启动frp客户端,如果open=0则关闭frp客户端。
下面直接贴程序(python程序会监听frp程序进程,防止在open=1的时候即使结束frp客户端进程也会自动再次启动,因为frp是运行在dos下的程序,所以不能直接运行,所以在下面代码中你会看到运行的是个bat文件):
# 每隔10秒从指定地址获取参数, 如果为1则启动frp(启动前会判断本地是否已启动frpc.exe),如果为0则结束frp进程 #当接口发生异常时客户端会结束frp进程,接口恢复后按获取参数配置启动/关闭frp进程 #客户端每次变更状态时会请求服务器,由服务器写入log日志 import json import os import time #获取远程json内容并解析 import requests url ='http://frp.ranjuan.cn/main.php' # 使用win32com import win32com open = False def proc_exist(process_name): str = 'tasklist /FI "IMAGENAME eq '+process_name+'"' if process_name in os.popen(str).read(): # if 'frpc' in os.popen('tasklist /FI "IMAGENAME eq frpc.exe"').read(): #os.system('TASKKILL /F /IM frpc.exe') return True else: return False def open_frp(open): if open ==1: if proc_exist('frpc.exe'): #continue pass else: #启动程序/ print('开始启动frp') exe_file =r'cd C:\Users\Administrator\Desktop\frp && frpc.exe' #exe_file =r'cmd.exe C:\Users\Administrator\Desktop\frp\frpc.exe' exe_file =r'cd C:\Users\Administrator\Desktop\frp && start.bat' r_v = os.system(exe_file) print (r_v ) print('启动成功!') requests.get(url+"?result=server start") else: if proc_exist("frpc.exe"): os.system('TASKKILL /F /IM frpc.exe') print('结束进程!') requests.get(url+"?result=server stop") else: print('不存在') os.system('TASKKILL /F /IM frpc.exe') requests.get(url+"?result=client process start") while True: time.sleep(10) try: r = requests.get(url) #json格式 json_response = r.content.decode() print(json_response) #json 转字典 dict_json = json.loads(json_response) #print(dict_json[0]['name']) #print('---------------------------') if dict_json[0]['name']=='win2008' and dict_json[0]['open']==1: #print('开启frp') open_frp(1) if open ==False: #open_frp(1) open =True else: if open == True: open_frp(0) open =False except: print('服务异常,结束进程') requests.get(url+"?result=server error & server stop") os.system('TASKKILL /F /IM frpc.exe') # 启动程序/ 结束程序
远程服务器的main.php代码就很简单了,可以实现简单的日志记录功能,以及明文的接口json数据返回:
<?php if(isset($_GET['result'])){//记录日志 $txt = date("Y-m-d H:i:s").' | '.ip().' | '.$_GET['result']."rn"; file_put_contents('log.txt',$txt,FILE_APPEND); }else{ $res[0]['name']='win2008'; $res[0]['open']=1;//是否开启端口映射 1=开启,0=关闭; echo json_encode($res); } function ip() { //strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } $res = preg_match ( '/[d.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; return $res; //dump(phpinfo());//所有PHP配置信息 }
遇到的问题:
在使用这个python脚本的过程中无论是直接运行.py文件还是将其编译成exe运行都出现了程序退出的现象。正常情况下打开程序运行几个小时没有一点问题,但是一旦将系统锁定(已经关闭了系统休眠)过一段时间程序就莫名结束了进程,如果不锁屏貌似没什么问题。可能需要将次python程序写成服务的方式,这个问题目前还没彻底解决。
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/python-monitor-thread-action/
赞赏
微信赞赏支付宝赞赏
发表评论