TAMSHEN - 代码
type: channel
link: https://tamshen.com/category/Code/
items: P0 事故后复盘
items: [windows]php连接mssql数据库
items: 内网建设，利用服务器+WireGuard建立异地局域网
items: linux 宝塔 装sqlserver
items: [Ubuntu]宝塔tomcat遇到的坑 /www/server/tomcat/bin/jsvc: No such file or directory
items: 优秀网页
items: macOS 利用docker配置nginx+php7.0环境
items: bat 和 vbs 笔记
items: 运维笔记
items: Nginx笔记

P0 事故后复盘
type: item
date: 2026-07-22T17:26:00+08:00
description: P0事故后复盘几条短信刚过下班时间，我准备收尾git push下班突然收到几条云服务商发来的安全告警短信！刚看到的时候，我说：这啥啊？咋这么多信息？但当我看到：勒索的时候，整个人瞬间清醒！！！激动的心，颤抖的手进入服务器后台，发现数据库无法启动，系统OA无法访问点开数据备份 databack 目录，文件都被加了后缀，留了一个 txt(勒索信)。瞬间紧张起来：发冷、紧张、手抖...脑子里闪过：完了完了，网上看过这么多的勒索，这次到我了...我是不是要跑路了？冷静我疯狂提醒自己：一定先不要急！一定要冷静！冷静！现在不是解激动就能解决问题的，要冷静思考！！！于是开始重新整理思路与同事探讨。最后确定了大方向：尽最大能力恢复数据！假设数据真的丢失，接下来的业务不能断！落实计划第一条：寻找数据恢复可能因为系统有固定周期备份，所以第一时间想到：能不能找回之前被删除的备份文件（想着那些文件肯定没感染）。我尝试通过数据恢复工具扫描磁盘，希望找回未被感染的历史备份。但是结果失败。随后开始联系：云服务厂商身边做安全、运维、数据恢复的朋友使用 AI 分析加密样本第二条：业务不能断数据能不能恢复，是未知的。但是第二天一定要继续处理工作流，公司业务不能断！一边想办法的同时，做最坏的打算：如果数据恢复失败怎么办？如果历史数据无法找回怎么办？业务是不是全部停止？我知道业务一定不能停止，整个公司的工作流必须运转！必须准备 Plan B 临时方案：保障核心基础业务能够继续运行，业务能运行起来，数据恢复只是一个未知数！封存离线文档、信息马上组织人员进行：封存近六个月的本地冷文件记录、汇总冷数据、聊天记录构造 MVP：如果系统回不来，业务怎么活？*MVP = Minimum Viable Product 最小产品版本组织团队开始拆业务，按照最小完整工作流，制定一个小型 OA，还有如何配合离线数据。让明天一上班的同事能正常处理工作。庆幸是晚上后来回头看，我觉得真的庆幸是晚上，没有实际业务，可以中断。但是这个晚上是一个不眠夜是一个确定后续结果的重要时刻！如果当时：继续对着被勒索的数据手足无措，那么第二天可能完全被动。系统跑不起来，全部手动操作工作流，每个人的压力都无比大！事故处理不是等答案！而是在未知情况下，不断增加成功概率。数据无价：希望再也不要数据恢复！在凌晨三点的时候，数据恢复取得了进展。数据不是文件，早就成了我们工作流一个不可缺失的部分！很多东西，一旦丢失，不是重新开发一个系统就能回来。系统可以重建，代码可以重写，但是数据没有那么容易。所以数据无价，不是一句口号！只有真正经历过一次数据风险，才会理解它的重量。认真反省：没有热备冷备，服务器一锅端事情解决之后，最大的感受不是庆幸。而是反思！为什么会这么紧张？因为我深知我没有完整恢复能力...之前有一段时间想过要是这个服务器挂了怎么办？一直搁那纠结...就想着“代码写好，服务器没那么容易出问题的，最多就是修修小问题。”因为几年过来我遇到的问题就是这些问题，感觉大意也没事。但是哪有那么多感觉，明天和意外谁知道哪个先来？感觉程序没问题，代码写的很好，想尽了我所谓安全的“防护”，但...实际这次的攻击点在系统级别，我压根完全没有审计系统级别的能力。我想到了基础的备份，但是留在了服务器本身，而没上传到云盘等专门的备份，我的窝点在这里，人家一锅端。只想过软件问题，没有想到外部问题，安全意识完全不足！总觉得岁月静好，当岁月静好被打爆，才知道什么痛！还有就是每个行业有每个行业的知识，不要自己三脚猫臆想，ai 算一下就无知的去挑战人家的专业。知己知彼：勒索病毒相关资料Weaxor 勒索病毒 .weax后缀，是Mallox变种。解密工具：decryptor_console.exe解密需要：key加密文件结构（172字节尾部）： 偏移 大小 内容 ───────────────────────────────────────── 0-3 4B 魔法头 0x12213241 4-7 4B 版本号 5 8-11 4B flags 12-15 4B 密钥材料大小 40 16-19 4B 模式 3 20-27 8B 加密块大小 28-35 8B 步长 36-43 8B 原始文件大小 ← 可恢复元数据 44-87 44B AES-256-CTR 密文（封装的 ChaCha20 key+nonce） 88-103 16B AES-CTR IV 104-135 32B victim ID（赎金票据中的 Key） 136-167 32B 每文件标识 168-171 4B 魔法尾 0x44332413发生的第一时间进行镜像 dump 还有机会获得那个加密的 key360-Weaxor勒索软件瞄准政企服务器Linux.do-关于勒索病毒恢复讨论Linux.…

