白荼日记 - 技术笔记 https://blog.iletter.top/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/ zh-CN Tue, 30 Dec 2025 14:35:53 +0800 Tue, 30 Dec 2025 14:35:53 +0800 linux服务器实现webdav挂载 https://blog.iletter.top/archives/518/ https://blog.iletter.top/archives/518/ Tue, 30 Dec 2025 14:35:53 +0800 DelLevin 使用 davfs2 (推荐用于标准WebDAV)

安装 davfs2

在 Debian/Ubuntu:

sudo apt update && sudo apt install davfs2

在 CentOS/RHEL (可能需要EPEL源):

sudo yum install davfs2

创建挂载点

sudo mkdir /home/dellevin/zhang/jellyfin/media/webdav/g3

配置 davfs2 凭证

编辑 /etc/davfs2/secrets 文件,添加一行:

/home/dellevin/zhang/jellyfin/media/webdav/g3 webdav账户 webdav密码

设置文件权限:

sudo chmod 600 /etc/davfs2/secrets

挂载 WebDAV

sudo mount -t davfs http://webdav地址/path  /home/dellevin/zhang/jellyfin/media/webdav/g3

卸载

sudo umount /home/dellevin/zhang/jellyfin/media/webdav/g3
]]>
0 https://blog.iletter.top/archives/518/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
宝塔面板V11.4精简去除vip以及其他推广功能 https://blog.iletter.top/archives/516/ https://blog.iletter.top/archives/516/ Sun, 21 Dec 2025 22:57:03 +0800 DelLevin 该操作仅适用于宝塔面板 V11.4,其他版本需要自行测试。

功能隐藏:

关闭不必要的功能

设置->常用设置->面板栏隐藏,隐藏如下功能

WAF、WP Tools、多用户、邮局、节点管理

不想用,隐藏就行了。

去除首页的软件推荐功能。

image.png

一开始我本以为这个是在utils-lib.js里面带着的,后来通过减慢请求查看到是在请求里面带着的。通过搜索关键词get_pay_type发现,是通过getRecommendContent这个请求函数带过来的。所以我们需要在这里设置返还值为空即将

getRecommendContent=()=>useAxios.post("ajax/get_pay_type")

替换成

getRecommendContent=()=>{return []}

去除日志部分的 SSH 登录日志

删掉如下部分

