迷失
type: channel
link: https://blog.tx.sb/
description: 何以解忧。唯有暴富
items: js逆向时，常用的11个hook
items: Linux Ubuntu 使用docker安装科学上网v2raya
items: uni-app 安全区域适配：防止刘海屏遮挡
items: 联通光猫烽火HG6142A查看超管密码
items: 检测到 localhost 代理配置，但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理解决方法
items: 白嫖Jetbrains全家桶 无需下载第三方应用
items: web js逆向
items: JS逆向常见问题解决方式
items: Electron学习笔记
items: docker笔记

js逆向时，常用的11个hook
type: item
date: 2025-08-03T10:01:59+00:00
description: JavaScript 逆向分析中的常用 Hook 技术详解 在 JavaScript 逆向工程中，Hook（钩子）技术是定位关键逻辑、拦截数据生成、调试加密函数的核心手段。通过修改或监控原生方法的行为，我们可以深入理解目标网站的运行机制。本文整理了 11 种常见的 Hook 技术，并附上实用示例代码，适用于油猴脚本（Tampermonkey）、浏览器调试及安全研究场景。 📌 提示：以下代码建议在浏览器控制台或用户脚本中使用，用于辅助分析，切勿用于非法用途。 01. DOM 操作 Hook 通过修改 DOM 元素的属性或样式，实现对页面行为的干预，常用于隐藏元素、触发事件或篡改界面状态。 // 修改元素属性 document.getElementById('elementId').setAttribute('attrName', 'attrValue'); // 修改元素样式 document.getElementById('elementId').style.color = 'red'; document.getElementById('elementId').style.display = 'none'; 02. Cookie 操作 Hook 用于监控 document.cookie 的读写操作，定位 Cookie 中关键字段（如 __dfp、token）的生成位置。 方式一：使用 Object.defineProperty (function () { 'use strict'; let cookieTemp = ''; Object.defineProperty(document, 'cookie', { set: function (val) { if (val.includes('__dfp')) { debugger; // 断点触发 } console.log('Hook 捕获到 Cookie 设置 ->', val); cookieTemp = val; return val; }, get: function () { return cookieTemp; } }); })(); 方式二：使用 __defineSetter__（已废弃，兼容旧环境） (function () { 'use strict'; var org = document.__lookupSetter__('cookie'); document.__defineSetter__('cookie', function (cookie) { if (cookie.includes('__dfp')) { debugger; } org = cookie; }); document.__defineGetter__('cookie', function () { return org; }); })(); ⚠️ 注意：__defineSetter__ 已被弃用，推荐使用 Object.defineProperty。 03. 事件监听 Hook 监听用户交互事件（如点击、输入），用于追踪行为触发逻辑。 // 监听按钮点击 document.getElementById('buttonId').addEventListener('click', function () { console.log('按钮被点击！'); // 可在此注入自定义逻辑 }); 也可用于监听 copy、input、submit 等敏感事件。 04. AJAX 请求拦截 Hook 通过重写 XMLHttpRequest.prototype.send，拦截所有 AJAX 请求，便于分析参数与加密逻辑。 // 保存原始方法 XMLHttpRequest.prototype._send = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function (data) { console.log('拦截到 AJAX 请求，发送数据：', data); // 可在此修改 data 或插入断点 debugger; // 继续执行原方法 this._send.apply(this, arguments); }; 05. 函数替换 Hook 替换全局函数以插入日志或断点，常用于追踪加密函数调用。 // 保存原始函数 const originalFunction = window.encryptData; // 替换为自定义函数 window.encryptData = function (...args) { console.log('encryptData 被调用，参数：', args); debugger; …