[windows]php连接mssql数据库
type: item
date: 2023-10-14T22:35:00+08:00
description: 因为php版本和mssql数据库版本不同 要用到不同的php扩展案例：SqlSever 2008 R2PHP 7.3根据版本去微软这里找到对应版本的扩展然后去github下载 ，找到对应的版本，我们对应的版本是5.6点开 Assets，找到 Windows-7.3.zip 下载。压缩包有好几种规格，根据情况使用！！！x64和x86的版本区别（php info可查看）nts和ts的区别pdo和普通的区别比如我用的是x64的nts、用的是pdo链接，就选 .\x64\php_pdo_sqlsrv_73_nts.dll将这和dll文件放到php的扩展目录 .\php\73\ext重启php就可以测试链接了。

内网建设，利用服务器+WireGuard建立异地局域网
type: item
date: 2023-09-27T16:49:00+08:00
description: https://www.bilibili.com/video/BV1uT411w7Tq/docker run -d \ --name=wg-easy \ -e WG_HOST=YourIpAddress \ -e PASSWORD=YourIpPassword \ -e WG_DEFAULT_ADDRESS=10.0.8.x \ -e WG_DEFAULT_DNS=114.114.114.114 \ -e WG_ALLOWED_IPS=10.0.8.0/24 \ -e WG_PERSISTENT_KEEPALIVE=25 \ -v ~/.wg-easy:/etc/wireguard \ -p 51820:51820/udp \ -p 51821:51821/tcp \ --cap-add=NET_ADMIN \ --cap-add=SYS_MODULE \ --sysctl="net.ipv4.conf.all.src_valid_mark=1" \ --sysctl="net.ipv4.ip_forward=1" \ --restart unless-stopped \ weejewel/wg-easy群晖 WireGuardhttps://www.bilibili.com/read/cv18452418/

linux 宝塔 装sqlserver
type: item
date: 2023-03-09T16:12:00+08:00
description: wget http://pecl.php.net/get/pdo_sqlsrv-5.6.0.tgz tar -zxvf pdo_sqlsrv-5.6.0.tgz cd pdo_sqlsrv-5.6.0 ./configure --with-php-config=/www/server/php/73/bin/php-config make && make install echo "extension = pdo_sqlsrv.so" >> /www/server/php/73/etc/php.ini /etc/init.d/php-fpm-73 reload /www/server/php/73/bin/php -m|grep -i sqlsrv

