Python很慢？这十个方法让你的代码执行速度提升3倍！
前言Python，作为一种动态类型的解释性语言，确实在执行速度上可能不如C这样的静态类型的编译语言。但是，通过一些技巧和策略，我们可以显著提升Python代码的性能。本文将探讨如何通过优化方法使Python代码运行得更快、更高效。我们将利用Python的timeit模块来精确测量代码的执行时间。注意：timeit模块在默认情况下会重复执行代码一百万次，以确保测量结果的准确性和稳定性def print_hi(name): print(f'Hi, {name}') if __name__ == '__main__': # 执行print_hi('PyCharm')方法 t = timeit.Timer(setup='from __main__ import print_hi', stmt='print_hi("PyCharm")') t.timeit()如何计算Python脚本的运行时间呢？在time模块中time.perf_counter()提供了一个高精度的计时器，适合测量短时间，例如import time # 记录程序开始时间 start_time = time.perf_counter() # 你的代码逻辑 # ... # 记录程序结束时间 end_time = time.perf_counter() # 计算程序运行时间 run_time = end_time - start_time print(f"程序运行时间：{run_time} 秒")介绍一、I/O密集型操作I/O密集型操作（Input/Output Intensive Operation）指的是那些在执行过程中，大部分时间都花在等待输入/输出操作完成的程序或任务。I/O操作包括从磁盘读取数据、写入数据到磁盘、网络通信等。这些操作通常涉及到硬件设备，因此它们的执行速度受到硬件性能和I/O带宽的限制。他们的特点有：\1. 等待时间：程序在执行I/O操作时，往往需要等待数据从外部设备传输到内存，或从内存传输到外部设备，这会导致程序的执行被阻塞。\2. CPU利用效率：由于I/O操作的等待时间，CPU在这段时间内可能处于空闲状态，导致CPU利用率不高。\3. 性能瓶颈：I/O操作的速度往往成为程序性能的瓶颈，尤其是在数据量大或传输速度慢的情况下。例如，使用I/O密集型操作print，运行一百万次import time import timeit def print_hi(name): print(f'Hi, {name}') return if __name__ == '__main__': start_time = time.perf_counter() # 执行print_hi('PyCharm')方法 t = timeit.Timer(setup='from __main__ import print_hi', stmt='print_hi("PyCharm")') t.timeit() end_time = time.perf_counter() run_time = end_time - start_time print(f"程序运行时间：{run_time} 秒")运行结果为3s而不使用i/o操作执行一个方法，即调用这个print_hi('xxxx')空方法，不使用print()，程序明显快了不少def print_hi(name): # print(f'Hi, {name}') return如果代码中必要的时候，例如文件读写，可以使用如下方法提高效率异步I/O：使用异步编程模式例如asyncio，允许程序在等待I/O操作完成时继续执行其他任务，从而提高CPU利用率。缓冲：使用缓冲区暂存数据，减少I/O操作的频率。并行处理：并行执行多个I/O操作，以提高整体的数据处理速度。优化数据结构：选择合适的数据结构，减少数据的读取和写入次数。二、使用生成器生成列表、字典在Python 2.7及其后续版本中，引入了对列表、字典和集合生成器的改进，这些改进让数据结构的构建过程更加简明和高效。1、传统方法def fun1(): list=[] for i in range(100): list.append(i) if __name__ == '__main__': start_time = time.perf_counter() t = timeit.Timer(setup='from __main__ import fun1', stmt='fun1()') t.timeit() end_time = time.perf_counter() run_time = end_time - start_time print(f"程序运行时间：{run_time} 秒") # 输出结果：程序运行时间：3.3872999000595883 秒2、使用生成器优化代码注：为了方便以下内容皆省略主函数main的代码部分def fun1(): list=[ i for i in range(100)] # 程序运行时间：2.1053185999626294 秒从上述的推导式程序中可以看出，除了理解更简洁、更容易阅读之外，它也更快。这使得此方法成为生成列表和循环的首选方法。三、避免字符串连接，使用join()join() 是一个字符串方法，在Python中用于将序列中的元素连接（或拼接）成一个字符串，通常使用特定的分隔符。他的优点通常为：\1. 效率高：join() 是连接字符串的高效方法，尤其是当处理大量字符串时，它通常比使用 + 操作符或 % 格式化更快，在连接大量字符串时，join() 方法通常比逐个连接更节省内存。\2. 简洁性：join() 使得代码更加简洁，避免了重复的字符串连接操作。\3. 灵活性：可以指定任何字符串作为分隔符，这为字符串拼接提供了极大的灵活性。\4. 广泛的用途：不仅可以用于字符串，还可以用于列表、元组等序列类型，只要元素可以被转换成字符串。举例：def fun1(): obj=['hellow','my','name','is','xiaoyu','!'] s="" for i in obj: s+=i # 程序运行时间：0.3610708999913186 秒使用 join() 来实现字符串拼接：def fun1(): obj=['hellow','my','name','is','xiaoyu','!'] "".join(obj) # 程序运行时间：0.18804279994219542 秒使用join()将函数的执行时间从0.36秒减少到0.18秒。四、使用Map代替循环在多数场景中，传统的for循环可以被更为高效的map()函数所替代。map()*是一个Python内置的*高阶函数，它能够将指定的函数应用于各种可迭代的数据结构，如列表、元组或字符串。使用map()的主要优势在于，它提供了一种更为简洁且高效的数据处理方式，避免了编写显式的循环代码。传统的循环方式：def fun1(): arr=["hello", "my", "name", "is", "xiaoyu", "!"] new = [] for i in arr: new.append(i) # 程序运行时间：0.31288250000216067 秒使用map()函数做相同的功能：def fun2(x): return x def fun1(): arr=["hello", "my", "name", "is", "xiaoyu", "!"] map(fun2,arr) # 程序运行时间：0.18387670000083745 秒对比之后，使用map()节省了将近一半的时间，大大提升了运行效率五、选择正确的数据结构选用恰当的数据结构对提升Python代码的执行效率至关重要。各类数据结构都针对特定操作进行了优化，合理选择能够加速数据的检索、添加和移除过程，进而增强程序的整体运行效能。例如，判断容器内的元素的时候，字典的查找效率高于列表，但是是在大量数据的情况下，少量数据恰恰相反# 使用少量数据进行测试 def fun1(): arr=["hello", "my", "name", "is", "xiaoyu", "!"] 'hello' in arr 'my' in arr # 程序运行时间：0.11527379998005927 秒 def fun1(): arr={"hello", "my", "name", "is", "xiaoyu", "!"} 'hello' in arr 'my' in arr # 程序运行时间：0.17057139997836202 秒 # 使用 numpy 进行随机生成100个整数 def fun1(): nums = {i for i in np.random.randint(100, size=100)} 1 in nums # 程序运行时间：14.48330469999928 秒 def fun1(): nums = {i for i in np.random.randint(100, size=100)} 1 in nums # 程序运行时间：13.411826699972153 秒看到了在少量数据的情况下list执行效率是要大于dict的，但是在大量数据的情况下，dict的效率大于list如果有频繁的新增、删除操作，新增、删除的元素数量又很多时，list的效率不高。此时，应该考虑使用collections.deque。collections.deque是双端队列，同时具备栈和队列的特性，能够在两端进行 O(1)复杂度的插入和删除操作。collections.deque的使用from collections import deque def fun1(): arr=deque()# 创建一个空的deque for i in range(1000000): arr.append(i) # 程序运行时间：0.05507110000002058 秒 def fun1(): arr=[] for i in range(1000000): arr.append(i) # 程序运行时间：0.06128990000001977 秒list的查找操作也非常耗时。当需要在list频繁查找某些元素，或频繁有序访问这些元素时，可以使用bisect维护list对象有序并在其中进行二分查找，提升查找的效率。六、避免不必要的函数调用在Python编程中，优化函数调用次数对于提升代码效率至关重要。过多的函数调用不仅增加了开销，还可能消耗额外的内存，从而拖慢程序的运行速度。为了提升性能，我们应尽量减少不必要的函数调用，并尝试将多个操作合并成一个，以此来减少执行时间和资源消耗。这样的优化策略有助于我们编写更高效、更快速的代码。七、避免不必要的import虽然Python的import语句相对较快，但每个import都会涉及到查找模块、执行模块代码（如果还没有被执行过）、并将模块对象放入到当前命名空间中。这些操作都需要一定的时间和内存。当你不必要地导入模块时，就会增加这些开销。八、避免使用全局变量import math size=10000 def fun1(): for i in range(size): for j in range(size): z = math.sqrt(i) + math.sqrt(j) # 程序运行时间：15.630933800013736 许多程序员刚开始会用 Python 语言写一些简单的脚本，当编写脚本时，通常习惯了直接将其写为全局变量，例如上面的代码。但是，由于全局变量和局部变量实现方式不同，定义在全局范围内的代码运行速度会比定义在函数中的慢不少。通过将脚本语句放入到函数中，通常可带来 15% - 30% 的速度提升。import math def fun1(): size = 10000 for i in range(size): for j in range(size): z = math.sqrt(i) + math.sqrt(j) # 程序运行时间：14.933845699997619 秒九、避免模块和函数属性访问import math # 不推荐写法 def fun2(size: int): result = [] for i in range(size): result.append(math.sqrt(i)) return result def fun1(): size = 10000 for _ in range(size): result = fun2(size) # 程序运行时间：10.154493000009097 秒每次使用.（属性访问操作符时）会触发特定的方法，如__getattribute__()和__getattr__()，这些方法会进行字典操作，因此会带来额外的时间开销。通过from import语句，可以消除属性访问。from math import sqrt # 推荐写法：用到哪个模块就导哪个模块 def fun2(size: int): result = [] for i in range(size): result.append(sqrt(i)) return result def fun1(): size = 10000 for _ in range(size): result = fun2(size) # 程序运行时间：8.960758000030182 秒十、减少内层for循环的计算import math def fun1(): size = 10000 sqrt = math.sqrt for x in range(size): for y in range(size): z = sqrt(x) + sqrt(y) # sqrt() 求非负实数的平方根 # 程序运行时间：14.267008299939334 秒在上面代码中sqrt(x)位于内测for循环，每次循环都会重新计算，增加不必要的时间开销import math def fun1(): size = 10000 sqrt = math.sqrt for x in range(size): sqrt_x=sqrt(x) # 在外层for循环进行计算 for y in range(size): z = sqrt_x + sqrt(y) # 程序运行时间：8.499037600005977 秒总结通过这些方法，我们可以有效地提高Python代码的性能，使其在处理复杂任务时更加快速和高效。记住，性能优化是一个持续的过程，需要根据具体情况不断调整和改进，python运行速度的优化方法不限于以上方法，还有很多，如有大佬路过，请多指教。
前言不知道为什么今天，我的DockerHub push的时候连接超时，只能本地演示了，不上传到自己的Dockerhub，如果你们有自己的加速源，当然也可以之际push到自己的DockerHub仓库。Web篇章web题，首先是需要按照常规逻辑写一个网页，这里就写一个带flag的简单网页，把flag放在源代码里，并注释掉。创建一个html文件，代码如下 签到 <?php echo "Do u want 2 sign?? "; ?> 我所使用的平台无需暴露端口，如有需要可以使用EXPOSE 80暴露80端口。接下来实现动态flag，还记得上面提到的flag.sh吗，先来看一下它的代码，同样相关解释写在注释里，正式使用记得删掉注释。#!/bin/sh #必需的东西没什么好讲的 sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.php #使用平台的动态flag替换 # index.php中的flag，这里我使用的平台为GZCTF，因此动态flag环境变量为$GZCTF_FLAG，其他平台一般为$FLAG export GZCTF_FLAG="" #这一句暂时不知道什么作用，但是要写着flag.sh文件完整内容#!/bin/sh sed -i "s/flag{testflag}/$GZCTF_FLAG/" /var/www/html/index.php export GZCTF_FLAG=""接下来编写Dockerfile，各语句解释就写在后面的注释里吧，正式编写请删掉注释。FROM CTFtraining/base_image_nginx_mysql_php_56 #web题Docker基础镜像，这里使用CTFtraing打包好 的，包含了基础的nginx，mysql，php环境，并且会自动运行flag.sh脚本(后面会提到)，本题使用php环境。 COPY src /var/www/html # 将你编写的网页源码复制到Docker容器中，这里为php网页，因此只需要 复制源码到/var/www/html就可以了，其他类型网页按照实际部署情况COPY到Docker中相应目录下就可以了 RUN mv /var/www/html/flag.sh / #把你源码中的flag.sh复制到根目录以便自动执行 && chmod +x /flag.sh #添加运行权限Dockerfile完整内容FROM CTFtraining/base_image_nginx_mysql_php_56 COPY src /var/www/html RUN mv /var/www/html/flag.sh / && chmod +x /flag.sh目录结构确保你已经Docker login，拥有自己的Docker账号使用build命令，构建本地的题目镜像，xiaoyuss为你的docker镜像名，可以参考我以前的文章，webtest为镜像名(自定义)，"."为版本号，代表latest，也可以自定义，不过拉取时记得加上版本号docker build -t name/webtest .接下来部署题目，类型记得选择动态容器，不同平台可能有所不同，这里以GZCTF为例。启动赛题flag随机生成成功PWN篇首先下载一个库，pwn题基本逻辑一般为利用栈溢出漏洞，打通后得到shell权限，因此把flag文件放在容器的根目录或其他目录下即可，为了安全，这里在ctf_xinetd基础上做出一些修改来进行pwn题的部署git clone https://github.com/Eadom/ctf_xinetd.git cd ctf_xinetd修改Dockerfile如下内容FROM ubuntu:16.04 RUN sed -i "s/http://archive.ubuntu.com/http://mirrors.tuna.tsinghua.edu.cn/g" /etc/apt/sources.list && apt-get update && apt-get -y dist-upgrade && apt-get install -y lib32z1 xinetd RUN useradd -m ctf WORKDIR /home/ctf RUN cp -R /lib* /home/ctf && cp -R /usr/lib* /home/ctf RUN mkdir /home/ctf/dev && mknod /home/ctf/dev/null c 1 3 && mknod /home/ctf/dev/zero c 1 5 && mknod /home/ctf/dev/random c 1 8 && mknod /home/ctf/dev/urandom c 1 9 && chmod 666 /home/ctf/dev/* RUN mkdir /home/ctf/bin && cp /bin/sh /home/ctf/bin && cp /bin/ls /home/ctf/bin && cp /bin/cat /home/ctf/bin COPY ./ctf.xinetd /etc/xinetd.d/ctf COPY ./flag.sh /flag.sh RUN echo "Blocked by ctf_xinetd" > /etc/banner_fail RUN chmod +x /flag.sh COPY ./bin/ /home/ctf/ RUN chown -R root:ctf /home/ctf && chmod -R 750 /home/ctf && chmod 740 /home/ctf/flag CMD ["/flag.sh"] EXPOSE 70修改后的ctf.xinetdservice ctf { disable = no socket_type = stream protocol = tcp wait = no user = root type = UNLISTED port = 70 bind = 0.0.0.0 server = /usr/sbin/chroot # replace helloworld to your program server_args = --userspec=1000:1000 /home/ctf ./pwn #pwn为二进制可执行文件的文件名 banner_fail = /etc/banner_fail # safety options per_source = 10 # the maximum instances of this service per source IP address rlimit_cpu = 20 # the maximum number of CPU seconds that the service may use #rlimit_as = 1024M # the Address Space resource limit for the service #access_times = 2:00-9:00 12:00-24:00 } 把"start.sh"改为"flag.sh"，以下为flag.sh的具体内容#!/bin/sh # Add your startup script #!/bin/sh sed -i "s/flag{pwntestflag}/$GZCTF_FLAG/" /home/ctf/flag export GZCTF_FLAG="" # DO NOT DELETE /etc/init.d/xinetd start; sleep infinity;然后修改flag的内容为flag{pwntestflag}这个变量，不然随机不成功打包到本地Docker仓库docker build -t xiaoyuss/pwntest .编辑题目的时候注意端口启动实例提交flag测试
前言GZCTF，一个开源的网络安全竞赛平台，它巧妙地融合了React.js前端技术和Django后端架构，为用户提供了一个通过实战演练提升安全技能的宝贵舞台。无论你是初学者、教育机构还是企业培训部门，GZCTF都能满足你的需求，其丰富的功能如权限控制、加密通信以及自定义赛事等，将带给你前所未有的使用体验。官方文档：https://docs.ctf.gzti.me/zh/quick-start操作系统：ubuntu-22.04.4（已重装）1、换源从0开始，换源vim /etc/apt/sources.list修改为如下内容deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse更新apt源：apt update2、安装Docker继去年Docker Hub被封锁后，各大NAS的注册表均出现问题，例如群晖的Docker套件注册表无法连接（更新至DSM7.2版本后恢复）。而在今年2024年6月初（约2024.06.06），NAS中最重要的工具Docker又面临无法使用的问题。常用镜像站：阿里云、科大、南大、上交等，全部挂掉。2.1更新系统软件包：sudo apt update2.2安装已经配置的镜像源最新版：apt install Docker-ce Docker-ce-cli containerd.io2.3换Docker源vim /etc/Docker/daemon.json修改为如下内容{ "registry-mirrors": [ "https://ustc-edu-cn.mirror.aliyuncs.com/", "https://ccr.ccs.tencentyun.com/", "https://docker.m.daocloud.io/", "https://dockerhub.azk8s.cn", "https://mirror.baidubce.com", "https://docker.nju.edu.cn", "https://mirror.iscas.ac.cn", "https://dockerhub.icu", "https://docker.anyhub.us.kg", "https://hub.gog.email", "https://dockerpull.com", "https://atomhub.openatom.cn" ] }添加好了之后，重启Docker服务sudo systemctl restart Docker 或者 sudo systemctl restart docker.service //如果一个命令不行就换上面一个查看docker信息docker info配置docker开机自启sudo systemctl restart docker 或者 systemctl enable docker.service //如果一个命令不行就换上面一个3. GZCTF的安装3.1 在当前文件夹下（就是你GZCTF靶场的配置目录），创建 appsettings.json：vim appsettings.json { "AllowedHosts": "*", "ConnectionStrings": { "Database": "Host=db:5432;Database=gzCTF;Username=postgres;Password=GzCTFAuto233", // 此处Password内容可以自定义（安全起见，至少包含数字及字母大小写） "RedisCache": "cache:6379,abortConnect=false" }, "EmailConfig": { // 邮件配置，用于找回密码之类的，这里就用163举例 "SendMailAddress": "demo@163.com", // 邮件发送者 "UserName": "demo@163.com", // SMTP用户名，就是你开启SMTP的邮箱 "Password": "SMTP_PASSWORD", // 你得STMP服务器密码，唯一， "Smtp": { "Host": "smtp.163.com", // 163邮箱的stmp服务器地址 "Port": 465 // stmp端口 } }, "XorKey": "GzCTFAuto233", // 此处XorKey可以自定义 "ContainerProvider": { "Type": "Docker", "PortMappingType": "Default", "EnableTrafficCapture": false, "PublicEntry": "XXX.XXX.XXX.XXX", // 域名或IP配置，用于容器生成,域名不带http/https "DockerConfig": { "SwarmMode": false, "Uri": "unix:///var/run/docker.sock" } }, "RequestLogging": false, "DisableRateLimit": true, "RegistryConfig": { "UserName": "DOCKER_USERNAME", "Password": "DOCKER_PASSWORD", "ServerAddress": "DOCKER_ADDRESS" }, "CaptchaConfig": { "Provider": "None", "SiteKey": "", "SecretKey": "", "GoogleRecaptcha": { "VerifyAPIAddress": "https://www.recaptcha.net/recaptcha/api/siteverify", "RecaptchaThreshold": "0.5" } }, "ForwardedOptions": { "ForwardedHeaders": 5, "ForwardLimit": 1, "ForwardedForHeaderName": "X-Forwarded-For", "TrustedNetworks": [ "0.0.0.0/0" ] } }3.2 在当前文件夹下，创建 docker-compose.yml：vim docker-compose.yml3.3 将以下内容保存为 docker-compose.yml 文件，并替换为你的初始化参数（注释需删除，保存后可能会报错）： version: "3.7" services: gzCTF: image: registry.cn-shanghai.aliyuncs.com/gztime/gzCTF:latest restart: always environment: - "GZCTF_ADMIN_PASSWORD=<Password>" # <Password>换成账户管理员密码，管理员账户为admin # choose your backend language `en_US` / `zh_CN` / `ja_JP` - "LC_ALL=zh_CN.UTF-8" ports: - "80:8080" volumes: - "./data/files:/app/files" - "./appsettings.json:/app/appsettings.json:ro" # - "./kube-config.yaml:/app/kube-config.yaml:ro" - "/var/run/docker.sock:/var/run/docker.sock" depends_on: - db - cache cache: image: redis:alpine restart: always db: image: postgres:alpine restart: always environment: - "POSTGRES_PASSWORD=GzctfAuto233" # 数据库密码，务必要和appsettings.json中的配置一致 volumes: - "./data/db:/var/lib/postgresql/data"3.4 在当前文件夹执行命令，构建并启动GZCTF：docker compose up -d等他安装完成就好，这里我已经安装好了查看GZCTF启动状态，我配置的是8888端口，这里你们可以直接配置为80docker ps然后访问你的服务器地址就好，默认为80端口这里可以跳过，如果不想要80被占用，可以添加一个反向代理8888到你的IP地址，我用的宝塔面板国庆假期真实有效，欢迎各位出题人投稿，出题者经审核通过我们将会给予一定的现金奖励【需要Writeup】，题目版权归作者所有，题目也会写上作者的名字，供广大CTFSer们学习使用，并且会永远保存在本平台，本次活动我们将会在国庆假期举行，欢迎各位来参与，我会争取赞助更多的奖品给大家，力争人人都有参与奖，这就是本次赛点。http://ctf.54cto.com/新建比赛管理员登录后找到这个设置添加标题，选择日期添加比赛内容这样就可以直接添加了查看详细，奖励我暂时只想到这些，这些都是用我自己工资给大伙儿送，到时候看看赞助方怎么说，争取人人都有参与奖创建队伍但是现在还不能报名，里面也没有题目创建队伍这样就可以报名了新建题目找到比赛的题目管理这里可以选择题目类型，这里我们添加一个Misc题目，题目类型为静态附件点击编辑附件及flag添加赛题附件和flag固定答案等你设置的比赛日期到了，报名之后就可以查看赛题了（这里为了演示，我换了网盾的平台作为参考）泷羽Sec欢迎各位CTFSer和大学生们来出题，出题者经审核通过我们将会给予一定的现金奖励【需要Writeup】，题目版权归作者所有，题目也会写上作者的名字，供广大CTFSer们学习使用，并且会永远保存在本平台，本次活动我们将会在国庆假期举行，欢迎各位来参与，我会争取赞助更多的奖品给大家，力争人人都有参与奖，感谢各位小伙伴们的关注。本公众号致力于提供网络安全自学的文章，特别是针对自学网安迷路的朋友们，如果您自学网络安全的路上遇到了什么困难，欢迎添加作者进群咨询。往期推荐111
【信息收集】24年11月最新灯塔安装教程最近做总结课程总结，安装灯塔的时候，遇到了下面这两种问题，官方镜像不在了应该是，拉取不了。然后搜了很多资料发现了这个东西，人家已经装好的2.6.1版本，用docker导入就好了百度网盘: https://pan.baidu.com/s/1-V-0M-sXHEqi1Ri-6FrNew?pwd=1212 下载后，放到kali里面（这里我用的kali，比较方便，可以使用自己的服务器或者习惯的操作系统），用解压命令unzipunzip ARL.zip总共多出4个压缩包，这个ARL-2.6.1.zip就不要导入到docker了，后面要解压解压ARL-2.6.1.zip切换到ARL-2.6.1使用ls -a可以看到隐藏的 .env 文件注意，修改的时候一定不要少了那个 v创建数据库arl_dbdocker-compose up -d访问http://服务器IP地址:5003即可登录，默认账号密码admin/arlpass（友情提醒：登陆后请立即修改密码）添加任务等待扫描完成导出异常这里需要修改你的 config-docker.yaml文件，去fofa对接自己的api修改配置文件后，重新执行如下命令更新配置，就可以使用了docker-compose restart因为是注册用户，不支持api的调用这里我开了一个高级会员，api key，给大家一起用，在这个链接，如果出现超时，那么就是当日导出数量过多，第二天再来查就行https://mp.weixin.qq.com/s/ngY7rtth0OjVe83c8r-Fvg这里我是没有新加策略的等待资产搜集完成查看ip信息导出数据使用策略，新加一个策略之后下发fofa任务就可以指定策略了，刚刚不小心把导出次数用完了，，，查询的时候注意加上 size 关键字。。。。那就静静等待，12点后，哈哈哈哈这时候就有其他信息了在你添加的策略勾选的信息，这里都会有SSL证书信息服务及端口指纹统计计划任务貌似出bug了，添加的时候添加不上还有更多，自行尝试吧往期推荐111