手头有台电脑装的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 jsonimport osimport time#获取远程json内容并解析import requestsurl ='http://frp.ranjuan.cn/main.php'# 使用win32comimport win32comopen = Falsedef 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 Trueelse:return Falsedef open_frp(open):if open ==1:if proc_exist('frpc.exe'):#continuepasselse:#启动程序/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 =Trueelse:if open == True:open_frp(0)open =Falseexcept:print('服务异常,结束进程')requests.get(url+"?result=server error & server stop")os.system('TASKKILL /F /IM frpc.exe')# 启动程序/ 结束程序
远程服务器的main.php代码就很简单了,可以实现简单的日志记录功能,以及明文的接口json数据返回:
<?phpif(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程序写成服务的方式,这个问题目前还没彻底解决。
发表评论