[Ubuntu]宝塔tomcat遇到的坑 /www/server/tomcat/bin/jsvc: No such file or directory
type: item
date: 2023-01-12T23:10:00+08:00
description: 参考：https://blog.csdn.net/weixin_45907703/article/details/121478423问题：最初问题：在宝塔安装tomcat之后发现启动不了，报错：daemon.sh: line xxx: /www/server/tomcat/bin/jsvc: No such file or directory首先，我试图去bin下寻找jsvc文件夹，确实找不到然后，在apache网站找到了一篇文章，是介绍jsvc的文章http://commons.apache.org/proper/commons-daemon/jsvc.html意思是可以通过编译源码来获得jsvc 编译jsvc需要java环境，所以首先要配置好java环境1.安装java环境# 安装java8 环境 apt install openjdk-8-jre-headless # 安装完成试验一下 显示8的版本就对了 java -version2.配置环境变量配置环境变量在终端输入vim /etc/profile.d/java.sh然后输入以下代码export JAVA\_HOME=/usr/local/java/jdk1.8.0\_211 export CLASS\_PATH="$JAVA\_HOME/lib:$JAVA\_HOME/jre/lib" export PATH=$PATH:$JAVA\_HOME/bin123复制进去之后，按下esc并输入:wq，然后回车，即保存并退出然后在终端输入source /etc/profile，使配置立即生效最后在终端输入java -version，查看环境是否配置成功编译jsvc进入tomcat下的bin目录，找到commons-daemon-native.tar.gz文件并解压得到commons-daemon-x.x.xx-native-src文件夹然后使终端进入到commons-daemon-x.x.xx-native-src下的unix文件夹下，输入./configure --with-java=$JAVA_HOME我在这出现了 checking JAVA_HOME... failed可能是变量问题，我就直接./configure --with-java=/usr/local/java/jdk1.8.0_351了如果出现error: no acceptable C compiler found in $PATH,就代表没有安装gcc编译环境，然后输入yum install gcc-c++ -y，稍等片刻之后再次输入./configure --with-java=$JAVA_HOME，出现Now you can issue "make"字样则代表这一步已经成功上一步成功之后输入make编译完成之后会在当前文件夹生成一个jscv文件将jscv文件拷贝到tomcat下bin目录然后在启动tomcat即可

优秀网页
type: item
date: 2022-06-10T09:33:00+08:00
description: 上美影 六一活动网页 历史画卷-进程-历史介绍（复制地址后手机访问）https://animation100.silverplanet.club/?fr=share

macOS 利用docker配置nginx+php7.0环境
type: item
date: 2022-04-02T20:25:00+08:00
description: 1.安装docker2.打开终端3.找到你想要的dock镜像4.拉去镜像，比如：docker pull webdevops/php-nginx:7.05.建立容器（8809为端口）`docker run -itd --name {容器名字} -p 8809:80 -v /Users/{用户名}/work/Dev/Php:/app/ webdevops/php-nginx:7.0`ARM64https://github.com/dockhippie/php-nginx路径'/srv/www' -> '本地目录'参考学习：Docker Nginx+php环境https://www.cnblogs.com/wjs2019/p/13608548.htmlhttps://github.com/webdevops/Dockerfile