{path:"ssh",name:"ssh",meta:{title:"SSH登录日志"},component:()=>__vitePreload(()=>import("./index57.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},

去除 SSL 部分的 自动部署

image.png

删掉如下部分

{path:"auto-deploy",name:"auto-deploy",meta:{title:"自动部署"},component:()=>__vitePreload(()=>import("./index89.js?v=1766131796").then(e=>e.i),__vite__mapDeps([]),import.meta.url)},

去除 安全部分的 安全检测和违规词检测

image.png

删掉如下部分

{path:"safe-detect",name:"safe-detect",meta:{title:"安全检测"},component:()=>__vitePreload(()=>import("./index46.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"keyword",name:"keyword",meta:{title:"违规词检测"},component:()=>__vitePreload(()=>import("./index47.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},

去除 PHP网站安全 入侵防御 系统加固 扫描感知 部分

image (1).png

删掉如下部分

,{path:"php-safe",name:"php-safe",meta:{title:"PHP网站安全"},component:()=>__vitePreload(()=>import("./index48.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"intrusion",name:"intrusion",meta:{title:"入侵防御"},component:()=>__vitePreload(()=>import("./index49.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"fixed",name:"fixed",meta:{title:"系统加固"},component:()=>__vitePreload(()=>import("./index50.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{path:"network-scan",name:"network-scan",meta:{title:"扫描感知"},component:()=>__vitePreload(()=>import("./index51.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)}

去除网站界面 的漏洞扫描 和 网站安全

找到 index74.js

image.png

漏洞扫描删除如下部分

{type:"custom",render:()=>w(P,{onClick:ee},{default:()=>{var e,t;return[S("漏洞扫描"),w("span",{class:"ml-4px py-1px px-4px text-center font-bold ".concat((null==(e=Se.value)?void 0:e.loophole_num)>0?"text-danger":"text-warning")},[null==(t=Se.value)?void 0:t.loophole_num])]}})},

网站安全删除如下部分

,{type:"custom",render:()=>w(P,{onClick:te},{default:()=>{var e,t;return[S("网站安全"),w("span",{class:"ml-4px py-1px px-4px text-center font-bold ".concat((null==(e=Se.value)?void 0:e.web_scaning_times)>0?"text-danger":"text-warning")},[null==(t=Se.value)?void 0:t.web_scaning_times])]}})}

去除 table 表格的右侧的统计和 waf

image.png

{onClick:e=>{le(e,"monitor-setting")},title:"统计"},{onClick:e=>{le(e,"bt_waf")},title:"WAF"},

去除网站安全和防篡改

找到 index235.js

image (1).png

删除该部分

{label:"防篡改",name:"antiTamper",lazy:!0,render:()=>r(()=>import("./index463.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},{label:"网站安全",lazy:!0,name:"siteSecurity",render:()=>r(()=>import("./index464.js?v=1766131796"),__vite__mapDeps([]),import.meta.url)},

Css隐藏:

主要路径为/www/server/panel/BTPanel/static/css/style.css 一下更改需要在此文件内进行调整,如需更改其他部分会另作说明

去除顶部的企业版tag

image.png

.icon-end-time-free[data-v-402b09ab]{ 后面添加 display:none;

软件商店的推广 banner

image.png

.recom-view[data-v-81e888c5]{ 后面添加 display:none

去除底部的vip推广

image.png

找到如下路径的/www/server/panel/BTPanel/static/css里面的style.css搜索advantage-view吧这里面的display:flex改成display:none

去除网站里面的 waf 图标

image (1).png

.svgtofont-left-waf:before{content:""} 替换成 .svgtofont-left-waf:before{dispaly:none;content:""}

]]>
0 https://blog.iletter.top/archives/516/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
将bat脚本设置成windows服务 https://blog.iletter.top/archives/502/ https://blog.iletter.top/archives/502/ Tue, 02 Dec 2025 13:46:29 +0800 DelLevin 步骤 1: 下载 NSSM

访问 NSSM 官方网站:http://nssm.cc/download
下载适用于你系统架构(通常是 64-bit x64)的最新版本。
解压下载的 ZIP 文件。你会得到一个包含 nssm.exe 的文件夹(例如 win64 文件夹里有 nssm.exe)。

步骤 2: 将 NSSM 添加到系统 PATH

为了在任何地方都能使用 nssm 命令,建议将其路径添加到系统的环境变量 PATH 中。

打开“控制面板” -> “系统和安全” -> “系统” -> “高级系统设置”。点击“环境变量”。在“系统变量”或“用户变量”中找到 Path,选中它并点击“编辑”。点击“新建”,然后粘贴你解压出来的 nssm.exe 所在的完整目录路径(例如 D:\tools\nssm-2.24\win64)。

请务必将路径修改为你实际解压的路径。点击“确定”保存所有更改。关闭并重新打开命令提示符窗口,以使 PATH 变更生效。

步骤 3: 使用 NSSM 创建服务

以管理员身份 打开命令提示符 (CMD) 或 PowerShell。
输入以下命令来启动 NSSM 的图形安装界面:

nssm install frp_client_service

(frp_client_service 是你将要创建的服务名称,你可以根据需要修改,但不能包含空格)。

在弹出的 NSSM 配置窗口中:

Path: 浏览并选择你的 start.bat 文件路径:D:\appStable\frp-client\start.bat。

Startup directory: 自动填充为 .bat 文件所在的目录,即 D:\appStable\frp-client。请确认此目录正确。这是程序运行时的工作目录。

Arguments: 如果你的 start.bat 脚本需要额外的命令行参数,可以在这里填写。通常 .bat 文件不需要在此处添加参数。

其他选项卡(如 Details, Log on, Dependencies, Process, Shutdown, Exit actions, I/O Priority)可以根据需要进行配置,但对于大多数情况,默认设置即可。

Details: 可以给服务起个易读的显示名称(Display name),比如 "FRP Client",以及描述(Description)。
Log on: 默认是使用本地系统账户,通常足够了。

I/O Priority: 如果担心性能,可以将优先级设为 Normal。
确认所有信息无误后,点击 Install service 按钮。

步骤 4: 启动并测试服务

可以通过 NSSM GUI 来管理服务:

nssm edit frp_client_service  # 编辑服务
nssm start frp_client_service # 启动服务
nssm stop frp_client_service  # 停止服务
nssm remove frp_client_service # 删除服务

或者使用 Windows 内置的 服务管理器:

按 Win + R 键,输入 services.msc 并回车。

在服务列表中找到你刚刚创建的服务(名称是你在 NSSM 中指定的 Display name 或服务名 frp_client_service)。

右键单击该服务,选择“启动”。

检查状态是否变为“正在运行”。

步骤 5: 设置开机自启

在 Windows 的 服务管理器 (services.msc) 中,找到你的 frp_client_service 服务。

右键单击该服务,选择“属性”。

在“常规”选项卡下,将“启动类型”设置为 自动。

点击“应用”和“确定”。

现在,这个 FRP 客户端就会作为 Windows 服务运行,并且在系统开机时自动启动了。

]]>
0 https://blog.iletter.top/archives/502/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
pycharm远程开发 https://blog.iletter.top/archives/501/ https://blog.iletter.top/archives/501/ Thu, 06 Nov 2025 22:18:00 +0800 DelLevin 首先创建新的ssh项目

2025-11-06T14:03:42.png

填写相关参数

2025-11-06T14:04:29.png

这里需要上传linux的安装包,因为下载的话一直失败无法下载成功,我们选择上传和上传路径
2025-11-06T14:05:26.png

pycharm地址:https://www.jetbrains.com/zh-cn/pycharm/download/other.html

破解文件下载地址:ja-netfilter-2025.3.0.zip

弄完之后,会让你填写远程pycharm的验证,在这之前退出一下我们需要填写编辑一下文件

vim pycharm64.vmoptions

里面填写关于破解文件的相关信息

-Xms256m
-Xmx2048m
-XX:ReservedCodeCacheSize=512m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:CICompilerCount=2
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-XX:+IgnoreUnrecognizedVMOptions
-XX:CompileCommand=exclude,com/intellij/openapi/vfs/impl/FilePartNodeRoot,trieDescend
-ea
-Dsun.io.useCanonCaches=false
-Dsun.java2d.metal=true
-Djbr.catch.SIGABRT=true
-Djdk.http.auth.tunneling.disabledSchemes=""
-Djdk.attach.allowAttachSelf=true
-Djdk.module.illegalAccess.silent=true
-Dkotlinx.coroutines.debug=off
-Dide.show.tips.on.startup.default.value=false
-Dsun.tools.attach.tmp.only=true
-Dawt.lock.fair=true
-javaagent:/root/ja-netfilter/ja-netfilter.jar
--add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED
--add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED

之后再次打开pycharm远程,填写激活码

6ZLWI4KV9Y-eyJsaWNlbnNlSWQiOiI2WkxXSTRLVjlZIiwibGljZW5zZWVOYW1lIjoi5rC45LmF5r+A5rS7IHd3d8K3YWppaHVvwrdjb20iLCJsaWNlbnNlZVR5cGUiOiJQRVJTT05BTCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkdPIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUzAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNVIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSU0MiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IkRTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSRCIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUkMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJTRiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJEQlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlJNIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJJSSIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiRFBOIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJEQiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiREMiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6ZmFsc2V9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUiIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjpmYWxzZX0seyJjb2RlIjoiUlNWIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJQU0kiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUENXTVAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiQUlMIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOmZhbHNlfSx7ImNvZGUiOiJSUyIsInBhaWRVcFRvIjoiMjAyNS0xMS0yMyIsImV4dGVuZGVkIjp0cnVlfSx7ImNvZGUiOiJQUlIiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiRFAiLCJwYWlkVXBUbyI6IjIwMjUtMTEtMjMiLCJleHRlbmRlZCI6dHJ1ZX0seyJjb2RlIjoiUERCIiwicGFpZFVwVG8iOiIyMDI1LTExLTIzIiwiZXh0ZW5kZWQiOnRydWV9XSwibWV0YWRhdGEiOiIwNDIwMjUxMDI0UFBBTTAwMDAwNUEwMDAwMDBYQyIsImhhc2giOiI3NTkxODgyNy8wOjEzODU1MTE2NSIsImdyYWNlUGVyaW9kRGF5cyI6NywiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlLCJ0cmlhbCI6ZmFsc2UsImFpQWxsb3dlZCI6dHJ1ZX0=-jEJB+XsDL603fDEvkpWiZmuv+g4j7nLQ2jwzghoDP8KuxfCXLPG6LFK4C00mUzUX23i+T9XB9hAp83icdF+YuVESTTbPPxLQVCzk2uIskO8s/g4BZacTQD5IsHVDjRmv5HWtuakqNVUzbatF+yc0ut58PfrPsnKMrp1yFBQEvw3Ch1gghbm85UsTQ4zW2C05QSQDrLSlQB4M/cZ6OTI22NtPSrfJxyfdUhVEnQQqO6uQqrqa7CX8ZuC+ZKsap4tnaXmHG4hfUlZdO7PTlZfV20n9mtJxZSftqZUgeJzreporG7C2bX1mIDlkAECzkMU5gmJzlUQ6499xz2O2Upx7Wg==-MIIETDCCAjSgAwIBAgIBETANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTI0MDkyMDEyMTEyN1oXDTI2MDkyMjEyMTEyN1owHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyNDA5MjAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC7SH/XcUoMwkDi8JJPzXWWHWFdOZdrP2Dqkz2W8iUi650cwz2vdPEd0tMzosLAj7ifkFEHUyiuEcL//q9d9Op7ZsV23lpPXX8tFMLFwugoQ9D8jDLT/XP9pp/YukWkKF5jpNbaCvsVQkDdYkArBkYvhH3aN4v9BkEsXahfgLLOPe4IG2FDJNf9R4to9V1vt+m2UVJB0zV4a/sVMKUZLgqKmKKKOKoLrE3OjBlZlb+Q0z2N5dsW0hDEVRFGmBUAbHN/mp44MMMvEIFKfoLIGpgic92P2O6uFh75PI7mcultL6yuR48ajErx8CjjQEGOSnoq/8hD+yVE+6GW2gJa2CPvAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUb5NERj05GyNerQ/Mjm9XH8HXtLIwSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggIBALq6VfVUjmPI3N/w0RYoPGFYUieCfRO0zVvD1VYHDWsN3F9buVsdudhxEsUb8t7qZPkDKTOB6DB+apgt2ZdKwok8S0pwifwLfjHAhO3b+LUQaz/VmKQW8gTOS5kTVcpM0BY7UPF8cRBqxMsdUfm5ejYk93lBRPBAqntznDY+DNc9aXOldFiACyutB1/AIh7ikUYPbpEIPZirPdAahroVvfp2tr4BHgCrk9z0dVi0tk8AHE5t7Vk4OOaQRJzy3lST4Vv6Mc0+0z8lNa+Sc3SVL8CrRtnTAs7YpD4fpI5AFDtchNrgFalX+BZ9GLu4FDsshVI4neqV5Jd5zwWPnwRuKLxsCO/PB6wiBKzdapQBG+P9z74dQ0junol+tqxd7vUV/MFsR3VwVMTndyapIS+fMoe+ZR5g+y44R8C7fXyVE/geg+JXQKvRwS0C5UpnS5FcGk+61b0e4U7pwO20RlwhEFHLSaP61p2TaVGo/TQtT/fWmrtV+HegAv9P3X3Se+xIVtJzQsk8QrB/w52IB3FKiAKl/KRn1egbMIs4uoNAkqNZ9Ih2P1NpiQnONFmkiAgeynJ+0FPykKdJQbV3Mx44jkaHIif4aFReTsYX1WUBNu/QerZRjn4FVSHRaZPSR5Oi82Wz0Nj7IY9ocTpLnXFrqkb/Kt3S6B9s2Kol3Lr1ElYA

这一步可能会提示

This license xxxx has been suspended

可以设置一下代理就可以了

2025-11-06T14:15:15.png

]]>
0 https://blog.iletter.top/archives/501/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
1+ACE2系统优化笔记 https://blog.iletter.top/archives/495/ https://blog.iletter.top/archives/495/ Sat, 01 Nov 2025 21:01:00 +0800 DelLevin 记录一下系统的优化记录系统版本C13.1 (cn01)版本。机型1+ace2

系统版本:

系统版本.jpg

冻结的应用:

禁用服务.jpg

其中,发现我的system_server里面一直高负载,时不时跳到150%以上。于是采用adb抓包形式。

抓包命令

.\adb logcat -v time > D:\UserData\Desktop\logcat.log

第一次日志抓取

11-01 18:31:44.931 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
11-01 18:31:44.931 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
11-01 18:31:44.932 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
11-01 18:31:44.933 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
11-01 18:31:44.934 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
11-01 18:31:44.935 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
11-01 18:31:44.936 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
11-01 18:31:44.937 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
11-01 18:31:44.938 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
11-01 18:31:44.938 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 
11-01 18:31:44.939 W/ActivityManager( 3189): Unable to start service Intent { act=com.oplus.onet.service.INTENT_SDK_BIND_SERVICE pkg=com.oplus.onet } U=0: not found
11-01 18:31:44.939 W/ContextImpl( 4912): Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1973 android.content.ContextWrapper.bindService:863 com.oplus.onet.case$do.run:142 android.os.Handler.handleCallback:942 android.os.Handler.dispatchMessage:99 

这里疯狂唤醒com.oplus.onet 服务,同时com.oplus.virtualcomm,这个虚拟通信也疯狂调用。于是只好解冻这net服务。

第二次抓包

11-01 18:48:53.927 E/AdbDebuggingManager( 3189): Caught an exception opening the socket: java.io.IOException: No such file or directory
11-01 18:48:53.956 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
11-01 18:48:53.958 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
11-01 18:48:53.960 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
11-01 18:48:53.962 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
11-01 18:48:53.962 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
11-01 18:48:53.963 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
11-01 18:48:53.963 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
11-01 18:48:53.964 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
11-01 18:48:53.964 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
11-01 18:48:53.965 W/ActivityManager( 3189): Receiver with filter android.content.IntentFilter@56b32fa already registered for pid 16357, callerPackage is com.oplus.onet
11-01 18:48:53.965 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.action.BASE_FRAMEWORK_MANAGER pkg=com.heytap.accessory } U=0: not found
11-01 18:48:53.966 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found
11-01 18:48:53.966 W/ActivityManager( 3189): Unable to start service Intent { act=com.heytap.accessory.ScanService pkg=com.heytap.accessory (has extras) } U=0: not found

这里疯狂唤醒com.heytap.accessory,于是把这个解冻了。

第三次抓包

发现一直在唤醒com.nearme.statistics.rom这个玩意,但是频次不是很高。搜索发现这是哪个用户体验计划,索性就不管了。

同时在阅读了https://www.coolapk.com/feed/66547164这个大佬的文章之后。也是选择性的禁用软件。删除了olc和反馈工具箱这俩应用。

其实从18年入手的第一台小米8开始,就开始了我的root之路。到现在已经七年了。也从小米换到了一加。从一个无脑安装模块的脚本小子,到了开始解读源码写程序的程序员。自己蜕变了好多,心态也老了好多。沉下心来做事,安安静静的学习!

加油吧!

]]>
0 https://blog.iletter.top/archives/495/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
typecho添加附件功能如果是图片就可以预览 https://blog.iletter.top/archives/492/ https://blog.iletter.top/archives/492/ Tue, 28 Oct 2025 19:29:00 +0800 DelLevin 定位文件file-upload.phpfile-upload-js.php。修改之前记得备份文件。更改了一下排序顺序,刚上传的放在最前面。如果是图片就可以简单预览缩略图。

微信图片_20251028192723_266_15.png

更改file-upload.php

<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>

<?php
if (isset($post) || isset($page)) {
    $cid = isset($post) ? $post->cid : $page->cid;

    if ($cid) {
        \Widget\Contents\Attachment\Related::alloc(['parentId' => $cid])->to($attachment);
    } else {
        \Widget\Contents\Attachment\Unattached::alloc()->to($attachment);
    }
}
?>

<div id="upload-panel" class="p">
    <div class="upload-area" draggable="true"><?php _e('拖放文件到这里<br>或者 %s选择文件上传%s', '<a href="###" class="upload-file">', '</a>'); ?></div>
    <ul id="file-list">
    <?php while ($attachment->next()): ?>
        <li data-cid="<?php $attachment->cid(); ?>" data-url="<?php echo $attachment->attachment->url; ?>" data-image="<?php echo $attachment->attachment->isImage ? 1 : 0; ?>">
            <input type="hidden" name="attachment[]" value="<?php $attachment->cid(); ?>" />
            <a class="insert" title="<?php _e('点击插入文件'); ?>" href="###"><?php $attachment->title(); ?></a>
            <div class="info">
                <?php echo number_format(ceil($attachment->attachment->size / 1024)); ?> Kb
                <a class="file" target="_blank" href="<?php $options->adminUrl('media.php?cid=' . $attachment->cid); ?>" title="<?php _e('编辑'); ?>"><i class="i-edit"></i>编辑</a>
                <a href="###" class="delete" title="<?php _e('删除'); ?>"><i class="i-delete"></i>删除</a>
            </div>
            <?php if ($attachment->attachment->isImage): ?>
                <div class="image-preview">
                    <img src="<?php echo $attachment->attachment->url; ?>" alt="<?php $attachment->title(); ?>" />
                </div>
            <?php endif; ?>
        </li>
    <?php endwhile; ?>
    </ul>
</div>

<style>
/* 为包含图片的列表项设置基础样式 */
#file-list li {
    margin-bottom: 10px; /* 列表项之间的间距 */
    padding: 8px; /* 内边距 */
    border: 1px solid #eee; /* 边框 */
    border-radius: 4px; /* 圆角 */
    background-color: #fafafa; /* 背景色 */
    list-style: none; /* 去除默认列表符号 */
}

/* 标题样式 */
#file-list li .insert {
    display: block; /* 使其独占一行 */
    font-weight: bold; /* 标题加粗 */
    margin-bottom: 4px; /* 与下方 .info 的间距 */
    color: #333; /* 标题颜色 */
    text-decoration: none; /* 去除下划线 */
}

#file-list li .insert:hover {
    text-decoration: underline; /* 悬停时添加下划线 */
}

/* 信息栏样式 */
#file-list li .info {
    font-size: 0.9em; /* 信息栏字体稍小 */
    color: #666; /* 信息栏颜色 */
    margin-bottom: 8px; /* 与下方图片的间距 */
    line-height: 1.4; /* 行高 */
}