Linux Ubuntu 使用docker安装科学上网v2raya
type: item
date: 2025-07-13T05:13:00+00:00
description: docker run -d \ --name v2raya \ --network=host \ -e V2RAYA_ADDRESS=0.0.0.0:2017 \ -v /lib/modules:/lib/modules:ro \ -v /etc/resolv.conf:/etc/resolv.conf \ -v /home/docker/v2raya:/etc/v2raya \ --restart=always \ --privileged \ mzz2017/v2raya 这个方式是使用全局透明代理，宿主机和 docker 容器都会走这个代理，如果不想这么做，你可能需要如下方式启动： docker run -d \ --name v2raya \ -p 2017:2017 \ -p 20170-20172:20170-20172 \ -e V2RAYA_ADDRESS=0.0.0.0:2017 \ -v /home/docker/v2raya:/etc/v2raya \ --restart=always \ --privileged \ mzz2017/v2raya 访问 2017 端口，进行添加和配置节点，这些就不多说了。主要是配置好后，选择节点并启动，右上角显示正在运行即可。 如果需要使用代理，可以使用如下方式。 curl -x localhost:2017 google.com -vL

uni-app 安全区域适配：防止刘海屏遮挡
type: item
date: 2025-07-11T14:26:00+00:00
description: # uni-app 安全区域适配：防止刘海屏遮挡 ## 🎯 核心 API ```javascript // 获取设备安全区域信息 const { safeAreaInsets } = uni.getSystemInfoSync() console.log(safeAreaInsets) // 输出： // { // top: 44, // 顶部安全距离（刘海屏为44px，普通设备为20px） // bottom: 34, // 底部安全距离（Home指示器高度） // left: 0, // 左侧安全距离 // right: 0 // 右侧安全距离 // } 📱 应用场景 1. 自定义导航栏适配 <view class="navbar" :style="{ paddingTop: safeAreaInsets?.top + 'px' }"> <view class="title">页面标题</view> </view> 2. 底部工具栏适配 <view class="toolbar" :style="{ paddingBottom: safeAreaInsets?.bottom + 'px' }"> 操作按钮 </view> 3. 页面内容区域适配 <view class="content" :style="{ paddingTop: safeAreaInsets?.top + 'px', paddingBottom: safeAreaInsets?.bottom + 'px' }"> </view> ⚙️ pages.json 配置 { "pages": [ { "path": "pages/index/index", "style": { "navigationStyle": "custom" // 使用自定义导航栏才需要手动适配 } } ] } 🎨 CSS 方式（备选） .navbar { /* CSS 安全区域常量 */ padding-top: constant(safe-area-inset-top); /* iOS 11.0-11.2 */ padding-top: env(safe-area-inset-top); /* iOS 11.2+ */ } .toolbar { padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom); } 🔧 实用代码片段 兜底处理 const { safeAreaInsets } = uni.getSystemInfoSync() const safeTop = safeAreaInsets?.top || 20 // 默认状态栏高度 const safeBottom = safeAreaInsets?.bottom || 0 组合式函数 // composables/useSafeArea.ts export const useSafeArea = () => { const { safeAreaInsets } = uni.getSystemInfoSync() return { safeTop: safeAreaInsets?.top || 0, safeBottom: safeAreaInsets?.bottom || 0, safeStyle: { paddingTop: `${safeAreaInsets?.top || 0}px`, paddingBottom: `${safeAreaInsets?.bottom || 0}px` } } } H5 端配置 📋 重点提醒 ✅ 只有 navigationStyle: "custom" 的页面需要手动适配 ✅ iPhone X 系列：top: 44px, bottom: 34px ✅ 普通设备：top: 20px, bottom: 0px ✅ 使用动态样式绑定：:style="{ paddingTop: safeAreaInsets?.top + 'px' }"