bat 和 vbs 笔记
type: item
date: 2022-03-13T17:21:00+08:00
description: bat 多按键实例@ECHO OFF ECHO CreateObject("WScript.Shell").SendKeys "{F5}">>%Temp%\F5.vbs ECHO CreateObject("WScript.Shell").SendKeys "+{F10}">>%Temp%\F5.vb ECHO CreateObject("WScript.Shell").SendKeys "V">>%Temp%\F5.vbs ECHO CreateObject("WScript.Shell").SendKeys "D">>%Temp%\F5.vbs cscript /nologo %Temp%\F5.vbsvbs多按键实例set WshShell = CreateObject("WScript.Shell") WshShell.SendKeys "{F5}" WScript.sleep 1000 WshShell.SendKeys "{F5}" WshShell.SendKeys "+{F10}" WshShell.SendKeys "V" WshShell.SendKeys "D"目录树tree /f >D:\1.txt D:\1.txt为保存路径检查文件夹里的文本是否包含内容@echo off setlocal EnableDelayedExpansion for /r "D:\Mirserver\Mir200\Envir\MonItems\" %%a in (*.txt) do ( find "匕首" %%a if "!errorlevel!"=="0" echo %%a >>d:\include_name垃圾史诗.txt ) setlocal DiskableDelayedExpansion echo 已完成,路径保存在d:\include_name垃圾史诗.txt pause >nul批量在文件头添加文字@echo off title 批量替换文件名 echo. echo 本批处理可批量替换本文件所在文件夹下所有文件的文件名。 echo. echo.&set /p strtemp3= 请输入要添加前缀的文件类型： echo.&set /p strtemp2= 请输入要添加前缀的文件名字符串（不变则直接回车）： setlocal enabledelayedexpansion for /f "delims=" %%a in ('dir /a /b *.%strtemp3%') do ( ren "%%~a" "%strtemp2%_%%a") for /f "delims=" %%a in ('dir /a /b *"批量改工具".bat') do ( ren "%%~a" "批量改工具.bat") echo. echo OK了！ echo. pause

运维笔记
type: item
date: 2022-03-04T01:37:00+08:00
description: 这里是我个人服务器运维过程中常用的一些shell代码和技巧，希望能帮助到你。软件推荐Windows 稳定的AMP / NMP环境http://www.ampnmp.com/visual-nmp/常用基本命令# 查看端口占用 netstat -ntpl # 硬盘 df -h测速bash <(curl -Lso- https://git.io/superspeed)91yun / 锐速ServerSpeeder无限带宽无限制版一键安装包# 安装命令： yum -y install wget wget -N --no-check-certificate https://raw.githubusercontent.com/wn789/serverspeeder/master/serverspeeder.sh bash serverspeeder.sh # 锐速serverspeeder常用命令： service serverSpeeder start #启动 service serverSpeeder stop #停止 service serverSpeeder reload #重新加载配置 service serverSpeeder restart #重启 service serverSpeeder status #状态 service serverSpeeder stats #统计 service serverSpeeder renewLic #更新许可文件 service serverSpeeder update #更新 chattr -i /serverspeeder/etc/apx* && /serverspeeder/bin/serverSpeeder.sh uninstall -f #卸载入站规则# 可视化UI Shell 安装操作配置：端口(Port 比如 201)、用户(UserName)、网页根路径(比如 /Q)等 bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh) # 设置参数 1.设置额外id 2.禁用不安全加密 3.设置ws 4.设置路径 5.ng看下面 nginx+433 网站配置（ng反代教程）less + ws : url /Data (no Tls)location ^~ /Q { proxy_pass http://127.0.0.1:201/Q; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /Date { proxy_redirect off; proxy_pass http://127.0.0.1:201; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_read_timeout 300s; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 反代后 # 端口：443 # 路径：前面的 %2F 换为 / # TLS：True日志控制https://www.jianshu.com/p/66e16f7b79f4//创建或修改文件 /etc/docker/daemon.json，并增加以下配置 //max-size=500m，意味着一个容器日志大小上限是500M， //max-file=3，意味着一个容器有三个日志，分别是id+.json、id+1.json、id+2.json。 { "log-driver":"json-file", "log-opts":{ "max-size" :"50m","max-file":"3" } }国内服务器加速访问git config --global http.proxy 'socks5://127.0.0.1:34560' git config --global https.proxy 'socks5://127.0.0.1:34560' curl --proxy "http://user:pwd@127.0.0.1:1234"…

Nginx笔记
type: item
date: 2022-01-21T11:58:00+08:00
description: nginx匹配get参数和判断ualocation ~* ^/(w|v)_.*$ { set $flag 0; if ($arg_social_platform = "wechat_circle") { set $flag "${flag}1"; } if ($http_user_agent ~* "MicroMessenger") { set $flag "${flag}2"; } if ($flag = "012") { proxy_pass [http://vue](http://vue)_qae; } proxy_pass http://10.110.117.55:80; }原文->