/* 信息栏内的链接和图标 */
#file-list li .info a {
    margin-right: 8px; /* 链接之间的间距 */
    color: #999; /* 图标颜色 */
    text-decoration: none;
}

#file-list li .info a:hover {
    color: #007cba; /* 悬停时的颜色 */
}

/* 图片预览容器 */
.image-preview {
    text-align: center; /* 图片居中 */
    margin-top: 5px; /* 与上方 .info 的间距 */
    clear: both; /* 清除浮动(如果有的话) */
}

/* 图片样式 */
.image-preview img {
    max-width: 150px; /* 设置最大宽度 */
    max-height: 150px; /* 设置最大高度 */
    height: auto; /* 保持宽高比 */
    border: 1px solid #ddd; /* 图片边框 */
    border-radius: 4px; /* 图片圆角 */
    padding: 2px; /* 图片内边距 */
    background-color: #fff; /* 图片背景色,防止透明图有背景色干扰 */
    box-shadow: 0 1px 3px rgba(0,0,0,0.1); /* 添加轻微阴影 */
}

/* 加载状态样式 */
#file-list li.loading {
    color: #999;
    font-style: italic;
}

/* 删除按钮悬停效果 */
#file-list li a.delete:hover {
    color: #e74c3c !important; /* 删除按钮悬停时变为红色 */
}

