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/

赞赏

微信赞赏支付宝赞赏

发表评论