- name
- skyeye-sensor-use
- group
- 平台集成
- description
- 使用天眼 SkyEye Sensor 传感器侧精简 CLI 查询告警列表和告警统计。适用于用户提到"SkyEye Sensor""天眼流量传感器告警"场景。
# SkyEye Sensor 数据查询
> 如果是分析平台日志检索,不要用这个 skill,改用 `skyeye-use`。
## 适用范围
这个 skill 主要覆盖传感器侧接口:
- 告警统计
- 告警列表
不适合:
- Lucene 日志检索
- 专家模式管道检索
- 分析平台资产与系统模块
- 传感器枚举接口、License、权限和菜单配置
## 零、登录认证
> 对后台任务 / 定时任务,或系统不支持可视化,使用 `browser-use` 的 `cdp-headless` 模式。
State 文件路径:`~/.flocks/browser/skyeye-sensor/auth-state.json`(固定,全局唯一)。
自动登录配置路径:`~/.flocks/browser/skyeye-sensor/auth-config.json`(只保存 base_url、state 路径和 secret 引用;密码写入 Flocks secret)。
## 跨平台执行约定(必须遵守)
`scripts/skyeye_sensor_auth.py` 和 `scripts/skyeye_sensor_cli.py` 都是 **skill-relative** 路径。执行任何脚本前,必须先把当前工作目录切到 `skill_load` 输出中的 **Base directory**,不要假设当前 shell 已经在 skill 目录,也不要拼未加引号的绝对路径。
推荐方式:
- 如果工具支持 `workdir` 参数,直接把 `workdir` 设为 `skill_load` 输出的 Base directory,再运行 `uv run python scripts/...`。
- 如果只能写 shell 命令,先进入 Base directory,再运行脚本。
- 跨平台示例优先使用 `--base-url`、`--auth-state` 等 CLI 参数,少用 shell 环境变量前缀。
- Windows PowerShell 设置环境变量必须用 `$env:NAME = 'value'`;不要用 POSIX 的 `NAME=value command`。
- macOS/Linux shell 可以用 `NAME=value command` 或 `export NAME=value`。
- 路径含空格时必须整体加引号。Windows 下优先用 `Set-Location -LiteralPath '<skill-dir>'`,macOS/Linux 下优先用 `cd "$SKILL_DIR"`。
- 不要在 `glob` / 文件工具的 `path` 参数里写 `$env:USERPROFILE`、`$HOME` 这类 shell 变量;这些参数通常不会做 shell 展开。需要用户目录时,用 `~/.flocks/...` 或先在 shell 里展开后再传入。
Windows PowerShell 模板:
```powershell
Set-Location -LiteralPath '<skill-load 输出的 Base directory>'
uv run python scripts/skyeye_sensor_auth.py --base-url 'https://<skyeye-sensor-domain>' validate
uv run python scripts/skyeye_sensor_cli.py --base-url 'https://<skyeye-sensor-domain>' alarm list --days 7
```
macOS/Linux 模板:
```bash
cd "<skill-load 输出的 Base directory>"
uv run python scripts/skyeye_sensor_auth.py --base-url 'https://<skyeye-sensor-domain>' validate
uv run python scripts/skyeye_sensor_cli.py --base-url 'https://<skyeye-sensor-domain>' alarm list --days 7
```
### 首次登录 / Session 过期重新登录
打开 SkyEye Sensor 页面或执行 CLI 前,必须按下面顺序处理登录态,不要一开始就要求用户提供账密:
1. 先检查 `auth-state.json` 是否可用。
2. 如果 state 可用,直接复用登录态继续打开页面或执行 CLI 获取数据。
3. 如果 state 不存在或失效,但本地已有可用于自动登录的配置,先在 skill Base directory 中执行自动刷新:`uv run python scripts/skyeye_sensor_auth.py ensure`。
4. 如果没有可用 state,也没有保存账密配置,再引导用户选择:
- 提供 SkyEye Sensor 地址、用户名、密码,自动登录并保存账密配置,后续 state 失效时可直接自动刷新;
- 不提供账密,走浏览器手动登录流程。
5. 只有自动登录失败、验证码 OCR / MFA / 登录页 DOM 变化 / 登录成功检测失败,或用户拒绝提供账密时,才回退手动登录。
只读查看本地是否具备自动刷新条件(需在 skill Base directory 中执行):
```bash
uv run python scripts/skyeye_sensor_auth.py status
```
检查 state 是否可用(需在 skill Base directory 中执行):
```bash
uv run python scripts/skyeye_sensor_auth.py --base-url https://<skyeye-sensor-domain> validate
```
如果 `validate` 返回 `valid: true`,继续后续页面操作或 CLI 查询;如果返回 `auth_state_not_found`、`auth_state_expired_or_login_page` 或 `auth_state_load_failed`,再看 `status` 中 `can_auto_refresh` 是否为 `true`。
有已保存账密配置时自动刷新(需在 skill Base directory 中执行):
```bash
uv run python scripts/skyeye_sensor_auth.py ensure
```
自动刷新成功后继续执行原页面或 CLI 操作;失败才进入下方用户选择流程。
```bash
flocks browser --doctor
```
如果 `flocks browser --doctor` 提示浏览器已运行,但 daemon 或 active browser connection 不可用,先执行 `flocks browser --setup` 触发 attach,不要先要求用户重复勾选 Allow remote debugging。
1. 执行 `flocks browser --setup` 触发交互式 attach,不要用短超时包装该命令。
2. 再运行 `flocks browser --doctor` 做只读确认。
3. 如果 `--setup` 或 `--doctor` 明确提示 remote debugging 未启用,再提示用户打开 inspect 页面(例如 `chrome://inspect/#remote-debugging` 或 `edge://inspect/#remote-debugging`)并勾选 Allow remote debugging。
4. 如果还失败,先执行 `flocks browser --reload` 清理旧 daemon,再重新执行 `flocks browser --setup`,避免因为残留 daemon 造成干扰。
5. 只有随后 `--doctor` 通过后,才继续后面的登录或页面操作。
当必须询问用户时,说明两种选择并尊重用户偏好:
- 提供账密并保存:调用 `scripts/skyeye_sensor_auth.py`,通过 browser daemon / CDP 驱动真实登录页自动登录。脚本会优先从登录页验证码图片元素动态获取图片、OCR 识别、填入页面、保存 state,并把用户名/密码写入 Flocks secret,把基础配置保存到 `~/.flocks/browser/skyeye-sensor/auth-config.json`。后续 `auth-state.json` 失效时,可在 skill Base directory 中直接执行 `uv run python scripts/skyeye_sensor_auth.py ensure`。
- 不提供账密:沿用原有浏览器登录流程。打开登录页后由用户手动完成登录(含短信验证码 / MFA 等),登录成功后保存 state。
手动登录时,打开登录页并等待用户完成登录:
```bash
flocks browser -c '
tid = new_tab("https://<skyeye-sensor-domain>/login", activate=True)
wait_for_load()
print(tid)
import json
print(json.dumps(page_info(), ensure_ascii=True))
'
```
自动执行上述命令,等待用户登录结束,收到通知后继续:
```bash
# 登录成功后立即保存 state
flocks browser state save ~/.flocks/browser/skyeye-sensor/auth-state.json
```
提供账密并保存时,执行自动登录:
```bash
uv run python scripts/skyeye_sensor_auth.py --base-url https://<skyeye-sensor-domain> ensure --username '<username>' --password '<password>'
```
下次 `auth-state.json` 失效且本地保存过账密配置时,可直接执行:
```bash
uv run python scripts/skyeye_sensor_auth.py ensure
```
也可以在查询命令前直接带账密或使用已保存账密刷新登录态:
```bash
uv run python scripts/skyeye_sensor_cli.py \
--base-url https://<skyeye-sensor-domain> \
--username '<username>' \
--password '<password>' \
alarm count
uv run python scripts/skyeye_sensor_cli.py --auto-login alarm list
```
如果验证码 OCR、MFA、登录页 DOM 变化或登录成功检测失败,回退到上面的手动登录流程。
### CLI 认证失败时的恢复流程
当 CLI 出现以下任一情况,优先判定为认证问题(**不要立刻要求用户重新登录**):
- 返回 HTTP `401` / `403`
- 返回内容包含 `Unauthorized`、`login`、未登录、认证失败
- `auth-state.json` 存在,但 CLI 请求仍失败
**恢复步骤(最多尝试 1 次)**:
```bash
# 1) 重新加载 state(强制刷新浏览器会话)
flocks browser state load ~/.flocks/browser/skyeye-sensor/auth-state.json --url "https://<skyeye-sensor-domain>"
# 2) 读取当前页面状态
flocks browser -c '
import json
print(json.dumps(page_info(), ensure_ascii=True))
'
```
```bash
# 3) 根据结果决策
URL=$(flocks browser -c '
import json
info = page_info()
print(info.get("url", ""))
' | tail -n 1)
if [[ "$URL" == *"/login"* ]]; then
echo "Session 仍无效,需重新登录"
# → 走上方「首次登录 / 重新登录」流程
else
flocks browser state save ~/.flocks/browser/skyeye-sensor/auth-state.json
echo "Session 已恢复,可重试 CLI"
# → 重试一次 CLI;若仍失败,再走重新登录,不要无限循环
fi
```
---
## 执行约定
CLI 在 skill 内:
`scripts/skyeye_sensor_cli.py`
执行命令时:
1. 必须先进入 `skill_load` 输出的 Base directory,或把命令工具的 `workdir` 设置为该目录。
2. 优先使用 `uv run python scripts/skyeye_sensor_cli.py ...`
3. 认证优先使用浏览器导出的 `auth-state.json`
可选认证环境变量:
- `SKYEYE_SENSOR_BASE_URL=https://<skyeye-sensor-domain>`
- `SKYEYE_SENSOR_AUTH_STATE=~/.flocks/browser/skyeye-sensor/auth-state.json`
- 如有单独 Cookie 文件,可用 `SKYEYE_SENSOR_COOKIE_FILE`
- 没有 state/cookie 时,再考虑 `SKYEYE_SENSOR_CSRF_TOKEN`
## 常用命令
如果已经通过环境变量或 CLI 参数设置好认证信息:
```bash
# 默认输出 JSON
uv run python scripts/skyeye_sensor_cli.py alarm count --days 7
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --page 1 --page-size 10
uv run python scripts/skyeye_sensor_cli.py alarm list --hours 6 --sip 1.1.1.1
# 配合 jq 提取字段
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --hazard-level "3,2" | jq '.items[].threat_name'
# 加 --table 输出格式化表格(人工阅读用)
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --table
```
带认证的完整单行格式(无需提前 export,适合 Windows/macOS/Linux 直接执行):
```bash
uv run python scripts/skyeye_sensor_cli.py --base-url https://<skyeye-sensor-domain> --auth-state ~/.flocks/browser/skyeye-sensor/auth-state.json alarm list --days 7 --hazard-level "3,2"
```
## 查询策略
- 用户问"最近几天告警数量变化"时,优先 `alarm count`
- 用户问"列出具体告警"时,使用 `alarm list`
- 需要按更多页面字段精确过滤时,先查 `references/API_REFERENCE.md` 中"API Client 已支持"部分
## 常见过滤条件
时间:`--days` / `--hours`
IP 相关:`--sip` `--dip` `--alarm-sip` `--attack-sip`
告警分类:`--hazard-level` `--threat-type` `--attack-type` `--threat-name` `--attack-stage` `--attack-dimension`
处置状态:`--status` `--attack-result` `--host-state` `--is-read` `--user-label`
网络特征:`--proto` `--sport` `--dport` `--host` `--uri` `--xff` `--status-http`
威胁情报:`--ioc` `--attck-org` `--attck` `--alert-rule` `--is-web-attack`
网络标识:`--src-mac` `--dst-mac` `--vlan-id` `--vxlan-id` `--gre-key`
标签与来源:`--marks` `--ip-labels` `--alarm-source`
时间与文件:`--start-update-time` `--end-update-time` `--pcap-filename`
完整参数说明见 [references/API_REFERENCE.md](references/API_REFERENCE.md)。
## 常用查询示例
### 高危及以上告警
```bash
# 最近 7 天,严重 + 高危告警列表
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --hazard-level "3,2"
# 最近 24 小时,高危以上告警数量趋势
uv run python scripts/skyeye_sensor_cli.py alarm count --hours 24 --hazard-level "3,2"
```
### 攻击成功的告警
```bash
# 最近 7 天攻击成功告警
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --attack-result "攻击成功"
# 高危以上 + 攻击成功
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --hazard-level "3,2" --attack-result "攻击成功"
# 统计最近 7 天攻击成功告警数量
uv run python scripts/skyeye_sensor_cli.py alarm count --days 7 --attack-result "攻击成功"
```
### 未处置告警
```bash
# 最近 7 天未处置告警(status=0)
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --status "0"
# 高危以上 + 未处置
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --hazard-level "3,2" --status "0"
```
### 指定 IP 的告警
```bash
# 某 IP 作为流量源 IP 的告警
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --sip "1.1.1.1"
# 某 IP 作为流量目的 IP 的告警
uv run python scripts/skyeye_sensor_cli.py alarm list --days 7 --dip "192.168.1.100"
```
### 按威胁类型 + 主机状态过滤
```bash
# 威胁类型 2、3,主机状态包含失陷(-1)
uv run python scripts/skyeye_sensor_cli.py alarm list \
--days 7 \
--threat-type "2,3" \
--host-state "0,1,2,-1"
```
### 告警数量变化趋势
```bash
# 最近 30 天每天告警数
uv run python scripts/skyeye_sensor_cli.py alarm count --days 30
# 最近 7 天,仅高危以上
uv run python scripts/skyeye_sensor_cli.py alarm count --days 7 --hazard-level "3,2"
```
> 当查询字段或条件不在常用查询字段/示例中,请阅读完整字段列表、CLI 参数说明、查询示例:[references/API_REFERENCE.md](references/API_REFERENCE.md)
## 边界说明
- 如果用户要求"原始日志检索 / Lucene / 字段状态 / expert_model",这是分析平台能力,切换到 `skyeye-data-fetch`
- 这个 skill 是天眼流量传感器平台适用, CLI只保留 `alarm list` 和 `alarm count`
## 重要提醒
- **Session 管理**:详见[零、登录认证](#零登录认证)。任务开始前先用 `skyeye_sensor_auth.py validate` 确认 `auth-state.json` 可用;CLI 认证失败时先走恢复流程,不要立刻要求用户重新登录。
- **禁止连续失败循环**:同一命令最多重试 2 次;认证恢复流程只走一次,仍失败则提示用户手动重新登录。
- **以下错误属于需要用户干预的基础设施问题,立即停止所有重试,直接告知用户处理**:
- `ERR_CERT_AUTHORITY_INVALID`:站点证书不被本机信任,使用--ignore-https-errors 或 请求用户处理。
## 参考文档
- 完整字段列表、CLI 参数说明、查询示例:[references/API_REFERENCE.md](references/API_REFERENCE.md)
在 GitHub 查看