/* 编辑按钮悬停效果 */
#file-list li a.file:hover {
    color: #3498db !important; /* 编辑按钮悬停时变为蓝色 */
}
</style>

更改file-upload-js.php

<?php if(!defined('__TYPECHO_ADMIN__')) exit; ?>
<?php
if (isset($post) && $post instanceof \Typecho\Widget && $post->have()) {
    $fileParentContent = $post;
} elseif (isset($page) && $page instanceof \Typecho\Widget && $page->have()) {
    $fileParentContent = $page;
}

$phpMaxFilesize = function_exists('ini_get') ? trim(ini_get('upload_max_filesize')) : 0;

if (preg_match("/^([0-9]+)([a-z]{1,2})$/i", $phpMaxFilesize, $matches)) {
    $phpMaxFilesize = strtolower($matches[1] . $matches[2] . (1 == strlen($matches[2]) ? 'b' : ''));
}
?>

<script src="<?php $options->adminStaticUrl('js', 'moxie.js'); ?>"></script>
<script src="<?php $options->adminStaticUrl('js', 'plupload.js'); ?>"></script>
<script>
$(document).ready(function() {
    function updateAttacmentNumber () {
        var btn = $('#tab-files-btn'),
            balloon = $('.balloon', btn),
            count = $('#file-list li .insert').length;

        if (count > 0) {
            if (!balloon.length) {
                btn.html($.trim(btn.html()) + ' ');
                balloon = $('<span class="balloon"></span>').appendTo(btn);
            }

            balloon.html(count);
        } else if (0 == count && balloon.length > 0) {
            balloon.remove();
        }
    }

    $('.upload-area').bind({
        dragenter   :   function () {
            $(this).parent().addClass('drag');
        },

        dragover    :   function (e) {
            $(this).parent().addClass('drag');
        },

        drop        :   function () {
            $(this).parent().removeClass('drag');
        },
        
        dragend     :   function () {
            $(this).parent().removeClass('drag');
        },

        dragleave   :   function () {
            $(this).parent().removeClass('drag');
        }
    });

    updateAttacmentNumber();

    function fileUploadStart (file) {
        $('<li id="' + file.id + '" class="loading">'
            + file.name + '</li>').appendTo('#file-list');
    }

    function fileUploadError (error) {
        var file = error.file, code = error.code, word; 
        
        switch (code) {
            case plupload.FILE_SIZE_ERROR:
                word = '<?php _e('文件大小超过限制'); ?>';
                break;
            case plupload.FILE_EXTENSION_ERROR:
                word = '<?php _e('文件扩展名不被支持'); ?>';
                break;
            case plupload.FILE_DUPLICATE_ERROR:
                word = '<?php _e('文件已经上传过'); ?>';
                break;
            case plupload.HTTP_ERROR:
            default:
                word = '<?php _e('上传出现错误'); ?>';
                break;
        }

        var fileError = '<?php _e('%s 上传失败'); ?>'.replace('%s', file.name),
            li, exist = $('#' + file.id);

        if (exist.length > 0) {
            li = exist.removeClass('loading').html(fileError);
        } else {
            li = $('<li>' + fileError + '<br />' + word + '</li>').appendTo('#file-list');
        }

        li.effect('highlight', {color : '#FBC2C4'}, 2000, function () {
            $(this).remove();
        });

        // fix issue #341
        this.removeFile(file);
    }

    var completeFile = null;
    function fileUploadComplete (id, url, data) {
        // 根据是否为图片来构建列表项内容
        var itemContent = '<input type="hidden" name="attachment[]" value="' + data.cid + '" />';
    
        // 添加标题和信息
        itemContent += '<a class="insert" target="_blank" href="###" title="<?php _e('点击插入文件'); ?>">' + data.title + '</a>'
                     + '<div class="info">' + data.bytes
                     + ' <a class="file" target="_blank" href="<?php $options->adminUrl('media.php'); ?>?cid=' 
                     + data.cid + '" title="<?php _e('编辑'); ?>"><i class="i-edit"></i>编辑</a>'
                     + ' <a class="delete" href="###" title="<?php _e('删除'); ?>"><i class="i-delete"></i>删除</a></div>';
    
        // 如果是图片,添加预览图 (注意:这里图片放在 .info 之后,与PHP模板保持一致)
        if (data.isImage) {
            itemContent += '<div class="image-preview"><img src="' + data.url + '" alt="' + data.title + '" /></div>';
        }
    
        // 创建 jQuery 对象 li
        var li = $('#' + id).removeClass('loading').data('cid', data.cid)
            .data('url', data.url)
            .data('image', data.isImage)
            .html(itemContent); // 先设置内容
    
        // 关键修改:将新 li 插入到 #file-list 的最前面,而不是留在原地或追加到末尾
        // 1. 先从当前位置移除(如果它在列表中的话,虽然通常在上传开始时是添加到列表末尾的空li)
        // 2. 然后插入到 #file-list 的开头
        li.prependTo('#file-list'); // prependTo 将元素插入到目标元素的开头
    
        // 绑定事件
        attachInsertEvent(li);
        attachDeleteEvent(li);
        updateAttacmentNumber();
    
        if (!completeFile) {
            completeFile = data;
        }
    }

    var uploader = null, tabFilesEl = $('#tab-files').bind('init', function () {
        uploader = new plupload.Uploader({
            browse_button   :   $('.upload-file').get(0),
            url             :   '<?php $security->index('/action/upload'
                . (isset($fileParentContent) ? '?cid=' . $fileParentContent->cid : '')); ?>',
            runtimes        :   'html5,flash,html4',
            flash_swf_url   :   '<?php $options->adminStaticUrl('js', 'Moxie.swf'); ?>',
            drop_element    :   $('.upload-area').get(0),
            filters         :   {
                max_file_size       :   '<?php echo $phpMaxFilesize ?>',
                mime_types          :   [{'title' : '<?php _e('允许上传的文件'); ?>', 'extensions' : '<?php echo implode(',', $options->allowedAttachmentTypes); ?>'}],
                prevent_duplicates  :   true
            },

            init            :   {
                FilesAdded      :   function (up, files) {
                    for (var i = 0; i < files.length; i ++) {
                        fileUploadStart(files[i]);
                    }

                    completeFile = null;
                    uploader.start();
                },

                UploadComplete  :   function () {
                    if (completeFile) {
                        Typecho.uploadComplete(completeFile);
                    }
                },

                FileUploaded    :   function (up, file, result) {
                    if (200 == result.status) {
                        var data = $.parseJSON(result.response);

                        if (data) {
                            fileUploadComplete(file.id, data[0], data[1]);
                            uploader.removeFile(file);
                            return;
                        }
                    }

                    fileUploadError.call(uploader, {
                        code : plupload.HTTP_ERROR,
                        file : file
                    });
                },

                Error           :   function (up, error) {
                    fileUploadError.call(uploader, error);
                }
            }
        });

        uploader.init();
    });

    Typecho.uploadFile = function (file, name) {
        if (!uploader) {
            $('#tab-files-btn').parent().trigger('click');
        }
        
        var timer = setInterval(function () {
            if (!uploader) {
                return;
            }

            clearInterval(timer);
            timer = null;

            uploader.addFile(file, name);
        }, 50);
    };

    // function attachInsertEvent (el) {
    //     $('.insert', el).click(function () {
    //         var t = $(this), p = t.parents('li');
    //         Typecho.insertFileToEditor(t.text(), p.data('url'), p.data('image'));
    //         return false;
    //     });
    // }
    // 修改 attachInsertEvent 函数,使其能处理标题链接和图片
    function attachInsertEvent (el) {
        // 为标题链接和图片(或其父容器 .image-preview)绑定点击事件
        $('.insert, .image-preview img', el).click(function (e) {
            // 防止事件冒泡到父级 <a> 标签(如果图片被另一个链接包裹的话)
            e.stopPropagation();
            
            var t = $(this);
            // 查找当前点击元素的父级 <li>,然后从中获取数据
            var p = t.closest('li'); // 使用 closest 更可靠,可以找到最近的祖先 <li>
    
            // 确保找到了包含数据的 <li> 元素
            if (p.length > 0) {
                // 从 <li> 元素获取数据
                var url = p.data('url');
                var isImage = p.data('image');
                var title = p.find('.insert').first().text(); // 获取标题文本
    
                // 调用 Typecho 提供的插入函数
                Typecho.insertFileToEditor(title, url, isImage);
            }
            
            return false; // 阻止默认链接行为
        });
    }

    function attachDeleteEvent (el) {
        var file = $('a.insert', el).text();
        $('.delete', el).click(function () {
            if (confirm('<?php _e('确认要删除文件 %s 吗?'); ?>'.replace('%s', file))) {
                var cid = $(this).parents('li').data('cid');
                $.post('<?php $security->index('/action/contents-attachment-edit'); ?>',
                    {'do' : 'delete', 'cid' : cid},
                    function () {
                        $(el).fadeOut(function () {
                            $(this).remove();
                            updateAttacmentNumber();
                        });
                    });
            }

            return false;
        });
    }

    $('#file-list li').each(function () {
        attachInsertEvent(this);
        attachDeleteEvent(this);
    });
});
</script>


]]>
0 https://blog.iletter.top/archives/492/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
wireguard组网搭建windows远程桌面可用但是无法ssh https://blog.iletter.top/archives/471/ https://blog.iletter.top/archives/471/ Wed, 22 Oct 2025 15:33:00 +0800 DelLevin 因为wireguard搭建的组网是public的。所以但是open ssh允许的是私有网络的。