联通光猫烽火HG6142A查看超管密码
type: item
date: 2025-06-23T05:59:56+00:00
description: 光猫超管密码查看教程 一、操作前准备 ​确认设备连接​：确保电脑或移动设备已通过网线或 Wi-Fi 成功连接至目标光猫。 ​获取基础账户​：找到光猫设备背面的标签，获取 user 账户信息（通常标注为 “普通用户”），用于后续登录光猫后台。 ​准备工具​：提前打开常用的浏览器（如 Chrome、Edge、Safari 等），同时准备好能运行 Telnet 命令的终端（Windows 系统可使用命令提示符，Mac 或 Linux 系统可使用终端应用） 。 二、详细操作步骤 步骤 1：登录光猫普通用户后台 打开浏览器，在地址栏输入光猫默认管理地址 192.168.1.1 ，回车后进入登录界面。输入光猫背面标签上标注的 user 账户和密码，点击 “登录” 进入后台。 步骤 2：获取光猫 MAC 值 在光猫后台界面中，找到 “状态” 选项卡（不同光猫界面可能不同，部分可能命名为 “设备信息”“网络状态” 等） 。在 “上报云平台网关信息” 区域，找到 MAC 地址字段，记录完整的 MAC 值（例如：956E784E8880），注意​MAC 值区分大小写​。 步骤 3：开启 Telnet 功能 根据光猫型号，在浏览器地址栏输入对应开启 Telnet 的链接： ​**通用型号（非 HG6145D、HG6142a1）**​： http://192.168.1.1/telnet?enable=1&key=956E784E8880 将956E784E8880替换为步骤 2 中获取的实际 MAC 值。 ​HG6145D 和 HG6142a1 型号​： http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable=1&key=956E784E8880 同样将956E784E8880替换为实际 MAC 值。 输入链接并回车后，若页面显示Open telnet success!，则表示 Telnet 功能开启成功。 步骤 4：通过 Telnet 连接光猫 打开命令提示符（Windows）或终端（Mac/Linux） 。 在终端窗口输入命令：telnet 192.168.1.1，回车后尝试连接光猫。 连接成功后，系统会提示输入用户名和密码： ​用户名​：尝试admin或root 。 ​密码​：格式为Fh@4E8880，将4E8880替换为步骤 2 中 MAC 值的后六位 。 步骤 5：进入工厂模式并查看超管信息 登录成功后，在命令行输入load_cli factory，回车进入工厂模式。 输入show admin_pwd，回车即可显示管理员密码。 输入show admin_name，回车显示管理员账户名称。 步骤 6：使用超管账户登录 在浏览器地址栏输入http://192.168.1.1/cu.html，进入登录界面。使用步骤 5 中获取的管理员账户和密码，即可登录光猫超管后台。

检测到 localhost 代理配置，但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理解决方法
type: item
date: 2025-05-12T16:52:46+00:00
description: WSL 中使用 V2 代理的配置方法 在使用 Windows 上的 V2 代理软件时，可能会遇到 WSL 无法通过 localhost 访问代理的问题，提示如下错误： wsl: 检测到 localhost 代理配置，但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。 这是因为 WSL 默认运行在 NAT 模式 下，与 Windows 处于不同的网络命名空间中，导致 WSL 无法访问 Windows 的 localhost 代理服务。 🧩 问题原因分析 原因 说明 NAT 模式 WSL 默认使用 NAT 网络模式，与 Windows 网络隔离 无法访问 localhost WSL 无法直接访问 Windows 的 localhost 代理（如 V2Ray 监听在 127.0.0.1:1080） 代理类型 V2Ray、Shadowsocks 等通常监听在 127.0.0.1，而非 0.0.0.0 ✅ 解决方案：修改 WSL 网络模式为 Mirrored 🔧 步骤一：创建或编辑 .wslconfig 文件 .wslconfig 应该放在 Windows 的用户目录下： C:\Users\<YourUsername>\.wslconfig 替换 <YourUsername> 为你的实际用户名。 如果文件不存在，请新建一个，并写入以下内容： [experimental] autoMemoryReclaim=gradual networkingMode=mirrored networkingMode=mirrored：启用“镜像”模式，允许 WSL 共享 Windows 的网络设置（包括代理） autoMemoryReclaim=gradual：优化内存回收（可选） 🔄 步骤二：重启 WSL 在 Windows 命令行中执行： wsl --shutdown 然后重新启动 WSL： wsl 🌐 步骤三：在 WSL 中设置代理 现在 WSL 已经可以访问 Windows 的 localhost 代理了。你可以手动设置环境变量来使用代理。 export http_proxy="http://127.0.0.1:10808" export https_proxy="http://127.0.0.1:10809" 如果你使用的是 V2Ray，默认端口通常是 10808 或 10809，请根据你的代理软件配置调整。 ⚠️ 注意事项 确保代理监听在 0.0.0.0 而非 127.0.0.1 如果你的代理软件只监听 127.0.0.1，那么即使 WSL 设置了 localhost 代理也无法访问。你需要将代理配置为监听 0.0.0.0，以便 WSL 可以访问。 例如，在 V2Ray 配置文件中，将监听地址改为： "listen": "0.0.0.0", "port": 1080 临时设置代理 如果不想每次登录都手动设置，可以将代理配置写入 shell 配置文件（如 ~/.bashrc 或 ~/.zshrc）。 📚 总结 问题 解决方式 WSL 无法访问 Windows 的 localhost 代理 修改 .wslconfig，设置 networkingMode=mirrored 代理监听在 127.0.0.1 修改代理监听地址为 0.0.0.0 设置 WSL 代理 手动设置 http_proxy 和 https_proxy 环境变量

