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/
赞赏
微信赞赏
支付宝赞赏
发表评论