所以在此需要改一下网络类型。

Set-NetConnectionProfile -InterfaceAlias "winServer2025" -NetworkCategory Private

winServer2025为我的配置文件名称,你可以根据你的去变更

变更完毕之后通过 Get-NetConnectionProfile 进行查看。此时在进行ssh链接即可成功。

其实还有一种方式就是直接关闭防火墙简单暴力。。。

]]>
0 https://blog.iletter.top/archives/471/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
开机显示windows无法完成安装,解决方法 https://blog.iletter.top/archives/470/ https://blog.iletter.top/archives/470/ Tue, 21 Oct 2025 21:41:00 +0800 DelLevin 1.等待报错出现

2.按住shift+F10 进入cmd界面

3.输入regedit编辑注册表

4.找到路径 计算机\HKEY_LOCAL_MACHINE\SYSTEM\Setup

5.编辑内部数据

  • OOBEInProgress 设置为 0
  • CmdLine 设置为空,即删除里面的数据
  • SetupPhase 设置为 0
  • SetupType 设置为 0
  • SystemSetupInProgress 设置为 0

6.再次打开 cmd 窗口 输入以下命令行
net user administrator /active:yes

然后重启系统即可正常进入系统。

]]>
0 https://blog.iletter.top/archives/470/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
构建AI个人知识库的一些思考 https://blog.iletter.top/archives/468/ https://blog.iletter.top/archives/468/ Thu, 25 Sep 2025 21:51:00 +0800 DelLevin 最近在使用obsidian+Copilot虽然使用确实不错,但是总感觉差点味道。