白嫖Jetbrains全家桶 无需下载第三方应用
type: item
date: 2025-04-21T17:19:00+00:00
description: 亲测有效，此处以phpstrom为例，按理其他产品也可以用相同的方式激活。 原理是我们通过代码搜索其他授权服务器进行永久激活。 方式一 通过censys https://search.censys.io/ 用到的代码： [hide]services.http.response.headers.location: account.jetbrains.com/fls-auth[/hide] 我们将上面这串代码复制进censys搜索框中进行搜索，会出现： 可以看到出现了很多对应跳转到 jetbrains 的服务器IP和网址,我们随便点击一个看下状态是不是 302 只有 302 的才能正常使用 。 然后我们复制域名或者IP到jetbrains全家桶进行激活,比如我们使用第一个 49.234.70.205 复制到 License server 。 可以看到已经连接到jetbrains授权服务器成功了,然后我们点击 ACTIVATE 进行启动就可以了。 方式二 通过shodan或fofa https://fofa.info/ https://www.shodan.io 用到的代码： [hide]Location: https://account.jetbrains.com/fls-auth[/hide] 和方式一同样我们将代码复制到搜索框进行搜索就可以了。 通过shodan我们可以直接看到 HTTP/1.1 302 不用再每个都要点进去看了,相对来说比方式一方便。 激活使用jetbrains全家桶方式和censys一样,激活之后我们可以看到用的是 天津理工大学 的 jetbrains授权服务器 。 jetbrains激活原理 通过以上方式激活 jetbrains全家桶 主要是用到了爬取网站服务这一类的搜索引擎实现的。通过搜索引擎我们找到全世界的 jetbrains授权服务器进行激活。 注意事项 每个服务器IP承载激活的数量优先, 如果激活时候提示失败,可以多换几个. 本文章仅用于学习研究勿用于非法. 请支持正版

web js逆向
type: item
date: 2025-03-09T09:49:00+00:00
description: JS逆向常见问题解决方式** 一、AES加密 JS实现 const CryptoJS = require('crypto-js'); //引用AES源码js const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF"); //十六位十六进制数作为密钥 const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412'); //十六位十六进制数作为密钥偏移量 //解密方法 function Decrypt(word) { let encryptedHexStr = CryptoJS.enc.Hex.parse(word); let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr); let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8); return decryptedStr.toString(); } //加密方法 function Encrypt(word) { let srcs = CryptoJS.enc.Utf8.parse(word); let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString().toUpperCase(); } export default { Decrypt , Encrypt } Python实现 import base64 import binascii from Crypto.Cipher import AES from Crypto.Util.Padding import pad class AESUtil(object): config = { 'ECB': 1, 'CBC': 2, 'CFB': 3, 'OFB': 5, 'CTR': 6, 'OPENPGP': 7, 'CCM': 8, 'EAX': 9, 'SIV': 10, 'GCM': 11, 'OCB': 12 } @classmethod def encrypt(cls, text, key, iv=None, encoding='b64', mode='ECB', padding='pkcs7'): key = key.encode() # 秘钥，b就是表示为bytes类型 if mode != 'ECB': iv = iv.encode() aes = AES.new(key, mode=cls.config[mode], iv=iv) # 创建一个aes对象 else: aes = AES.new(key, mode=cls.config[mode]) # 创建一个aes对象 text = text.encode() if padding: text = pad(text, AES.block_size, style='pkcs7') # 选择pkcs7补全 encrypt_aes = aes.encrypt(text) if encoding == 'b64': encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 解码 elif encoding == 'hex': encrypted_text = str(binascii.b2a_hex(encrypt_aes), encoding='utf-8') else: raise ValueError('错误的编码') encrypted_text_str = encrypted_text.replace("\n", "") return encrypted_text_str if __name__ == '__main__': t = '{"YSZH":"2023","XMMC":"","verifyCode":"bg34"}' key = 'dbd99c5139145091' # iv = '0000000000000000' m = 'ECB' encoding = 'hex' res = AESUtil…

