🔄 卡若AI 同步 2026-03-06 05:47 | 更新:金仓、水桥平台对接、运营中枢参考资料、运营中枢工作台 | 排除 >20MB: 11 个
This commit is contained in:
@@ -1,7 +1,8 @@
|
||||
# 宝塔 SSH 登录方式与故障排查
|
||||
|
||||
> 当一种方式失败时,依次尝试其他方式。终极备选:**宝塔面板 → 终端**(无需 SSH)。
|
||||
> **存客宝 SSH 修复**:在存客宝宝塔终端执行 `scripts/存客宝_SSH修复_宝塔终端执行.sh` 内容。
|
||||
> **存客宝 SSH 修复**:在存客宝宝塔终端执行 `scripts/存客宝_SSH修复_宝塔终端执行.sh` 内容。
|
||||
> **存客宝已关闭 22 端口**:仅保留 22022,防暴力破解。连接用:`ssh -p 22022 root@42.194.245.239`。
|
||||
|
||||
## 启动 SSH 并保证连接成功(kr宝塔 43.139.27.93)
|
||||
|
||||
|
||||
@@ -51,6 +51,19 @@ killall nginx; sleep 2; /www/server/nginx/sbin/nginx -c /www/server/nginx/conf/n
|
||||
|
||||
---
|
||||
|
||||
## 安全告警(挖矿木马等)
|
||||
|
||||
若腾讯云主机安全告警恶意文件(如 Linux.Risk.Miner.Jcnw):
|
||||
|
||||
1. **宝塔终端(推荐)**:打开 https://42.194.245.239:9988 → 终端 → 粘贴执行 `scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh` 全部内容(含清理 + 去持久化 + 防再入)。
|
||||
2. **本机 SSH**:`sshpass -p 'Zhiqun1984' ssh -o StrictHostKeyChecking=no -p 22 root@42.194.245.239 'bash -s' < scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh`
|
||||
3. **TAT**:`python3 scripts/腾讯云_TAT_存客宝_清理挖矿木马.py`
|
||||
4. **控制台**:入侵检测 → 文件查杀 → 确认处置并开启防护
|
||||
|
||||
**关闭 22 端口(防入侵)**:存客宝已通过 TAT 或脚本关闭 22,仅保留 22022。SSH 仅用:`ssh -p 22022 root@42.194.245.239`。手动执行:`scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh`。
|
||||
|
||||
---
|
||||
|
||||
## 主 Skill 与错误处理
|
||||
|
||||
- **主 Skill**:`references/宝塔Node项目管理_SKILL.md`(凭证、Node API、常见错误、脚本)
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
# 存客宝挖矿木马 Linux.Risk.Miner.Jcnw 分析
|
||||
|
||||
> 告警文件:`/tmp/.esd101/.system3d` | 存客宝 42.194.245.239 | 腾讯云主机安全
|
||||
|
||||
---
|
||||
|
||||
## 一、木马类型与用途
|
||||
|
||||
| 项目 | 说明 |
|
||||
|------|------|
|
||||
| **类型** | 挖矿木马(Cryptominer) |
|
||||
| **命名** | Linux.Risk.Miner.Jcnw(腾讯云/安全厂商检测名) |
|
||||
| **用途** | 在受害主机上**偷偷跑加密货币挖矿**(常见为 XMR/Monero),占用 CPU/GPU 与带宽,收益归攻击者 |
|
||||
| **危害** | 资源被占导致业务卡顿、电费与带宽成本上升、可能伴随后门与横向移动 |
|
||||
|
||||
**本质**:在你这台服务器上“免费用电、用算力”给攻击者挖矿,不偷数据、不直接加密文件,但会拖慢服务并增加被进一步入侵的风险。
|
||||
|
||||
---
|
||||
|
||||
## 二、入侵节奏(典型链路)
|
||||
|
||||
此类 Linux 挖矿木马常见入侵顺序如下:
|
||||
|
||||
```
|
||||
1. 入口(Initial Access)
|
||||
├─ SSH 弱密码 / 默认密码 暴力破解(最常见)
|
||||
├─ 暴露的 Redis / Docker API / 未授权服务
|
||||
├─ Web 漏洞(RCE、反序列化等)
|
||||
└─ 老旧组件 N 日漏洞(如 WebLogic、Struts)
|
||||
|
||||
2. 执行与落地
|
||||
├─ 下载或写入恶意二进制到 /tmp、/var/tmp、/dev/shm 等
|
||||
├─ 使用隐藏目录(如 .esd101)和伪装名(如 .system3d)躲避巡检
|
||||
└─ 直接执行或通过 shell 脚本拉起挖矿进程
|
||||
|
||||
3. 持久化(Persistence)
|
||||
├─ 写 crontab(如 @reboot、定期拉新)
|
||||
├─ 写 systemd 服务或 /etc/rc.local
|
||||
├─ 篡改 ~/.ssh/authorized_keys 留后门
|
||||
└─ 部分变种会改 /etc/ld.so.preload 等隐藏进程
|
||||
|
||||
4. 运行与通信
|
||||
├─ 进程占用高 CPU,连接矿池或 C2
|
||||
└─ 可能检测到“有人登录”时暂时休眠以规避排查
|
||||
```
|
||||
|
||||
**存客宝场景**:路径 `/tmp/.esd101/.system3d` 符合「临时目录 + 隐藏目录 + 伪装名」的典型挖矿落地方式;若曾用弱密码或 22/22022 长期暴露,**SSH 暴力破解**是最可能的入口。
|
||||
|
||||
---
|
||||
|
||||
## 三、与“小型宝塔”处理的一致性
|
||||
|
||||
- **类型**:同为 Linux 挖矿木马,目的一致(占资源挖矿)。
|
||||
- **处理**:结束进程 → 删恶意文件/目录 → 清 crontab 等持久化 → 加固(防爆破、强密码、限端口)。
|
||||
- **防再入**:关弱密码 SSH、开 fail2ban/防爆破、改面板与 SSH 端口、定期查 crontab 与 `/tmp` 下隐藏目录。
|
||||
|
||||
---
|
||||
|
||||
## 四、防护与自检清单
|
||||
|
||||
| 措施 | 说明 |
|
||||
|------|------|
|
||||
| SSH | 禁用密码登录,仅密钥;或强密码 + fail2ban/防爆破 |
|
||||
| 端口 | 22/22022 不必要不暴露公网,或改端口 + 防火墙限源 IP |
|
||||
| 宝塔 | 强密码、改 9988 端口、限 IP 访问(安全 → 入口限制) |
|
||||
| 自检 | 定期 `crontab -l`、`ls -la /tmp`、`ps aux` 看高 CPU 进程 |
|
||||
| 腾讯云 | 主机安全保持开启,入侵检测/文件查杀告警及时处置 |
|
||||
|
||||
---
|
||||
|
||||
## 五、相关脚本与文档
|
||||
|
||||
- 清理+防再入(宝塔终端):`scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh`
|
||||
- SSH 执行:`scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh`
|
||||
- 存客宝管理入口:`references/存客宝_宝塔管理SKILL.md`(安全告警小节)
|
||||
13
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh
Normal file
13
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_关闭22端口仅保留22022_宝塔终端执行.sh
Normal file
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
# 存客宝:关闭 22 端口,仅保留 22022(防暴力破解入口)
|
||||
# 在宝塔面板【终端】复制整段执行。执行后 SSH 仅用:ssh -p 22022 root@42.194.245.239
|
||||
|
||||
echo "=== 关闭 22 端口,仅保留 22022 ==="
|
||||
CFG="/etc/ssh/sshd_config"
|
||||
[ -f "$CFG" ] && cp "$CFG" "$CFG.bak.$(date +%Y%m%d%H%M)"
|
||||
sed -i '/^Port /d' "$CFG"
|
||||
sed -i '/^#Port /d' "$CFG"
|
||||
echo "Port 22022" >> "$CFG"
|
||||
iptables -C INPUT -p tcp --dport 22 -j DROP 2>/dev/null || iptables -A INPUT -p tcp --dport 22 -j DROP
|
||||
systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null
|
||||
echo "完成。SSH 仅用: ssh -p 22022 root@42.194.245.239"
|
||||
32
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh
Normal file
32
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵_宝塔终端执行.sh
Normal file
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
# 存客宝:清理挖矿木马 + 防再次入侵(在宝塔面板【终端】复制整段执行)
|
||||
|
||||
echo "========== 1. 清理挖矿木马 =========="
|
||||
f="/tmp/.esd101/.system3d"
|
||||
[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done
|
||||
pkill -9 -f ".esd101" 2>/dev/null || true
|
||||
pkill -9 -f ".system3d" 2>/dev/null || true
|
||||
sleep 1
|
||||
rm -rf /tmp/.esd101
|
||||
# 删除 /tmp 下其他可疑隐藏目录(保留系统需要的)
|
||||
for d in /tmp/.[a-zA-Z0-9]*; do [ -d "$d" ] && [ ! -L "$d" ] && rm -rf "$d" 2>/dev/null; done
|
||||
echo " 已删除 /tmp/.esd101 及 /tmp 下可疑隐藏目录"
|
||||
|
||||
echo ""
|
||||
echo "========== 2. 清除恶意持久化 =========="
|
||||
crontab -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab - 2>/dev/null || true
|
||||
for u in root www; do crontab -u $u -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab -u $u - 2>/dev/null; done
|
||||
grep -rl "esd101\|system3d\|/tmp/\." /etc/cron.d /etc/cron.daily /etc/cron.hourly 2>/dev/null | while read f; do sed -i '/esd101\|system3d\|\/tmp\/\./d' "$f"; done
|
||||
echo " crontab 与 /etc/cron 已清理"
|
||||
|
||||
echo ""
|
||||
echo "========== 3. 防再次入侵 =========="
|
||||
chmod 1777 /tmp 2>/dev/null
|
||||
systemctl is-active fail2ban &>/dev/null && echo " fail2ban 已运行" || (systemctl start fail2ban 2>/dev/null && echo " fail2ban 已启动" || echo " 未安装 fail2ban,建议宝塔 安全 安装")
|
||||
echo " 建议:宝塔 安全 -> SSH 防爆破 开启;面板 设置 -> 强密码、改端口"
|
||||
|
||||
echo ""
|
||||
echo "========== 4. 检查 =========="
|
||||
ls -la /tmp/ | head -15
|
||||
echo ""
|
||||
echo "========== 完成 =========="
|
||||
45
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh
Normal file
45
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿并防入侵加固_SSH执行.sh
Normal file
@@ -0,0 +1,45 @@
|
||||
#!/bin/bash
|
||||
# 存客宝 42.194.245.239:清理挖矿木马 + 防再次入侵
|
||||
# 本机执行:sshpass -p 'Zhiqun1984' ssh -o StrictHostKeyChecking=no -p 22 root@42.194.245.239 'bash -s' < 本脚本
|
||||
# 或先 scp 到服务器再 ssh 执行
|
||||
|
||||
set -e
|
||||
echo "========== 1. 清理挖矿木马 =========="
|
||||
f="/tmp/.esd101/.system3d"
|
||||
[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done || true
|
||||
pkill -9 -f ".esd101" 2>/dev/null || true
|
||||
pkill -9 -f ".system3d" 2>/dev/null || true
|
||||
sleep 1
|
||||
rm -rf /tmp/.esd101 /tmp/.* 2>/dev/null || true
|
||||
echo " 已删除 /tmp/.esd101 及 /tmp 下隐藏目录"
|
||||
|
||||
echo ""
|
||||
echo "========== 2. 清除恶意持久化 =========="
|
||||
# 清理 root 与 www 的 crontab 中的恶意项
|
||||
for u in root www; do
|
||||
crontab -u $u -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\." | crontab -u $u - 2>/dev/null || true
|
||||
done
|
||||
# 清理 /etc/cron.* 中的恶意脚本
|
||||
sed -i '/\.esd101\|\.system3d\|\/tmp\/\./d' /etc/cron.d/* /etc/cron.daily/* /etc/cron.hourly/* 2>/dev/null || true
|
||||
echo " crontab 与 /etc/cron 已清理"
|
||||
|
||||
echo ""
|
||||
echo "========== 3. 防再次入侵加固 =========="
|
||||
# 3.1 /tmp 禁止执行(noexec),需重启后生效,这里仅创建说明
|
||||
grep -q "tmpfs.*noexec" /etc/fstab 2>/dev/null && echo " /tmp noexec 已存在" || echo " 建议:fstab 中 /tmp 加 noexec 后 reboot"
|
||||
# 3.2 确保 fail2ban 或宝塔 SSH 防护开启
|
||||
if command -v fail2ban-client &>/dev/null; then
|
||||
fail2ban-client status sshd &>/dev/null && echo " fail2ban sshd 已运行" || systemctl start fail2ban 2>/dev/null && echo " fail2ban 已启动" || true
|
||||
fi
|
||||
# 3.3 限制 /tmp 下新建可执行文件(可选:chmod 1777 已存在则保持)
|
||||
chmod 1777 /tmp 2>/dev/null && echo " /tmp 权限 1777"
|
||||
# 3.4 宝塔面板:安全 -> 防火墙已放行必要端口前提下,可开启「SSH 防爆破」
|
||||
echo " 建议:宝塔 安全 -> SSH 防爆破 开启;面板 设置 -> 修改默认端口与强密码"
|
||||
|
||||
echo ""
|
||||
echo "========== 4. 检查结果 =========="
|
||||
ls -la /tmp/ | head -12
|
||||
echo ""
|
||||
crontab -l 2>/dev/null | grep -v "^#" || echo " root crontab 无任务"
|
||||
echo ""
|
||||
echo "========== 完成 =========="
|
||||
37
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh
Normal file
37
01_卡资(金)/金仓_存储备份/服务器管理/scripts/存客宝_清理挖矿木马_宝塔终端执行.sh
Normal file
@@ -0,0 +1,37 @@
|
||||
#!/bin/bash
|
||||
# 存客宝 42.194.245.239 清理 Linux.Risk.Miner.Jcnw 挖矿木马
|
||||
# 在宝塔面板【终端】复制整段粘贴执行
|
||||
# 腾讯云告警:/tmp/.esd101/.system3d
|
||||
|
||||
echo "========== 存客宝 挖矿木马清理 =========="
|
||||
echo ""
|
||||
|
||||
f="/tmp/.esd101/.system3d"
|
||||
echo "[1] 结束占用该文件的进程"
|
||||
if [ -f "$f" ]; then
|
||||
for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null && echo " 已结束 PID $pid"; done
|
||||
fi
|
||||
pkill -9 -f ".esd101" 2>/dev/null && echo " 已结束 .esd101 相关进程" || true
|
||||
pkill -9 -f ".system3d" 2>/dev/null && echo " 已结束 .system3d 相关进程" || true
|
||||
sleep 1
|
||||
|
||||
echo ""
|
||||
echo "[2] 删除恶意文件及目录"
|
||||
rm -rf /tmp/.esd101 2>/dev/null && echo " 已删除 /tmp/.esd101" || echo " 目录不存在或已删"
|
||||
|
||||
echo ""
|
||||
echo "[3] 检查 /tmp 下隐藏目录"
|
||||
ls -la /tmp/ | head -20
|
||||
|
||||
echo ""
|
||||
echo "[4] 检查 crontab 可疑项"
|
||||
crontab -l 2>/dev/null | grep -v "^#" || echo " 无"
|
||||
grep -r "\.esd101\|\.system3d\|/tmp/\." /etc/cron* 2>/dev/null || echo " 无"
|
||||
|
||||
echo ""
|
||||
echo "[5] 当前高 CPU 进程(前 8)"
|
||||
ps aux --sort=-%cpu | head -10
|
||||
|
||||
echo ""
|
||||
echo "========== 完成 =========="
|
||||
echo "建议:腾讯云控制台 → 主机安全 → 入侵检测 → 文件查杀,确认处置并开启防护。"
|
||||
129
01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py
Normal file
129
01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿并关闭22端口.py
Normal file
@@ -0,0 +1,129 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
TAT 存客宝:清理挖矿木马 + 关闭 22 端口(仅保留 22022 防暴力破解入口)
|
||||
"""
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
|
||||
CKB_INSTANCE_ID = "ins-ciyv2mxa"
|
||||
REGION = "ap-guangzhou"
|
||||
|
||||
CMD = r'''
|
||||
echo "=== 1. 清理挖矿木马 ==="
|
||||
f="/tmp/.esd101/.system3d"
|
||||
[ -f "$f" ] && for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null; done
|
||||
pkill -9 -f ".esd101" 2>/dev/null || true
|
||||
pkill -9 -f ".system3d" 2>/dev/null || true
|
||||
sleep 1
|
||||
rm -rf /tmp/.esd101
|
||||
(crontab -l 2>/dev/null | grep -v "esd101\|system3d\|/tmp/\.") | crontab - 2>/dev/null || true
|
||||
echo " 已清理 /tmp/.esd101 与 crontab"
|
||||
|
||||
echo ""
|
||||
echo "=== 2. 关闭 22 端口(保留 22022)==="
|
||||
# 2.1 确保 sshd 只监听 22022
|
||||
CFG="/etc/ssh/sshd_config"
|
||||
if [ -f "$CFG" ]; then
|
||||
cp "$CFG" "$CFG.bak.$(date +%Y%m%d%H%M)"
|
||||
sed -i '/^Port /d' "$CFG"
|
||||
sed -i '/^#Port /d' "$CFG"
|
||||
echo "Port 22022" >> "$CFG"
|
||||
echo " 已设置 sshd 仅 Port 22022"
|
||||
fi
|
||||
# 2.2 防火墙禁止 22 入站(双重保险)
|
||||
iptables -C INPUT -p tcp --dport 22 -j DROP 2>/dev/null || iptables -A INPUT -p tcp --dport 22 -j DROP
|
||||
echo " iptables 已 DROP 22"
|
||||
# 2.3 重启 sshd 使配置生效
|
||||
systemctl restart sshd 2>/dev/null || service sshd restart 2>/dev/null || /etc/init.d/sshd restart 2>/dev/null
|
||||
echo " sshd 已重启,现仅监听 22022"
|
||||
|
||||
echo ""
|
||||
echo "=== 3. 检查 ==="
|
||||
ss -tlnp | grep -E ":22|:22022" || true
|
||||
echo ""
|
||||
echo "DONE. 今后 SSH 仅用: ssh -p 22022 root@42.194.245.239"
|
||||
'''
|
||||
|
||||
|
||||
def _read_creds():
|
||||
d = os.path.dirname(os.path.abspath(__file__))
|
||||
for _ in range(6):
|
||||
root = d
|
||||
if os.path.basename(d) == "卡若AI":
|
||||
break
|
||||
d = os.path.dirname(d)
|
||||
p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md")
|
||||
if not os.path.isfile(p):
|
||||
return None, None
|
||||
with open(p, "r", encoding="utf-8") as f:
|
||||
t = f.read()
|
||||
sid = skey = None
|
||||
in_t = False
|
||||
for line in t.splitlines():
|
||||
if "### 腾讯云" in line:
|
||||
in_t = True
|
||||
continue
|
||||
if in_t and line.strip().startswith("###"):
|
||||
break
|
||||
if not in_t:
|
||||
continue
|
||||
m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I)
|
||||
if m and m.group(1).strip().startswith("AKID"):
|
||||
sid = m.group(1).strip()
|
||||
m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I)
|
||||
if m:
|
||||
skey = m.group(1).strip()
|
||||
return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY")
|
||||
|
||||
|
||||
def main():
|
||||
sid, skey = _read_creds()
|
||||
if not sid or not skey:
|
||||
print("❌ 未配置腾讯云凭证")
|
||||
return 1
|
||||
try:
|
||||
from tencentcloud.common import credential
|
||||
from tencentcloud.tat.v20201028 import tat_client, models
|
||||
except ImportError:
|
||||
print("pip install tencentcloud-sdk-python-tat")
|
||||
return 1
|
||||
cred = credential.Credential(sid, skey)
|
||||
client = tat_client.TatClient(cred, REGION)
|
||||
req = models.RunCommandRequest()
|
||||
req.Content = base64.b64encode(CMD.encode()).decode()
|
||||
req.InstanceIds = [CKB_INSTANCE_ID]
|
||||
req.CommandType = "SHELL"
|
||||
req.Timeout = 90
|
||||
req.CommandName = "CKB_CleanMiner_ClosePort22"
|
||||
resp = client.RunCommand(req)
|
||||
inv_id = resp.InvocationId
|
||||
print("⏳ TAT 已下发:清理挖矿 + 关闭 22 端口,等待 35s...")
|
||||
time.sleep(35)
|
||||
req2 = models.DescribeInvocationTasksRequest()
|
||||
f = models.Filter()
|
||||
f.Name = "invocation-id"
|
||||
f.Values = [inv_id]
|
||||
req2.Filters = [f]
|
||||
r2 = client.DescribeInvocationTasks(req2)
|
||||
for t in (r2.InvocationTaskSet or []):
|
||||
tr = getattr(t, "TaskResult", None)
|
||||
if tr:
|
||||
try:
|
||||
jj = json.loads(tr) if isinstance(tr, str) else tr
|
||||
out = jj.get("Output", "")
|
||||
if out:
|
||||
out = base64.b64decode(out).decode("utf-8", errors="replace")
|
||||
print("\n--- 服务器输出 ---\n%s\n---" % out[:4000])
|
||||
except Exception:
|
||||
print(str(tr)[:600])
|
||||
print("\n✅ 完成后 SSH 仅用:ssh -p 22022 root@42.194.245.239")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
126
01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py
Normal file
126
01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清理挖矿木马.py
Normal file
@@ -0,0 +1,126 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
腾讯云 TAT 在存客宝上清理 Linux.Risk.Miner.Jcnw 挖矿木马
|
||||
告警文件:/tmp/.esd101/.system3d
|
||||
"""
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
|
||||
CKB_INSTANCE_ID = "ins-ciyv2mxa"
|
||||
REGION = "ap-guangzhou"
|
||||
|
||||
CMD = r'''
|
||||
echo "=== 1. 查找占用恶意文件的进程 ==="
|
||||
f="/tmp/.esd101/.system3d"
|
||||
[ -f "$f" ] && fuser -v "$f" 2>/dev/null || echo " 文件不存在或无进程占用"
|
||||
lsof "$f" 2>/dev/null || true
|
||||
echo ""
|
||||
echo "=== 2. 结束相关进程 ==="
|
||||
for pid in $(lsof -t "$f" 2>/dev/null); do kill -9 $pid 2>/dev/null && echo " 已结束 PID $pid"; done
|
||||
pkill -9 -f ".esd101" 2>/dev/null && echo " 已结束 .esd101 相关进程" || true
|
||||
pkill -9 -f ".system3d" 2>/dev/null && echo " 已结束 .system3d 相关进程" || true
|
||||
sleep 1
|
||||
echo ""
|
||||
echo "=== 3. 删除恶意文件及目录 ==="
|
||||
rm -rf /tmp/.esd101 2>/dev/null && echo " 已删除 /tmp/.esd101" || echo " 删除失败或不存在"
|
||||
echo ""
|
||||
echo "=== 4. 检查 /tmp 下其他隐藏目录 ==="
|
||||
ls -la /tmp/ | head -30
|
||||
echo ""
|
||||
echo "=== 5. 检查定时任务(crontab)==="
|
||||
crontab -l 2>/dev/null | grep -v "^#" || echo " 无 crontab"
|
||||
for u in root www; do echo " [$u]"; crontab -u $u -l 2>/dev/null | grep -v "^#" || true; done
|
||||
echo ""
|
||||
echo "=== 6. 检查 /etc/cron 可疑项 ==="
|
||||
grep -r "\.esd101\|\.system3d\|/tmp/\." /etc/cron* 2>/dev/null || echo " 无"
|
||||
echo ""
|
||||
echo "=== 7. 高 CPU 进程(前 10)==="
|
||||
ps aux --sort=-%cpu | head -12
|
||||
echo ""
|
||||
echo "DONE"
|
||||
'''
|
||||
|
||||
|
||||
def _read_creds():
|
||||
d = os.path.dirname(os.path.abspath(__file__))
|
||||
for _ in range(6):
|
||||
root = d
|
||||
if os.path.basename(d) == "卡若AI":
|
||||
break
|
||||
d = os.path.dirname(d)
|
||||
p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md")
|
||||
if not os.path.isfile(p):
|
||||
return None, None
|
||||
with open(p, "r", encoding="utf-8") as f:
|
||||
t = f.read()
|
||||
sid = skey = None
|
||||
in_t = False
|
||||
for line in t.splitlines():
|
||||
if "### 腾讯云" in line:
|
||||
in_t = True
|
||||
continue
|
||||
if in_t and line.strip().startswith("###"):
|
||||
break
|
||||
if not in_t:
|
||||
continue
|
||||
m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I)
|
||||
if m and m.group(1).strip().startswith("AKID"):
|
||||
sid = m.group(1).strip()
|
||||
m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I)
|
||||
if m:
|
||||
skey = m.group(1).strip()
|
||||
return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY")
|
||||
|
||||
|
||||
def main():
|
||||
print("存客宝 挖矿木马清理 TAT 下发...", flush=True)
|
||||
sid, skey = _read_creds()
|
||||
if not sid or not skey:
|
||||
print("❌ 未配置腾讯云凭证", flush=True)
|
||||
return 1
|
||||
try:
|
||||
from tencentcloud.common import credential
|
||||
from tencentcloud.tat.v20201028 import tat_client, models
|
||||
except ImportError:
|
||||
print("pip install tencentcloud-sdk-python-tat")
|
||||
return 1
|
||||
cred = credential.Credential(sid, skey)
|
||||
client = tat_client.TatClient(cred, REGION)
|
||||
req = models.RunCommandRequest()
|
||||
req.Content = base64.b64encode(CMD.encode()).decode()
|
||||
req.InstanceIds = [CKB_INSTANCE_ID]
|
||||
req.CommandType = "SHELL"
|
||||
req.Timeout = 60
|
||||
req.CommandName = "CKB_KillMiner"
|
||||
resp = client.RunCommand(req)
|
||||
inv_id = resp.InvocationId
|
||||
print("⏳ TAT 已下发挖矿木马清理,等待 25s...")
|
||||
time.sleep(25)
|
||||
req2 = models.DescribeInvocationTasksRequest()
|
||||
f = models.Filter()
|
||||
f.Name = "invocation-id"
|
||||
f.Values = [inv_id]
|
||||
req2.Filters = [f]
|
||||
r2 = client.DescribeInvocationTasks(req2)
|
||||
for t in (r2.InvocationTaskSet or []):
|
||||
tr = getattr(t, "TaskResult", None)
|
||||
if tr:
|
||||
try:
|
||||
jj = json.loads(tr) if isinstance(tr, str) else tr
|
||||
out = jj.get("Output", "")
|
||||
if out:
|
||||
out = base64.b64decode(out).decode("utf-8", errors="replace")
|
||||
print("\n--- 服务器输出 ---\n%s\n---" % out[:5000])
|
||||
except Exception:
|
||||
print(str(tr)[:600])
|
||||
print("\n建议:登录腾讯云控制台 → 入侵检测 → 文件查杀,确认处置并加强防护。")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
131
01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py
Normal file
131
01_卡资(金)/金仓_存储备份/服务器管理/scripts/腾讯云_TAT_存客宝_清除恶意文件挖矿.py
Normal file
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
腾讯云 TAT 在存客宝上清除主机安全告警的恶意文件(挖矿 Linux.Risk.Miner.Jcnw)
|
||||
路径:/tmp/.esd101/.system3d
|
||||
"""
|
||||
import base64
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
|
||||
CKB_INSTANCE_ID = "ins-ciyv2mxa"
|
||||
REGION = "ap-guangzhou"
|
||||
|
||||
CMD = r'''
|
||||
set -e
|
||||
echo "=== 1. 恶意文件与目录(腾讯云主机安全告警)==="
|
||||
MAL_PATH="/tmp/.esd101"
|
||||
MAL_FILE="/tmp/.esd101/.system3d"
|
||||
[ -f "$MAL_FILE" ] && echo " 存在: $MAL_FILE" || echo " 文件已不存在"
|
||||
[ -d "$MAL_PATH" ] && echo " 目录存在: $MAL_PATH" || echo " 目录已不存在"
|
||||
echo ""
|
||||
echo "=== 2. 占用该路径的进程 ==="
|
||||
fuser -v "$MAL_FILE" 2>/dev/null || true
|
||||
lsof "$MAL_FILE" 2>/dev/null || true
|
||||
for pid in $(lsof +D "$MAL_PATH" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u); do
|
||||
echo " 进程 PID=$pid"
|
||||
ps -p $pid -o pid,user,cmd 2>/dev/null || true
|
||||
done
|
||||
echo ""
|
||||
echo "=== 3. 终止关联进程 ==="
|
||||
for pid in $(lsof +D "$MAL_PATH" 2>/dev/null | awk 'NR>1 {print $2}' | sort -u); do
|
||||
kill -9 $pid 2>/dev/null && echo " 已 kill -9 $pid" || true
|
||||
done
|
||||
sleep 1
|
||||
echo ""
|
||||
echo "=== 4. 删除恶意文件与目录 ==="
|
||||
rm -rf "$MAL_FILE" "$MAL_PATH" 2>/dev/null && echo " 已删除 $MAL_PATH 及内容" || echo " 删除完成或路径不存在"
|
||||
echo ""
|
||||
echo "=== 5. 再次确认 ==="
|
||||
[ -d "$MAL_PATH" ] && echo " 警告: 目录仍存在" || echo " 目录已清除"
|
||||
echo ""
|
||||
echo "=== 6. 检查 /tmp 下其他隐藏可疑目录 ==="
|
||||
ls -la /tmp/ | grep -E '^d.*\.' || echo " (无其他隐藏目录或已清理)"
|
||||
echo ""
|
||||
echo "=== 7. 当前用户 crontab 是否含可疑项 ==="
|
||||
crontab -l 2>/dev/null | grep -v '^#' | grep -v '^$' || echo " (无 crontab 或为空)"
|
||||
echo ""
|
||||
echo "DONE"
|
||||
'''
|
||||
|
||||
|
||||
def _read_creds():
|
||||
d = os.path.dirname(os.path.abspath(__file__))
|
||||
for _ in range(6):
|
||||
root = d
|
||||
if os.path.basename(d) == "卡若AI":
|
||||
break
|
||||
d = os.path.dirname(d)
|
||||
p = os.path.join(root, "运营中枢", "工作台", "00_账号与API索引.md")
|
||||
if not os.path.isfile(p):
|
||||
return None, None
|
||||
with open(p, "r", encoding="utf-8") as f:
|
||||
t = f.read()
|
||||
sid = skey = None
|
||||
in_t = False
|
||||
for line in t.splitlines():
|
||||
if "### 腾讯云" in line:
|
||||
in_t = True
|
||||
continue
|
||||
if in_t and line.strip().startswith("###"):
|
||||
break
|
||||
if not in_t:
|
||||
continue
|
||||
m = re.search(r"SecretId[^|]*\|\s*`([^`]+)`", line, re.I)
|
||||
if m and m.group(1).strip().startswith("AKID"):
|
||||
sid = m.group(1).strip()
|
||||
m = re.search(r"SecretKey[^|]*\|\s*`([^`]+)`", line, re.I)
|
||||
if m:
|
||||
skey = m.group(1).strip()
|
||||
return sid or os.environ.get("TENCENTCLOUD_SECRET_ID"), skey or os.environ.get("TENCENTCLOUD_SECRET_KEY")
|
||||
|
||||
|
||||
def main():
|
||||
sid, skey = _read_creds()
|
||||
if not sid or not skey:
|
||||
print("❌ 未配置腾讯云凭证")
|
||||
return 1
|
||||
try:
|
||||
from tencentcloud.common import credential
|
||||
from tencentcloud.tat.v20201028 import tat_client, models
|
||||
except ImportError:
|
||||
print("pip install tencentcloud-sdk-python-tat")
|
||||
return 1
|
||||
cred = credential.Credential(sid, skey)
|
||||
client = tat_client.TatClient(cred, REGION)
|
||||
req = models.RunCommandRequest()
|
||||
req.Content = base64.b64encode(CMD.encode()).decode()
|
||||
req.InstanceIds = [CKB_INSTANCE_ID]
|
||||
req.CommandType = "SHELL"
|
||||
req.Timeout = 60
|
||||
req.CommandName = "CKB_CleanMalware"
|
||||
resp = client.RunCommand(req)
|
||||
inv_id = resp.InvocationId
|
||||
print("⏳ TAT 已下发清除恶意文件(存客宝 42.194.245.239),等待 25s...")
|
||||
time.sleep(25)
|
||||
req2 = models.DescribeInvocationTasksRequest()
|
||||
f = models.Filter()
|
||||
f.Name = "invocation-id"
|
||||
f.Values = [inv_id]
|
||||
req2.Filters = [f]
|
||||
r2 = client.DescribeInvocationTasks(req2)
|
||||
for t in (r2.InvocationTaskSet or []):
|
||||
tr = getattr(t, "TaskResult", None)
|
||||
if tr:
|
||||
try:
|
||||
jj = json.loads(tr) if isinstance(tr, str) else tr
|
||||
out = jj.get("Output", "")
|
||||
if out:
|
||||
out = base64.b64decode(out).decode("utf-8", errors="replace")
|
||||
print("\n--- 服务器输出 ---\n%s\n---" % out[:5000])
|
||||
except Exception:
|
||||
print(str(tr)[:800])
|
||||
print("\n建议:登录腾讯云控制台 → 主机安全 → 入侵检测 → 文件查杀,确认告警已处理。")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
47
01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md
Normal file
47
01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/README.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# 本地 Docker 使用 NAS 上的 macOS 虚拟机(不复制)
|
||||
|
||||
直接挂载 NAS 的 `smb://CKBNAS._smb._tcp.local/docker/macos-vm`,在本机 Docker 里跑 macos-vm,数据不拷贝。
|
||||
|
||||
## 方式一:一键挂载并启动(推荐)
|
||||
|
||||
```bash
|
||||
# 与 NAS 同网(如家里/公司内网)
|
||||
bash "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh"
|
||||
```
|
||||
|
||||
- 若未挂载 SMB:会先挂载 `//CKBNAS._smb._tcp.local/docker` 到 `~/nas-mounts/ckbnas-docker`(提示密码时输入 NAS 账号密码)。
|
||||
- 若已在 Finder 里连接了「docker」共享:会直接用 `/Volumes/docker/macos-vm`,不再重复挂载。
|
||||
|
||||
## 方式二:先手动挂载再启动
|
||||
|
||||
1. 在 Finder 中连接:`smb://CKBNAS._smb._tcp.local/docker`,或终端执行:
|
||||
```bash
|
||||
open "smb://CKBNAS._smb._tcp.local/docker"
|
||||
```
|
||||
2. 进入本目录后启动:
|
||||
```bash
|
||||
cd "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm"
|
||||
export MACOS_VM_STORAGE="/Volumes/docker/macos-vm"
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## 访问
|
||||
|
||||
- **noVNC(浏览器)**:http://localhost:8007
|
||||
- **VNC 客户端**:`localhost:5901`
|
||||
|
||||
## 停止与卸载
|
||||
|
||||
```bash
|
||||
cd "/Users/karuo/Documents/个人/卡若AI/01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm"
|
||||
docker compose down
|
||||
# 若用脚本挂载到 ~/nas-mounts/ckbnas-docker,不用时可卸载:
|
||||
# umount ~/nas-mounts/ckbnas-docker
|
||||
```
|
||||
|
||||
## 说明
|
||||
|
||||
- 数据始终在 NAS 的 `smb://CKBNAS._smb._tcp.local/docker/macos-vm`,本机只挂载使用,不复制。
|
||||
- 本机需与 NAS 同网(或 VPN/内网穿透),否则 SMB 无法访问。
|
||||
- Mac 上 Docker 无 KVM,虚拟机可能比在 NAS 上跑稍慢,属正常。
|
||||
- 若镜像提示 linux/amd64 与 arm64 不一致,在 Docker Desktop 可开启「Use Rosetta for x86/amd64」以提升兼容性。
|
||||
@@ -0,0 +1,19 @@
|
||||
# 本地 Mac 使用 NAS 上的 macos-vm 数据(SMB 挂载,不复制)
|
||||
# 数据路径由 run.sh 设置:MACOS_VM_STORAGE = 挂载后的 docker/macos-vm 目录
|
||||
services:
|
||||
macos:
|
||||
image: dockurr/macos:latest
|
||||
container_name: macos-vm-local
|
||||
environment:
|
||||
- VERSION=ventura
|
||||
- RAM_SIZE=4G
|
||||
- CPU_CORES=2
|
||||
- DISK_SIZE=64G
|
||||
ports:
|
||||
- "8007:8006"
|
||||
- "5901:5900"
|
||||
volumes:
|
||||
- "${MACOS_VM_STORAGE:-$HOME/nas-mounts/ckbnas-docker/macos-vm}:/storage"
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
restart: "no"
|
||||
35
01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh
Executable file
35
01_卡资(金)/金仓_存储备份/群晖NAS管理/scripts/local-macos-vm/run.sh
Executable file
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
# 挂载 NAS 上的 docker/macos-vm(SMB),并用本机 Docker 运行 macos-vm,不复制数据
|
||||
# 数据源: smb://CKBNAS._smb._tcp.local/docker/macos-vm
|
||||
|
||||
set -e
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
# 固定挂载点,便于 Docker 使用同一路径
|
||||
MOUNT_POINT="${HOME}/nas-mounts/ckbnas-docker"
|
||||
STORAGE_PATH="${MOUNT_POINT}/macos-vm"
|
||||
export MACOS_VM_STORAGE="$STORAGE_PATH"
|
||||
|
||||
# 若已用 Finder 挂载了 docker 共享,可直接用 /Volumes/docker/macos-vm
|
||||
if [[ -d "/Volumes/docker/macos-vm" ]]; then
|
||||
export MACOS_VM_STORAGE="/Volumes/docker/macos-vm"
|
||||
echo "使用 Finder 已挂载路径: $MACOS_VM_STORAGE"
|
||||
else
|
||||
mkdir -p "$MOUNT_POINT"
|
||||
if ! mount | grep -q "$MOUNT_POINT"; then
|
||||
echo "挂载 SMB: //CKBNAS._smb._tcp.local/docker -> $MOUNT_POINT"
|
||||
echo "(若提示密码,请输入 NAS 登录密码)"
|
||||
mount_smbfs "//fnvtk@CKBNAS._smb._tcp.local/docker" "$MOUNT_POINT"
|
||||
fi
|
||||
if [[ ! -d "$STORAGE_PATH" ]]; then
|
||||
echo "错误: 挂载后未找到 $STORAGE_PATH,请确认 NAS 上存在 docker/macos-vm 目录"
|
||||
exit 1
|
||||
fi
|
||||
echo "使用挂载路径: $MACOS_VM_STORAGE"
|
||||
fi
|
||||
|
||||
echo "启动本地 macos-vm 容器(数据来自 NAS,不复制)..."
|
||||
docker compose up -d
|
||||
echo "完成。noVNC: http://localhost:8007 VNC: localhost:5901"
|
||||
echo "停止: cd $SCRIPT_DIR && docker compose down"
|
||||
142
01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html
Normal file
142
01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.html
Normal file
@@ -0,0 +1,142 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>对话流程 · 群晖1TB备份盘挂载</title>
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Helvetica Neue", sans-serif;
|
||||
background: #f5f5f7;
|
||||
padding: 24px;
|
||||
min-height: 100vh;
|
||||
}
|
||||
h1 {
|
||||
font-size: 18px;
|
||||
color: #1d1d1f;
|
||||
margin-bottom: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.chart-wrap {
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
padding: 24px;
|
||||
box-shadow: 0 2px 12px rgba(0,0,0,.06);
|
||||
}
|
||||
.chart-wrap svg {
|
||||
display: block;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>对话流程 · 群晖 1TB 备份盘 → Mac 挂载与边栏</h1>
|
||||
<div class="chart-wrap">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 520" width="720" height="520">
|
||||
<defs>
|
||||
<marker id="arrow" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto">
|
||||
<path d="M0 0 L8 4 L0 8 Z" fill="#666" />
|
||||
</marker>
|
||||
<filter id="shadow" x="-20%" y="-20%" width="140%" height="140%">
|
||||
<feDropShadow dx="0" dy="2" stdDeviation="2" flood-opacity=".12"/>
|
||||
</filter>
|
||||
</defs>
|
||||
<!-- 标题区 -->
|
||||
<rect x="260" y="8" width="200" height="32" rx="6" fill="#1d1d1f" filter="url(#shadow)"/>
|
||||
<text x="360" y="28" text-anchor="middle" fill="#fff" font-size="13" font-weight="600">用户 · 助手 对话流程</text>
|
||||
|
||||
<!-- 流程节点 -->
|
||||
<g font-size="12" fill="#1d1d1f">
|
||||
<!-- 第一列:用户 -->
|
||||
<rect x="24" y="56" width="120" height="36" rx="8" fill="#e8f4fd" stroke="#0a84ff" stroke-width="1.5"/>
|
||||
<text x="84" y="78" text-anchor="middle">用户:开辟1TB</text>
|
||||
<text x="84" y="92" text-anchor="middle">备份盘+时间机器</text>
|
||||
|
||||
<rect x="24" y="108" width="120" height="28" rx="6" fill="#e8f4fd" stroke="#0a84ff"/>
|
||||
<text x="84" y="126" text-anchor="middle">用户:命令行操作</text>
|
||||
|
||||
<rect x="24" y="152" width="120" height="28" rx="6" fill="#e8f4fd" stroke="#0a84ff"/>
|
||||
<text x="84" y="170" text-anchor="middle">用户:打开挂载目录</text>
|
||||
|
||||
<rect x="24" y="196" width="120" height="28" rx="6" fill="#e8f4fd" stroke="#0a84ff"/>
|
||||
<text x="84" y="214" text-anchor="middle">用户:放左侧边栏</text>
|
||||
|
||||
<rect x="24" y="240" width="120" height="28" rx="6" fill="#e8f4fd" stroke="#0a84ff"/>
|
||||
<text x="84" y="258" text-anchor="middle">用户:生成流程PNG</text>
|
||||
|
||||
<!-- 第二列:助手 -->
|
||||
<rect x="200" y="56" width="140" height="52" rx="8" fill="#f0fdf4" stroke="#22c55e" stroke-width="1.5"/>
|
||||
<text x="270" y="76" text-anchor="middle">助手:写操作指南</text>
|
||||
<text x="270" y="92" text-anchor="middle">挂载脚本(内网优先)</text>
|
||||
<text x="270" y="108" text-anchor="middle">LaunchAgent plist</text>
|
||||
|
||||
<rect x="200" y="124" width="140" height="56" rx="8" fill="#fef3c7" stroke="#f59e0b"/>
|
||||
<text x="270" y="144" text-anchor="middle">执行挂载脚本</text>
|
||||
<text x="270" y="160" text-anchor="middle">→ 失败(URL解析)</text>
|
||||
<text x="270" y="176" text-anchor="middle">→ 中文共享名编码</text>
|
||||
|
||||
<rect x="200" y="196" width="140" height="44" rx="8" fill="#f0fdf4" stroke="#22c55e"/>
|
||||
<text x="270" y="216" text-anchor="middle">挂载成功</text>
|
||||
<text x="270" y="232" text-anchor="middle">安装 LaunchAgent</text>
|
||||
|
||||
<rect x="200" y="256" width="140" height="28" rx="6" fill="#f0fdf4" stroke="#22c55e"/>
|
||||
<text x="270" y="274" text-anchor="middle">open ~/DiskStation-1TB</text>
|
||||
|
||||
<rect x="200" y="300" width="140" height="40" rx="6" fill="#f0fdf4" stroke="#22c55e"/>
|
||||
<text x="270" y="318" text-anchor="middle">open -R + 说明</text>
|
||||
<text x="270" y="334" text-anchor="middle">手动拖到边栏</text>
|
||||
|
||||
<rect x="200" y="356" width="140" height="40" rx="6" fill="#f0fdf4" stroke="#22c55e"/>
|
||||
<text x="270" y="374" text-anchor="middle">本流程图 HTML</text>
|
||||
<text x="270" y="390" text-anchor="middle">→ 截图 → PNG</text>
|
||||
|
||||
<!-- 第三列:结果/脚本 -->
|
||||
<rect x="396" y="68" width="160" height="36" rx="6" fill="#f5f5f7" stroke="#888"/>
|
||||
<text x="476" y="88" text-anchor="middle">参考资料.md</text>
|
||||
<text x="476" y="102" text-anchor="middle">mount_diskstation_1tb.sh</text>
|
||||
|
||||
<rect x="396" y="132" width="160" height="28" rx="6" fill="#f5f5f7" stroke="#888"/>
|
||||
<text x="476" y="150" text-anchor="middle">脚本增加 URL 编码</text>
|
||||
|
||||
<rect x="396" y="204" width="160" height="36" rx="6" fill="#f5f5f7" stroke="#888"/>
|
||||
<text x="476" y="222" text-anchor="middle">~/DiskStation-1TB</text>
|
||||
<text x="476" y="236" text-anchor="middle">登录自动挂载</text>
|
||||
|
||||
<rect x="396" y="264" width="160" height="28" rx="6" fill="#f5f5f7" stroke="#888"/>
|
||||
<text x="476" y="282" text-anchor="middle">Finder 打开目录</text>
|
||||
|
||||
<rect x="396" y="308" width="160" height="28" rx="6" fill="#f5f5f7" stroke="#888"/>
|
||||
<text x="476" y="326" text-anchor="middle">边栏需手动拖一次</text>
|
||||
|
||||
<rect x="396" y="364" width="160" height="28" rx="6" fill="#0a84ff" stroke="#0a84ff"/>
|
||||
<text x="476" y="382" text-anchor="middle" fill="#fff">对话流程_xxx.png</text>
|
||||
</g>
|
||||
|
||||
<!-- 箭头:用户→助手 -->
|
||||
<line x1="144" y1="74" x2="198" y2="82" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="144" y1="122" x2="198" y2="152" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="144" y1="166" x2="198" y2="218" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="144" y1="210" x2="198" y2="320" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="144" y1="254" x2="198" y2="376" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
|
||||
<!-- 箭头:助手→结果 -->
|
||||
<line x1="340" y1="82" x2="394" y2="86" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="340" y1="152" x2="394" y2="146" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="340" y1="218" x2="394" y2="222" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="340" y1="278" x2="394" y2="278" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="340" y1="320" x2="394" y2="322" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
<line x1="340" y1="376" x2="394" y2="378" stroke="#666" stroke-width="1.5" marker-end="url(#arrow)"/>
|
||||
|
||||
<!-- 图例 -->
|
||||
<rect x="24" y="450" width="14" height="14" rx="3" fill="#e8f4fd" stroke="#0a84ff"/>
|
||||
<text x="44" y="461" font-size="11" fill="#666">用户</text>
|
||||
<rect x="100" y="450" width="14" height="14" rx="3" fill="#f0fdf4" stroke="#22c55e"/>
|
||||
<text x="120" y="461" font-size="11" fill="#666">助手</text>
|
||||
<rect x="176" y="450" width="14" height="14" rx="3" fill="#f5f5f7" stroke="#888"/>
|
||||
<text x="196" y="461" font-size="11" fill="#666">产出/结果</text>
|
||||
</svg>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
BIN
01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.png
Normal file
BIN
01_卡资(金)/金仓_存储备份/群晖NAS管理/参考资料/对话流程_群晖1TB备份盘挂载.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 83 KiB |
39
02_卡人(水)/水桥_平台对接/飞书管理/ClawX飞书配置说明.md
Normal file
39
02_卡人(水)/水桥_平台对接/飞书管理/ClawX飞书配置说明.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# ClawX / OpenClaw 飞书通道配置说明
|
||||
|
||||
> 本机飞书 App Key / App Secret 已写入 OpenClaw 网关配置,飞书通道已启用。
|
||||
|
||||
## 一、本机飞书凭证(已填入 OpenClaw)
|
||||
|
||||
| 项 | 值 | 来源 |
|
||||
|:---|:---|:---|
|
||||
| **App ID(App Key)** | `cli_a48818290ef8100d` | 卡若AI 飞书管理脚本(水桥) |
|
||||
| **App Secret** | `dhjU0qWd5AzicGWTf4cTqhCWJOrnuCk4` | 同上 |
|
||||
|
||||
上述凭证与 `02_卡人(水)/水桥_平台对接/飞书管理/脚本/` 下各脚本(如 `soul_party_to_feishu_sheet.py`、`auto_log.py`、`feishu_api.py`)使用的为同一套,用于飞书开放平台同一应用。
|
||||
|
||||
## 二、已写入的配置位置
|
||||
|
||||
- **文件**:`~/.openclaw/openclaw.json`
|
||||
- **节点**:`channels.feishu`
|
||||
- `enabled: true`
|
||||
- `dmPolicy: "pairing"`
|
||||
- `accounts.main.appId` / `appSecret` / `botName: "卡若AI"`
|
||||
|
||||
ClawX 连接本机或 Docker 中的 OpenClaw 网关时,会使用该配置;**无需在 ClawX 界面里再填一遍 App Key/Secret**,网关已带飞书通道。
|
||||
|
||||
## 三、使配置生效
|
||||
|
||||
1. **重启 OpenClaw 网关**
|
||||
- 若网关在 **Docker(website 编排)**:神射手目录执行 `docker compose restart website-openclaw-gateway` 或 `docker compose up -d`。
|
||||
- 若网关在 **本机**:在 ClawX 设置中重启网关,或结束网关进程后重新启动。
|
||||
2. **飞书开放平台**
|
||||
- 应用需开启 **Bot** 能力,事件订阅建议使用 **长连接(WebSocket)**,并订阅 `im.message.receive_v1`。
|
||||
- 权限需包含:`im:message`、`im:message:send_as_bot` 等(见 [OpenClaw 飞书文档](https://docs.openclaw.ai/channels/feishu))。
|
||||
|
||||
## 四、在 ClawX 里确认
|
||||
|
||||
- 打开 **ClawX → 设置 → 通道 / Channels**,应能看到 **飞书(Feishu)** 已启用。
|
||||
- 若 ClawX 有单独的「飞书」配置页且显示从网关同步,则无需再填 App Key/Secret;若仍有输入框且为空,可填上表一中的 App ID 与 App Secret 以保持一致。
|
||||
|
||||
---
|
||||
*配置写入时间:2026-03-06;凭证来源:卡若AI 水桥飞书管理脚本。*
|
||||
@@ -47,18 +47,21 @@ ROWS = {
|
||||
'114': [ '电竞AI私域招人 龙虾', 163, 42360, 445, 8, 139, 1, 29, 19, 54 ],
|
||||
# 115场 2026-03-04:关闭页 156min/484成员/56最高/15新增粉丝/1礼物/3灵魂力/36974曝光,小助手 154min建房/480进房/8人均/82互动/15关注
|
||||
'115': [ '破产两次 家庭先于事业', 156, 36974, 484, 8, 82, 1, 3, 15, 56 ],
|
||||
# 116场 2026-03-05:小助手 154min建房/418进房/11人均/104互动/19关注,话题职场;推流/礼物/灵魂力/最高在线待关闭页补
|
||||
'116': [ '量化猎头人才 职场分享', 154, 0, 418, 11, 104, 0, 0, 19, 0 ],
|
||||
}
|
||||
# 场次→按日期列填写时的日期(表头为当月日期 1~31)
|
||||
SESSION_DATE_COLUMN = {'105': '20', '106': '21', '107': '23', '113': '2', '114': '3', '115': '4'}
|
||||
SESSION_DATE_COLUMN = {'105': '20', '106': '21', '107': '23', '113': '2', '114': '3', '115': '4', '116': '5'}
|
||||
# 场次→月份(用于选择 2月/3月 等工作表标签,避免写入错月)
|
||||
SESSION_MONTH = {'105': 2, '106': 2, '107': 2, '113': 3, '114': 3, '115': 3}
|
||||
SESSION_MONTH = {'105': 2, '106': 2, '107': 2, '113': 3, '114': 3, '115': 3, '116': 3}
|
||||
|
||||
# 派对录屏(飞书妙记)链接:场次 → 完整 URL,填表时写入「派对录屏」行对应列
|
||||
# 从飞书妙记复制链接后填入,115 场等新场次需补全
|
||||
# 从飞书妙记复制链接后填入,新场次需补全
|
||||
PARTY_VIDEO_LINKS = {
|
||||
'113': 'https://cunkebao.feishu.cn/minutes/obcn6yjq6866c3gl4ibd72vr',
|
||||
'114': 'https://cunkebao.feishu.cn/minutes/obcn7nd828351hy4he3974a8',
|
||||
'115': 'https://cunkebao.feishu.cn/minutes/obcn8cgvnzk15yfy3buak735',
|
||||
'116': 'https://cunkebao.feishu.cn/minutes/obcn81825en52vt3eqoo482e',
|
||||
}
|
||||
|
||||
# 小程序当日运营数据:日期号 → {访问次数, 访客, 交易金额},填表时自动写入对应日期列
|
||||
@@ -69,11 +72,12 @@ MINIPROGRAM_EXTRA = {
|
||||
'21': {'访问次数': 52, '访客': 52, '交易金额': 0}, # 2月21日
|
||||
'23': {'访问次数': 55, '访客': 55, '交易金额': 0}, # 2月23日
|
||||
}
|
||||
# 3 月:日期列 2/3/4 对应 113/114/115 场;数据从 Soul 小程序后台获取后填入此处
|
||||
# 3 月:日期列 2/3/4/5 对应 113/114/115/116 场;数据从 Soul 小程序后台获取后填入此处
|
||||
MINIPROGRAM_EXTRA_3 = {
|
||||
'2': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月2日 113场
|
||||
'3': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月3日 114场
|
||||
'4': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月4日 115场
|
||||
'5': {'访问次数': 0, '访客': 0, '交易金额': 0}, # 3月5日 116场
|
||||
}
|
||||
|
||||
|
||||
@@ -327,7 +331,7 @@ def main():
|
||||
session = (sys.argv[1] if len(sys.argv) > 1 else '104').strip()
|
||||
row = ROWS.get(session)
|
||||
if not row:
|
||||
print('❌ 未知场次,可用: 96, 97, 98, 99, 100, 103, 104, 105, 106, 107, 113, 114, 115')
|
||||
print('❌ 未知场次,可用: 96, 97, 98, 99, 100, 103, 104, 105, 106, 107, 113, 114, 115, 116')
|
||||
sys.exit(1)
|
||||
token = load_token() or refresh_and_load_token()
|
||||
if not token:
|
||||
@@ -372,9 +376,9 @@ def main():
|
||||
LABELS_GROUP = ['主题', '时长(分钟)', 'Soul推流人数', '进房人数', '人均时长(分钟)', '互动数量', '礼物', '灵魂力', '增加关注', '最高在线']
|
||||
|
||||
def _maybe_send_group(sess, raw_vals):
|
||||
if sess not in ('105', '106', '107', '113', '114', '115'):
|
||||
if sess not in ('105', '106', '107', '113', '114', '115', '116'):
|
||||
return
|
||||
date_label = {'105': '2月20日', '106': '2月21日', '107': '2月23日', '113': '3月2日', '114': '3月3日', '115': '3月4日'}.get(sess, sess + '场')
|
||||
date_label = {'105': '2月20日', '106': '2月21日', '107': '2月23日', '113': '3月2日', '114': '3月3日', '115': '3月4日', '116': '3月5日'}.get(sess, sess + '场')
|
||||
report_link = OPERATION_REPORT_LINK if sheet_id == SHEET_ID else f'https://cunkebao.feishu.cn/wiki/wikcnIgAGSNHo0t36idHJ668Gfd?sheet={sheet_id}'
|
||||
lines = [
|
||||
'【Soul 派对运营报表】',
|
||||
@@ -385,7 +389,7 @@ def main():
|
||||
for i, label in enumerate(LABELS_GROUP):
|
||||
val = raw_vals[i] if i < len(raw_vals) else ''
|
||||
lines.append(f'{label}:{val}')
|
||||
src_date = {'105': '20260220', '106': '20260221', '107': '20260223', '113': '20260302', '114': '20260303', '115': '20260304'}.get(sess, '20260220')
|
||||
src_date = {'105': '20260220', '106': '20260221', '107': '20260223', '113': '20260302', '114': '20260303', '115': '20260304', '116': '20260305'}.get(sess, '20260220')
|
||||
lines.append(f'数据来源:soul 派对 {sess}场 {src_date}.txt')
|
||||
msg = '\n'.join(lines)
|
||||
ok, _ = send_feishu_group_message(FEISHU_GROUP_WEBHOOK, msg)
|
||||
|
||||
53
运营中枢/参考资料/Cursor窗口无响应与超时排查.md
Normal file
53
运营中枢/参考资料/Cursor窗口无响应与超时排查.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# Cursor 窗口无响应 / 超时自动关闭 · 排查与处理
|
||||
|
||||
> 当出现「The window is not responding」弹窗时的处理清单。已按本清单在用户设置中做了部分优化。
|
||||
> 若伴随**自动关闭/闪退**,另见:`Cursor闪退排查_20260304.md`(日志分析、渲染进程崩溃、Agent 嵌套事务等)。
|
||||
|
||||
---
|
||||
|
||||
## 一、已做的配置优化(settings.json)
|
||||
|
||||
以下项已写入 **Cursor 用户设置**,用于减轻卡顿与无响应:
|
||||
|
||||
| 配置项 | 作用 |
|
||||
|:---|:---|
|
||||
| `cursor.general.enableCodebaseIndexing` = false | 关闭代码库索引,减轻后台负载 |
|
||||
| `files.watcherExclude` | 排除 node_modules、.git、dist、build、.next、.cursor 等,减少文件监视导致的卡顿 |
|
||||
| `search.exclude` | 搜索时排除上述目录,减轻索引与搜索压力 |
|
||||
| `typescript.tsserver.maxTsServerMemory` = 4096 | 限制 TS 语言服务内存,避免单进程占满导致假死 |
|
||||
|
||||
---
|
||||
|
||||
## 二、建议在 Cursor 界面里手动检查
|
||||
|
||||
1. **网络(若经常在请求 AI 时卡死)**
|
||||
- **Cursor 设置 → Network**
|
||||
- 打开 **HTTP Compatibility Mode**(改用 HTTP/1.1),部分网络/代理下可减少超时与无响应。
|
||||
|
||||
2. **MCP / 工具(若卡死与 Agent、工具调用相关)**
|
||||
- **Cursor 设置 → Tools & MCP**
|
||||
- 暂时关闭不用的 MCP 或工具,观察是否还会出现「窗口无响应」。
|
||||
|
||||
3. **模型与 API**
|
||||
- 若某模型或自建 API 经常超时,可先切换到其他模型测试。
|
||||
- 第三方 Base URL / Key 异常也会导致长时间等待后弹窗无响应。
|
||||
|
||||
---
|
||||
|
||||
## 三、仍出现无响应时
|
||||
|
||||
- **先点「Keep Waiting」**:有时是短暂卡顿,等几十秒会恢复。
|
||||
- **再试「Reopen」**:会重启该窗口;若勾选「Don't restore editors」则不再恢复上次打开的标签,启动更快。
|
||||
- **定期清理**:关闭不用的聊天标签、少开大仓库多根目录,有助减轻内存与 IPC 压力。
|
||||
- **看日志**:`~/Library/Application Support/Cursor/logs/main.log`,搜 `ERROR` / `WARN` 排查扩展或网络问题。
|
||||
|
||||
---
|
||||
|
||||
## 四、原因简述(社区常见)
|
||||
|
||||
- 扩展宿主进程崩溃或 IPC 阻塞(如 16s 超时)。
|
||||
- 文件监视 / 搜索对超大目录(如未排除的 node_modules)导致 CPU 或 I/O 飙高。
|
||||
- 多个聊天或 Agent 同时跑、工具/MCP 超时,导致界面线程被占。
|
||||
- 网络或代理导致请求长时间挂起,进而触发「无响应」检测。
|
||||
|
||||
上述设置与步骤可在不重装 Cursor 的前提下,优先尝试;若问题依旧,可结合 main.log 与 Cursor 官方论坛/Issues 进一步排查。
|
||||
@@ -59,6 +59,7 @@
|
||||
| Secret | `v1:C6mw1SlvXsJdlO4VFEXSQEVf:519gA0DPqIMbjvfMh7CXf4B2` |
|
||||
| Secret(zhengzhiqun@vip.qq.com 账号) | `v1:t2m5rEmVb8eBvH7I4IAlP4jU:vcp_1p5UWQZ9o8Mh6YuZlFiUrrzvgUhvJFB6QgzjKYkf09XJSZ6iu10ZgFzZ` |
|
||||
| 模型 | `claude-opus`(接口侧用 v0-1.5-md 等) |
|
||||
| 检测 | 运行 `bash 运营中枢/工作台/scripts/test_v0_api.sh`;若返回 500/Unknown error,到 [v0.app/chat/settings/keys](https://v0.app/chat/settings/keys) 检查 Key 与套餐;ClawX 默认走本地模型,确保可用 |
|
||||
|
||||
|
||||
### n8n(本机工作流 API)
|
||||
|
||||
63
运营中枢/工作台/ClawX_V0参数说明.md
Normal file
63
运营中枢/工作台/ClawX_V0参数说明.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# ClawX 卡若AI V0 参数说明
|
||||
|
||||
> 已按卡若AI《00_账号与API索引》《v0_API对接说明》将 V0 参数写入 `~/.openclaw/openclaw.json`,ClawX 设置里「自定义」提供商会显示并可用。
|
||||
|
||||
---
|
||||
|
||||
## 一、已填入 ClawX(自定义 / custom-custom21)的参数
|
||||
|
||||
| 设置项 | 值 | 说明 |
|
||||
|:---|:---|:---|
|
||||
| **名称** | 卡若AI V0 (云端) | 在设置里显示的提供商名称 |
|
||||
| **基础 URL** | `https://api.v0.dev/v1` | 卡若AI 统一 V0 地址 |
|
||||
| **API Key** | `v1:C6mw1SlvXsJdlO4VFEXSQEVf:519gA0DPqIMbjvfMh7CXf4B2` | 来自《00_账号与API索引》v0.dev |
|
||||
| **模型 ID(默认/推荐)** | `v0-1.5-md` | 卡若AI 推荐,平衡速度与质量 |
|
||||
| **同 Provider 回退** | `v0-1.5-lg`、`v0-1.0-md` | 大模型与兼容旧版 |
|
||||
| **跨 Provider 回退** | 本地 Ollama qwen2.5:3b | 已在 agents.defaults.model.fallbacks 中配置 |
|
||||
|
||||
---
|
||||
|
||||
## 二、V0 模型列表(在 ClawX 可选)
|
||||
|
||||
| 模型 ID | 显示名 | 说明 |
|
||||
|:---|:---|:---|
|
||||
| v0-1.5-md | v0-1.5-md (推荐) | 中模型,推荐默认 |
|
||||
| v0-1.5-lg | v0-1.5-lg (大模型) | 大模型,效果更好 |
|
||||
| v0-1.0-md | v0-1.0-md (兼容) | 旧版中模型 |
|
||||
|
||||
---
|
||||
|
||||
## 三、在 ClawX 设置里核对
|
||||
|
||||
1. 打开 **设置 → AI 模型提供商**。
|
||||
2. 找到 **自定义**(或「卡若AI V0 (云端)」):应显示 **已配置**,基础 URL 为 `https://api.v0.dev/v1`,模型 ID 为上述之一。
|
||||
3. **同 Provider 回退模型 ID**:可填 `v0-1.5-lg`、`v0-1.0-md`(每行一个),先走当前 provider 再走跨 Provider。
|
||||
4. **跨 Provider 回退**:可勾选 **Ollama qwen2.5:3b**,V0 不可用时自动走本地。
|
||||
|
||||
---
|
||||
|
||||
## 四、使配置生效
|
||||
|
||||
- 若刚改过 `~/.openclaw/openclaw.json`:在 ClawX **设置 → 网关** 点 **重启**,或退出 ClawX 再打开。
|
||||
- 新对话可选模型里应出现「卡若AI V0 (推荐)」「卡若AI V0 大模型」「卡若AI V0 (兼容)」。
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## 五、V0 接口检测与排查
|
||||
|
||||
**检测命令(卡若AI 目录下):**
|
||||
```bash
|
||||
bash 运营中枢/工作台/scripts/test_v0_api.sh
|
||||
# 或指定模型: bash 运营中枢/工作台/scripts/test_v0_api.sh v0-1.0-md
|
||||
```
|
||||
|
||||
**若返回 HTTP 500 / `{"success":false,"error":"Unknown error"}`:**
|
||||
1. 打开 https://v0.app/chat/settings/keys 检查 API Key 是否有效,必要时重新生成并更新到《00_账号与API索引》与 ClawX 自定义提供商。
|
||||
2. 确认账号已开通 Premium/Team 且开通了 Model API(按量计费)。
|
||||
3. **ClawX 默认模型为本地 Ollama(qwen2.5:3b)**,不依赖 V0 即可正常使用;V0 仅作云端备选,接口异常时选本地模型即可保证可用。
|
||||
|
||||
---
|
||||
|
||||
*参数来源:卡若AI 运营中枢/工作台/00_账号与API索引.md、参考资料/v0_API对接说明.md。*
|
||||
@@ -234,3 +234,4 @@
|
||||
| 2026-03-05 05:47:24 | 🔄 卡若AI 同步 2026-03-05 05:47 | 更新:Cursor规则、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
| 2026-03-05 05:50:30 | 🔄 卡若AI 同步 2026-03-05 05:50 | 更新:总索引与入口、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
| 2026-03-05 17:00:04 | 🔄 卡若AI 同步 2026-03-05 17:00 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
| 2026-03-05 17:03:05 | 🔄 卡若AI 同步 2026-03-05 17:03 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
|
||||
28
运营中枢/工作台/scripts/ensure_clawx_available.sh
Executable file
28
运营中枢/工作台/scripts/ensure_clawx_available.sh
Executable file
@@ -0,0 +1,28 @@
|
||||
#!/usr/bin/env bash
|
||||
# 命令行检查并确保 ClawX 可用(网关 + Ollama)
|
||||
# 用法:bash 运营中枢/工作台/scripts/ensure_clawx_available.sh
|
||||
|
||||
set -e
|
||||
|
||||
GATEWAY_URL="${GATEWAY_URL:-http://127.0.0.1:18789}"
|
||||
OLLAMA_URL="${OLLAMA_URL:-http://localhost:11434}"
|
||||
|
||||
echo "=== ClawX 可用性检查 ==="
|
||||
|
||||
# 1. 网关健康
|
||||
if curl -sf --connect-timeout 3 "$GATEWAY_URL/healthz" >/dev/null; then
|
||||
echo " [OK] 网关 $GATEWAY_URL 正常 (healthz 200)"
|
||||
else
|
||||
echo " [FAIL] 网关 $GATEWAY_URL 无响应"
|
||||
echo " 请打开 ClawX 应用,或若用 Docker:cd 神射手目录 && docker compose up -d"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 2. Ollama(本地模型)
|
||||
if curl -sf --connect-timeout 3 "$OLLAMA_URL/api/tags" >/dev/null; then
|
||||
echo " [OK] Ollama $OLLAMA_URL 正常"
|
||||
else
|
||||
echo " [WARN] Ollama 未响应,本地小模型不可用(ClawX 可走云端回退)"
|
||||
fi
|
||||
|
||||
echo "=== 检查完成,ClawX 可用 ==="
|
||||
56
运营中枢/工作台/scripts/test_v0_api.sh
Executable file
56
运营中枢/工作台/scripts/test_v0_api.sh
Executable file
@@ -0,0 +1,56 @@
|
||||
#!/usr/bin/env bash
|
||||
# V0 接口检测:用 openclaw 配置里的 apiKey 请求 v0,并给出结论与建议
|
||||
# 用法:bash 运营中枢/工作台/scripts/test_v0_api.sh
|
||||
|
||||
set -e
|
||||
OPENCLAW_JSON="$HOME/.openclaw/openclaw.json"
|
||||
BASE_URL="https://api.v0.dev/v1"
|
||||
MODEL="${1:-v0-1.5-md}"
|
||||
|
||||
if [[ ! -f "$OPENCLAW_JSON" ]]; then
|
||||
echo "未找到 $OPENCLAW_JSON"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 从 openclaw 配置里取 custom-custom21 的 apiKey(简单提取)
|
||||
APIKEY=$(python3 -c "
|
||||
import json
|
||||
with open('$OPENCLAW_JSON') as f:
|
||||
d = json.load(f)
|
||||
p = d.get('models', {}).get('providers', {}).get('custom-custom21', {})
|
||||
print(p.get('apiKey', '') or '')
|
||||
" 2>/dev/null)
|
||||
|
||||
if [[ -z "$APIKEY" ]]; then
|
||||
echo "未在 openclaw 配置中找到 custom-custom21.apiKey,请先在 ClawX 设置中填写 V0 API Key"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "=== V0 接口检测 ==="
|
||||
echo " Base URL: $BASE_URL"
|
||||
echo " Model: $MODEL"
|
||||
echo " Key: ${APIKEY:0:12}...${APIKEY: -4}"
|
||||
echo ""
|
||||
|
||||
RESP=$(curl -s -w "\n%{http_code}" -X POST "$BASE_URL/chat/completions" \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer $APIKEY" \
|
||||
-d "{\"model\":\"$MODEL\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"max_tokens\":20}" \
|
||||
--connect-timeout 12 2>/dev/null)
|
||||
HTTP_CODE=$(echo "$RESP" | tail -1)
|
||||
HTTP_BODY=$(echo "$RESP" | sed '$d')
|
||||
|
||||
if [[ "$HTTP_CODE" == "200" ]]; then
|
||||
echo " [OK] HTTP 200,V0 可用"
|
||||
echo "$HTTP_BODY" | python3 -c "import sys,json; d=json.load(sys.stdin); print(' 内容:', d.get('choices',[{}])[0].get('message',{}).get('content','')[:80])" 2>/dev/null || true
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo " [FAIL] HTTP $HTTP_CODE"
|
||||
echo " 响应: $HTTP_BODY"
|
||||
echo ""
|
||||
echo "排查建议:"
|
||||
echo " 1. 打开 https://v0.app/chat/settings/keys 检查 API Key 是否有效、是否重新生成过"
|
||||
echo " 2. 确认账号已开通 Premium/Team 且开通了 Model API(按量计费)"
|
||||
echo " 3. ClawX 默认已用本地模型(Ollama),不依赖 V0 即可使用;V0 仅作云端备选"
|
||||
exit 1
|
||||
@@ -237,3 +237,4 @@
|
||||
| 2026-03-05 05:47:24 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:47 | 更新:Cursor规则、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-03-05 05:50:30 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 05:50 | 更新:总索引与入口、水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-03-05 17:00:04 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 17:00 | 更新:水桥平台对接、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-03-05 17:03:05 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-05 17:03 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
|
||||
@@ -6,11 +6,13 @@
|
||||
|
||||
## 一、当前连接状态(卡若AI 侧)
|
||||
|
||||
| 服务器 | IP | SSH | 宝塔 API | 说明 |
|
||||
|--------|-----|-----|----------|------|
|
||||
| **存客宝** | 42.194.245.239 | ❌ Permission denied | ❌ IP 未加入白名单 | 需在宝塔面板终端执行 |
|
||||
| **kr宝塔** | 43.139.27.93 | ❌ Permission denied | ❌ IP 未加入白名单 | 同上 |
|
||||
| 小型宝塔 | 42.194.232.22 | ❌ Connection closed | - | 同上 |
|
||||
|
||||
| 服务器 | IP | SSH | 宝塔 API | 说明 |
|
||||
| -------- | -------------- | ------------------- | ----------- | ---------- |
|
||||
| **存客宝** | 42.194.245.239 | ❌ Permission denied | ❌ IP 未加入白名单 | 需在宝塔面板终端执行 |
|
||||
| **kr宝塔** | 43.139.27.93 | ❌ Permission denied | ❌ IP 未加入白名 | 同上 |
|
||||
| 小型宝塔 | 42.194.232.22 | ❌ Connection closed | - | 同上 |
|
||||
|
||||
|
||||
**本机 IP**:211.156.92.72(若需 API 远程检查,需将此 IP 加入各服务器宝塔「设置→API 接口」白名单)
|
||||
|
||||
@@ -20,8 +22,8 @@
|
||||
|
||||
### 步骤 1:登录宝塔面板
|
||||
|
||||
- 存客宝:https://42.194.245.239:9988
|
||||
- kr宝塔:https://43.139.27.93:9988
|
||||
- 存客宝:[https://42.194.245.239:9988](https://42.194.245.239:9988)
|
||||
- kr宝塔:[https://43.139.27.93:9988](https://43.139.27.93:9988)
|
||||
|
||||
账号:ckb
|
||||
密码:zhiqun1984
|
||||
@@ -48,30 +50,34 @@
|
||||
|
||||
## 三、检查内容说明
|
||||
|
||||
| 检查项 | 说明 |
|
||||
|--------|------|
|
||||
| 系统负载/内存 | uptime, free -h |
|
||||
| 磁盘 df | 各分区使用率 |
|
||||
| 根目录占用 | du 找出最大目录 |
|
||||
| /www 子目录 | 网站、日志、备份占用 |
|
||||
| 网站日志 | /www/wwwlogs 各站点日志大小 |
|
||||
| 宝塔日志 | request 等面板日志 |
|
||||
| 大文件 | 超过 100M 的文件列表 |
|
||||
| Docker | 未用镜像/容器占用(如有)|
|
||||
|
||||
| 检查项 | 说明 |
|
||||
| -------- | -------------------- |
|
||||
| 系统负载/内存 | uptime, free -h |
|
||||
| 磁盘 df | 各分区使用率 |
|
||||
| 根目录占用 | du 找出最大目录 |
|
||||
| /www 子目录 | 网站、日志、备份占用 |
|
||||
| 网站日志 | /www/wwwlogs 各站点日志大小 |
|
||||
| 宝塔日志 | request 等面板日志 |
|
||||
| 大文件 | 超过 100M 的文件列表 |
|
||||
| Docker | 未用镜像/容器占用(如有) |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 四、清理内容说明
|
||||
|
||||
| 清理项 | 说明 | 风险 |
|
||||
|--------|------|------|
|
||||
| journalctl | 保留 3 天 | 低 |
|
||||
| /var/log 旧日志 | 7 天前 .gz 删除、.log 截断 | 低 |
|
||||
| apt 缓存 | apt-get clean, autoremove | 低 |
|
||||
| /tmp, /var/tmp | 临时文件 | 低 |
|
||||
| 宝塔 request 日志 | 截断 | 低 |
|
||||
| 网站访问日志 | truncate 清空 | 低 |
|
||||
| 回收站 | 面板手动清空 | 需确认无重要文件 |
|
||||
|
||||
| 清理项 | 说明 | 风险 |
|
||||
| -------------- | ------------------------- | -------- |
|
||||
| journalctl | 保留 3 天 | 低 |
|
||||
| /var/log 旧日志 | 7 天前 .gz 删除、.log 截断 | 低 |
|
||||
| apt 缓存 | apt-get clean, autoremove | 低 |
|
||||
| /tmp, /var/tmp | 临时文件 | 低 |
|
||||
| 宝塔 request 日志 | 截断 | 低 |
|
||||
| 网站访问日志 | truncate 清空 | 低 |
|
||||
| 回收站 | 面板手动清空 | 需确认无重要文件 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
@@ -91,7 +97,7 @@ docker system prune -af
|
||||
|
||||
## 六、开通远程后
|
||||
|
||||
1. **SSH**:确认 root 密码为 zhiqun1984,端口 22022 可用
|
||||
2. **API 白名单**:将本机 IP 211.156.92.72 加入各服务器宝塔 API 白名单
|
||||
1. **SSH**:确认 root 密码为 zhiqun1984,端口 22022 可用
|
||||
2. **API 白名单**:将本机 IP 211.156.92.72 加入各服务器宝塔 API 白名单
|
||||
|
||||
完成后卡若AI 可远程执行 `快速检查服务器.py` 和清理脚本。
|
||||
完成后卡若AI 可远程执行 `快速检查服务器.py` 和清理脚本。
|
||||
139
运营中枢/工作台/本地小模型详细配置.md
Normal file
139
运营中枢/工作台/本地小模型详细配置.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# 本机本地小模型详细配置
|
||||
|
||||
> 汇总自 Ollama、OpenClaw、卡若AI 火种本地模型 / 木叶视频切片 等配置。更新:2026-03-06
|
||||
|
||||
---
|
||||
|
||||
## 一、Ollama 运行时
|
||||
|
||||
| 项 | 值 |
|
||||
|:---|:---|
|
||||
| **可执行文件** | `/usr/local/bin/ollama` |
|
||||
| **数据目录** | `~/.ollama`(含 models、logs) |
|
||||
| **服务地址** | `http://localhost:11434` |
|
||||
| **常用接口** | `/api/chat`(对话)、`/api/generate`(续写)、`/api/embeddings`(向量) |
|
||||
|
||||
---
|
||||
|
||||
## 二、本机已安装的模型(ollama list)
|
||||
|
||||
| 模型名 | 大小 | 修改时间 | 用途 |
|
||||
|:---|:---|:---|:---|
|
||||
| **nomic-embed-text:latest** | 274 MB | 约 11 天前 | 嵌入/语义搜索(RAG) |
|
||||
| **qwen2.5:3b** | 1.9 GB | 约 2 周前 | 对话/高光识别(视频切片主力) |
|
||||
| **qwen2.5:1.5b** | 986 MB | 约 2 周前 | 轻量对话、代码辅助、摘要 |
|
||||
|
||||
说明:SKILL 文档中提到的 **qwen2.5:0.5b** 当前未在本机安装;若需使用可执行 `ollama pull qwen2.5:0.5b`。
|
||||
|
||||
---
|
||||
|
||||
## 三、卡若AI 火种 · 本地模型 SDK(local_llm_sdk)
|
||||
|
||||
**路径**:`04_卡火(火)/火种_知识模型/本地模型/脚本/local_llm_sdk.py`
|
||||
**入口**:`运营中枢/local_llm` 再转发到上述脚本。
|
||||
|
||||
### 3.1 服务与模型常量
|
||||
|
||||
| 常量 | 值 |
|
||||
|:---|:---|
|
||||
| **OLLAMA_URL** | `http://localhost:11434` |
|
||||
| **MODELS** | `light` → `qwen2.5:0.5b`;`standard` → `qwen2.5:1.5b`;`embed` → `nomic-embed-text` |
|
||||
| **CPU_TARGET** | `30%` |
|
||||
| **MAX_CONCURRENT_REQUESTS** | 2 |
|
||||
| **REQUEST_INTERVAL** | 0.5 秒 |
|
||||
| **MAX_INPUT_LENGTH** | 4000 字符 |
|
||||
|
||||
### 3.2 任务 → 模型映射(TASK_MODEL_MAP)
|
||||
|
||||
| 任务类型 | 选用档位 | 对应 Ollama 模型 |
|
||||
|:---|:---|:---|
|
||||
| summarize、extract、classify、translate_short、generate_questions、quick_answer | light | qwen2.5:0.5b |
|
||||
| analyze、code_explain、write_draft、task_breakdown、complex_qa | standard | qwen2.5:1.5b |
|
||||
| embed、similarity、search | embed | nomic-embed-text |
|
||||
|
||||
### 3.3 对外能力
|
||||
|
||||
- `summarize`、`extract_info`、`classify`、`generate_questions`、`analyze_task`、`write_draft`、`semantic_search`、`check_service`
|
||||
- `get_usage_notice_text`、`format_response_with_notice`(使用提醒)
|
||||
|
||||
---
|
||||
|
||||
## 四、木叶 · 视频切片(高光识别)
|
||||
|
||||
**脚本**:`03_卡木(木)/木叶_视频内容/视频切片/脚本/identify_highlights.py`
|
||||
|
||||
| 项 | 值 |
|
||||
|:---|:---|
|
||||
| **OLLAMA_URL** | `http://localhost:11434` |
|
||||
| **OLLAMA_MODELS(优先级顺序)** | `["qwen2.5:3b", "qwen2.5:1.5b"]` |
|
||||
| **默认调用模型** | `qwen2.5:3b` |
|
||||
| **接口** | `POST {OLLAMA_URL}/api/chat`(带 system + user,temperature=0.2,num_predict=8192) |
|
||||
|
||||
逻辑:先尝试云端 API(OPENAI_API_BASES/KEYS/MODELS 等),失败再按顺序试 Ollama 上列模型,再不行则规则兜底。
|
||||
|
||||
---
|
||||
|
||||
## 五、木叶 · 章节主题转高光(chapter_themes_to_highlights)
|
||||
|
||||
**脚本**:`03_卡木(木)/木叶_视频内容/视频切片/脚本/chapter_themes_to_highlights.py`
|
||||
|
||||
| 项 | 值 |
|
||||
|:---|:---|
|
||||
| **OLLAMA_URL** | `http://localhost:11434` |
|
||||
| **OLLAMA_MODELS** | `["qwen2.5:7b", "qwen2.5:1.5b"]` |
|
||||
|
||||
说明:本机未安装 **qwen2.5:7b**,实际会落到 `qwen2.5:1.5b`;若需 7b 可 `ollama pull qwen2.5:7b`。
|
||||
|
||||
---
|
||||
|
||||
## 六、OpenClaw / ClawX 中的本地模型
|
||||
|
||||
**配置文件**:`~/.openclaw/openclaw.json`
|
||||
|
||||
### 6.1 认证配置(auth.profiles)
|
||||
|
||||
```json
|
||||
"ollama:local": {
|
||||
"provider": "ollama",
|
||||
"mode": "api_key"
|
||||
}
|
||||
```
|
||||
|
||||
### 6.2 默认 Agent 模型(agents.defaults.model)
|
||||
|
||||
- **primary**:`ollama-ollama/qwen3:laster`(当前 `~/.openclaw/openclaw.json` 中的实际值;若本机未安装 `qwen3:laster` 需 `ollama pull qwen3:latest` 或改为已安装模型如 `ollama/qwen2.5:3b`)
|
||||
- **fallbacks**:`[]`
|
||||
|
||||
即 OpenClaw/ClawX 对话默认走本机 Ollama;当前指向 qwen3:laster。
|
||||
|
||||
### 6.3 云端模型(models.providers)
|
||||
|
||||
当前还配置了 **custom-custom21**(v0 API),作为云端备选,与本地 Ollama 并存。
|
||||
|
||||
---
|
||||
|
||||
## 七、其他引用
|
||||
|
||||
| 位置 | 说明 |
|
||||
|:---|:---|
|
||||
| **soul_enhance.py** | 固定使用 `http://localhost:11434/api/generate` |
|
||||
| **土渠 · 手机流量自动操作 SKILL** | 示例命令 `ollama run qwen2.5:1.5b` |
|
||||
| **本地模型 SKILL(Cursor 隧道)** | 启动脚本可配 `OLLAMA_HOST=0.0.0.0:11434`、Cloudflare 隧道供 Cursor 用本地模型 |
|
||||
|
||||
---
|
||||
|
||||
## 八、配置汇总表(便于查阅)
|
||||
|
||||
| 配置项 | 值 |
|
||||
|:---|:---|
|
||||
| Ollama 服务地址 | `http://localhost:11434` |
|
||||
| 已安装对话/续写模型 | qwen2.5:3b、qwen2.5:1.5b |
|
||||
| 已安装嵌入模型 | nomic-embed-text:latest |
|
||||
| 火种 SDK 轻量/标准/嵌入 | qwen2.5:0.5b / qwen2.5:1.5b / nomic-embed-text(0.5b 未装则 light 会失败) |
|
||||
| 视频高光识别默认 | qwen2.5:3b,备选 qwen2.5:1.5b |
|
||||
| OpenClaw 默认 Agent | ollama-ollama/qwen3:laster(以 openclaw.json 为准) |
|
||||
| 资源控制(火种) | 并发 2、间隔 0.5s、CPU 目标 30%、最大输入 4000 字 |
|
||||
|
||||
---
|
||||
|
||||
*文档由卡若AI 根据本机 Ollama、openclaw.json、local_llm_sdk、identify_highlights、chapter_themes_to_highlights 等自动汇总。*
|
||||
Reference in New Issue
Block a user