今天试了试python搞得rag向量数据库+ai模型,跑起来还是不错,但感觉和obsidian+Copilot大差不差。但至于差在哪里,却一眼难尽。单篇文章分析,都是可以的。多文章分析就报废了。

所以有个思路

针对md文档必须有严格的限制,在此使用markdown文章的yaml标签案例。

例如

---
标题: git拆分分支和合并分支
日期: 2025-09-24
作者: Del Levin
分类:
  - 技术笔记
  - 其他
tags:
  - 技术笔记
  - git
  - 运维
  - windows
---

构建数据库->检索

结构化检索方式:指定统计方式,分析方式

非结构化检索方式:ai分析

检索方式:

分类词:{classification[分类词1,分类词2]}
标签 :{tags[标签1,标签2]}
指定文章:{title[文章名称1,文章名称2]}

提问方式为:

1.根据{classification[分类词1,分类词2]}分类总结一下我这个人
2.根据{tags[标签1,标签2]}标签总结一下我的技术栈
3.{title[文章名称1,文章名称2]}总结一下这两篇文章
4.{title[文章名称1]}总结一下这一篇文章

理想很美好,现实很骨感,知识库的容量参考文件不支持那么多。要想真正实现,只能拿自己的笔记进行模型训练。可是模型数据基
数不足,成为一个问题。我也不知道该怎么做了。。。。

]]>
0 https://blog.iletter.top/archives/468/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/
利用wireduard实现windows远控macos https://blog.iletter.top/archives/466/ https://blog.iletter.top/archives/466/ Wed, 17 Sep 2025 23:13:00 +0800 DelLevin wireduard之前搭建过。在此不做赘述。图简单的话,可以拉docker的wg-easy进行运行。

