[{"content":" 扫雷小游戏 经典逻辑扫雷，挑战你的推理与运气\nSWF 小游戏 Flash 经典合集，一键回忆童年\n","date":"2026-06-10T00:00:00Z","permalink":"/p/%E5%9C%A8%E7%BA%BF%E6%B8%B8%E6%88%8F%E5%AF%BC%E8%88%AA/","title":"在线游戏导航"},{"content":"通过本教程，您将学会在 Windows 环境下搭建高性能 Minecraft 服务器，掌握版本选择、性能优化等核心技巧。\n注意事项 建议服务器运行在独立设备，避免使用笔记本/超极本等移动设备。 🏗 准备工作 推荐配置（1.21 版本） 项目 要求 操作系统 Windows 10/11 或 Linux 处理器 四核 2.0GHz+ 内存 8GB+ DDR4 存储 SSD 10GB+ 网络 20Mbps+ 有线连接 安全警告 确保关闭高危端口（25/465/587），定期备份服务器。 ☕ Java 环境配置 版本对应表 Minecraft 版本 推荐 Java 版本 说明 1.17- Java 8 Minecraft 1.12 及以下版本对 Java 8 兼容性最好。 1.18-1.19 Java 17 或 Java 16（不推荐） 在这些版本中，Minecraft 对 Java 8 的支持已经逐渐停止，Java 16 和 Java 17 的性能和安全性更好。 1.20+ Java 17+ 这些版本对 Java 16 以下的版本可能会有兼容性问题，Java 17 及以上提供了更好的性能和更高的安全性。 1.21+ Java 21+ 新版本的 Minecraft 通常会逐步淘汰旧版的 Java，因此建议尽量使用最新的 LTS 版本（例如 Java 21）。 注意 从 Minecraft 1.18 开始，官方已经不再支持 Java 8，因此建议使用 Java 17 及以上版本。 当然，如果不打算开那么远古的服务器，无脑选最新的 Java 版本即可，新版本相比旧版本在性能和安全性上都有显著提升，因此选择最新的 LTS 版本通常是最稳妥的选择。\n下载渠道 Oracle JDK OpenJDK（推荐） Zulu JDK Amazon Corretto Oracle 账号共享 根据操作系统选择对应版本（Windows 选 .msi，Linux 选 .tar.gz）。\n安装步骤 下载完成后，双击安装包，按照提示完成安装即可。\n安装完成后，您可以在命令提示符中输入以下命令验证 Java 是否安装成功：\n1 java -version # 预期输出：java version \u0026#34;21.0.2\u0026#34; 2024-01-16 安装完成！ 现在您已经成功安装了 Java 环境，可以开始搭建 Minecraft 服务器了。\n如果您在安装过程中遇到任何问题，请参考官方文档或社区论坛获取帮助。 ⚙️ 服务端核心选择 核心 特点 原版服务端 官方原生体验 Spigot 插件支持 + 性能优化 Paper 增强版 Spigot Fabric 轻量级 MOD 支持 Forge 重型 MOD 支持 🚀 启动服务器 创建服务器文件夹 在您选择的目录下创建一个新的文件夹，例如：MinecraftServer\n启动脚本示例 在服务器文件夹中创建一个新的文本文件，命名为 start.bat，并将以下代码复制到文件中：\n1 java -Xmx16G -Xms16G -jar paper-1.21.4-6.jar nogui 请根据您的服务器核心版本替换 paper-1.21.4-6.jar 为实际的 JAR 文件名。\n启动参数详解 -Xmx16G：最大内存分配（例如 16GB） -Xms16G：初始内存分配（建议与 -Xmx 相同） nogui：禁用图形界面以节省资源 -jar：指定 JAR 文件（需替换为实际文件名） 首次运行注意事项 运行后窗口会自动关闭，这是正常现象。 在生成的 eula.txt 文件中修改授权协议：\neula=false → eula=true 保存文件后重新运行启动脚本。 启动成功标志 当控制台显示 Done (XXs)! 时表示服务器已就绪。 控制台操作指南 输入指令时不带斜杠，具体操作如下： 1 2 3 4 5 6 help # 查看帮助 list # 查看在线玩家 ban \u0026lt;玩家名\u0026gt; # 禁止玩家进入服务器 pardon \u0026lt;玩家名\u0026gt; # 解除禁止 op \u0026lt;玩家名\u0026gt; # 给予玩家操作权限 deop \u0026lt;玩家名\u0026gt; # 取消操作权限 关闭服务器：stop 危险操作 直接关闭窗口 强制结束进程 意外断电 ⚠️ 可能造成：\n存档损坏 数据丢失 插件异常 连接服务器 1 localhost 或\n1 127.0.0.1 📡 局域网连接需使用主机内网 IP，公网需配置端口转发。\n","date":"2025-04-06T00:00:00Z","image":"/p/minecraft-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97/%E5%B0%81%E9%9D%A2.jpg","permalink":"/p/minecraft-%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97/","title":"Minecraft 服务器搭建指南"},{"content":"Office 全版本下载链接（离线安装包） 以下均为 Microsoft 官方 CDN 直链，适用于 Windows（除非标注为 Mac）。\n所有链接为 .img 格式，可直接下载或挂载安装。\n主要下载（推荐） Office 2021 Professional (专业版) Office 365 Office 365 ProPlus（企业应用版） 32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/O365ProPlusRetail.img Office 365 Business（商业应用版） 32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/O365BusinessRetail.img Office 365 HomePrem（家庭版 \u0026amp; 个人版） 32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/O365HomePremRetail.img Office 365 HomePrem 2013（家庭版 \u0026amp; 个人版） 32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/O365HomePremRetail.img Office 2013 完整套件 Professional（专业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/ProfessionalRetail.img\nHomeStudent（家庭学生版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/HomeStudentRetail.img\nHomeBusiness（小型企业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/HomeBusinessRetail.img\n单组件 ProjectPro（项目管理专业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/ProjectProRetail.img\nVisioPro（流程图专业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/VisioProRetail.img\nProjectStd（项目管理标准版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/ProjectStdRetail.img\nVisioStd（流程图标准版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/VisioStdRetail.img\nAccess（数据库管理系统）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/AccessRetail.img\nOutlook（电子邮件）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/OutlookRetail.img\nWord（文档）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/WordRetail.img\nExcel（表格）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/ExcelRetail.img\nPowerPoint（幻灯片）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/PowerPointRetail.img\nPublisher（出版应用软件）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/PublisherRetail.img\nOneNote（笔记本）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/39168D7E-077B-48E7-872C-B232C3E72675/media/zh-CN/OneNoteRetail.img\nOffice 2016 完整套件 ProPlus（专业增强版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProPlusRetail.img\nProfessional（专业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProfessionalRetail.img\nHomeStudent（家庭学生版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeStudentRetail.img\nHomeBusiness（小型企业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeBusinessRetail.img\n单组件 ProjectPro\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProjectProRetail.img\nVisioPro\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/VisioProRetail.img\nProjectStd\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProjectStdRetail.img\nVisioStd\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/VisioStdRetail.img\nAccess\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/AccessRetail.img\nOutlook\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/OutlookRetail.img\nWord\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/WordRetail.img\nExcel\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ExcelRetail.img\nPowerPoint\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/PowerPointRetail.img\nPublisher\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/PublisherRetail.img\nOffice 2019 完整套件 ProPlus（专业增强版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProPlus2019Retail.img\nProfessional（专业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Professional2019Retail.img\nHomeStudent（家庭学生版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeStudent2019Retail.img\nHomeBusiness（小型企业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeBusiness2019Retail.img\n单组件 ProjectPro\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProjectPro2019Retail.img\nVisioPro\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/VisioPro2019Retail.img\nProjectStd\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProjectStd2019Retail.img\nVisioStd\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/VisioStd2019Retail.img\nAccess\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Access2019Retail.img\nOutlook\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Outlook2019Retail.img\nWord\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Word2019Retail.img\nExcel\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Excel2019Retail.img\nPowerPoint\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/PowerPoint2019Retail.img\nPublisher\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Publisher2019Retail.img\nOffice 2021 完整套件 ProPlus（专业增强版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProPlus2021Retail.img\nProfessional（专业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Professional2021Retail.img\nHomeStudent（家庭学生版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeStudent2021Retail.img\nHomeBusiness（小型企业版）\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/HomeBusiness2021Retail.img\n单组件 ProjectPro\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProjectPro2021Retail.img\nVisioPro\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/VisioPro2021Retail.img\nProjectStd\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/ProjectStd2021Retail.img\nVisioStd\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/VisioStd2021Retail.img\nAccess\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Access2021Retail.img\nOutlook\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Outlook2021Retail.img\nWord\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Word2021Retail.img\nExcel\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Excel2021Retail.img\nPowerPoint\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/PowerPoint2021Retail.img\nPublisher\n32 \u0026amp; 64 位：https://officecdn.microsoft.com/sg/492350f6-3a01-4f97-b9c0-c7c6ddf67d60/media/zh-CN/Publisher2021Retail.img\nOffice 2019 for Mac 完整套件 不含 Teams\n安装包：https://go.microsoft.com/fwlink/p/?linkid=525133\n包含 Teams\n安装包：https://go.microsoft.com/fwlink/p/?linkid=2009112\n单组件 Word\n安装包：https://go.microsoft.com/fwlink/p/?linkid=525134\nExcel\n安装包：https://go.microsoft.com/fwlink/p/?linkid=525135\nPowerPoint\n安装包：https://go.microsoft.com/fwlink/p/?linkid=525136\nOutlook\n安装包：https://go.microsoft.com/fwlink/p/?linkid=525137\n","date":"2024-07-30T00:00:00Z","permalink":"/p/office-%E5%85%A8%E7%89%88%E6%9C%AC%E4%B8%8B%E8%BD%BD%E9%93%BE%E6%8E%A5%E7%A6%BB%E7%BA%BF%E5%AE%89%E8%A3%85%E5%8C%85/","title":"Office 全版本下载链接（离线安装包）"},{"content":"Volatility 内存取证框架 安装步骤（基于 Python2） 环境说明 Kali Linux 自带 Python2，无需额外安装。以下操作均在 root 或 sudo 权限下执行。 第一步：确认 Python2 环境 Kali 自带 Python2，可通过以下命令验证：\n1 python2 --version 第二步：安装 pip2 1 2 curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py python2 get-pip.py 第三步：安装 Python2 依赖库 1 2 python2 -m pip install pycryptodome -i https://pypi.tuna.tsinghua.edu.cn/simple/ # python2 -m pip install distorm3 -i https://pypi.tuna.tsinghua.edu.cn/simple/ # 可选，distorm3 后续会源码编译 第四步：编译安装 distorm3 1 2 3 git clone https://github.com/vext01/distorm3 cd distorm3 python2 setup.py install 第五步：编译安装 Volatility 1 2 3 git clone https://github.com/volatilityfoundation/volatility.git # 假设目录名为 Volatility cd Volatility python2 setup.py install 第六步：安装常用 Python 插件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # Yara（恶意软件分类工具） python2 -m pip install yara -i https://pypi.tuna.tsinghua.edu.cn/simple/ # OpenPyxl（读写 Excel 文件） python2 -m pip install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple/ # ujson（JSON 解析） python2 -m pip install ujson -i https://pypi.tuna.tsinghua.edu.cn/simple/ # construct 模块（后面 mimikatz 需要特定版本） python2 -m pip install construct -i https://pypi.tuna.tsinghua.edu.cn/simple/ # mimikatz 插件依赖 python2 -m pip install mimikatz -i https://pypi.tuna.tsinghua.edu.cn/simple/ 第七步：安装 mimikatz 插件 将 mimikatz.py 复制到 volatility-master/volatility/plugins/ 目录中（具体路径根据你的 Volatility 源码位置调整）。 安装指定版本的 construct（mimikatz 插件所需）： 1 2 pip2 install --upgrade pip setuptools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip2 install construct==2.5.5-reupload -i https://pypi.tuna.tsinghua.edu.cn/simple/ 插件和安装包可统一打包分发（如群文件）。\n基本用法 命令格式及插件列表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 Volatility Foundation Volatility Framework 2.6 用法：volatility - 内存取证分析平台 Options: -h, --help 列出所有可用选项及其默认值 --conf-file=... 用户配置文件 -d, --debug 调试模式 --plugins=PLUGINS 额外插件目录（冒号分隔） --info 打印所有注册对象的信息 --cache-directory=... 缓存目录 --cache 使用缓存 --tz=TZ 设置时区 -f FILENAME 内存镜像文件名 --profile=WinXPSP2x86 指定配置文件（用 --info 查看支持列表） -l LOCATION 地址空间 URN 位置 -w, --write 启用写支持 --dtb=DTB DTB 地址 --shift=SHIFT Mac KASLR 移位地址 --output=text 输出格式 --output-file=FILE 输出到文件 -v, --verbose 详细输出 -g KDBG 指定 KDBG 地址 --force 强制使用可疑配置文件 -k KPCR 指定 KPCR 地址 --cookie=COOKIE 指定 nt!ObHeaderCookie 地址（Windows 10） 支持的插件命令（部分）： amcache 查看 AmCache 应用程序痕迹 apihooks 检测内核及进程空间中的 API hook atoms 列出会话及窗口站 atom 表 atomscan Atom 表池扫描 auditpol 列出审计策略信息 bigpools 转储大分页池 bioskbd 读取键盘缓冲数据（早期 BIOS 密码） cachedump 获取内存中缓存的域帐号密码哈希 callbacks 打印全系统通知例程 clipboard 提取 Windows 剪贴板内容 cmdline 显示进程命令行参数 cmdscan 提取命令行历史记录 connections 打印系统打开的网络连接（XP/2003） connscan 打印 TCP 连接信息 consoles 提取命令行历史记录 crashinfo 提取崩溃转储信息 deskscan tagDESKTOP 池扫描 devicetree 显示设备树信息 dlldump 转储进程加载的 DLL dlllist 打印每个进程的 DLL 列表 driverirp IRP hook 驱动检测 drivermodule 关联驱动对象至内核模块 driverscan 驱动对象池扫描 dumpcerts 提取 RAS 私钥及 SSL 公钥 dumpfiles 提取内存中映射或缓存的文件 dumpregistry 转储注册表信息至磁盘 editbox 查看 Edit 编辑控件信息 envars 显示进程环境变量 eventhooks 打印 Windows 事件 hook 详细信息 evtlogs 提取 Windows 事件日志（XP/2003） filescan 提取文件对象池信息 gahti 转储用户句柄类型信息 gditimers 打印 GDI 计时器及回调 gdt 显示全局描述符表 getservicesids 获取注册表服务名称并返回 SID getsids 打印每个进程的 SID handles 打印每个进程打开的句柄列表 hashdump 转储 Windows 帐户密码哈希（LM/NTLM） hibinfo 转储休眠文件信息 hivedump 打印注册表配置单元信息 hivelist 打印注册表配置单元列表 hivescan 注册表配置单元池扫描 hpakextract 从 HPAK 文件提取物理内存数据 hpakinfo 查看 HPAK 文件属性 idt 显示中断描述符表 iehistory 重建 IE 缓存及访问历史 imagecopy 导出原生 DD 镜像文件 imageinfo 查看/识别镜像信息 impscan 扫描对导入函数的调用 joblinks 打印进程任务链接信息 kdbgscan 搜索和转储潜在 KDBG 值 kpcrscan 搜索和转储潜在 KPCR 值 ldrmodules 检测未链接的 DLL lsadump 提取 LSA 密钥信息（已解密） machoinfo 转储 Mach-O 文件格式信息 malfind 查找隐藏的和插入的代码 mbrparser 扫描并解析潜在的主引导记录（MBR） memdump 转储进程的可寻址内存 memmap 打印内存映射 messagehooks 桌面和窗口消息钩子线程列表 mftparser 扫描并解析潜在的 MFT 条目 moddump 转储内核驱动程序 modscan 内核模块池扫描 modules 打印加载模块列表 multiscan 批量扫描各种对象 mutantscan 互斥对象池扫描 notepad 查看记事本当前显示的文本 objtypescan 扫描窗口对象类型 patcher 基于页面扫描的补丁程序内存 poolpeek 可配置的池扫描器 printkey 打印注册表项及其子项和值 privs 显示进程权限 procdump 进程转储到可执行文件 pslist 按 EPROCESS 列表打印所有运行进程 psscan 进程对象池扫描 pstree 以树形方式打印进程列表 psxview 查找隐藏进程 qemuinfo 转储 Qemu 信息 raw2dmp 转换为 Windbg 崩溃转储格式 screenshot 基于 GDI 的屏幕截图 servicediff Windows 服务列表比较 sessions _MM_SESSION_SPACE 详细信息 shellbags 打印 Shellbags 信息 shimcache 解析应用程序兼容性 Shim 缓存 shutdowntime 获取机器关机时间 sockets 打印已打开套接字列表 sockscan TCP 套接字对象池扫描 ssdt 显示 SSDT 条目 strings 物理到虚拟地址的偏移匹配 svcscan Windows 服务列表扫描 symlinkscan 符号链接对象池扫描 thrdscan 线程对象池扫描 threads 调查 _ETHREAD 和 _KTHREADs timeliner 创建内存痕迹时间线 timers 打印内核计时器及 DPC truecryptmaster 恢复 TrueCrypt 7.1a 主密钥 truecryptpassphrase 查找并提取 TrueCrypt 密码 truecryptsummary TrueCrypt 摘要信息 unloadedmodules 打印卸载的模块列表 userassist 打印注册表 UserAssist 信息 userhandles 转储用户句柄表 vaddump 转储 VAD 数据为文件 vadinfo 转储 VAD 信息 vadtree 以树形显示 VAD 树 vadwalk 显示遍历 VAD 树 vboxinfo 转储 VirtualBox 信息 verinfo 打印 PE 镜像中的版本信息 vmwareinfo 转储 VMware VMSS/VMSN 信息 volshell 内存镜像中的交互式 Shell windows 打印桌面窗口详细信息 wintree Z 顺序打印桌面窗口树 wndscan 池扫描窗口站 yarascan 以 Yara 签名扫描进程或内核内存 使用示例 以下示例中 Target.vmem 为内存镜像文件，--profile=Win7SP1x64 根据实际情况修改（可通过 imageinfo 自动识别）。\n分析镜像基本信息 1 python vol.py --filename=Target.vmem imageinfo 查找用户名密码哈希（hashdump） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 hashdump 提取 LSA 密钥信息（lsadump） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 lsadump 列举进程（pslist，不能检测隐藏进程） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 pslist 直接破解哈希（mimikatz 插件） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 mimikatz 扫描已终止或隐藏的进程（psscan） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 psscan 树形显示进程列表（pstree） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 pstree 提取指定进程的内存（memdump） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 memdump -p \u0026lt;PID\u0026gt; --dump-dir=./ 查看服务列表（svcscan） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 svcscan 查看 IE 浏览历史（iehistory） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 iehistory 查看网络连接（netscan） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 netscan 查看命令行操作（cmdscan） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 cmdscan 查看文件对象（filescan） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 filescan 提取文件（dumpfiles） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 dumpfiles -Q 0x物理偏移地址 -D ./ 查看记事本内容（notepad） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 notepad 屏幕截图（screenshot） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 screenshot --dump-dir=./ 查看注册表单元列表（hivelist） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 hivelist 导出注册表单元（hivedump） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 hivedump -o 0xfffff8a001032410 获取注册表键值（printkey） 1 python vol.py -f Target.vmem --profile=Win7SP1x64 printkey -K \u0026#34;注册表路径\u0026#34; 查看 UserAssist 运行记录 1 python vol.py -f Target.vmem --profile=Win7SP1x64 userassist 完整示例：解密 TrueCrypt 加密文件 以 mem.vmem 为例，分析过程如下：\n1 2 3 4 5 6 7 8 9 10 11 12 # 1. 获取镜像信息 python vol.py -f mem.vmem imageinfo # 输出建议使用 WinXPSP2x86 # 2. 查看进程，发现 TrueCrypt 进程（PID 2012） python vol.py -f mem.vmem --profile=WinXPSP2x86 pslist # 3. 转储 TrueCrypt 进程内存 python vol.py -f mem.vmem --profile=WinXPSP2x86 memdump -p 2012 -D ./ # 4. 将转储文件丢到 edff 解密工具（外部工具） # 步骤截图如下： 暂无图片\n常见问题与解决方法 问题：libyara.so 找不到 1 2 Failed to import \u0026#39;/usr/lib/libyara.so\u0026#39; ... 原因：通过 pip install yara 安装后，libyara.so 被放在了 Python 的 dist-packages 目录下，而 Volatility 期望在 /usr/lib 中找到。\n解决方法：创建软链接\n1 ln -s /usr/local/lib/python2.7/dist-packages/usr/lib/libyara.so /usr/lib/libyara.so （如果路径不同，请根据实际情况修改）\n推荐参考文章 Volatility 内存取证详细教程\n快捷方式创建（方便使用） 1 2 3 4 5 6 7 8 # 进入 /usr/local/bin cd /usr/local/bin # 创建软链接 ln -s /path/to/vol.py vol # 将 /path/to/vol.py 替换为你的 vol.py 实际路径 # 测试 vol -h 之后即可直接使用 vol 命令代替 python vol.py。\n版权与使用声明 工具仅可用于授权渗透测试或合法取证分析，请勿用于非法用途。 ","date":"2023-02-02T00:00:00Z","permalink":"/p/volatility-%E5%86%85%E5%AD%98%E5%8F%96%E8%AF%81%E6%A1%86%E6%9E%B6%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8/","title":"Volatility 内存取证框架安装与使用"},{"content":"🛠️ BurpSuite 安装及使用教程 1. BurpSuite 简介 Burp Suite 是用于攻击 Web 应用程序的集成平台，包含了许多工具。Burp Suite 为这些工具设计了许多接口，以加快攻击应用程序的过程。所有工具都共享一个请求，并能处理对应的 HTTP 消息、持久性、认证、代理、日志、警报。\n2. BurpSuite 2021 安装及配置 2.1 JDK 选择及配置 版本对应关系 BurpSuite 1.7.x → Java 8 BurpSuite 2021 → Java 11 ⚠️ 注意：\n原文提到“Java 17 不能用”是基于 2021 年的语境。在当前（2026 年），BurpSuite 新版本通常已支持 Java 17+。请根据你实际下载的 Burp 版本选择对应的 JDK。\n下载 Java 官方下载路径\n本教程使用的是 2021 年的 Burp，因此下载 Java 11（亲测 Java 17 不适用）。推荐免安装版。\nOracle 账号（临时使用）：\n可访问 bugmenot 查找可用账号，示例：\n1602404824@qq.com / wf1996ROOT# 908344069@qq.com / Java2019 下载后解压至自定义路径，例如 D:/Java/jdk11。\n配置 方法一：配置环境变量 右键“此电脑” → 属性 → 高级系统设置 → 环境变量。 在系统变量中： 新建 JAVA_HOME，值为 D:\\Java\\jdk11 编辑 PATH，添加 %JAVA_HOME%\\bin 如果有 jre 目录，添加 %JAVA_HOME%\\jre\\bin （可选）新建 CLASSPATH，值为 .;%JAVA_HOME%\\lib\\dt.jar;%JAVA_HOME%\\lib\\tools.jar; 保存后打开 CMD 执行 java -version，应显示 Java 11。 方法二：运行时指定 Java 路径 启动 Burp 时直接使用 Java 11 的绝对路径：\n1 D:\\Java\\jdk11\\bin\\java -jar burpsuite_pro_v2021.x.jar 注意：路径中不能包含中文和空格。\n2.2 BurpSuite 下载安装及激活 下载 Burp 官方下载页面\n下载 Professional 版本的 JAR 包。\n运行 在 CMD 中执行：\n1 java -jar burpsuite_pro_v2021.x.jar 激活 下载注册机：BurpLoaderKeygen 在 CMD 中运行注册机： 1 java -jar BurpLoaderKeygen.jar 按照注册机界面提示操作（复制 License、手动激活等）。 成功标志：界面显示 “Success”。\n汉化参考：简书教程\n汉化包（百度网盘）：链接 https://pan.baidu.com/s/1VYJGTzbdG5kVqVTVxxbsGQ 提取码 39en\n2.3 BurpSuite 快捷启动方式选择 方法一：bat 脚本 创建 run.bat，内容（根据实际文件修改）：\n1 2 3 4 5 :: 要输入的内容 java -Dfile.encoding=utf-8 -javaagent:BurpSuiteCn.jar -Xbootclasspath/p:burploader.jar -jar burpsuite_pro_v2.0.11beta.jar :: 输入内容的具体说明 java -Dfile.encoding=utf-8（定义编码） -javaagent:BurpSuiteCn.jar（汉化补丁的名字） -Xbootclasspath/p:burploader.jar -jar（p:之后是加载器名） burpsuite_pro_v2.0.11beta.jar（burp详细版本及文件名） 方法二：vbs 静默脚本 创建 run.vbs：\n1 2 3 \u0026#39; 首先要创建方法一里的 run.bat 文件 Set ws = WScript.CreateObject(\u0026#34;WScript.Shell\u0026#34;) ws.Run \u0026#34;run.bat\u0026#34;, 0 补充：创建桌面快捷方式.bat\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 chcp 936 REM 设置936编码防止某些中文路径导致批处理失效 @echo off setlocal enabledelayedexpansion mode con cols=94 lines=30\u0026amp;color 0a\u0026amp;title 创建Burp Suite一键启动脚本快捷方式 echo [+] 获得当前路径:%~dp0 set path=%~dp0run.bat echo. if exist %path% ( echo [+] 发现Burp一键启动脚本run.bat echo. echo [+] 启动脚本路劲： echo. echo [+] %path% echo. goto :creat ) else ( echo [-] 注意,未发现启动脚本run.bat，请注意是否改名,程序退出... echo. pause exit ) :creat echo [+] 开始创建快捷方式... echo. rem 设置程序的完整路径(必要) set Program=%path% rem 设置快捷方式名字(必要) set LinkName=Burpsuite rem 程序工作路径 set WorkDir=%~dp0 rem 设置快捷方式说明 set Desc=BurpSuite一键启动 rem 设置快捷方式图标 set icon=%~dp0/Burpsuite.ico if not defined WorkDir call:GetWorkDir \u0026#34;%Program%\u0026#34; (echo Set WshShell=CreateObject(\u0026#34;WScript.Shell\u0026#34;^) echo strDesKtop=WshShell.SpecialFolders(\u0026#34;DesKtop\u0026#34;^) echo Set oShellLink=WshShell.CreateShortcut(strDesKtop^\u0026amp;\u0026#34;\\%LinkName%.lnk\u0026#34;^) echo oShellLink.TargetPath=\u0026#34;%Program%\u0026#34; echo oShellLink.WorkingDirectory=\u0026#34;%WorkDir%\u0026#34; echo oShellLink.WindowStyle=1 echo oShellLink.Description=\u0026#34;%Desc%\u0026#34; echo oShellLink.IconLocation=\u0026#34;%icon%\u0026#34; echo oShellLink.Save)\u0026gt;makelnk.vbs echo [+] 桌面快捷方式创建成功!! echo. makelnk.vbs del /f /q makelnk.vbs pause goto :eof :GetWorkDir set WorkDir=%~dp1 set WorkDir=%WorkDir:~,-1% pause goto :eof 方法三：exe 启动 可参考 B 站视频：BurpSuite 2021 教程\n3. BurpSuite 的使用 3.1 配置浏览器代理 要想在自己使用的浏览器上使用 burpsuite 的话，需要为自己的浏览器安装证书。当然也可以不安装证书，因为 burpsuite 里有自带的 谷歌浏览器，按需求来。\n方式一：系统代理下载证书 Windows 设置 → 网络和 Internet → 代理 → 手动设置代理，地址 127.0.0.1，端口 8080。\n浏览器访问 http://burp(http://burpsuite/) 下载 CA 证书。\n点击 “CA Certificate” 保存 cacert.der。\n在浏览器中导入该证书（受信任的根证书颁发机构），然后访问 https://www.baidu.com 测试。 方式二：Burp 生成证书 打开 Burp → Proxy → Proxy Settings。\n生成 CA 证书。\n按方式一的步骤 3 安装证书。 方式三：Burp 内嵌浏览器 打开 Burp → Proxy → open for browser （打开内嵌浏览器） 3.2 Proxy 模块 Burp Proxy 是Burp Suite以用户驱动测试流程功能的核心，通过代理模式，可以让我们拦截、查看、修改所有在客户端和服务端之间传输的数据。\nIntercept（拦截） Forward：放行请求 Drop：丢弃请求 Intercept is on/off：开关拦截 Action：发送到其他模块 Raw / Hex / Params / Header：查看不同格式 HTTP History 记录所有 HTTP 流量，支持过滤（Filter） 右键记录可执行更多操作 WebSockets History 类似 HTTP History，用于 WebSocket 通信 Options（重要设置） Proxy Listeners：设置监听端口 Intercept Client Requests：配置请求拦截规则 Intercept Server Responses：配置响应拦截规则 Miscellaneous：杂项（如自动添加请求头） 3.3 Target 模块 Burp Target 组件主要包含站点地图、目标域、Target 工具三部分组成，他们帮助渗透测试人员更好地了解目标应用的整体状况、当前的工作涉及哪些目标域、分析可能存在的攻击面等信息\nScope（作用域） 限制拦截、扫描的目标范围（域名、目录等）。\nSite Map（站点地图） 左侧树形结构展示 URL 层级，右侧展示请求/响应详情。 3.4 Spider（爬虫） 智能爬虫，枚举应用内容与功能。\n3.5 Scanner（扫描器，仅专业版） 自动发现 Web 漏洞。\n3.6 Intruder（入侵器） Intruder——是一个定制的高度可配置的工具，对web应用程序进行自动化攻击，如：枚举标识符，收集有用的数据，以及使用fuzzing 技术探测常规漏洞。\n教程:Intruder Attack type\u0026amp;Payloads – 拥有上千种姿态的攻击模式\nTarget Host：目标 URL Port：端口（HTTP 80，HTTPS 443）\nPositions（攻击模式） Sniper：单个 payload 集合，依次替换每个变量 Battering ram：单个 payload 集合，同时替换所有变量（值相同） Pitchfork：多个 payload 集合，按位置一一对应（数量需相同） Cluster bomb：多个 payload 集合，笛卡尔积组合 1、Sniper(狙击枪) 第一种攻击模式: Sniper\nsniper的特点是只需要指定一个Payload Set，不管你Positions中有几个变数，都是一个Payload Set，但会针对每个变数逐项的替换。 在替换第一个位置变量的时候，第二个是不会动的，也就是替换第一个位置的时候，第二个会是原始值，而测试完第一个位置时，才会测试二个位置。 所以假设尝试替换账号密码，利用Payload内容是11,22,33,aa,bb,cc。进行暴力破解时，会去尝试: admin:11 admin:22 admin:33 admin:aa admin:bb admin:cc 11:password0000 22:password0000… 这样依序下去。\n字段中Position的意思是表示第几个变量，因为我们只有设定两个， 账号§admin§就是position 1，而密码§password0000§就是position 2。 demo如下图: ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70.png)\n2、Battering ram(攻城槌) 第二种攻击模式: Battering ram\n这种攻击模式实际上比第一种还好理解，也是不管你Positions中有几个变数，都是一个Payload Set。 并且每个变量位置的值都会是一样的。 所以假设尝试替换账号密码，账号内容是11,22,33,aa,bb,cc 进行暴力破解时，会去尝试 11:11 22:22 33:33 aa:aa… 这样依序下去 demo如下图: ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971512.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971513.png)\n3、Pitchfork(干草叉) 第三种攻击模式: Pitchfork\n不能只输入一个字典，每个变量要有自己的字典文件，也就是说每个变量有一个属于自己的Payload set，但是要注意的是每个Payload set里面的payload个数要一样。 (当然其实payload set不一样也是没关系，还是可以执行，只是多出来的那些payload不会被送出去而已。) 假设两个Position各有自己的Payload Set， Position 1，也就是账号的地方，Payload是11,22,33 Position 2，也就是密码的地方，Payload是aa,bb,cc 尝试结果会是 11:aa 22:bb 33:cc demo如下图: ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971514.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971515.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971516.png)\n4、Cluster bomb(集束炸弹) 第四种攻击模式: Cluster bomb\n这种方式也是每个变量都要输入字典，但是不会像Pitchfork是一对一的关系，而是每个都会去尝试到，逐项地去尝试一多对的方式。\n假设两个Position各有自己的Payload Set， Position 1，也就是账号的地方，Payload是11,22,33 Position 2，也就是密码的地方，Payload是aa,bb,cc 尝试结果会是 11:aa 11:bb 11:cc 22:aa 22:bb … demo如下图: ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971527.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971528.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-16492463971529.png)\nPayload type（部分常用） Simple list：手动输入或加载字典文件 Runtime file：大文件字典（不显示内容） Custom iterator：多位置组合 Number：数字序列（起始、步长、进制） Brute force：字符集暴力枚举 Null payloads：重复相同请求 介绍完了四种Attack Mode之后，要来提的就是Payload type，虽然我们前面用的Payload type都是Simple list，(实际上最常用的也是Simple list)。不过Burp所支持的Payload type可是相当的多样化。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715211.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715212.png)\nSimple list 首先Simple list可以算是最基本的，用法很简单，可以直接输入按Add，也可以上传文档。 虽然这边我们demo都是手动输入，不过实际上要执行暴力破解等动作，通常Payload一定会是很大量的，用手输入可能会累死，所以实际上都是用选择上传文件的方式。\n那至于字典文件要去哪里找，就…自己到处随便用关键词找找，因为满多地方都有各种不同的字典的或是Payload文档。 谈起Payload与字典文件可能又会无限发散，这边就随便放个SecLists让大家参考参考: https://github.com/danielmiessler/SecLists/tree/master/Passwords\nRuntime file Runtime file 是指定文档，让你直接选择文档，每一行就是一个Payload，其实这个跟Simple list直接Load就是一样的意思而已，只是Simple list如果汇入的文档很大，会因为画面要显示出来给你看，所以会跑很久，Runtime file没有要显示给你看，所以没这个问题。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715213.png)\nCustom iterator Custom iterator这个稍微就有点小复杂了，首先先注意到这边里面也有个Position 1~8\n8个都可以输入不同的Payload Set，也就是说八个之间会去做排列组合，但是前后的顺序不会改变， 最后的结果 = position1 + position2 + position3。 为了方便demo，用的是Battering ram攻击模式，Payload的Position： Position 1: 11,22,33 Position 2: aa,bb,cc Position 3: dog,cat\n最后执行的payload会是: 11aadog 22aadog 33aadog 11bbdog 22bbdog … 以此类推总共18组payload： ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715214.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715315.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715316.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715317.png)\nCharacter substitution Character substitution 字符替换的意思，也就是你可以设定把某个字符修改成另一个字符，其实可以算还是会从原本Simple list去延伸，所以看到item的地方跟Simple list一样。 跑完原本的Payload之后会做字符的替换。 所以假设我的payload输入abcd，可以看到字符替换的规则有a-\u0026gt;4,b-\u0026gt;8；所以暴力破解时送完原始的payload abcd之后。有单独把a换成4，有单独把b换成8，也有两个都换的。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715319.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715320.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715321.png)\nRecursive grep Recursive grep 其实听起来有点复杂，但是其实没那么复杂XD 可是我没好的范例demo。 是从上一次的响应结果中，取得部分特定内容作为下次请求的Payload。\nIllegal Unicode 这个我也是第一次发现原来Burp还有这一招，利用Illegal Unicode进行Bypass。 因为不是很理解，让我先默默跳过…\nCharacter blocks Character blocks，举例，可以插入很多个A，起始要几个，每次增加多少个A，到多少个要停止，通常比较适用在测试overflow。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715322.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715323.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715424.png)\nNumber Number测试数字，这个也算是实际工作上很常用到的，可以设定起始多少到结尾多少，间隔多少数字， 也可以选择十进制与Hex，还有是否要小数点。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715425.png) ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715426.png)\nDatas 如其名，就是用来测时间日期格式的Payload。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715427.png)\nBrute Force Brute Force是纯粹的暴力破解，这个其实算是我除了Simple与Number以外，可能比较常用到的之一，Payload的产生方式就是Character set中的所有字符排列组合都会试过，那也可以设定最小的长度与最大的长度，不过要注意就是Brute Force很容易一不小心Payload数量就超多的。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3piajE4MzE0NDY5Mzk1,size_6,color_FFFFFF,t_70-164924639715428.png)\nNull payloads Null payloads 其实就是重复同样的原始请求，没有进行修改，你可能会好奇这样有什么意义？！ 那这个就是等到你遇到需要的场景就会知道意义了，通常可能是做观察与搜集数据的时候用，比如要确认一直重复发起一样的请求，是否服务器都会给一样的响应。\nCharacter frobber Character frobber 会按照顺序去递增每个字符的一个ASCII，感觉这个有点冷门，好像其实是满实用的，用途主要应该是用来确认token的每个字符是否有作用。\nBit flipper Username generator\n用户名生成。\nECB block shuffler ECB block shuffler 牵扯到加密模式，先不管他。\nPayload Processing 对 payload 进行加工（添加前缀/后缀、编码、正则替换等）。例如可以加入前缀、后缀字符、只截取字符串的某一部分等；后缀常见的可能像是Email结尾的字符，比如@gmail.com之类的。 可以利用match替换，可以反转，可以编码，许多方法可以选择。 Payload Encoding 自动对特殊字符进行 URL 编码。这边则是勾选的话，Payload如果有match的characters就会进行URL-encode。 ![在这里插入图片描述](D:/桌面/blog/content/post/网络安全工具安装使用教程/BurpSuite 安装及使用/20210404162540343.png)\nRepeater 3.7 Repeater（重发器） 手动修改并重发单个请求。\n3.8 Sequencer（序列器） 分析 token 随机性。\n3.9 Decoder（解码器） 编解码工具（Base64、URL、HTML 等）。\n3.10 Comparer（比较器） 可视化对比两个请求/响应的差异。\n","date":"2022-12-01T00:00:00Z","image":"/p/burpsuite-%E5%AE%89%E8%A3%85%E5%8F%8A%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/%E5%B0%81%E9%9D%A2.jpg","permalink":"/p/burpsuite-%E5%AE%89%E8%A3%85%E5%8F%8A%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/","title":"BurpSuite 安装及使用教程"},{"content":"•PHP 搭建环境 什么是PHP PHP 定义：一种服务器端的 HTML 脚本/编程语言，是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言。是一种广泛用于 Open Source（开放源代码）的尤其适合 Web 开发并可以嵌入 HTML 的多用途脚本语言。它的语法接近 C，Java 和 Perl，而且容易学习。该语言让 Web 开发人员快速的书写动态生成的网页。\nPHP前身：Personal HomePage，个人主页，使用 Perl 语言开发的一种写个人主页的语言。\nPHP：PHP Hypertext Preprocessor，php超文本预处理器，底层使用 C 语言。\n安装 Apache 环境 可参考 在 apache 中添加 php 处理模块_李志圆的博客-CSDN博客\n安装 Apache 软件 安装版 获取 Apache 安装软件\n双击安装\n选择自定义\n选择安装位置\n免安装版 官网下载软件\n解压\n解压下载的文件，将解压后的文件放在相应目录。\n配置\n3.1 进入所在目录。\n3.2 下载服务器\n输入 httpd -k install -n apache（该命令的意思是安装 Apache 服务器，并将该服务器名称命名为 apache）。\n注意 若出现 localhost 拒绝连接，则可能是未下载服务器。 3.3 修改 httpd.conf，把路径改为自己的安装路径。\n3.4 配置文件更改权限（可能？）\n搜到的教程中说要改，于是跟着改了，不知道不改要不要紧。\nApache 的目录结构说明 Httpd.exe 的详细应用 服务器进程\n服务器程序运行之后才能够工作。\n运行 httpd\n用来查看 Apache 具有哪些功能以及配置文件是否有错：httpd 或 httpd.exe（文件所在目录）。\n查看使用的模块：httpd -M\n验证配置文件是否有效：httpd -t\n配置默认站点 Apache 确定服务器上访问的位置\n网站文件夹所在位置。httpd.conf 中的 DocumentRoot。\n方便用户使用名字访问对应的网站\n给文件夹对应的取一个别名。http.conf 中的 ServerName。\n端口可以单独实现：httpd.conf 中的 listen。\n重启 Apache\n凡是涉及到 Apache 配置文件的修改，需要重启 Apache 才能生效。\n实现 DNS 域名解析\n通常默认站点都是本地 DNS：hosts 文件。\n运行时出现问题 要确保 Apache 与 PHP 都是 X64/X32 的。 PHP 的版本号要对应 Apache 的版本号。 安装与配置 PHP 安装 PHP 语言 获取 PHP 安装文件\n解压缩 PHP 目录结构说明 PHP.exe 的应用 PHP.exe 可以解析 PHP 代码转变成 HTML 代码，从而让浏览器可以解析。\n进入目录\n通过 CMD 进入到 php.exe 所在目录，例如 cd D:\\...\\php8。\n运行命令\n通过 php.exe 运行命令来指定要解析的 PHP 脚本：php.exe -f PHP文件所在路径。\n配置 Apache 加载 PHP 模块 Apache 加载 PHP 模块\n在 Apache 的主配置文件中加载对应的 PHP 提供的模块：\nLoadModule php_module php8apache2_4.dll 所提供的模块链接所在路径。\n（LoadModule 是加载模块的语法，标准是：LoadModule 模块名称 模块的实现文件。注意 PHP 版本为 8 时 php8_module 中的 8 不需要写，写了会报错。）\n在 Apache 的 bin 目录下打开 CMD，输入 httpd -M 确认模块已导入。\nApache 分配工作给 PHP 模块\n如果是 PHP 代码就交给 PHP 处理：通过文件后缀判断 .php 结尾肯定是 PHP 代码：\nAddType application/x-httpd-php .php\n将 PHP 的配置文件加载到 Apache 配置文件中，共同生效。\n3.1 在 Apache 中指定 PHP 配置文件所在路径：PHPIniDir php.ini 所在路径\n3.2 php.ini 文件\nphp.ini 文件默认是不存在的，是以 development 和 production 格式存在，需要格式化。可以将 php.ini-development 复制后改名为 php.ini。\n运行时出现问题 解决方法：\n原因是 PHP 8.0 需要用到 Visual Studio 2019 的 Microsoft Visual C++ Redistributable 工具，需要访问 下载 Visual Studio 2019 进行下载。\nPHP 连接数据库 PHP 本身不具备操作 MySQL 数据库的能力，需要借助 PHP 操作 MySQL 的扩展来实现。\nPHP 加载 MySQL 扩展\n在 php.ini 文件中配置。\n指定扩展路径\nPHP 中所有的扩展都在 ext 目录中，需要指定扩展所在路径：extension_dir。\n例如：extension_dir = \u0026quot;D:/Security/Server/php/ext\u0026quot;。当添加 redis.dll 扩展时，只需写 extension=redis.dll。\n重启 Apache\nphp.ini 已被 Apache 加载，所以需要重启才会生效。\n搭建基于域名的虚拟主机 在 Apache 中，虚拟主机的搭建有两种方式：\n在主配置文件中搭建\n需要手动开启虚拟主机（基于域名）：NameVirtualHost *:80\n在专门的虚拟主机配置文件中配置\n加载配置文件\n在主配置文件（php.ini）中加载虚拟主机配置文件：虚拟主机配置文件已经开启了虚拟主机 NameVirtualHost。\n配置虚拟主机\n在虚拟主机配置文件中配置虚拟主机。\n2.1 增加一个对应的站点文件夹位置：DocumentRoot\n2.2 增加主机名字（文件夹的别名）：ServerName\n2.3 增加域名解析 DNS：hosts\n2.4 需要给当前设定的站点（目录）访问权限\n注意 Apache 2.4 会报错不能识别 Order、Deny、Allow。 1 2 3 4 5 \u0026lt;Directory \u0026#39;站点目录\u0026#39;\u0026gt; Order Deny,Allow # 没有顺序关系：实际顺序有意义 Deny from 指定的范围 Allow from 指定范围/all \u0026lt;/Directory\u0026gt; 2.5 配置访问列表\n当访问一个目录时（没有指定具体要访问的文件）：Options Indexes [FollowSymLinks]，如果访问目录，则列表显示所有文件。\n2.6 当用户访问指定目录不指定文件时，通常需要系统指定一个默认文件：DirectoryIndex 默认的文件列表，使用空格分隔。\n注意：如果网站中整个根目录允许访问，但其中还有其他文件夹不允许访问，可以增加多个 \u0026lt;Directory\u0026gt; 标签，针对不同的文件夹。\nlocalhost 配置\n一旦启用虚拟主机配置文件，默认的主机地址 localhost 就不再生效。如果想要生效，需要为 localhost 增加单独的虚拟主机。 添加样图\nPHP 基础 PHP 语法初步 PHP 是一种运行在服务器端的脚本语言，可以嵌入到 HTML 中。\nPHP 代码标记 在 PHP 历史发展中，可以使用多种标记来区分 PHP 脚本：\nASP 标记：\u0026lt;% php 代码 %\u0026gt; 短标记：\u0026lt;? php 代码 ?\u0026gt; 以上两种基本弃用，如果要使用需要在配置文件 php.ini 中开启。\n脚本标记：\u0026lt;script language=\u0026quot;php\u0026quot;\u0026gt;php 代码\u0026lt;/script\u0026gt; 标准标记（常用）：\u0026lt;?php php 代码 ?\u0026gt; PHP 注释 注释是个人学习和写代码的思路说明。PHP 中注释分为两种：\n行注释：一次注释一行\n// 后面跟的所有内容都是注释。\n# 与 // 一样。 块注释：一次注释多行\n/* 与 */ 之间的全部内容都是注释。 PHP 语句分隔符 语句分隔符：在 PHP 中，代码以行为单位，系统通过分号 ;（英文状态）判断行的结束。\n特殊说明：\nPHP 中标记结束符 ?\u0026gt; 自带语句结束符的效果，最后一行 PHP 代码可以没有语句结束符 ;。 PHP 中很多代码的书写并不是嵌入到 HTML 中，而是单独存在，通常书写习惯中就不建议使用标记结束符 ?\u0026gt;，PHP 会自动从开始到最后全部认为是 PHP 代码，从而解析。 变量 变量来源于数学，是计算机语言中能储存计算结果或能表示值的抽象概念。变量可以通过变量名访问。在指令式语言中，变量通常是可变的。\n变量基本概念 变量是用来存储数据的。 变量是存在名字的。 变量是通过名字来访问数据的。 变量是可以改变数据的。 变量的使用 定义：在系统中增加对应的变量名字（内存）。 赋值：将数据赋值给变量名（可以在定义的同时完成）。 通过变量名访问存储的数据。 将变量从内存中删除。\n变量命名规则 在 PHP 中变量名字必须以 $ 符号开始。 名字由字母、数字和下划线 _ 构成，但不能以数字开头。 在 PHP 中本身还允许中文变量（不建议）。 预定义变量 预定义变量：提前定义的变量，系统定义的变量，存储许多要用到的数据（预定义变量都是数组）。\n$_GET：获取所有表单以 GET 方式提交的数据。 $_POST：POST 提交的数据都会保存在此。 $_REQUEST：GET 和 POST 提交的都会保存。 $GLOBALS：PHP 中所有的全局变量。 $_SERVER：服务器信息。 $_SESSION：session 会话数据。 $_COOKIE：cookie 会话数据。 $_ENV：环境信息。 $_FILES：用户上传的文件信息。 可变变量 可变变量：如果一个变量保存的值刚好是另外一个变量的名字，那么可以直接通过访问一个变量得到另外一个变量的值：在变量前面再多加一个 $ 符号。\n例如：$a = 'b'; $b = 'bb'; 那么 $$a = 'bb'。\n变量传值 将一个变量赋值给另外一个变量：变量传值。有两种方式：值传递和引用传递。\n值传递：将变量保存的值复制一份，然后将新的值给另外一个变量保存（两个变量没有关系）。\n引用传递：将变量保存的值所在的内存地址传递给另外一个变量，两个变量指向同一块内存空间（两个变量是同一个值）。 1 2 // $新变量 = \u0026amp;$老变量 $a = \u0026amp;$b; 内存分区：\n栈区：程序可以操作的内存部分（不存数据，运行程序代码），少但快。 代码段：存储程序的内存部分（不执行）。 数据段：存储普通数据（全局区和静态区）。 堆区：存储复杂数据，大但效率低。 常量 常量与变量一样，都是用来保存数据的。\n常量基本概念 常量（const/constant）是一种在程序运行当中不可改变的量（数据）。常量一旦定义，通常数据不可改变（用户定义）。\n常量定义形式 在 PHP 5.3 之后有两种定义方式：\n使用函数 define('常量名', 常量值); 使用 const 常量名 = 值; 1 2 3 4 5 6 \u0026lt;?php // 使用函数定义常量：define define(\u0026#39;PI\u0026#39;, 3.14); // 使用 const 关键字定义 const PII = 3; ?\u0026gt; 常量命名规则：\n常量不需要使用 $ 符号，一旦使用系统就会认为是变量。 常量的名字由字母、数字和下划线组成，不能以数字开头。 常量的名字通常以大写字母为主（与变量以示区别）。 常量命名的规则比变量要松散，可以使用一些特殊字符，但只能使用 define 定义。 1 2 define(\u0026#39;-_-\u0026#39;, \u0026#39;smile\u0026#39;); // const -_- = \u0026#39;smile\u0026#39;; // 错误 注意：define 和 const 定义的常量有区别：在于访问权限区别。定义常量通常不区分大小写，但可以区分，可参照 define 函数的第三个参数（参考文档）。\n常量使用形式 常量的使用与变量一样：不可改变值（在定义的时候必须赋值）。\n对于特殊名字的常量，需要使用 constant('常量名') 函数来访问。\n1 2 3 4 5 6 // 定义特殊常量 define(\u0026#39;-_-\u0026#39;, \u0026#39;smile\u0026#39;); // 使用常量 echo PI; // echo -_-; // 特殊符号不能直接使用 echo constant(\u0026#39;-_-\u0026#39;); 常量和变量的使用选择：\n数据可能会变化 → 用变量。 数据不一定会变 → 可以用常量或变量（变量居多）。 数据不允许被修改 → 一定用常量。 系统常量 系统常量：系统帮助用户定义的常量，用户可以直接使用。\n常用系统常量：\nPHP_VERSION：PHP 版本号。 PHP_INT_SIZE：整型大小（所占用的字节数）。 PHP_INT_MAX：整型能表示的最大值（整型中允许出现负数：带符号）。 魔术常量（双下划线开头+常量名+双下划线结束，值会随环境变化）：\n__DIR__：当前被执行的脚本所在电脑的绝对路径。 __FILE__：当前被执行的脚本所在的电脑的绝对路径（带自己的文件名）。 __LINE__：当前所属的行数。 __NAMESPACE__：当前所属的命名空间。 __CLASS__：当前所属的类。 __METHOD__：当前所属的方法。 数据类型 数据类型（data type）：在 PHP 中指的是存储的数据本身的类型，而不是变量的类型。PHP 是一种弱类型语言，变量本身没有数据类型。\nPHP 的八种数据类型 简单（基本）数据类型（4小类）：\n整型：int/integer，系统分配 4 个字节存储，表示整数类型（有前提）。 浮点型：float/double，系统分配 8 个字节存储，表示小数或者整型存不下的整数。 字符串型：string，系统根据实际长度分配，表示字符串（引号）。 布尔类型：bool/boolean，只有两个值：true 和 false。 复合数据类型（2小类）：\n对象类型：object，存放对象（面向对象）。 数组类型：array，存储多个数据（一次性）。 特殊数据类型（2小类）：\n资源类型：resource，存放资源数据（PHP 外部数据，如数据库、文件）。 空类型：NULL，只有一个值就是 NULL（不能运算）。 类型转换 类型转换：在需要指定数据类型时，将外部数据转换成目标数据类型。PHP 中有两种类型转换方式：\n自动转换：系统根据需求自己判定转换（用的比较多，效率偏低）。 强制（手动）转换：人为根据需要的目标类型转换。\n强制转换规则：在变量之前增加一个括号 ()，里面写上对应类型：int/integer\u0026hellip; 其中 NULL 类型要用到 unset()。 在转换过程中，用得比较多的是转布尔类型（判断）和转数值类型（算术运算）。\n其他类型转布尔类型：true 或 false，在 PHP 中比较少类型会变成 false。\n其他类型转数值的说明：\n布尔 true 为 1，false 为 0。 字符串转数值有自己的规则： 以字母开头的字符串，永远为 0。 以数字开头的字符串，取到碰到字符串为止（不会同时包含两个小数点）。 类型判断 通过一组 is_ 开头的函数来判断变量类型，返回布尔值：is_XXX(变量名)。\nbool 类型不能用 echo 查看，可以使用 var_dump 结构查看：var_dump(变量1, 变量2...)\n1 2 3 $a = \u0026#39;123asdf\u0026#39;; var_dump(is_int($a)); // false var_dump(is_string($a)); // true 另外还有一组函数用来获取以及设定数据（变量）的类型：\ngettype(变量名)：获取类型，返回类型对应的字符串。 settype(变量名, 类型)：设定数据类型，与强制转换不同。强制转换 (类型)变量名 是对数据值复制的内容进行处理（不会处理实际存储的内容）；而 settype 会直接改变数据本身。 1 2 3 4 5 $a = \u0026#39;sad123\u0026#39;; echo (float)$a; // 输出 0 echo gettype($a); // string var_dump(settype($a, \u0026#39;int\u0026#39;)); // true echo gettype($a); // integer 整数类型 整数类型保存整数数值（范围限制），4 个字节存储数据，最大 32 位约 42 亿。PHP 中默认是有符号类型（区分正负数）。\nPHP 提供了四种整型定义方式：十进制、二进制、八进制、十六进制。\n1 2 3 4 5 6 $a = 110; // 十进制 $b = 0b110; // 二进制 $c = 0110; // 八进制 $d = 0x110; // 十六进制 // 默认 PHP 输出数值都会自动转换成十进制输出 echo $a, $b, $c, $d; // 输出 110 6 72 272 进制转换函数：\ndecbin()：十进制转二进制。 decoct()：十进制转八进制。 dechex()：十进制转十六进制。 bindec()：二进制转十进制。 1 var_dump(decbin(10)); // 得到1010 浮点类型 浮点型：小数类型以及超过整型存储范围的整数（不保证精度），精度范围大约 15 个有效数字。\n定义方式：\n1 2 $f = 1.23; $f = 1.23e10; // 科学计数法，e 表示底数 10 尽量不要用浮点数做精确判断，因为浮点数保存的数据不够精确，计算机中小数基本上存储都不准确。\n布尔类型 布尔类型：两个值 true 和 false，通常用于判断比较。\n常用判断函数：\nempty()：判断数据的值是否为“空”，不是 NULL，如果为空返回 true，不为空返回 false。 isset()：判断数据存储的变量本身是否存在，存在返回 true，不存在返回 false。 运算符 运算符（operator）是一种将数据进行运算的特殊符号，PHP 中有十种运算符之多。\n赋值运算符 符号 =，将右边的结果（可以是变量、数据、常量和其他运算出来的结果）保存到内存的某个位置，然后将该内存地址赋值给左侧的变量（常量）。\n算术运算符 +：累加 -：相减 *：相乘 /：相除 %：取余（模），两个整数相除保留余数 进行除法或取余运算时，被除数（第二个数）不能为 0。\n比较运算符 比较两个数据的大小或内容是否相同，返回布尔类型：\n\u0026gt;：左边大于右边 \u0026gt;=：左边大于等于右边 \u0026lt;：左边小于右边 \u0026lt;=：左边小于等于右边 ==：左边等于右边（大小相同） !=：左边不等于右边（大小不同） ===：全等于，大小和数据类型都相同 !==：不全等于，大小或类型不同 逻辑运算符 \u0026amp;\u0026amp;：逻辑与，两边条件同时成立 ||：逻辑或，至少一边成立 !：逻辑非，对已有条件取反 1 2 3 4 5 6 7 8 9 $a = \u0026#39;123\u0026#39;; $b = \u0026#39;456\u0026#39;; # 逻辑与 var_dump($a == \u0026#39;123\u0026#39; \u0026amp;\u0026amp; $b == \u0026#39;45\u0026#39;); // false # 逻辑或 var_dump($a == \u0026#39;123\u0026#39; || $b == \u0026#39;456\u0026#39;); // true # 逻辑非 var_dump($b == \u0026#39;456\u0026#39;); // true var_dump(!($b == \u0026#39;456\u0026#39;)); // false 逻辑与和逻辑或具有短路运算特性：如果第一个表达式结果已经满足条件，则不会运行后面的表达式。书写代码时尽量将出现概率最高的表达式放在第一位。\n连接运算符 .：将两个字符串连接在一起。 .=：复合运算，将左边的内容与右边的内容连接起来，然后重新赋值给左边变量（$a .= $b 等价于 $a = $a . $b）。 1 2 3 4 5 $a = \u0026#39;hello \u0026#39;; $b = 123; echo $a . $b; // hello 123 $a .= $b; //等价于$a = $a . $b echo $a; // hello 123 错误抑制符 @：在可能出错的表达式前面使用，可以抑制错误输出。\n1 2 3 4 $a = 10; $b = 0; $a / $b; // 报错 @($a / $b); // 不报错 三目运算符 表达式1 ? 表达式2 : 表达式3：如果表达式1成立则执行表达式2，否则执行表达式3。\n可以复合使用。\n1 2 3 $a = 10; $b = $a \u0026gt; 10 ? 100 : 0; echo $b; // 0 三目运算还可以复合三木运算：表达式1 ? (表达式2 ? 表达式3 : 表达式4) : (表达式5 ? 表达式6 : 表达式7)\n自操作运算符 ++：在原值上 +1 --：在原值上 -1 前置与后置：\n如果只有自操作不参与其他运算，效果相同；如果同时参与其他运算，则后置先保留原值再改变，前置先改变再使用。\n1 2 3 4 5 6 $a = $b = 1; $a++; ++$b; echo $a, $b; // 2,2 $a = $b = 1; echo $a++, ++$b; // 1,2 衍生赋值运算符：+=、-=、*=、/=、%=。\n1 2 3 4 $a = 10; $b = 5; $a += $b; // $a = $a + $b = 15 $a -= $b - 1; // $a = $a - ($b - 1) = 6 位运算符 计算机码 计算机存储数据采用二进制编码规则：原码、反码、补码，最左边一位是符号位（正数为0，负数为1）。\n原码：数据本身从十进制转换成二进制的结果。正数的原码、反码、补码相同；负数符号位为1。 反码：负数符号位不变，其他位取反。 补码：负数反码+1。 系统中存在 +0 和 -0：\n+0: 00000000\n-0: 10000000（原码） → 11111111（反码） → 00000000（补码）\n位运算 \u0026amp;：按位与，两位都为1结果为1，否则0。 |：按位或，至少一位为1结果为1。 ~：按位非，位取反。 ^：按位异或，相同为0，不同为1。 \u0026lt;\u0026lt;：按位左移，整体向左移动，右边补0。 \u0026gt;\u0026gt;：按位右移，整体向右移动，左边补符号位（正数补0，负数补1）。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 $a = 5; $b = -5; //按位与 var_dump($a \u0026amp; $b); //得到int(1) /* 5\t原码\t00000101 -5\t原码\t10000101 取反\t11111010 //反码:符号位不变:其他位取反 求补\t11111011 //补码:反码+1 取出系统存储的结果进行与操作 5\t00000101 -5\t11111011 \u0026amp;\t00000001\t//最终结果 转换:判断符号位,0表示正数(原码),1表示附属(补码) */ //按位非 var_dump(~ $b); //得到int(4) /* -5\t补码\t11111011 取反\t00000100 原码\t00000100 */ //按位右移 var_dump($b \u0026gt;\u0026gt; 1); //得到int(-2) /* -5\t补码\t11111011 \u0026gt;\u0026gt;1\t11111110 //运算结果:补码 反码\t11111101 //补码-1 取反\t10000010 //原码:-2 */ 注意：\n系统进行任何位运算时都使用补码。 运算结束后必须转换成原码才是最终显示的数据。 按位左移相当于乘以2，按位右移相当于除以2（不完全正确，整数除以2可能出现小数）。 运算符优先级 多种运算符同时存在时的结合顺序。\n流程控制 流程控制：代码执行的方向。\n控制分类 顺序结构：代码从上往下顺序执行（最基本结构）。 分支结构：给定条件，有多种可执行代码块，根据条件执行某一段。 循环结构：在条件控制范围内，指定代码块重复执行。 顺序结构 最基本结构，所有代码默认从上往下依次执行。\n分支结构 PHP 中分支结构主要有 if 分支和 switch 分支。\nif 分支：\n给定一个条件，同时为该条件设置多种（两种）情况，然后通过条件判断来实现具体的执行段。\n最简 if：只有一段代码，可选择是否执行。 1 2 3 if(条件表达式){ // 满足条件执行的代码 } 基础 if：两面性。 1 2 3 4 5 if(条件表达式){ // 满足条件 }else{ // 不满足条件 } 复杂 if：可在不满足后再次判断。 1 2 3 4 5 6 7 if(条件表达式1){ // 满足1 }else if(条件表达式2){ // 不满足1但满足2 }else{ // 全部不满足 } switch 分支：适合条件单一、固定值匹配的情况。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 switch(条件表达式){ case 值1: // 代码1 break; /* 在 switch 中，如果条件匹配成功，那么系统就不会继续匹配，而是会顺序执行该 case 下的所有代码，如：匹配到了值1，那么就会执行 代码1和代码2（没有 break 的情况）。如果不需要继续执行，那么就需要使用 break 中断 switch。 */ case 值2: // 代码2 break; default: // 都不匹配 break; } 选择：if 能做所有分支结构；switch 处理条件多且单一、固定值匹配的情况。\n循环结构 for 循环：\n1 2 3 4 5 6 7 8 9 10 11 //条件表达式1：定义初始化条件,可以有多种赋值语句存在,使用逗号分隔即可。 //条件表达式 2：边界判定,限定循环执行的次数。 //条件表达式3：用来执行条件变化 for(条件表达式1; 条件表达式2; 条件表达式3){ // 循环体 } //从1到10输出 for($i = 1,$end = 10; $i \u0026lt;= $end; $i++){ echo $i,\u0026#39;\u0026lt;br /\u0026gt;\u0026#39;;\t//循环体 } 执行原理：1 → 2（判断） → 循环体 → 3 → 2（判断）→ \u0026hellip;\nwhile 循环：\n1 2 3 4 5 6 7 8 9 10 11 12 条件初始化; while(条件表达式){ // 循环体 // 条件变化 } $i = 1; //从1输出到10 while($i \u0026lt;= 10){ echo $i++,\u0026#39;\u0026lt;br /\u0026gt;\u0026#39;;//循环体 //循环条件变更\t$i++ } do-while 循环：至少执行一次循环体。\n1 2 3 do { // 循环体 } while(条件); 循环控制：\ncontinue [层级]：重新开始循环（默认1层）。 break [层级]：终止循环。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 $i = 1; while($i \u0026lt;= 100){ //判断是否是5的倍数 if($i % 5 != 0){\t//不是5的倍数 //重新循环 $i++; continue;//重新跳到循环开始时 //终止循环 break; } //输出数值 echo $i++,\u0026#39;\u0026lt;br /\u0026gt;\u0026#39;; } 流程控制替代语法 用于在 HTML 中混写 PHP 时替代大括号，使代码更美观。\n左大括号 { 用冒号 : 替代，右大括号 } 用 end + 起始标记 替代。\n例如：if(): ... endif;、for(...): ... endfor;、switch(): ... endswitch; 等。\n示例：九九乘法表（表格展示）\n1 2 3 4 5 6 7 8 9 10 11 \u0026lt;table border=1\u0026gt; \u0026lt;?php for($i = 1; $i \u0026lt; 10; $i++): ?\u0026gt; \u0026lt;tr\u0026gt; \u0026lt;?php for($j = 1; $j \u0026lt;= $i; $j++): ?\u0026gt; \u0026lt;td\u0026gt; \u0026lt;?php echo $i . \u0026#39; * \u0026#39; . $j . \u0026#39; = \u0026#39; . $i * $j; ?\u0026gt; \u0026lt;/td\u0026gt; \u0026lt;?php endfor; ?\u0026gt; \u0026lt;/tr\u0026gt; \u0026lt;?php endfor; ?\u0026gt; \u0026lt;/table\u0026gt; 文件包含 在一个 PHP 脚本中将另外一个文件包含进来，合作完成任务。\n文件包含的作用 使用被包含文件中的内容，实现代码共享（向上包含）。 将自身内容提供给其他文件使用（向下包含）。 分工协作，多个脚本共同完成任务。 文件包含四种形式 include：包含文件。 include_once：判断是否已包含过，一个文件最多被包含一次。 require：与 include 相同，但错误级别更高（包含出错时停止执行）。 require_once：与 include_once 相同。 向上包含：先包含文件，后使用文件中的内容\n1 2 3 4 5 6 //文件1\t//include1.php \u0026lt;?php //被包含文件：定义数据 $a = 1; define(\u0026#39;PI\u0026#39;,3.14); ?\u0026gt; 1 2 3 4 5 6 7 //文件2\t//include2.php \u0026lt;?php //包含文件：使用数据 //包含当前文件include2.php所在文件夹下的include1.php include \u0026#34;include1.php\u0026#34;; echo $a,PI;//得到结果 13.14 ?\u0026gt; 向下包含：先准备内容，然后包含另外的文件，在另外的文件中，使用当前的内容\n1 2 3 4 5 6 7 8 9 //文件3\t//include3.php \u0026lt;?php //定义数据 $a = 10; const PI = 3.14; //包含文件：为了显示以上数据 include_once \u0026#34;include4.php\u0026#34;; ?\u0026gt; 1 2 3 4 5 //文件4\t//include4.php \u0026lt;table\u0026gt; \u0026lt;tr\u0026gt;\u0026lt;td\u0026gt; \u0026lt;?php echo $a; ?\u0026gt; \u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt; \u0026lt;tr\u0026gt;\u0026lt;td\u0026gt; \u0026lt;?php echo PI; ?\u0026gt; \u0026lt;/td\u0026gt;\u0026lt;/tr\u0026gt; \u0026lt;/table\u0026gt; 文件加载原理 PHP 执行流程：读取代码 → 编译成字节码 → zend engine 解析 opcode → 输出 HTML。\n文件加载时，被包含文件的代码嵌入到当前文件的 include 位置，单独编译。如果被包含文件有错误，在执行到 include 语句时才报错。\ninclude 与 require 的区别 include 和 include_once 的区别 Include：系统会碰到一次，执行一次；如果对同一个文件进行多次加载，那么系统会执行多次； Include_once：系统碰到多次，也只会执行一次。 1 2 3 4 5 //文件1\t//include1.php \u0026lt;?php $a = 10; define(\u0026#39;PI\u0026#39;,3.14); ?\u0026gt; 1 2 3 4 5 6 7 8 //文件2\t//include2.php \u0026lt;?php echo \u0026#34;hello\u0026#34;;//正常执行 include \u0026#34;include1.php\u0026#34;;//正常执行 echo $a;//正常执行 //再次包含 include \u0026#34;include1.php\u0026#34;;//报错,变量不可重复定义 ?\u0026gt; require 和 include 的区别 include 错误级别较轻，不会阻止后续代码执行。 require 要求较高，包含出错后后续代码不再执行。 文件加载路径 绝对路径：从磁盘根目录开始（如 D:/sever/apache/htdocs/include1.php），效率偏低但安全。 相对路径：从当前文件所在目录开始，./ 当前，../ 上级，效率高但容易出错。 1 2 3 4 5 6 7 8 9 10 11 12 \u0026lt;?php //PHP文件加载路径 //绝对路径 include_once \u0026#34;D:/sever/apache/htdocs/include1.php\u0026#34;; //相对路径加载 include_once \u0026#39;include1.php\u0026#39;; //默认当前文件本身 include_once \u0026#34;./include1.php\u0026#34;; //复杂相对路径 include_once \u0026#34;../htdocs/include1.php\u0026#34;; ?\u0026gt; 文件嵌套包含 一个文件包含另一个文件，被包含文件又包含其他文件。嵌套容易导致相对路径出错。\n1 2 //include1.php \u0026lt;?php $a = 10; ?\u0026gt; 1 2 //include2.php \u0026lt;?php include_once \u0026#34;include1.php\u0026#34;; ?\u0026gt; 1 2 3 4 5 6 7 //include3.php \u0026lt;?php //文件嵌套包含 //被包含include2本身包含了include1 include_once \u0026#34;include2.php\u0026#34;; echo $a;//正常输出,得到10 ?\u0026gt; 函数 函数的基本概念 函数（function）是一种语法结构，将实现某一功能的代码块封装起来，实现代码复用。\n函数定义语法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;?php /* Function 函数名 ([参数]){ //函数体 //返回值：return 结果； } */ // 调用可以在定义之前（编译与执行分离） display(); function display(){ echo \u0026#34;hello\u0026#34;; } display(); ?\u0026gt; 函数通过 函数名() 调用。 如果定义时有参数，调用时必须传入对应参数。 函数不会自动运行，必须调用才执行。 只要系统在内存中能够找到对应的函数，就可以执行（函数的调用可以在函数定义之前）。 函数命名规范 由字母、数字和下划线组成，不能以数字开头。常用命名方式：驼峰法（showParentInfo）或下划线法（show_parent_info）。在同一脚本周期内不允许出现同名函数。\n函数的参数 形参与实参：形参是定义时的形式参数，实参是调用时传入的实际数据。PHP 允许实参多于形参（多余不用），但不能少于形参个数。\n形参是实参的载体：实参在调用时通常是需要传入到函数内部参与计算（运算），那么需要在函数内部去找到实际数据所在的位置才能找到数据本身：需要实际调用的时候，将数据以实参的形式传递给形参：给形参赋值，从而使得函数内部可以用到外部数据。\n📝 备注 在PHP中允许实参多余形参（个数）：函数内部不用而已。\n在PHP中理论上形参个数没有限制（实际开发不会太多）。\n实参不能少于形参个数。\n默认值：形参可以设置默认值，当实参未提供时使用。默认值必须放在参数列表的右边。\n1 2 3 4 5 6 7 8 $num1 = 10; //函数的默认值 function add($num1 = 0,$num2 = 0){ echo $num1 + $num2; } //调用：默认值如果存在，可以不再传入 add($num1);//得到 10,且不报错 📝 备注 默认值的定义是放在最后边的（多个），不能左边形参有默认值，但是右边没有。\n函数外部定义的变量名字与函数定义的形参名字冲突（同名）是没有任何关联关系的，如果多个函数使用同样的形参名字也不冲突。\n引用传递：使用 \u0026amp; 符号，使函数内部可以修改外部变量的值。调用时必须传入变量。\n1 2 3 function 函数名 (形参 1, \u0026amp;形参 2){ //函数体 } 在调用的时候，必须给引用传值的参数位置传入实际参数，而且参数本身必须是变量。（变里才有指向的数据的内存地址）\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //定义变量 $a = 10; $b = 5; //函数定义 function add($a, \u0026amp;$b){ $a = $a + $a; $b = $b + $b; echo $a;//得到 20 echo $b;//得到 10 } //调用函数 add($a, $b); echo $a;//得到 10，$a的本身没变 echo $b;//得到 10，$b改变 /* 说明：函数在定义的时侯，对应的b形参采用的是取地址； 所以在实参传入之后，形参b取到了外部变量b的内存地址， 而a取的是值，因此改变之后：a只改变了函数内部的自己； b改变自己的同时也改变了外部 */ 函数体 函数体内可以定义变量、常量，使用流程控制，调用其他函数等。\n函数返回值 使用 return 关键字将结果返回给调用处。所有函数都有返回值，未明确 return 时默认返回 NULL。\n函数的返回值可以是任意数据类型\nreturn 在函数内部会终止函数执行；在文件外部使用 return 可以返回内容给包含它的文件，并终止后续代码。\n作用域 作用域：变量（常量）能够被访问的区域。变量可以在普通代码或函数内部定义。\n在 PHP 中作用域严格来说分为两种：但是 PHP 内部还定义一些在严格意义之外的一种，所以总共算三种：\n全局变量\n函数外部定义只在全局空间使用，函数内部不可直接访问（可通过 $GLOBALS 或参数传递）。 函数周期：直到脚本运行结束（最后一行代码执行完）。 局部变量\n函数内部定义，只在当前函数内使用。 函数周期：函数执行结束即销毁。 超全局变量\n系统预定义（如 $_SERVER），无访问限制。 超全局变量会将全局变量自动纳入到$GLOBALS 里面，而$GLOBALS 没有作用城限制，所以能够帮助局部去访问全局变量：但是必须使用数组方式。 global 关键字可以在函数内部声明全局变量，使局部与全局共享同一内存空间。\n基本语法：\n1 2 global 变量名;//不能赋值 变量名 = 值; //修改 具体使用示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $str_a = \u0026#34;this a\u0026#34;; function str(){ //定义变量：使用全局变量 global $str_a; echo $str_a; //定义变量：全局不存在 global $str_b; $str_b = \u0026#34;this b\u0026#34;; } //调用函数 str();//可以得到输出：this a //访问‘局部’变量 echo $str_b;//可以得到输出：this b 虽然以上方式可以实现局部与全局的互访，但是通常不会这么用。一般如果会存在特殊使用，也会使用参数的形式来访问。（还可以使用常量：define定义的）\n静态变量 static是在函数内部定义的变量，使用 static 关键字修饰，用来实现跨函数共享数据的变量：函数运行结束，所有同部变量都会清空，如果重新运行一下函数,所有的局部变量又会重新初始化。\n静态变量的使用：\n为了统计当前函数被调用的次数。 ：为了统筹函数多次调用得到的不同结果（递归思想）。 基本语法\n1 2 3 4 function 函数名(){ //定义变量 static $变量名 = 值;//通常会在定义的时候就直接赋值 } 静态变量的作用是为了跨函数共享数据（同一个变量多次调用）\n1 2 3 4 5 6 7 function countCall(){ static $count = 0; $count++; echo $count; } countCall(); // 1 countCall(); // 2 可变函数 如果变量保存的值刚好是一个函数的名字，可以使用 $变量() 来调用该函数。\n1 2 3 4 5 $func = \u0026#39;display\u0026#39;; function display(){ echo \u0026#39;hello\u0026#39;; } $func(); // 输出 hello 可变函数在系统使用的过程中还是比较多的，尤其是使用很多系统函数的时候：需要用户在外部定义一个自定义函数，但是是需要传入到系统函数内部使用。\n匿名函数（闭包） 没有名字的函数，通常赋值给变量。\n1 2 3 4 $greet = function($name){ echo \u0026#34;Hello, $name\u0026#34;; }; $greet(\u0026#39;Tom\u0026#39;); 闭包：匿名函数可以使用 use 关键字引用外部变量，即使外部函数已执行完毕，这些变量仍被保留。\n1 2 3 4 5 6 7 8 function getClosure(){ $msg = \u0026#39;hello\u0026#39;; return function() use ($msg){ echo $msg; }; } $closure = getClosure(); $closure(); // hello 证明：函数的局部变量在函数使用完之后没有被释放\n使用内部匿名函数； 匿名函数使用局部变量：use； 匿名函数被返回给外部使用； 伪类型 假类型，实际上在 PHP 中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习。\n伪类型主要有两种：在三大类八小类之外。\nmixed：可以是多种数据类型。 number：可以是整型或浮点型。 常用系统函数 输出函数 print()：类似 echo，返回 1。 print_r()：简化版的 var_dump，只输出值（常用于数组）。 header('Content-type:text/html;charset=utf-8')：设置浏览器字符集。 时间函数 date('Y-m-d H:i:s'[, 时间戳])：格式化时间戳。 time()：当前时间戳。 microtime()：微秒级时间。 strtotime()：字符串转时间戳。 数学函数 max() / min()：最大/最小值。 rand() / mt_rand()：随机数（推荐 mt_rand）。 round()：四舍五入；ceil() 向上取整；floor() 向下取整。 pow()：乘方；abs() 绝对值；sqrt() 平方根。 函数相关函数 function_exists('函数名')：判断函数是否存在。 func_get_arg($n)：获取第 n 个参数。 func_get_args()：获取所有参数（数组）。 func_num_args()：获取参数数量。 错误处理 错误处理：指的是系统（或者用户）在对某些代码进行执行的时候，发现有错误，就会通过错误处理的形式告知程序员。\n错误分类 语法错误：编译不通过，代码不执行（Parse error）。\n用户书写的代码不符合PHP的语法规范，语法错误会导致代码在编译过程中不通过，所以代码不会执行（Parse error）。 运行时错误：编译通过，执行时条件不满足导致（如调用未定义函数）。\n逻辑错误：代码正常执行但结果不符合预期。\n错误代号（系统常量） E_PARSE：编译错误。 E_ERROR：致命错误，代码不能继续执行。 E_WARNING：警告，不影响执行但可能结果异常。 E_NOTICE：通知，不影响执行。 E_USER_ERROR / E_USER_WARNING / E_USER_NOTICE：用户自定义错误。 E_ALL：所有错误。 错误触发 系统自动触发。系统自动根据错误发生后，对比对应的错误信息，输出给用户：主要针对代码的语法错误和运行时错误。\n人为触发：trigger_error('错误信息'[, 错误类型])。知道某些逻辑可能会出错，从而使用对应的判断代码来触发响应的错误提示。\nTrigger_error(错误提示); 可以通过第二个参数进行严格性控制。 错误显示设置 哪些错误该显示，以及该如何显示。在 PHP 中，其实有两种方式来设置当前脚本的错误处理。\n在配置文件 php.ini 中：display_errors = On是否显示错误，error_reporting = E_ALL显示什么级别的错误。 在脚本中：在脚本中定义的配置项级别比配置文件高（通常在开发当中都会在代码中去进行控制和配置）。ini_set('display_errors', 1); error_reporting(E_ALL); error_reporting()：设置对应的错误显示级别。 ini_set(\u0026ldquo;配置文件中的配置项“,配置值)。 错误日志设置 生产环境通常不显示错误，而是记录到日志文件。在 php.ini 中设置 log_errors = On 和 error_log = 路径。\n自定义错误处理 最简单的错误处理：trigger_errors()函数，但是该函数不会阻止系统报错。\nPHP系统提供了一种用户处理错误的机制：用户自定义错误处理函数，然后将该函数增加到系统错误处理的句柄中，然后系统会在碰到错误之后，使用用户定义的错误函数。\n使用 set_error_handler('自定义函数') 接管系统错误处理。 自定义错误处理函数，系统有要求。 代码实现：\n自定义错误处理函数：注意参数 注册自定义函数：修改错误处理机制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 \u0026lt;?php header(\u0026#34;Content-type:text/html;charset=utf-8\u0026#34;); //自定义函数 //$error,是系统提供的错误代码:E_ALL,E_NOTICE function my_error($errno,$errstr,$errfile,$errline){ //判断：当前会碰到的错误有哪些.排除当前本身系统就要排除的错误 if(!(error_reporting() \u0026amp; $errno)){ return false; //error_reporting没有参数代表获取当前系统错误处理对应的级别 } //开始判断错误类型 switch($errno){//错误匹配 case E_ERROR: case E_USER_ERROR: echo \u0026#34;fltal error in file \u0026#34; . $errfile . \u0026#34; on line\u0026#34; . $errline . \u0026#34;\u0026lt;br /\u0026gt;\u0026#34;; echo \u0026#34;error info: \u0026#34; . $errstr; break; case E_WARNING: case E_USER_WARNING: echo \u0026#34;warning in file \u0026#34; . $errfile . \u0026#34; on line\u0026#34; . $errline . \u0026#34;\u0026lt;br /\u0026gt;\u0026#34;; echo \u0026#34;error info: \u0026#34; . $errstr; break; case E_NOTICE: case E_USER_NOTICE: echo \u0026#34;notice in file \u0026#34; . $errfile . \u0026#34; on line\u0026#34; . $errline . \u0026#34;\u0026lt;br /\u0026gt;\u0026#34;; echo \u0026#34;error info: \u0026#34; . $errstr; break; } return true; } //报错 echo $a;//未定义报错 //修改错误机制 set_error_handler(\u0026#34;my_error\u0026#34;); echo $a;//报自定义的错 ?\u0026gt; 当前属于简单自定义模式，如果要复杂，可以在某些影响代码功能的错误发生后，让用户跳转到某个指定界面。\n字符串 字符串定义语法 单引号：$str = 'content'; 不解析变量和转义（除 \\' 和 \\\\）。\n双引号：$str = \u0026quot;content\u0026quot;; 解析变量和转义（\\n、\\r、\\t、\\$ 等）。\n1 2 3 $name = \u0026#39;Tom\u0026#39;; echo \u0026#34;Hello $name\u0026#34;; // Hello Tom echo \u0026#39;Hello $name\u0026#39;; // Hello $name 比较适合定义那些比较短（不超过一行）或者没有结构要求的字符串。\nNowdoc（无单引号的单引号字符串）：$str = \u0026lt;\u0026lt;\u0026lt;'EOT' ... EOT;，不解析变量。 Heredoc（无双引号的双引号字符串）：$str = \u0026lt;\u0026lt;\u0026lt;EOT ... EOT;，解析变量。 适合有结构要求，或者内容超过一行。\n无引号字符串与有引号字符串的区别\n字符串转义 常用转义符：\n\\'：在单引号字符串中显示单引号。\n\\\u0026quot;：在双引号字符串中显示双引号。\n\\r：代表回车（理论上是回到当前行的首位置）。\n\\n：代表新一行。\n\\t：类似 tap 键，输出4个空格。\n\\$：在PHP中使用$符号作为变量符号，因此需要特定识别。\n单引号和双引号的区别：\n单引号中能够识别\\\u0026rsquo;，而双引号中就不能识别\\\u0026rsquo;。 双引号中因为能够识别$符号，所以双引号中可以解析变量，而单引号不可以。 双引号中变量识别的规则：\n变量本身系统能够与后面的内容区分：应该保证变量的独立性，不要让系统难以区分。 使用变量专业标识符（区分），给变量加上一组大括号{}; 双引号中解析变量的规则：为保证变量独立，可使用 {$var} 或 ${var}。 结构化定义字符串变量的规则：\n结构化定义字符串对应的边界符有条件：\n上边界符后面不能跟任何内容； 下边界符必须顶格：最左边； 下边界同样后面只能跟分号，不能跟任何内容； 结构化定义字符串的内部（边界符之间）的所有内容都是字符串本身。\n字符串长度 strlen()：字节长度（中文在 UTF-8 下占 3 字节）。 mb_strlen($str, 'utf-8')：多字节字符串长度，需开启 mbstring 扩展。 常用字符串函数 转换\nimplode()（数组→字符串），将数组中的元素按照某个规则连接成一个字符串。\nexplode()（字符串→数组）,将字符串按照某个格式进行分割，变成数组。\n中国|北京|顺义 == array(\u0026ldquo;中国，北京\u0026quot;顺义); str_split()。按照指定长度拆分字符串得到数组。\n截取\ntrim(字符串[,指定字符])（去两边空格或指定字符） ltrim() rtrim() 子串\nsubstr(字符串,起始位置从 0 开始[长度])，指定位置开始截取字符串，可以截取指定长度（不指定到最后） strstr(字符串,匹配字符)，从指定位置开始，截取到最后（可以用来去文件后缀名）。 大小写\nstrtolower()，全部小写。 strtoupper()，全部大写。 ucfirst()，首字母大写。 查找\nstrpos()，判断字符在目标字符串中出现的位置（首次）。 strrpos()，判断字符在目标字符串中最后出现的位置。 1 2 3 4 $str = \u0026#34;12a4a67a\u0026#34;; //查找位置 echo strpos($str,\u0026#34;a\u0026#34;);//得到 2，从0开始 echo strrpos($str,\u0026#34;a\u0026#34;);//得到 7 替换\nstr_replace(匹配目标,替换的内容,字符串本身)，将目标字符串中部分字符串进行替换。 1 2 3 $str = \u0026#34;abacd\u0026#34;; //字符串替换 echo str_replace(\u0026#34;a\u0026#34;,\u0026#34;b\u0026#34;,$str);//得到 bbbcd 格式化\nprintf()， sprintf() 1 2 3 4 5 $age = 10; $name = \u0026#34;tom\u0026#34;; //格式化输出 echo printf(\u0026#34;我叫%s,我%d岁了\u0026#34;,$name,$age); //得到 我叫tom,我10岁了 重复/打乱\nstr_repeat()，重复某个字符串N次。\nstr_shuffle()，随机打乱字符串。\n1 2 3 $str = \u0026#34;abcd\u0026#34;; echo str_repeat($str,2);//得到 abcdabcd echo str_shuffle($str);//得到一个打乱了的字符串 数组 数组的概念 数组（array）是将一组数据存储到一个容器中，通过变量指向容器，从而一次性获取所有数据。\n数组定义语法 使用 array() 关键字：\n1 $arr = array(元素1, 元素2, ...); 使用中括号 []（PHP 5.4+）：\n1 $arr = [元素1, 元素2, ...]; 隐式定义：给变量加上中括号，系统自动转为数组。\n1 2 $arr[] = 值1; //如果不提供下标也可以，系统自动生成（数字：从 0 开始） $arr[下标] = 值2; //该下标可以是字母（单词）或者数字，与变量命名的规则相似。 PHP 数组特点 下标可以是整数或字符串，可混合（索引数组/关联数组/混合数组）。 元素顺序以放入顺序为准，与下标无关。 数字下标自动增长，从 0 开始，若手动指定较大下标，后续自动增长从最大值+1 开始。 特殊值下标自动转换：true→1，false→0，NULL→空字符串。 元素无类型限制，无长度限制。 数组存储在堆区，分配连续内存。 多维数组 数组中元素又是数组，支持任意维度（不建议超过三维）。二维数组示例：\n1 2 3 4 5 $arr = array( 0 =\u0026gt; array(\u0026#39;name\u0026#39; =\u0026gt; \u0026#39;Tom\u0026#39;), 1 =\u0026gt; array(\u0026#39;name\u0026#39; =\u0026gt; \u0026#39;Jim\u0026#39;) ); echo $arr[1][\u0026#39;name\u0026#39;]; // Jim 数组遍历 普通数组数据的访问都是通过数组元素的下标来实现访问，如果说数组中所有的数据都需要依次输出出来，就需要我们使用到一些简化的规则来实现自动获取下标以及输出数组元素。\n1 2 3 4 5 6 7 8 9 10 11 //二维数组 $arr = array( 0 =\u0026gt; array(\u0026#39;name\u0026#39; =\u0026gt; \u0026#39;Tom\u0026#39;), 1 =\u0026gt; array(\u0026#39;name\u0026#39; =\u0026gt; \u0026#39;Jim\u0026#39;) ); //访问一维元素：$arr[一维下标] $arr[0];//结果：array(\u0026#39;name\u0026#39; =\u0026gt; \u0026#39;Tom\u0026#39;); //访问二维元素：$arr[一维下标][二维下标] $arr[1][\u0026#39;name\u0026#39;]; //得到 Jim foreach 遍历： foreach($数组变量 as [$下标 =\u0026gt;] $值）\n1 2 3 foreach($arr as $key =\u0026gt; $value){ // $key 为下标，$value 为值 } foreach 会重置数组指针。\nfor 循环遍历（要求数字索引连续）：\n1 2 3 for($i = 0, $len = count($arr); $i \u0026lt; $len; $i++){ echo $arr[$i]; } while + each + list 遍历：\neach() 返回当前指针位置的键值对数组（四个元素：0,1,key,value），指针下移。\nlist() 将数组元素赋值给变量。\n组合使用可实现遍历。\nEach函数使用：each 能够从一个数组中获取当前数组指针所指向的元素的下标和值，拿到之后将数组指针下移，同时将拿到的元素下标和值以一个四个元素的数组返回：\n0 下标 \u0026ndash;\u0026gt; 取得元素的下标值 1 下标 \u0026ndash;\u0026gt; 取得元素的值 Key 下标 \u0026ndash;\u0026gt; 取得元素的下标值 Value 下标 \u0026ndash;\u0026gt; 取得元素的值 如果 each 取不到结果（数组指针移动到最后），返回 false\nList 函数使用：list 是一种结构，不是一种函数（没有返回值），是 list 提供一堆变量去从一个数组中取得元素值，然后依次存放到对应的变量当中（批量为变量赋值：值来源于数组）：\nlist 必须从索引数组中去获取数据，而且必须从 0 开始。\n正确：\n错误：变量多于数组元素，没有指定从 0 到指定变量的下标的数组元素。\n所以 List 与 each 可以配合：each 一定有两个元素就是 0 和 1 下标元素。\nList[变量 1,变量 2)= each(数组); //是一种赋值运算，但是可以得到 false 结果（each 取不到正确的结果），整个表达式为 false\n数组相关函数 排序函数：\nsort() / rsort()：顺序/逆序，下标重排。\nasort() / arsort()：顺序/逆序，保留下标。\nksort() / krsort()：按键名排序。\nshuffle()：随机打乱。\n指针函数：\nreset() / end()：重置到首位/末位。\nnext() / prev()：下移/上移。\ncurrent() / key()：获取当前值/下标。\n注意事项：next 和 prev 会移动指针，有可能导致指针移动到最前或者最后（离开数组），导致数组不能使用，通过 next 和 prev 不能回到正确的指针位置。只能通过 end 或者 reset 进行指针重置。\n其他函数：\ncount()：元素个数。 array_push() / array_pop()：尾部添加/删除。 array_shift() / array_unshift()：头部删除/添加。 array_reverse()：反转。 in_array()：判断值是否存在。 array_keys() / array_values()：获取所有键/所有值。 ","date":"2022-11-19T00:00:00Z","image":"/p/php-%E5%9F%BA%E7%A1%80/%E5%B0%81%E9%9D%A2.jpg","permalink":"/p/php-%E5%9F%BA%E7%A1%80/","title":"PHP 基础"},{"content":"1. Python 程序的扩展名与提示符 扩展名 1 2 3 4 5 扩展名：.py , .pyc , .pyo , .pyd 。 .py 是源文件，.pyc 是源文件编译后的文件，.pyo 是源文件优化编译后的文件，.pyd 是其他语言写的 Python 库。 知道 .py 和 .pyc 应该就够了。 提示符 1 \u0026gt;\u0026gt;\u0026gt; 请记住三个 \u0026gt; 号。\n2. 关于 Python 在变量声明、创建、释放等内存管理与其他语言的差别 变量声明与创建\n变量无需事先声明 变量无需指定类型 程序员不用关心内存管理 变量名会被“回收” del 语句能够直接释放资源 大多数编译型语言，变量在使用前必须先声明，但在 Python 中变量在第一次被赋值时自动声明。和其他大多数语言一样，变量只有被创建和赋值后才能被使用。 变量一旦被赋值，就可以通过变量名来访问。 内存管理（不确定）\n在 Python 中，一个对象一旦被创建，它在内存中的大小就是不变的。 引用计数 + 垃圾回收机制。 参考：Python 内存管理 Java 和 Python 内存管理机制区别 3. Python 语言命名规则 模块（软件包名）\n模块尽量使用小写命名，首字母保持小写，尽量不要用下划线（除非多个单词且数量不多的情况）。\n例如：import thisname、import this_name\n不规范：import Thisname\n类名\n类名使用驼峰（CamelCase）命名风格，首字母大写，私有类用一个下划线开头。\n例如：class Add():、class AddNum():、class _Private():\n函数\n函数名一律小写，如有多个单词，用下划线隔开。\n例如：def run():、def add_num():\n变量名\n变量名尽量小写，如有多个单词，用下划线隔开。不能使用关键字（Python 本身已经使用的字）或保留字。\n例如：number = 1、school_name = \u0026quot;px\u0026quot;\n常量\n常量使用以下划线分隔的大写命名。\n例如：MAX_NUM = 100\n4. Python 的多行注释方式 1 2 3 4 5 6 7 8 # 三个单引号 或 三个双引号 \u0026#39;\u0026#39;\u0026#39; 这是多行注释 \u0026#39;\u0026#39;\u0026#39; \u0026#34;\u0026#34;\u0026#34; 这也是多行注释 \u0026#34;\u0026#34;\u0026#34; 5. 浮点数的科学计数法表示 使用字母 e 或 E 作为幂的符号，以 10 为基数。\n例如：4.3e-3 即 4.3*10^{-3}，值为 0.0043；9.6E3 即 9600。\n6. pow() 函数 1 pow(x, y) # 返回 x 的 y 次方 示例：\npow(3, 2) → 9\npow(10, 3) → 1000\n7. round() 函数 1 round(x, y) # 返回浮点数 x 的四舍五入值，y 为要保留的小数位数 示例：\nround(30.12345) → 30\nround(-100.123) → -100\nround(60.12345, 2) → 60.12\nround(100.0002, 3) → 100.0\n8. 字符串切片操作（如 s[3:-3]） 1 2 str = \u0026#34;hello the world\u0026#34; str[x:y] # 取 str 中从 x 开始到 y 的字符，x 从 0 开始，y 为负数时从末尾倒数（-1 表示最后一个字符） 示例：\nstr[0:2] → \u0026quot;he\u0026quot;\nstr[:3] → \u0026quot;hel\u0026quot;\nstr[1:] → \u0026quot;ello the world\u0026quot;\nstr[0:-1] → \u0026quot;hello the worl\u0026quot; str[:-6] → \u0026quot;hello the\u0026quot;\n9. Python 代码块以缩进区分 1 2 3 4 def add(): # 这是函数体内 pass # 这是函数体外 10. Lambda 函数：参数、函数体和返回值 当我们想要使用一个简单定义的、或者只需要调用一两次的函数时，取名比较麻烦，使用 lambda 匿名函数可以省去这一步骤。\n1 2 3 4 5 6 # x 是传入的参数 a = lambda x: x * 10 print(a(1)) # 10 # 相当于 def a(x): return x * 10 11. print 格式化：% 格式化或 format 格式化两种方式 参考：Python 格式化输出的三种方式\n% 格式化 符号 说明 %c 格式化字符及其 ASCII 码 %s 格式化字符串 %d 格式化整数 %o 格式化八进制数（不能带小数点） %x 格式化十六进制数（不能带小数点） %f 格式化浮点数，可控制小数点后位数 %e 将数字转化成科学计数法形式 1 2 3 name = \u0026#34;lucy\u0026#34; age = 18 print(\u0026#34;my name is %s, i am %d years old\u0026#34; % (name, age)) format 格式化 模板：print('xxx{}x{}x'.format(x,y))\n{} 中常用方法：\n模板 说明 {:a\u0026lt;3} 用 a 填充长度为 3，内容靠左（\u0026lt; 左对齐，^ 居中，\u0026gt; 右对齐） {:f} 转换为浮点数（默认保留 6 位小数） {:.a} 控制浮点数保留 a 位小数 {:+} 显示正负号 {:e} 科学计数法 {:%} 转换为百分数 {:b} {:d} {:o} {:x} 二进制、十进制、八进制、十六进制 1 2 3 name = \u0026#34;lucy\u0026#34; age = 18 print(\u0026#34;my name is {}, i am {} years old\u0026#34;.format(name, age)) 12. IPO（Input Processing Output）模式包含哪些部分 参考：Python 第二课：IPO 模式\nI（Input，输入）：程序的输入（文件输入、网络输入、用户手工输入、随机数据输入、程序内部参数输入等）。例如从键盘接收两个数 a 和 b，这个过程就是输入。由于 input 一般接受字符串类型，所以需要使用 eval 函数去掉字符串两边的引号，使其变为整数类型。 P（Process，处理）：算法，程序的主要逻辑。程序对输入进行处理产生结果，处理方法也叫算法。这是程序的灵魂。 O（Output，输出）：程序的输出（屏幕显示输出、文件输出、网络输出、操作系统内部变量输出等）。 13. 复数：real、imag 各代表哪部分 复数由 实部（real） 和 虚部（imag） 构成，形式为 x + yj，其中 j 或 J 表示虚部后缀。 具体格式：a + bj，a 为实部（real），b 为虚部（imag）。 1 2 3 4 5 6 a1 = 3 + 2j a2 = 2 + 5j print(type(a1)) # \u0026lt;class \u0026#39;complex\u0026#39;\u0026gt; print(a1 + a2) # (5+7j) print(a1 * a2) # (-4+19j) # 乘法计算过程：(3+2j)*(2+5j) = 6 +15j +4j -10 = -4 +19j 14. 字符串比较规则 1 2 3 4 5 6 7 8 9 # 字符串比较操作： # 运算符：\u0026gt;, \u0026gt;=, \u0026lt;, \u0026lt;=, ==, != # 比较规则：首先比较两个字符串中的第一个字符，如果相等则继续比较下一个字符，直到不等时，其比较结果就是两个字符串的比较结果，后续字符不再比较。 # 比较原理：比较字符的 ordinal value（原始值），内置函数 ord() 获取 ASCII 码，chr() 则相反。 print(\u0026#39;apple\u0026#39; \u0026gt; \u0026#39;app\u0026#39;) # True print(\u0026#39;apple\u0026#39; \u0026gt; \u0026#39;banana\u0026#39;) # False（\u0026#39;a\u0026#39; 的 ASCII 97 \u0026lt; \u0026#39;b\u0026#39; 的 98） print(ord(\u0026#39;a\u0026#39;), ord(\u0026#39;b\u0026#39;)) # 97 98 print(chr(97), chr(98)) # a b is 与 == 的区别 参考：Python 中 is 和 == 的区别\n== 比较的是 值（value）。 is 比较的是 内存地址（id）。 只有数值型和字符串型，且在通用对象池中的情况下，a is b 才为 True；否则对于 int、str、tuple、list、dict、set 等，a is b 通常为 False。 1 2 3 4 5 6 7 8 9 10 a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True print(a is b) # False print(id(a), id(b)) # 不同地址 a = b = [1, 2, 3] print(a == b) # True print(a is b) # True print(id(a), id(b)) # 相同地址 15. while 循环的使用 参考：Python 中 while 循环讲解【详细】 和 Python 教程：while 循环用法讲解\n基本形式：\n1 2 while 判断条件: 执行语句 求和示例：\n1 2 3 4 5 6 n = 0 sum = 0 while n \u0026lt;= 100: sum += n n += 1 print(sum) # 5050（1 加到 100） while 与 else 搭配：当 while 判断条件为 False 时执行 else。\n1 2 3 4 5 6 7 n = 0 while n \u0026lt; 3: print(n) n += 1 else: print(\u0026#34;else\u0026#34;) # 输出：0 1 2 else 16. 递归调用的终止条件 参考：Python 之函数的递归调用 - 知乎\n递归函数停止的条件一般定义在递归函数内部，在递归调用前进行条件判断，根据结果选择继续调用自身还是 return 返回。常见停止条件：\n判断递归次数是否达到某一限定值。 判断运算结果是否达到某个范围等，根据设计目的选择。 附：Python 递归超过一定次数后会抛出异常（报错，终止）。\n17. 文件的读写，尤其是 CSV 文件的读写 参考：Python open() 函数\n普通文件读写：\n1 2 3 4 5 6 7 8 # 方法一 f = open(\u0026#34;D://123.txt\u0026#34;, \u0026#34;w\u0026#34;) f.write(\u0026#34;123\u0026#34;) f.close() # 方法二（推荐，自动关闭） with open(\u0026#34;D://123.txt\u0026#34;, \u0026#34;w\u0026#34;) as f: f.write(\u0026#34;123\u0026#34;) CSV 文件：CSV（Comma-Separated Values）是一种逗号分隔值格式的纯文本文件，用于存储数据。每条记录由换行符分隔，字段间用逗号或其他字符分隔。\n1 2 3 id,name,age 0,张三,19 1,李四,20 18. Request 请求失败的常用做法 修改请求头中的 User-Agent（客户端软件类型）。 默认请求头（容易被识别为爬虫）：\n1 2 3 4 5 6 GET / HTTP/1.1 Host: www.qq.com User-Agent: python-requests/2.25.1 Accept-Encoding: gzip, deflate Accept: */* Connection: close 修改 User-Agent 为浏览器标识：\n1 2 3 4 5 6 7 import requests url = \u0026#34;http://www.qq.com\u0026#34; heads = { \u0026#34;User-Agent\u0026#34;: \u0026#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\u0026#34; } data = requests.get(url, headers=heads) 修改后的请求头：\n1 2 3 4 5 6 GET / HTTP/1.1 Host: www.qq.com User-Agent: Mozilla/5.0 (...) Accept-Encoding: gzip, deflate Accept: */* Connection: close 19. 集合的操作：|、-、\u0026amp;、^ 集合是无序且无索引的，用花括号 {} 表示。 集合一旦创建，不能更改元素，但可以添加或删除。 集合中不允许有重复元素。 1 2 3 4 5 6 7 8 9 a = set(\u0026#39;abracadabra\u0026#39;) b = set(\u0026#39;alacazam\u0026#39;) print(a) # {\u0026#39;a\u0026#39;, \u0026#39;r\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;d\u0026#39;} print(b) # {\u0026#39;a\u0026#39;, \u0026#39;l\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;z\u0026#39;, \u0026#39;m\u0026#39;} print(a - b) # 在 a 但不在 b 中：{\u0026#39;r\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;b\u0026#39;} print(a | b) # 并集：{\u0026#39;a\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;r\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;m\u0026#39;, \u0026#39;z\u0026#39;, \u0026#39;l\u0026#39;} print(a \u0026amp; b) # 交集：{\u0026#39;a\u0026#39;, \u0026#39;c\u0026#39;} print(a ^ b) # 对称差集（不同时包含）：{\u0026#39;r\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;m\u0026#39;, \u0026#39;z\u0026#39;, \u0026#39;l\u0026#39;} 20. 循环保留字：break 与 continue 的差别和作用 break：跳出循环，执行循环之后的语句。 continue：终止本次循环，执行下一次循环。 break 示例 1 2 3 4 5 6 7 for a in range(10): for b in range(5): if a == b: print(a, b) break print(\u0026#34;123\u0026#34;) # 当 a == b 时，break 终止内层 for 循环，继续外层下一次迭代 continue 示例 1 2 3 4 5 6 7 for a in range(10): for b in range(5): if a == b: print(a, b) continue print(\u0026#34;123\u0026#34;) # 当 a == b 时，continue 跳过本次内层循环的后续代码，继续内层下一次迭代 21. 伪随机数 计算机生成的随机数都是伪随机数。 random 模块提供随机数生成功能，可设置随机数种子 seed() 保证每次运行结果一致。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import random def randomness(): rum = random.randint(1, 100) print(rum) randomness() # 每次运行结果可能不同 def random_seed(seed=1): random.seed(seed) rum = random.randint(1, 100) print(rum) random_seed(2) # 8 random_seed(3) # 31 random_seed(2) # 8（相同种子结果相同） random_seed(3) # 31 22. Python 根据命名空间寻找变量的过程 查找顺序：局部命名空间 → 全局命名空间 → 内置命名空间\n命名空间：从名称（变量名）到对象的映射，大部分通过 Python 字典实现。不同命名空间中的同名标识符不会冲突。 作用：避免命名冲突。 参考：Python 命名空间的加载与查找顺序 23. 字典的创建和使用 参考：Python 字典（创建方式、常用操作方式）\n字典通过键值对 key: value 存储数据：\nkey 在同一个字典内不可重复 value 可以重复 创建方法：\n1 2 3 4 5 6 7 8 9 # 花括号手动创建 dic = { \u0026#34;name\u0026#34;: \u0026#34;张三\u0026#34;, \u0026#34;age\u0026#34;: 18, 18: \u0026#34;123\u0026#34; } # 使用 dict() 函数创建 dict(key1=value1, key2=value2) 常用操作：\n1 2 3 4 dic.get(key) # 获取 key 对应的 value，不存在则返回 None dic.get(key, \u0026#34;备用\u0026#34;) # 不存在则返回 \u0026#34;备用\u0026#34; dic.keys() # 返回所有 key dic.values() # 返回所有 value 24. 用户输入函数 参考：Python 之 input() 函数 - 知乎\n1 str = input(\u0026#34;请输入: \u0026#34;) 25. 爬取指定 HTML 标签下的内容 re（正则表达式） bs4（BeautifulSoup4）（老师讲的） xpath 参考：\nPython 第三方模块之 beautifulsoup (bs4) Bilibili 爬虫教学 P28-P32 ","date":"2022-08-31T00:00:00Z","permalink":"/p/python-%E5%B0%8F%E7%9F%A5%E8%AF%86/","title":"Python 小知识"},{"content":"Nessus 破解版插件下载 | 202201111911 nessus plugin pro 来源于：Nessus破解版插件下载（需要梯子）\n本次更新插件版本为 all-2.0_202201111911.tar.gz\n先说一下 Nessus 10.0.2 的破解方法，部分人说换到 Nessus 10.0.2 会出各种问题。\nNessus 10.0.2 破解方法（以 Kali Linux 为例） 准备工作 卸载旧版本 Nessus\n1 apt remove nessus 重启 Kali Linux\n1 reboot 删除残留文件\n1 rm -rf /opt/nessus/var/nessus ① 下载安装包 Nessus 安装包现已更新至 10.0.2 版本。\nLinux 安装包下载地址：Nessus-10.0.2-debian6_amd64.deb 也可以自己到官网下载适合自己系统的版本：Tenable Nessus 下载页 可点击图片跳转原图链接\n② 安装方法 使用如下命令进行安装：\n1 dpkg -i Nessus-10.0.2-debian6_amd64.deb （此处用的是 10.0.1 的图，本质是一样的）\n③ 启动 Nessus 1 sudo systemctl start nessusd \u0026amp;\u0026amp; systemctl --no-pager status nessusd ④ 访问 Nessus 并进行配置 [1] 浏览器打开如下任意一个网址： https://127.0.0.1:8834/ https://ddosi:8834/（将 ddosi 替换成你的 Kali 主机名） https://localhost:8834/ [2] 选择最后一个 —— Managed Scanner [3] 选择 Tenable.sc [4] 设置 Nessus 账号密码 例如：\n用户名：root\n密码：www.ddosi.org\n安装完成后界面如下（尚未激活，只能看到设置按钮，无扫描按钮）：\n（此处使用的是 8.15 版本的图，本质是一样的）\n⑤ 更新插件 插件下载 云中转网盘：https://yzzpan.com/#sharefile=fCSsVfsp_26946 解压密码：www.ddosi.org 不会解压的请自行搜索往期文章。\n更新插件命令 1 /opt/nessus/sbin/nessuscli update all-2.0_202201111911.tar.gz 更新过程请耐心等待。\n⑥ 修改 plugin_feed_info.inc 文件 打开目录 /opt/nessus/var/nessus/\n找到文件 plugin_feed_info.inc\n修改 plugin_feed_info.inc 为以下内容并保存：\n1 2 3 PLUGIN_SET = \u0026#34;202201111911\u0026#34;; PLUGIN_FEED = \u0026#34;ProfessionalFeed (Direct)\u0026#34;; PLUGIN_FEED_TRANSPORT = \u0026#34;Tenable Network Security Lightning\u0026#34;; 复制已修改过的 plugin_feed_info.inc 文件到 /opt/nessus/var/nessus/plugins/ 目录下\n如果没有 plugins 目录，则手动创建一个。 ⑦ 重启 Nessus 先停止服务：\n1 /bin/systemctl stop nessusd.service 再启动服务：\n1 /bin/systemctl start nessusd.service 打开 Nessus 网页，等待配置完成。\n至此破解完成。\n插件数量总数变化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 AIX Local Security Checks 11140 Amazon Linux Local Security Checks 2082 Backdoors 121 Brute force attacks 26 CentOS Local Security Checks 3942 CGI abuses 4607 CGI abuses : XSS 690 CISCO 2025 Databases 772 Debian Local Security Checks 7829 Default Unix Accounts 171 Denial of Service 110 DNS 210 F5 Networks Local Security Checks 1086 Fedora Local Security Checks 16421 Firewalls 314 FreeBSD Local Security Checks 4865 FTP 259 Gain a shell remotely 282 General 315 Gentoo Local Security Checks 3157 HP-UX Local Security Checks 1983 Huawei Local Security Checks 6108 Junos Local Security Checks 433 MacOS X Local Security Checks 1830 Mandriva Local Security Checks 3641 Misc. 2526 Netware 14 NewStart CGSL Local Security Checks 1099 Oracle Linux Local Security Checks 4302 OracleVM Local Security Checks 571 Palo Alto Local Security Checks 150 Peer-To-Peer File Sharing 102 PhotonOS Local Security Checks 1895 Policy Compliance 60 Red Hat Local Security Checks 8416 RPC 39 SCADA 361 Scientific Linux Local Security Checks 3191 Service detection 529 Settings 112 Slackware Local Security Checks 1259 SMTP problems 150 SNMP 33 Solaris Local Security Checks 3760 SuSE Local Security Checks 18505 Ubuntu Local Security Checks 5769 Virtuozzo Local Security Checks 341 VMware ESX Local Security Checks 141 Web Servers 1445 Windows 5363 Windows : Microsoft Bulletins 2442 Windows : User management 29 测试截图 可正常使用扫描漏洞：\n注意事项 提示 每次重启后需要重新启动 Nessus 服务，使用如下命令即可：\n1 sudo systemctl start nessusd \u0026amp;\u0026amp; systemctl --no-pager status nessusd 有任何其他问题，可留言或发邮件给我：cpu@usa.com\n建议：Nessus 在 Linux 中的扫描速度比在 Windows 中快很多，因此推荐使用 Linux 进行安装。\nWindows 用户可参考这篇文章：Nessus Pro 8.13.1 破解版 + 插件 + 激活方法\n工具仅可作为有授权的渗透测试使用，切勿用于违法犯罪。\n插件以后会视情况更新。\n转载请注明出处及链接\n漏洞扫描器 | 黑客工具 | 黑客软件\n","date":"2022-08-29T00:00:00Z","image":"/p/nessus-%E7%A0%B4%E8%A7%A3%E7%89%88%E6%8F%92%E4%BB%B6%E4%B8%8B%E8%BD%BD/%E5%B0%81%E9%9D%A2.jpg","permalink":"/p/nessus-%E7%A0%B4%E8%A7%A3%E7%89%88%E6%8F%92%E4%BB%B6%E4%B8%8B%E8%BD%BD/","title":"Nessus 破解版插件下载"},{"content":"Python 爬虫与正则表达式 正则表达式基础 正则表达式 – 语法 | 菜鸟教程\n常用字符说明 字符 描述 [ABC] 匹配字符串中所有的 A、B、C 字母 [^ABC] 匹配字符串中所有的非 A、B、C 字母 [A-Z] 表示一个区间，匹配所有大写字母；[a-z] 表示所有小写字母 . 匹配除换行符（\\n、\\r）之外的任何单个字符，等价于 [^\\n\\r] \\s 匹配任何空白字符（空格、制表符、换页符等）；\\S 匹配任何非空白字符 ^ 匹配输入字符串的开始位置 $ 匹配输入字符串的结尾位置 ? 匹配前面的子表达式零次或一次，或指明非贪婪限定符 * 匹配前面的子表达式零次或多次 + 匹配前面的子表达式一次或多次 {n,m} m 和 n 均为非负整数，且 n ≤ m。最少匹配 n 次，最多匹配 m 次。例如 \u0026quot;o{1,3}\u0026quot; 将匹配 \u0026quot;fooooood\u0026quot; 中的前三个 o。\u0026quot;o{0,1}\u0026quot; 等价于 \u0026quot;o?\u0026quot;。注意逗号和两数之间不能有空格 ( ) 标记一个子表达式的开始和结束位置，子表达式可以获取供以后使用（如 (?P\u0026lt;函数名\u0026gt;匹配正则)） 贪婪与非贪婪模式 在正则表达式中，*、+、? 默认是贪婪的，会尽可能多地匹配内容。例如 \u0026quot;\u0026lt;.*\u0026gt;\u0026quot; 中的 * 会匹配到字符串最后的 \u0026gt;。若要使用非贪婪模式，在限定符后加 ?，如 \u0026quot;\u0026lt;.*?\u0026gt;\u0026quot; Python 正则表达式 Python 正则表达式 | 菜鸟教程\n常用函数 1 2 3 4 5 6 import re re.match(pattern, string, flags=0) re.search(pattern, string, flags=0) # 匹配成功时返回一个匹配对象，否则返回 None。 # 可以使用 group(num) 或 groups() 获取匹配表达式。 re.match 与 re.search 的区别：\nre.match 只匹配字符串的开始位置，如果开始位置不符合正则表达式，则匹配失败返回 None；而 re.search 匹配整个字符串，直到找到第一个匹配。\n参数说明 参数 描述 pattern 匹配的正则表达式 string 要匹配的字符串 flags 标志位，用于控制匹配方式（如是否区分大小写、多行匹配等） flags 修饰符 修饰符 描述 re.I 使匹配对大小写不敏感 re.L 做本地化识别（locale-aware）匹配 re.M 多行匹配，影响 ^ 和 $ re.S 使 . 匹配包括换行符在内的所有字符 re.U 根据 Unicode 字符集解析字符，影响 \\w、\\W、\\b、\\B re.X 允许更灵活的格式，使正则表达式更易于理解 re.compile 函数 compile 函数用于编译正则表达式，生成一个正则表达式（Pattern）对象，供 match() 和 search() 使用。\n1 re.compile(pattern[, flags]) pattern：字符串形式的正则表达式 flags：可选，匹配模式（如忽略大小写、多行模式等） re.sub 函数 1 re.sub(pattern, repl, string, count=0, flags=0) pattern：正则中的模式字符串 repl：替换的字符串，也可为一个函数 string：要被查找替换的原始字符串 count：模式匹配后替换的最大次数，默认 0 表示替换所有匹配 ","date":"2022-07-08T00:00:00Z","permalink":"/p/python-%E7%88%AC%E8%99%AB%E4%B8%8E%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/","title":"Python 爬虫与正则表达式"},{"content":"1. 基本配置 一切操作都是基于 root 用户下。\n一、需要下载的工具 net-tools（获取 IP 的工具）\nyum -y install net-tools（需要配置网络后）\nopenssh-server（免密登录所需）\nyum -y install openssh-server（需要配置网络后）\njdk（Java 环境）\nJava Downloads | Oracle Oracle 账号密码（临时） 下载的包大致为 jdk-8u333-linux-x64.tar.gz，具体版本根据自己的需求选择 网上下载后解压 hadoop（集群环境）\nApache Hadoop Releases 下载 Binary download 或 Index of /hadoop/common 下载的包大致为 hadoop-3.3.1.tar.gz，具体版本自选 网上下载后解压 二、需要更改的配置 连接网络 如果是最小化安装，一开始没有 IP。\nip addr（查看网卡名称，如 ens33）\n进入 /etc/sysconfig/network-scripts/\nvi ifcfg-ens33（编辑你的网卡信息）\n将 ONBOOT=no 改为 ONBOOT=yes（启用网卡开机自启）\nifup ens33（因为之前网卡没自启，启用网卡）\nsystemctl restart network（重启网络，也可 service network restart）\n尝试 ping 外网：ping www.baidu.com 看是否成功。 虚拟机内 ping 不通的排查 ping 127.0.0.1 不通 → 网卡问题 检查网卡设置是否正确 桥接网络静态 IP 可能有问题；NAT 模式检查主机的 VMware NAT Service / VMware DHCP Server 服务是否开启 如果是复制的虚拟机，记得修改 MAC 地址：ip addr 查看，先在虚拟机设置中刷新 MAC，再修改 HWADDR=。 UUID 是否要改？可用 uuidgen ens33 生成新的 UUID。 关闭防火墙 1 2 3 4 systemctl stop firewalld # 关闭防火墙 systemctl disable firewalld # 禁用防火墙开机自启 # 关闭 SELinux vi /etc/selinux/config # 将 SELINUX=enforcing 改为 SELINUX=disabled 免密登录 1 2 3 ssh localhost # 生成 .ssh 目录（记得退出） ssh-keygen -t rsa # 生成 RSA 公私钥 ssh-copy-id hostname@ip # 将公钥发送给要免密登录的主机（包括自己 localhost） 配置 JAVA 环境变量 （全部用户）在 /etc/profile.d/ 中创建一个 .sh 文件（例如 java_env.sh）。/etc/profile 会自动遍历该目录下所有 .sh 文件。 （单个用户，推荐）在 ~/.bashrc 中添加环境变量。 1 2 3 # JAVA_HOME export JAVA_HOME=/opt/software/jdk1.8.0 # 你的 JDK 路径 export PATH=$PATH:$JAVA_HOME/bin 之后执行 source java_env.sh 或 source ~/.bashrc，再运行 java -version 测试是否成功。\n配置 hadoop 环境变量 1 2 3 4 # HADOOP_HOME export HADOOP_HOME=/opt/software/hadoop # 你的 Hadoop 路径 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin 同样添加到 hadoop_env.sh 或 ~/.bashrc，source 后运行 hadoop 查看是否有显示。\n三、可选的配置更改 静态 IP 1 vi /etc/sysconfig/network-scripts/ifcfg-ens33 # 最后为你的网卡名 修改内容：\n1 2 3 4 5 BOOTPROTO=static # 改为 static IPADDR=192.168.37.101 # 你要的 IP NETMASK=255.255.255.0 # 子网掩码，也可用 PREFIX=24 GATEWAY=192.168.37.2 # 网关（VMware 虚拟网络编辑器 → VMnet8 查看） DNS1=192.168.37.2 # 与网关相同 yum 换源 1 2 3 4 5 6 7 8 9 10 # 备份默认源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup # 下载阿里云源（CentOS 7 示例） curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 清除缓存并生成新缓存 yum clean all yum makecache yum update 2. Hadoop 运行 1. 本地模式 单机运行，一般只演示官方案例。 不配置文件。 2. 伪分布模式 也是单机运行，但具备 Hadoop 集群的所有功能，一台机器模拟分布式环境。一般用于测试，实际项目中不用。 需要 SSH 免密登录 修改配置文件 core-site.xml、hdfs-site.xml NameNode 格式化 明确启动用户，修改 hadoop-env.sh 若包含 YARN，还需修改 yarn-site.xml、mapred-site.xml 和 yarn-env.sh 注意 若运行实例出现 code 143，可能为内存不足。 一旦重新启动 YARN，之前运行过的程序运行情况将无法查看（输出结果还在）。配置历史服务器可保留，需修改 mapred-site.xml。 配置文件 core-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;configuration\u0026gt; \u0026lt;!-- 指定 NameNode 的地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;fs.defaultFS\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;hdfs://master:8020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 指定 hadoop 数据的存储目录 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.tmp.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;/opt/module/hadoop-3.1.3/data\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 配置 HDFS 网页登录使用的静态用户为 root --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.http.staticuser.user\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;root\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; hdfs-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 \u0026lt;configuration\u0026gt; \u0026lt;!-- NameNode web 端访问地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.http-address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;master:9870\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 文件数据副本数 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.replication\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;1\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; NameNode 格式化 1 2 3 hdfs namenode -format # 若不是第一次格式化，要先将 /.../hadoop/ 下的 data 和 logs 删除，再格式化 # 别忘了先 stop-all.sh 明确启动用户（HDFS） 在 hadoop-env.sh 末尾添加：\n1 2 3 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root yarn-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;configuration\u0026gt; \u0026lt;!-- 指定 mapreduce 走 shuffle --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.nodemanager.aux-services\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;mapreduce_shuffle\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 指定 ResourceManager 的地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.hostname\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;master\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 环境变量的继承 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.nodemanager.env-whitelist\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; mapred-site.xml（包含历史服务器配置） 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;configuration\u0026gt; \u0026lt;!-- 指定 MapReduce 程序运行在 Yarn 上 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.framework.name\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;yarn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 历史服务器端地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.jobhistory.address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;master:10020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 历史服务器 web 端地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.jobhistory.webapp.address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;master:19888\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; 启动历史服务器 1 mapred --daemon start historyserver 明确启动用户（YARN） 在 yarn-env.sh 末尾添加：\n1 2 export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root 3. 完全分布模式 节点 HDFS 角色 YARN 角色 master NameNode, DataNode NodeManager slave1 DataNode ResourceManager, NodeManager slave2 SecondaryNameNode, DataNode NodeManager 需要 修改主机名\n配置 IP 映射\n修改配置文件\ncore-site.xml hdfs-site.xml yarn-site.xml mapred-site.xml workers 指定进程用户\n互相免密登录\n使用 rsync/scp 分发配置\n启动集群（格式化 NameNode → 启动 HDFS → 启动 YARN → 启动历史服务器）\n启动集群效果 master jps NodeManager DataNode NameNode slave1 jps ResourceManager NodeManager DataNode slave2 jps SecondaryNameNode NodeManager DataNode Web 端 HDFS master 主机 IP:9870 YARN slave1 主机 IP:8088 历史服务 master 主机 IP:19888 时间同步（NTP）\n配置文件 修改主机名 1 2 vi /etc/hostname # 分别改为 master, slave1, slave2（方便区分即可） 配置 IP 映射 1 2 3 4 5 6 7 vi /etc/hosts # 需要在每台主机的 hosts 中添加 # 添加以下内容（IP 换成你的实际地址） 192.168.37.101 master 192.168.37.102 slave1 192.168.37.103 slave2 # 重启使配置生效（reboot） 修改配置文件 若已配置伪分布，请删除 /.../hadoop 下的 data、input、logs、output 或重新解压 Hadoop。\ncore-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;configuration\u0026gt; \u0026lt;!-- 指定 NameNode 的地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;fs.defaultFS\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;hdfs://master:8020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 指定 hadoop 数据的存储目录 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.tmp.dir\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;/.../hadoop/data\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 配置 HDFS 网页登录使用的静态用户为 root --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;hadoop.http.staticuser.user\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;root\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; hdfs-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;configuration\u0026gt; \u0026lt;!-- NameNode web 端访问地址--\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.http-address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;master:9870\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- SecondaryNameNode web 端访问地址--\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.namenode.secondary.http-address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;slave2:9868\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 文件数据副本数 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;dfs.replication\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;3\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; yarn-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 \u0026lt;configuration\u0026gt; \u0026lt;!-- 指定 mapreduce 走 shuffle --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.nodemanager.aux-services\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;mapreduce_shuffle\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 指定 ResourceManager 的地址--\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.resourcemanager.hostname\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;slave1\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 环境变量的继承 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.nodemanager.env-whitelist\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 开启日志聚集功能 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.log-aggregation-enable\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;true\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 设置日志聚集服务器地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.log.server.url\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;http://master:19888/jobhistory/logs\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 设置日志保留时间为 7 天 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;yarn.log-aggregation.retain-seconds\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;604800\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;!-- 与伪分布式相比添加了一个日志聚焦，程序运行完成时，都会产生日志，日志聚焦就是 把日志信息上传到 HDFS 文件系统上，方便查看程序运行详情，方便排错和开发调试。 --\u0026gt; mapred-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 \u0026lt;configuration\u0026gt; \u0026lt;!-- 指定 MapReduce 程序运行在 Yarn 上 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.framework.name\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;yarn\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 历史服务器端地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.jobhistory.address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;master:10020\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;!-- 历史服务器 web 端地址 --\u0026gt; \u0026lt;property\u0026gt; \u0026lt;name\u0026gt;mapreduce.jobhistory.webapp.address\u0026lt;/name\u0026gt; \u0026lt;value\u0026gt;master:19888\u0026lt;/value\u0026gt; \u0026lt;/property\u0026gt; \u0026lt;/configuration\u0026gt; workers 文件 1 2 3 4 5 6 vi /.../hadoop/etc/hadoop/workers # 注意：文件中每行末尾不能有空格，不允许有空行。 # localhost 可保留可以删除（建议删除）。添加下列主机名 master slave1 slave2 指定进程用户 在 hadoop-env.sh 末尾添加：\n1 2 3 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root 在 yarn-env.sh 末尾添加：\n1 2 export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root 互相免密登录 参考伪分布式部分，确保 master、slave1、slave2 之间均能免密 SSH 登录。\n远程同步配置（使用 scp） 1 2 3 4 5 6 7 # 附：目前是在 root 环境下进行安装 # scp -r(传输文件夹) 文件夹路径 用户@其他主机的ip:要传到的路径 # 将已经修改好的配置文件传给其他主机，减少工作量 scp -r /.../hadoop/etc/hadoop root@slave1:/.../hadoop/etc # 传输环境配置 scp -r /etc/profile.d root@slave1:/etc/ 启动集群 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # # 若 /.../hadoop 下有 date 和 logs 先删除（说明之前格式化过） # 格式化 NameNode（只在 master 执行一次） hdfs namenode -format # 启动 HDFS（在 master 执行），具体根据配置文件来 start-dfs.sh # 在配置了 ResourceManager 的节点（slave1）上启动 Yarn # 具体根据配置文件来 # 若碰到提示 known hosts 请检查 ssh 免密登录 start-yarn.sh # 启动历史服务器（在 master 执行），具体根据配置文件来 mapred --daemon start historyserver 启动后进程检查（jps） master：NodeManager、DataNode、NameNode、JobHistoryServer slave1：ResourceManager、NodeManager、DataNode slave2：SecondaryNameNode、NodeManager、DataNode Web 端访问地址 HDFS：http://master:9870 YARN：http://slave1:8088 历史服务器：http://master:19888 时间同步（NTP） 1 2 3 4 # 所有节点安装 ntp yum -y install ntp # 设置时间为亚洲上海 timedatectl set-timezone Asia/Shanghai 主节点（master）配置 /etc/ntp.conf 添加：\n1 2 3 4 5 6 7 8 9 10 11 12 # 添加以下内容 # 允许 192.168.37.x 这一网段，即与主机同一网段的机器同步该主机的时间 restrict 192.168.37.0 mask 255.255.255.0 nomodify notrap # 该主机使用的时间服务器为阿里提供的公网 NTP 服务器(可不用) server ntp1.aliyun.com iburst #如果集群是在一个封闭的局域网内，可以屏蔽掉默认的server: #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst 启动主节点 NTP 服务：\n1 2 3 4 systemctl start ntpd systemctl enable ntpd # 查看 ntp 的状态 systemctl status ntpd 其他节点同步：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 方案一: # 其他从节点停止并禁用 ntp 服务 systemctl stop ntpd systemctl disable ntpd # 同步主节点时间 ntpdate master 方案二: # 将本地的硬件时间也作为同步的时间源之一 master(主节点)配置：server 127.127.1.0 master(主节点)配置：fudge 127.127.1.0 stratum 10 # 删除或注释以下配置项 #server 0.centos.pool.ntp.org iburst #server 1.centos.pool.ntp.org iburst #server 2.centos.pool.ntp.org iburst #server 3.centos.pool.ntp.org iburst #添加 server master ntpdate master #同步时间 service ntpd start #启动 ntpd 时间服务器 查看与时间同步服务器的时间偏差 1 2 3 4 5 6 7 8 9 ntpdc -c loopinfo # # offset: 0.001014 s #时间偏差极小，即同步了 # frequency: 29.720 ppm # poll adjust: 30 # watchdog timer: 929 s # 或 ntpdate master # 同步时间时会显示时间偏差 设置定时任务可设置定时任务： 1 2 3 crontab -e # 每天 00:00 同步一次(master 不行的话直接写 IP) 00 00 * * * /usr/sbin/ntpdate master 1 2 3 4 5 6 7 8 * * * * * - - - - - | | | | | | | | | +----- 星期中星期几 (0 - 6) (星期天为0) | | | +---------- 月份 (1 - 12) | | +--------------- 一个月中的第几天 (1 - 31) | +-------------------- 小时 (0 - 23) +------------------------- 分钟 (0 - 59) 4. Hadoop 常见问题汇总 原文档此处未展开，保留标题。\n3. Hive 及数据可视化 一、需要的安装包 Docker 容器（简化软件安装部署） Docker 可以帮助开发人员快速构建轻量级和可移植的软件容器，简化应用程序开发、测试和部署等环节。它提供轻量级执行环境，共享操作系统内核但彼此独立运行。\n二、不使用 Docker 容器 原文档至此结束。\n","date":"2022-05-09T00:00:00Z","image":"/p/linux-%E4%B8%8B%E7%9A%84-hadoop-%E9%85%8D%E7%BD%AE/%E5%B0%81%E9%9D%A2.jpg","permalink":"/p/linux-%E4%B8%8B%E7%9A%84-hadoop-%E9%85%8D%E7%BD%AE/","title":"Linux 下的 Hadoop 配置"},{"content":"一、Python pexpect 库的使用 在终端中许多命令都有与用户交互的场景，例如切换用户时需要手动输入密码，安装应用有时要输入默认配置等。这对 shell 自动化脚本十分不便。expect 命令的出现解决了上述问题。下面简单演示 shell 中使用 expect 命令自动输入密码切换用户并用切换后的用户执行命令的流程。\n原版 shell 执行 expect 命令演示 在终端按以下步骤执行（其中 123 是 root 用户的密码），可以登录到 root 用户的终端。\n1 2 3 4 5 6 7 8 9 10 11 user@host:~$ expect expect1.1\u0026gt; set timeout 5 5 expect1.2\u0026gt; spawn su spawn su 3712 expect1.3\u0026gt; expect \u0026#34;Password\u0026#34; \u0026#34;密码\u0026#34; Password: expect1.4\u0026gt; send \u0026#34;123\\n\u0026#34; expect1.5\u0026gt; interact root@host:/home/user# 这样就进入了 root 用户的终端。这时或许会有人说，写这么多，还不如直接执行 su 命令。事实上，真正的 expect 指令不会像这样直接在终端运行，而是作为脚本来运行。下面使用 Python 的 os 库中的 system 函数模拟在终端输入命令，以脚本的方式运行，感受 expect 的强大。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 from os import system as shell_command # expect 脚本如下 script = \u0026#34;\u0026#34;\u0026#34; #!/usr/bin/expect set timeout 5 spawn su expect { \u0026#34;Password\u0026#34; {send \u0026#34;123\\\\r\u0026#34;} \u0026#34;密码\u0026#34; {send \u0026#34;123\\\\r\u0026#34;} } send \u0026#34;whoami \u0026gt; whoami.txt\\\\r\u0026#34; send \u0026#34;exit\\\\r\u0026#34; expect eof \u0026#34;\u0026#34;\u0026#34; # print(script) # 先清理先前测试残留的文件 shell_command(\u0026#34;rm -f whoami.txt\u0026#34;) # 用 echo 的方式创建 expect 脚本 shell_command(\u0026#34;echo \u0026#39;\u0026#34; + script + \u0026#34;\u0026#39; \u0026gt; /tmp/shell_expect_su_script.sh\u0026#34;) shell_command(\u0026#34;chmod +x /tmp/shell_expect_su_script.sh\u0026#34;) shell_command(\u0026#34;/tmp/shell_expect_su_script.sh\u0026#34;) print(\u0026#34;\\ncat whoami.txt = \u0026#34;, end=\u0026#34;\u0026#34;) shell_command(\u0026#34;cat whoami.txt\u0026#34;) 输出结果：\n1 2 3 4 5 6 7 8 9 spawn su Password: ]0;root@Master: /home/hadoop[01;32mroot@Master[00m:[01;34m/home/hadoop[00m# whoami \u0026gt; whoami.txt ]0;root@Master: /home/hadoop[01;32mroot@Master[00m:[01;34m/home/hadoop[00m# exit exit cat whoami.txt = root 0 在上面的例子中，无需手动输入 root 用户的密码，即可登录进 root 用户的终端，并将自己的名称（root）写入文件 whoami.txt 中。由此看来，有了 expect 命令，使全自动化脚本成为了可能。\nPython 自动化脚本 pexpect 库演示 在 Python 中，提供了 pexpect 库，可以十分方便地使用 Python 代码实现 expect 命令的功能。下面演示使用 pexpect 切换到 root 用户并在 text.txt 中写入一些数据，最后用 os 库的 system 函数执行 cat 命令读取 text.txt 文件内容验证执行结果。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import pexpect, os # 先清理先前残留下的文件 os.system(\u0026#34;rm -f text.txt\u0026#34;) os.system(\u0026#34;ls -l | grep \u0026#39;text.txt\u0026#39;\u0026#34;) process = pexpect.spawn(\u0026#34;su\u0026#34;) process.timeout = 5 process.expect(\u0026#34;Password\u0026#34;) process.sendline(\u0026#34;123\u0026#34;) process.sendline(\u0026#34;echo export PATH=/home/hadoop \u0026gt; text.txt\u0026#34;) process.sendline(\u0026#34;EOF\u0026#34;) process.close() os.system(\u0026#34;ls -l text.txt\u0026#34;) os.system(\u0026#34;cat text.txt\u0026#34;) 输出结果：\n1 2 3 4 -rw-r--r-- 1 root root 25 Mar 10 23:30 text.txt export PATH=/home/hadoop 0 可见，使用 Python 代码可以更加方便地实现 expect 的功能。\nexpect 脚本讲解 现在，讲解一下上述例子中 expect 脚本中的内容。\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/expect # 这条语句告诉操作系统用来解释脚本的程序的位置 set timeout 5 # 设置超时时间，单位是秒。超过这个时长，就认为执行失败并退出。 # 例如在这里，如果密码 \u0026#39;123\u0026#39; 是错误的，那么等待 5 秒后无法登录进去就会退出。 spawn su # spawn 是 expect 的内部指令，后面接要在 shell 执行的命令， # 这样 expect 会开启一个新的进程来执行这个命令并监听它。 expect { # expect 的中文是 \u0026#39;期待\u0026#39; 的意思，顾名思义，expect 会期待出现指定的字符串。 \u0026#34;Password\u0026#34; {send \u0026#34;123\\r\u0026#34;} # 双引号（必须写双引号，不能是单引号）中是 expect 指令等待 spawn 生成的程序 # （这里是 su）出现的字符串。 # # 这里当 su 命令执行后出现 \u0026#34;Password\u0026#34; 时，就发送 send 后面的字符串 \u0026#34;123\\r\u0026#34; # 给 su 命令。 # # 注意：123 后面的 \\r 不能少，它表示我们输入 123 后按下的回车键。 \u0026#34;密码\u0026#34; {send \u0026#34;123\\r\u0026#34;} # 与上面一样，只不过这里 expect 期待的是 \u0026#34;密码\u0026#34; 而不是 \u0026#34;Password\u0026#34;。 } send \u0026#34;whoami \u0026gt; whoami.txt\\r\u0026#34; # 此时不出意外的话已经进入 root 的终端了，这里直接发送终端命令即可执行，同样注意 \\r 不能少。 send \u0026#34;exit\\r\u0026#34; # 发送命令 exit 退出 root 的终端。 expect eof # 结束整个 expect 命令 参考链接 shell expect的简单用法 Linux expect 介绍和用法 python之pexpect模块 #!/bin/bash 正则表达式 – 教程 | 菜鸟教程 ","date":"2022-03-15T00:00:00Z","permalink":"/p/python-pexpect-%E5%BA%93%E7%9A%84%E4%BD%BF%E7%94%A8/","title":"Python pexpect 库的使用"},{"content":"OS 模块 os 模块是一个功能强大的模块，主要提供操作系统相关功能接口，例如：文件目录操作、进程相关操作、执行系统命令、解析环境变量等。\n使用 os 模块，我们首先要导入：\n1 import os 下面我们对这些功能逐一介绍。\n1. 目录相关操作 目录相关常用操作如下表：\n方法 说明 os.getcwd() 获取当前脚本工作的目录路径 os.getcwdb() 同上，返回 byte 对象 os.chdir(path) 修改当前目录为 path os.mkdir(path, mode=0o777, *, dir_fd=None) 创建目录 os.makedirs(name, mode=0o777, exist_ok=False) 创建多层目录 os.rmdir(path, *, dir_fd=None) 删除目录 os.removedirs(name) 删除多级目录 os.listdir(path='.') 返回指定目录下所有文件 scandir(path='.') 返回迭代器，内容为指定目录下所有文件目录 os.chmod(path, mode, *, dir_fd=None, follow_symlinks=True) 修改路径权限 os.rename(src, dst, ...) 修改文件名 相关操作示例：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 # 开发环境 Ubuntu # 获取当前目录 dirname = \u0026#39;test\u0026#39; pwd = os.getcwd() print(\u0026#39;当前工作目录:\u0026#39;, pwd) path = \u0026#39;/home/hyg/tmp\u0026#39; # 获取指定文件夹下所有文件 listf = os.listdir(path) print(f\u0026#39;{path} files: {listf}\u0026#39;) # 切换当前工作目录 os.chdir(path) # 查看当前路径 print(\u0026#39;切换工作目录:\u0026#39;, os.getcwd()) # 当前目录下创建目录 os.mkdir(dirname) # 显示当前目录下文件 print(f\u0026#39;{path} files: {os.listdir(\u0026#34;./\u0026#34;)}\u0026#39;) # 删除目录 os.rmdir(dirname) # 切回当前目录 os.chdir(pwd) # 显示当前目录 print(\u0026#39;当前工作目录:\u0026#39;, pwd) 输出结果：\n1 2 3 4 5 当前工作目录: /home/hyg/tmp /home/hyg/tmp files: [\u0026#39;1.jpg\u0026#39;, \u0026#39;2.jpg\u0026#39;] 切换工作目录: /home/hyg/tmp /home/hyg/tmp files: [\u0026#39;test\u0026#39;, \u0026#39;1.jpg\u0026#39;, \u0026#39;2.jpg\u0026#39;] 当前工作目录: /home/hyg/tmp 2. os.path 相关方法 这些方法包括目录判断、路径获取、路径拼接、文件信息获取等。\n2.1 文件判断 方法 说明 os.path.isdir(s) 判断是否为目录，如果是目录返回 True os.path.isfile(s) 判断是否为文件，如果是文件返回 True os.path.exists(path) 判断文件或目录是否存在，存在返回 True 2.2 文件路径获取 方法 说明 os.path.dirname(path) 返回目录所在路径 os.path.split(p) 目录切分，返回元组 (head, tail) os.path.basename(p) 返回最后一级目录 os.path.join(a, *p) 目录拼接 os.path.abspath(path) 获取文件绝对路径 注意 basename 和 split 的区别，来看两个例子：\n1 2 3 4 5 6 7 8 9 def func(path): print(f\u0026#39;split :{path}, result:{os.path.split(path)}\u0026#39;) print(f\u0026#39;basename:{path}, result:{os.path.basename(path)}\u0026#39;) path = \u0026#39;/home/linux/test/1.txt\u0026#39; func(path) path = \u0026#39;/home/linux/test/\u0026#39; func(path) func(\u0026#39;1.txt\u0026#39;) 输出结果：\n1 2 3 4 5 6 split :/home/linux/test/1.txt, result:(\u0026#39;/home/linux/test\u0026#39;, \u0026#39;1.txt\u0026#39;) basename:/home/linux/test/1.txt, result:1.txt split :/home/linux/test/, result:(\u0026#39;/home/linux/test\u0026#39;, \u0026#39;\u0026#39;) basename:/home/linux/test/, result: split :1.txt, result:(\u0026#39;\u0026#39;, \u0026#39;1.txt\u0026#39;) basename:1.txt, result:1.txt 注意路径及输出格式。\n关于目录拼接：很多代码实现如下面这种方式：\n1 2 3 path = \u0026#39;/home/linux/test\u0026#39; fpath = path + \u0026#39;/\u0026#39; + \u0026#39;1.txt\u0026#39; print(fpath) 输出结果：\n1 /home/linux/test/1.txt 这种方式存在的问题：\n跨平台问题：Linux 与 Windows 下目录表达方式不一样。 路径拼接时，目录之间分隔符有严格限制，容易出错。 推荐使用 os.path.join：\n1 2 3 4 5 6 7 path = \u0026#39;/home/linux/test/\u0026#39; fpath = os.path.join(path, \u0026#39;1.txt\u0026#39;) print(fpath) path = \u0026#39;/home/linux/test\u0026#39; fpath = os.path.join(path, \u0026#39;1.txt\u0026#39;) print(fpath) 输出结果：\n1 2 /home/linux/test/1.txt /home/linux/test/1.txt path 最后有无反斜杠，join 都可以正确处理，但字符串拼接方式则不行。\n2.3 获取文件信息 方法 说明 os.stat(path, *, dir_fd=None, follow_symlinks=True) 获取文件或目录信息 os.path.getatime(filename) 获取文件最后访问时间 os.path.getctime(filename) 获取文件最后改变时间 os.path.getmtime(filename) 获取文件最后修改时间 os.path.getsize(filename) 获取文件大小 getctime 与 getmtime 的区别：\n两者都是获取文件最后修改时间，但区别在于：\n文件内容修改：对两个方法获取的时间都有影响。 文件权限、用户修改：只对 getctime 获取的时间有影响。 使用 Python 代码验证：\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 import os path = \u0026#39;/home/linux/test/1.txt\u0026#39; # 获取文件修改时间 print(\u0026#39;ctime:\u0026#39;, os.path.getctime(path), \u0026#39;mtime:\u0026#39;, os.path.getmtime(path)) # 修改文件权限 os.chmod(path, 0o777) # 再次获取文件修改时间 print(\u0026#39;ctime:\u0026#39;, os.path.getctime(path), \u0026#39;mtime:\u0026#39;, os.path.getmtime(path)) # 获取文件大小 print(os.path.getsize(path)) 输出结果：\n1 2 3 ctime: 1554518401.870203 mtime: 1554518401.870203 ctime: 1554518438.9467654 mtime: 1554518401.870203 5 3. 其他一些方法 方法 说明 os.system(command) 执行命令 os._exit(status) 退出当前进程，需要添加退出状态 os.getenv(key, default=None) 获取指定环境变量 os.putenv(name, value, /) 设置指定环境变量 os.environ 环境变量获取与设置 os._exit 可以直接让当前运行程序退出，并能够添加退出状态。\nsystem 的使用示例：在指定目录创建文件（Linux 下创建文件的 shell 命令：touch fname）\n1 2 3 4 5 6 7 8 9 path = \u0026#39;/home/linux/test/tmp\u0026#39; print(os.listdir(path)) fname = os.path.join(path, \u0026#39;1.txt\u0026#39;) print(fname) # 创建文件 os.system(\u0026#39;/usr/bin/touch %s\u0026#39; % fname) print(os.listdir(path)) 输出结果：\n1 2 3 [] /home/linux/test/tmp/1.txt [\u0026#39;1.txt\u0026#39;] 环境变量设置：有两种方式获取环境变量：\nos.getenv：根据环境变量名称直接获取，如果没有获取到则返回 None。 os.environ：获取系统所有环境变量，可以使用字典方式去获取和设置环境变量。 对应设置环境变量，os.putenv 对于某些平台可能不支持，可以使用 os.environ 设置。\n下面我们来具体操作：\n1 2 3 4 5 6 7 8 9 10 11 12 print(\u0026#39;HOME=\u0026#39;, os.getenv(\u0026#39;HOME\u0026#39;)) # 设置环境变量（部分平台可能不支持） os.putenv(\u0026#39;Test\u0026#39;, \u0026#39;testval\u0026#39;) print(\u0026#39;Test=\u0026#39;, os.getenv(\u0026#39;Test\u0026#39;)) # 使用 environ print(\u0026#39;environ[HOME]=\u0026#39;, os.environ[\u0026#39;HOME\u0026#39;]) # 设置环境变量 Test（推荐） os.environ[\u0026#39;Test\u0026#39;] = \u0026#39;testval\u0026#39; print(\u0026#39;Test=\u0026#39;, os.getenv(\u0026#39;Test\u0026#39;)) 可以看到，在 Ubuntu 中使用 putenv 不生效，我们可以使用 os.environ 替换。\nos 模块还有很多其他常用方法与属性，遇到问题可以查阅官方文档。\n","date":"2022-03-13T00:00:00Z","permalink":"/p/python-os-%E6%A8%A1%E5%9D%97/","title":"Python os 模块"},{"content":"2021年21个最好用的种子下载网站 目前稳定的种子下载网站并不多，为此我们根据种子文件的可用性、安全性以及包含种子文件数量等进行评估，列举了目前最好用的种子下载网站。\n有些网站还有惊喜哦。\n国外 1. YTS 成立年份：2010 地区：新西兰 每月用户：1.85亿 全球排名：181 YTS是目前排名第一的种子下载网站，它提供的种子文件数量最全并且非常安全，YTS是由已经停止运行的YIFY发展而来。在2015年，美国电影协会要求关闭该网站。\nYTS的内容库非常丰富并且电影质量都很高，目前正在不断增加电影库，用户也在逐渐增多。\n不管是经典的老电影还是新发行的电影，在YTS中都可以找到，YTS的网站设计也非常简洁，使你可以轻松找到你喜欢的电影。\nYTS收录了从经典电影到新发行电影的大量电影列表。它具有易于浏览的友好用户界面，是寻找电影Torrent的用户的首选之地。\n2. 海盗湾(The Pirate Bay) 成立年份：2003 地区：瑞典 每月用户：10607万 全球排名：208 海盗湾已经运营超过15年，是目前运营时间最长，知名度最高的种子下载网站之一。但由于监管机构和政府的审查，海盗湾经历了多次域名变更。\n海盗湾又简称为TPB，内容包含音频，视频，电子书，软件，游戏和成人内容等多种类型，其中种子文件数量超过300万个。\n3. 1337x 成立年份：2007 地区：美国 每月用户：9596万 全球排名：253 1337x也是非常受欢迎的种子下载网站。虽然在许多国家遭到运营商的封锁，但是1337x已经稳定运营了许多年，是一个非常稳定可靠的种子下载网站。\n1337x提供的种子文件和磁力链接包括电影，电视节目，游戏，音乐，软件和纪录片等多种类型。\n虽然谷歌搜索结果中屏蔽了1337x，并且1337x也被爆出了一些安全问题，但是依然吸引了许多忠实用户。\n4. Rutracker 成立年份：2004 地区：俄罗斯 每月用户：8573万 全球排名：255 RuTracker也是一个深受用户喜爱的种子下载网站，但在该网站所在的国家俄罗斯却不太知名。\nRuTracker网站语言为俄语，种子文件包括音乐、电影以及有声读物等多种类型，在2015的时候，俄罗斯屏蔽了RuTracker。\n5. Rarbg 成立年份：2008 地区：美国 每月用户：9035万 全球排名：346 RARBG已经运营超过11年，网站服务器位于保加利亚。\nRARBG的种子文件和磁力链接都非常齐全，并且包含大量的高清视频，内容包括音乐，预告片，电影，电视节目和成人内容等，每月有超过9000万用户访问该网站。\n6. Nyaa 成立年份：2005 地区：日本 每月用户：69万 全球排名：493 NYAA是从已经停止运营的NYAA发展而来，是非常流行的动漫种子下载网站。\n该网站收到了许多动漫爱好者的喜爱，网站内容大多数是日语，也有部分英语，种子文件包含漫画，日本动漫，电影和游戏等。\n7. Eztv 成立年份：2005 地区：美国 每月用户：4225万 全球排名：896 EZTV成立于2005年，由一家电视流量发行商运营，该网站拥有非常丰富的种子文件库。\n虽然该网站经历很多变故，并且具有许多安全问题，但是依然有很多忠实用户在使用该网站，来搜索自己喜爱的Torrent。\n8. Torrent9 成立年份：2018 地区：法国 每月用户：2395万 全球排名：943 Torrent9位于法国，该网站为用户提供了电影，电视节目，音频内容和软件等种子文件。\nTorrent9的网站界面对用户非常友好，使用起来非常简单方便，用户可以更轻易的区分Torrent的真假。\n9. Limetorrents 成立年份：2009 地区：美国 每月用户：2425万 全球排名：1341 LimeTorrents是一个种子搜索引擎，拥有非常高的访问量，拥有超过1000万的种子文件。\nLimeTorrents的种子文件类型包括电影和电视节目到游戏和动漫，该网站提供了一个最新种子页面，展示了最新上传的100个种子文件。\n该网站在种子网站中的名声比较好，并且在严格的监管下保持稳定运营。\n10. Zooqle 成立年份：2013 地区：美国 每月用户：1452万 全球排名：2078 Zooqle成立时间不长，拥有丰富的电影，电视剧集和节目种子文件库。\n搜索结果经过验证，可以通过类别，语言，大小和时间进行筛选，电影目录是从TMDb收集而来。Zooqle目前的数据库中包含了超过400万个种子文件，并且提供了简单的界面，用户可以轻松下载。\n11. Newkatcr 成立年份：2016 地区：美国 每月用户：1473万 全球排名：2385 Newkatcr位于美国，是一家比较年轻的种子下载网站，从之前的旧网站kat发展而来。\n你可以根据电影，电视节目，动漫，游戏，应用程序，书籍和音乐查找你想要的种子文件，每个种子文件都详细列出了文件大小、发行时间等参数，为用户提供了简易的操作界面。\n12. Torrentdownloads 成立年份：2007 地区：英国 每月用户：1354万 全球排名：2943 Torrentdownloads成立于2007年，是一个运营时间比较长的种子搜索引擎，拥有超过1600万个种子文件，是目前世界上最大的Torrent数据库之一。\n前几年出现了安全问题，在Chrome和Firefox浏览器上不能正常访问，造成了该网站的访问量下降，但随着时间的推移，越来越多的用户正在使用该网站。\nTorrentdownloads提供的种子文件非常丰富，并且允许用户对种子文件进行评分，帮助用户区分种子文件的真假。\n该网站展示了每个种子文件的详细信息，其中包括上载者名称，日期，大小和链接等。\n13. Magnetdl 成立年份：2012 地区：英国/捷克 每月用户：956万 全球排名：3588 MagnetDL拥有丰富的磁力链数据库，磁力链通过一种流行并且高效的P2P文件共享传输。\n简单的来说，磁力链不需要提供大量服务器供用户下载，而是通过密码哈希来标识文件，任何人都可以发布磁力链文件。\n在通过从MagnetDL下载磁力链之前，你需要先在电脑上安装BitTorrent客户端，该网站建议使用uTorrent。\nMagnetDL为用户提供了简洁的界面，并且提供了直接下载磁力链和在线观看的功能。\n磁铁链接的详细信息展示了大小，上载日期，上传者的名称等相关信息。\n14. Torlock 成立年份：2010 地区：美国 每月用户：789万 全球排名：5806 Torlock是一个种子文件搜索引擎和下载网站，索引内容包括电影，电视节目和连续剧。该网站具有丰富的种子数据库，并且用户界面简洁。\n如果用户在Torlock数据库中找到一个虚假连接，可以获得1美元的奖励，这保证了Torlock提供的种子文件真实可靠。\nTorlock数据库中拥有超过500万个经过审核的种子文件，每月拥有超过789万用户访问该网站。\n15. Pcgamestorrents 成立年份：2018 地区：美国 每月用户：1055万 全球排名：6018 Pcgamestorrents的种子文件主要以游戏为主，涵盖了动作游戏，成人，策略，动漫以及VR游戏等分类，如果你是游戏玩家，可以参考最好用的游戏VPN。\nPcgamestorrents是一个专业的torrent索引器，具有按类型分类的海量游戏数据库，包括动作游戏，成人，策略，动漫甚至VR游戏。如果您是游戏玩家，并且喜欢下载Torrent，请查看我们最好的VPN游戏指南。\n不过由于网页具有许多弹窗广告，这些广告甚至不能被广告拦截器屏蔽，因此使得用户体验很差，导致访问量逐渐下降。\n16. Arenabg 成立年份：2007 地区：保加利亚 每月用户：628万 全球排名：8070 ArenaBG位于保加利亚，是非常知名的种子下载网站，该网站与Zamunda的门户网站在欧洲都拥有非常多的用户。\nArenaBG网站支持保加利亚语或英语显示，如果想要在线观看视频，可以在官网下载浏览器扩展程序进行安装。\n该网站曾经被黑客入侵，并窃取了用户的IP地址和数据，在访问网站之前，请先下载安装一款安全快速的VPN。\n17. Torrentgalaxy 成立年份：2018 地区：美国 每月用户：516万 全球排名：8527 TorrentGalaxy是比较年轻的种子下载网站，并且深受用户喜爱，目前每月有超过5百万的活跃用户。\n相比其他竞争对手，TorrentGalaxy提供了更加便捷的视频播放功能，并且保持高质量的种子下载。\nTorrentGalaxy首页展示了一些精选内容，种子详情页面包含了文件大小、语言、哈希信息以及上传者等详细信息，用户也可以对其进行评论。\n18. Ettvdl 成立年份：2017 地区：美国 每月用户：800万 全球排名：8666 ETTV具有非常丰富的种子文件，内容主要以电视连续剧和电视节目为主。开通此网站的会员之后，页面不会显示广告，浏览体验会更好。\nETTV提供的高级订阅计划是每月6美元，长时间订阅可以获得更优惠的价格。ETTV的种子数据库还包含一些书籍，动漫和音乐，可以通过高级搜索查找结果。\n该网站运营时间比较短，所以相对其他竞争者而言，种子文件要少一些。\n19. Torrentfunk 成立年份：2010 地区：美国 每月用户：267万 全球排名：13715 Torrentfunk成立于2010年，是一个知名度非常高的种子下载网站，拥有的种子文件包括电影，视频，软件和电子书。\nTorrentfunk是一个受欢迎的洪流网站，具有有趣的状态验证指示器。网站运营商采取了各种措施来揭露虚假的Torrent和误导性标题，并通过每个种子文件的专用评论栏来吸引社区参与。\n目前Torrentfunk的访问量正在下降，可能受到了监管机构的审查。\n国内 20. BT天堂 21. 高清MP4 使用注意 法律提示 使用BitTorrent协议用于文件共享本身是合法行为，但是发布者可能未经允许发布了受到版权保护的文件，这点仍然备受争议。\n在有些国家，用户在计算机上安装BitTorrent应用程序，或者下载种子文件，都可能会遭受刑事指控，这可能会给你带来不必要的麻烦。\n版权方可能会要求ISP运营商提供下载种子文件的历史记录，如果你通过VPN连接访问种子下载网站可以避免这些问题。\nBitTorrent协议简介 BitTorrent是一种点对点的文件共享协议，可以通过网络发送和接受文件。\nBitTorrent是由布法罗大学的一名学生Bram Cohen开发的，现在已经是传输音频文件，电影，电视节目和视频剪辑最常用的协议之一。\n目前，BitTorrent拥有超过1亿用户，比观看Netflix和观看Hulu的用户的总和还要多。\nBitTorrent的工作原理 需要在计算机上安装BitTorrent客户端，才能使用BitTorrent协议进行P2P共享传输文件。\nBitTorrent应用程序从多个其他对等计算机上下载文件，然后编译成一个完成的文件，而不是从服务器上下载。\n通过这种文件共享方式，用户可以从他人的电脑上下载文件，可能通过自己的电脑为他人服务（注意：在电脑上使用VPN连接确保安全）。\n使用这种协议可以降低网络拥塞，避免流量过于集中在骨干网络中。\n在使用BitTorrent协议传输内容的时候，追踪器可以找到对等计算机上的可用资源，并且将下载的文件片段进行重组。\n常见问题 FAQ 💡 种子网站安全吗？\n这并不是绝对的，错误的使用方式，可能会不安全。由于种子网站上的文件是由其他用户上传的，其中可能会包含病毒文件。因此，在浏览种子网站或者打开种子文件之前，请安装必要的杀毒软件。\n💡 可以不使用VPN下载种子吗？\n在下载一些受到版权保护的种子文件时，可能会有法律风险，使用VPN可以避免留下下载记录，但是我们不建议你下载非法内容，很多用户使用VPN来保证数据和隐私安全。\n💡 可以使用免费VPN下载种子吗？\n免费VPN会限制用户的速度和使用流量，在下载文件时会非常缓慢。并且免费VPN具有很多安全问题，可能会收集用户数据，然后出售给第三方获利。\n💡 下载或上传Torrent合法吗？\n如果共享的文件不是受到版权保护的文件，那么是合法的，否则可能会非法的，这要依据你所在的国家/地区而定。\n","date":"2021-12-12T00:00:00Z","permalink":"/p/bt%E7%A7%8D%E5%AD%90%E4%B8%8B%E8%BD%BD%E7%BD%91%E7%AB%99%E6%8E%A8%E8%8D%90/","title":"BT种子下载网站推荐"}]