JS逆向常见问题解决方式
type: item
date: 2025-02-13T06:24:00+00:00
description: web js逆向 web页面大家都不陌生，在web开发过程中后端负责程序架构和数据管理，前端负责页面展示和用户交互，有种不严谨的说法是：前端代码给浏览器看，后端代码给服务器看。 有开发经验的同学对前后端交互的理解会更深一点，在这种前后端分离的开发方式中，以接口为标准来进行联调整合。为了保证接口在调用时数据的安全性，也是为了防止请求的参数被篡改，大多数接口都进行了请求签名、身份认证、动态Cookie等机制。另外部分网站会对返回的数据进行加密，通常利用AES、RSA等加密方式，也有在传输时对数据进行序列化，比如Protobuf等，这些会在后面进行详细讲解。 请求签名十分常见，比如URL中的加密参数sign，身份认证也有很多例子，比如动态Cookie。这些参数的生成方法都是Js来控制的，如果想要直接从接口上获取数据，就要去调试分析JavaScript的调用逻辑、堆栈调用关系来弄清楚网站加密的实现方法，根据网站的参数生成规则还原加密参数，可以称这个过程为Js逆向。 我们总结了一下目前加密参数的常用逆向方式，一种是根据源码的生成逻辑还原加密代码，另一种是补环境Copy源码模拟加密参数生成，还有一种是通过RPC的方式远程调用。 在一些逆向案例中，其中的关键就是将浏览器环境移植到Node环境中，Node Js采用的内核也为V8引擎，该引擎调用对方Js的可行性并不是100%，同时由于Node没有界面渲染，因此在浏览器中可使用的例如window、navigator、dom等操作在node中是不存在的，所以对于Node Js的环境搭建和浏览器环境补齐也是Js逆向需要掌握的。 还有就是Chrome作为Js逆向的核心工具，熟练掌握Chrome的控制台、插件编写就足够应对绝大多数的抓包、调试、Hook等，这些内容都会在后续进行讲解。 第一章 逆向基础 1.1 语法基础 Js调试相对方便，通常只需要chrome或者一些抓包工具、扩展插件，就能顺利的完成逆向分析。但是Js的弱类型和语法多样，各种闭包，逗号表达式等语法让代码可读性变得不如其他语言顺畅。所以需要学习一下基础语法。 基本数据类型 字符串 String 数字 Number 布尔 Boolean 空值 Null 未定义 Undefined 独一无二的值 Symbol 引用数据类型 对象 Object 数组 Array 函数 Function 语句标识符 在条件为true时重复执行 do……while 在条件为true时执行 while 循环遍历 for 条件判断 if……else 根据情况执行代码块 switch 退出循环 break 异常捕获 try……catch……finally 抛出异常 Throw 声明固定值的变量 const 声明类 class 停止函数并返回 return 声明块作用域的变量 let 声明变量 var 断点调试 debugger 当前所属对象 this 算数运算符 加 + 减 - 乘 * 除 / 取余 % 累加 ++ 递减 – 比较运算符 等于 == 相等值或者相等类型 === 不等于 != 不相等值或者不相等类型 !== 大于 > 小于 < 大于等于 >= 小于等于 <= 在JavaScript中将数字存储为64位浮点数，但所有按位运算都以32位二进制数执行。在执行位运算之前，JavaScript将数字转换位32位有符号整数。执行按位操作后，结果将转换回64位JavaScript数。 Javascript 函数 JavaScript 中的函数是头等公民，不仅可以像变量一样使用它，同时它还具有十分强大的抽象能力 定义函数的 2 种方式 在JavaScript 中，定义函数的方式如下： function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述 abs() 函数的定义如下： function 指出这是一个函数定义； abs 是函数的名称； (x) 括号内列出函数的参数，多个参数以，分隔； {……} 之间的代码是函数体，可以包含若干语句，甚至可以没有任何语句。 请注意，函数体内部的语句在执行时，一旦执行到 return 时，函数就执行完毕，并将结果返回。因此，函数内部通过条件判断和循环可以实现非常复杂的逻辑。 如果没有 return 语句，函数执行完毕后也会返回结果，只是结果为 undefined。 由于JavaScript的函数也是一个对象，上述定义的 abs()函数实际上是一个函数对象，而函数名 abs可以视为指向该函数的变量。 因此，第二种定义函数的方式如下： var abs = function (x) { if (x >= 0) { return x; } else { return -x…

Electron学习笔记
type: item
date: 2025-01-04T15:19:00+00:00
description: 什么是 Electron? Electron 是一个用于构建跨平台桌面应用的框架。它结合了 Chromium 和 Node.js，使开发者可以使用 Web 技术（HTML、CSS、JavaScript）来构建桌面应用。 如上图所示，Electron 由 Chromium、Node.js 和 Native API 组成。 Electron 的架构 Electron 的架构分为主进程和渲染进程。主进程负责管理应用的生命周期和窗口创建，而渲染进程负责显示网页内容。 主进程 Main Native API: 处理系统级别的操作。 Node.js: 提供服务器端功能。 渲染进程 Web 页面: 使用 HTML、CSS、JavaScript 构建。 Node.js: 提供服务器端功能。 Webkit: 渲染网页内容。 进程间通信 (IPC) 主进程和渲染进程之间通过 IPC (Inter-Process Communication) 进行通信。 渲染进程: 使用 ipcRenderer 进行通信。 主进程: 使用 ipcMain 进行通信。 使用 Electron-Vite 构建项目 Electron-Vite 是一个集成了 Vite 的工具，简化了 Electron 应用的构建过程。 步骤 安装 Electron-Vite 使用 pnpm 安装 Electron-Vite： pnpm create @quick-start/electron 创建项目 然后按照提示操作即可! ✔ Project name: … ✔ Select a framework: › vue ✔ Add TypeScript? … No / Yes ✔ Add Electron updater plugin? … No / Yes ✔ Enable Electron download mirror proxy? … No / Yes Scaffolding project in ./... Done. 3. **开发模式** 启动开发服务器： ```bash npm run dev 构建应用 构建生产版本： npm run build 进程间通信 1. 主进程与渲染进程的角色 主进程 (Main Process) 只有一个，是应用程序的入口点 可以访问原生 GUI 管理所有渲染进程 可以访问 Node.js API 控制应用程序的生命周期 渲染进程 (Renderer Process) 可以有多个，每个对应一个窗口 运行网页内容 无法直接访问原生 GUI 默认沙箱化环境 通过 IPC 与主进程通信 2. IPC 通信详解 从渲染进程到主进程 (Renderer to Main) 单向通信 (send) // 渲染进程发送 ipcRenderer.send('message-to-main', data) // 主进程接收 ipcMain.on('message-to-main', (event, data) => { console.log(data) }) 请求响应模式 (invoke/handle) // 渲染进程 const response = await ipcRenderer.invoke('async-message', data) // 主进程 ipcMain.handle('async-message', async (event, data) => { // 处理异步操作 return result }) 从主进程到渲染进程 (Main to Renderer) // 主进程发送 mainWindow.webContents.send('message-to-renderer', data) // 渲染进程接收 ipcRenderer.on('message-to-renderer', (event, data) => { console.log(data) }) 3. 页面间通信 方式一：通过主进程中转 // 页面A发送消息 ipcRenderer.send('message-to-page-b', data) // 主进程中转 ipcMain.on('message-to-page-b', (event, data) => { // 转发给页面B windowB.webContents.send('receive-from-page-a', data) }) // 页面B接收消息 ipcRenderer.on('receive-from-page-a', (event, data) => { console.log(data) }) 方式二：使用 contextBridge // 预加载脚本中设置 contextBridge.exposeI…

docker笔记
type: item
date: 2024-11-30T13:45:49+00:00
description: # Docker常用命令 ## 镜像相关命令 ### 搜索镜像 ```bash docker search [镜像名称] # 示例：docker search ubuntu 用于在Docker Hub等镜像仓库查找包含指定关键词的镜像，展示镜像名称、描述、星级等相关信息，方便查找合适的镜像资源。 拉取镜像 docker pull [镜像名称:标签] # 示例：docker pull ubuntu:latest docker pull mysql:5.7 从镜像仓库下载指定的镜像到本地，若不指定标签，默认拉取 latest（最新版）镜像，以获取对应软件或服务的基础镜像。 查看本地镜像 docker images 此命令会列出本地已下载的所有镜像，展示的信息包含 REPOSITORY（仓库名）、TAG（标签）、IMAGE ID（镜像ID）、CREATED（创建时间）、SIZE（大小）等，方便了解本地镜像的存储情况。 删除镜像 docker rmi [镜像名称或镜像ID] # 示例：docker rmi ubuntu:latest docker rmi [具体镜像ID] 用于删除本地不再需要的镜像，若镜像正在被容器使用，需先停止并删除关联的容器后，方可成功删除该镜像。 构建镜像（基于Dockerfile） docker build -t [镜像名称:标签] [Dockerfile所在目录路径] # 示例：docker build -t myapp:v1 依据包含构建指令的Dockerfile所在目录来构建自定义镜像，-t 参数用于指定镜像名称和标签，便于创建符合自身业务需求的镜像。 批量删除镜像（根据条件） docker rmi $(docker images -q [筛选条件]) # 示例：docker rmi $(docker images -q -f "before=20240101") 可以通过结合 docker images -q（用于获取符合条件的镜像ID列表）与删除命令 docker rmi 来批量删除镜像。上述示例是删除在2024年1月1日之前创建的镜像，可根据具体的筛选条件（如名称、大小范围、创建时间等）灵活运用此方法进行批量清理。 容器相关命令 运行容器 docker run [参数] [镜像名称:标签] # 示例： docker run -it ubuntu:latest /bin/bash docker run -d -p 3306:3306 --name mymysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7 常用参数解释： -d：使容器后台运行（守护式运行），常用于运行长期提供服务的容器，如数据库容器等。 -it：分配交互式终端进入容器内部，方便在容器内执行命令操作，常用于调试等场景。 -p：进行端口映射（宿主机端口:容器内部端口），使得容器内运行的服务能被外部访问。 --name：指定容器的名称，便于后续对容器进行识别和操作。 -e：设置环境变量，用于向容器内传递配置相关信息，比如数据库的初始密码等。 查看运行中的容器 docker ps 列出当前正在运行的容器信息，包含 CONTAINER ID（容器ID）、IMAGE（所使用的镜像）、COMMAND（启动容器时执行的命令）、CREATED（创建时间）、STATUS（状态）、PORTS（端口映射情况）和 NAMES（容器名称）等，帮助掌握容器运行状态。 查看所有容器（包括已停止的） docker ps -a 展示所有容器的详细信息，除了运行中的容器信息外，还能看到已停止容器的相关情况，用于全面了解容器的存在和过往运行记录。 停止容器 docker stop [容器名称或容器ID] # 示例：docker stop mymysql docker stop [具体容器ID] 正常停止正在运行的容器，让容器内的进程优雅地结束，避免数据丢失或异常情况。 启动容器 docker start [容器名称或容器ID] # 示例：docker start mymysql docker start [具体容器ID] 用于启动处于停止状态的容器，使其再次投入运行，恢复到之前配置的运行状态。 重启容器 docker restart [容器名称或容器ID] # 示例：docker restart mymysql docker restart [具体容器ID] 重启正在运行或已停止的容器，常用于更新配置后或者容器出现异常需要重新初始化的场景。 删除容器 docker rm [容器名称或容器ID] # 示例：docker rm mymysql docker rm [具体容器ID] 删除指定的容器，若容器正在运行，需先停止容器才能删除，清理不…