搭建好之后,服务器给windows生成配置。

[Interface]
PrivateKey = 私钥
Address = 10.8.0.3/24

[Peer]
PublicKey = 公钥
PresharedKey = Xtz5vzzicOncQe3Dt8LMFIbdxa/XUepY9hAllrJ3k30=
AllowedIPs = 10.8.0.0/24
Endpoint = 152.136.153.72:51820

然后开始macos的操作,首先,你需要有一个Homebrew来用于安装软件。

macos安装wireguard步骤

1. 安装 WireGuard

使用 Homebrew 安装 WireGuard 工具包:

brew install wireguard-tools

3. 配置 WireGuard

使用下面的命令创建配置文件:

sudo vim /opt/homebrew/etc/wireguard/wg0.conf

编辑配置文件,添加以下内容:

[Interface]
PrivateKey = 私钥
Address = 10.8.0.7/24
MTU = 1540
[Peer]
PublicKey = 公钥
PresharedKey = 
AllowedIPs = 10.8.0.0/24
Endpoint = 152.136.153.72:51820
PersistentKeepalive = 25

一切配置好之后,安装图形化界面WireGuardStatusbar
https://github.com/aequitas/macos-menubar-wireguard这个链接下载文件安装。安装完毕之后,启动wg0这个就可以了。

不想安装的话可以使用这个命令去

开启

sudo wg-quick up wg0

关闭

sudo wg-quick down wg0
]]>
0 https://blog.iletter.top/archives/466/#comments https://blog.iletter.top/feed/tag/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/