Oxidized 0.37.0 配置参数详解

Oxidized 0.37.0 配置参数逐项详解:凭据/机型/调度/vars/groups、CSV 与 SQL 数据源、File 与 Git 输出,全部按改值-验证-还原实测闭环。

OxidizedOxidized网络配置备份2026/10/22

Oxidized 0.37.0 配置参数详解

目标:逐项讲清 Oxidized 0.37.0 配置文件(/etc/oxidized/config)的核心参数、数据源(CSV/SQL)与输出(File/Git)配置,每个关键参数按「改值 → 验证 → 还原」实测闭环演示,并给出可直接落地的生产配置模板。全文命令与回显均在 Ubuntu 22.04.5 LTS 服务器实测通过(Oxidized 0.37.0,systemd 托管, oxidized-web 0.18.1)。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64,内核 6.8.0-138-generic)
  • Oxidized 0.37.0(oxidized --version 实测:0.37.0),oxidized-web 0.18.1,rugged 1.9.6,sequel 5.109.0 + sqlite3 2.0.4
  • 配置目录:/etc/oxidized(由 systemd 单元 Environment=OXIDIZED_HOME=/etc/oxidized 指定),主配置文件 /etc/oxidized/config,运行账号 oxidized,服务单元 oxidized.service
  • 备份对象:SSH 可达的 Linux 设备 sw01(10.89.58.20,账号 admin/q1w2e3r4,机型 linuxgeneric),CSV 清单 /etc/oxidized/router.db 与 SQLite 清单 /etc/oxidized/nodes.db 两种数据源均实测跑通
  • 参数语义取证来源:首次运行自动生成的配置模板、oxidized --show-exhaustive-config 输出、0.37.0 源码 lib/oxidized/config.rb 与 lib/oxidized/source/、lib/oxidized/output/

二、前置条件

本文的参数实验基于已安装并可运行的 Oxidized 服务(安装步骤见《Ubuntu 22.04 安装 Oxidized 指南》)。开始前确认基线状态:

systemctl is-active oxidized
curl -s http://127.0.0.1:8888/nodes.json | head -c 200

实测回显:

active
[{"name":"sw01","full_name":"sw01","ip":"10.89.58.20","group":"default","model":"LinuxGeneric","last":{"start":"2026-10-22 09:21:05 UTC","end":"2026-10-22 09:21:10 UTC","status":"success","time":5.325234613},"vars":{},"mtime":"2026-10-22 09:21:11 UTC","status":"success","time":"2026-10-22 09:21:10 UTC"}

验证要点:服务 active 且节点 status: success,以此为基线做后续「改值 → 验证 → 还原」实验。

另外准备 Git 输出实验所需的 rugged(Git 后端)与 SQL 源实验所需的 sequel/sqlite3:

gem list | grep -E '^(rugged|sequel|sqlite3)'

实测回显:

rugged (1.9.6)
sequel (5.109.0)
sqlite3 (2.0.4)

三、参数查看与修改方式

查看有两种途径。其一是直接读配置文件 /etc/oxidized/config;其二是用 --show-exhaustive-config 输出「含全部默认值的穷举配置」,排查「某个键默认到底是什么」时最有用:

OXIDIZED_HOME=/etc/oxidized oxidized --show-exhaustive-config

实测回显(节选,前 42 行):

---
username: admin
password: q1w2e3r4
model: linuxgeneric
resolve_dns: true
interval: 3600
debug: false
run_once: false
threads: 30
use_max_threads: false
timeout: 20
timelimit: 300
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
next_adds_job: false
vars: {}
groups: {}
group_map: {}
models: {}
pid: "/etc/oxidized/pid"
extensions:
  oxidized-web:
    load: true
    listen: 0.0.0.0
    port: 8888
crash:
  directory: "/etc/oxidized/crashes"
  hostnames: false
stats:
  history_size: 10
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
output:
  default: file
  git:
    user: Oxidized

修改必须遵循一条铁律:改完 /etc/oxidized/config 后要 systemctl restart oxidized 才生效。Oxidized 只在进程启动时读取全局配置;REST API GET /reload 只重载节点清单,不重载全局参数(实测:改 password 后调用 /reload,节点仍按旧凭据成功抓取;systemctl restart 后新凭据才生效并抓取失败——见 5.1 实测)。

⚠️ 注意:/etc/oxidized/config 归运行账号所有(chown oxidized:oxidized),否则 systemd 下进程读不到写不进。YAML 中正则要用 !ruby/regexp 标签写法(如 delimiter: !ruby/regexp /:/),直接写 /…/ 会被当成字符串导致源解析失败。

四、参数总览

/etc/oxidized/config 顶层参数速查(默认值来自 0.37.0 首次生成模板与 lib/oxidized/config.rb,均为实测取证):

参数默认值作用
username / passwordusername / password登录设备的全局默认凭据(节点级可覆盖)
modeljunos未在清单中指定机型时的默认机型
resolve_dnstrue是否把设备名解析为 IP
interval3600每台设备的抓取周期(秒)
debugfalse调试日志开关(配合 -d 命令行参数)
run_oncefalse抓取一轮后退出(一次性任务场景用)
threads / use_max_threads30 / false工作线程数 / 是否按设备数吃满线程
timeout / timelimit / retries20 / 300 / 3单会话超时(秒)/ 单节点总时限(秒)/ 失败重试次数
prompt/^([\w.@-]+[#>]\s?)$/CLI 提示符识别正则
next_adds_jobfalse/node/next 是否立即入队执行
vars{}全局机型变量(如 enable: <enable 密码>)
groups / group_map{} / {}分组配置与组别名映射
models{}机型级配置(如指定某机型的 vars)
pid/etc/oxidized/pidPID 文件路径
extensions.oxidized-webload: false(listen 127.0.0.1、port 8888)Web UI + REST API 扩展
crashdirectory: <ROOT>/crashes、hostnames: false崩溃转储目录与文件名形态
stats.history_size10每节点统计采样保留条数
inputdefault: ssh, telnet 等登录方式族参数
outputdefault: file配置输出后端(file / git)
sourcedefault: csv设备清单来源(csv / sql)
model_mapjuniper→junos、cisco→ios清单机型别名归一化

表格解读:这批参数分四族——凭据/机型(5.1)、调度并发(5.2)、变量分组(5.3)、IO 三件套 input/output/source(5.4–5.6),加上 Web 扩展(5.7)与运行时杂项(5.8),下文逐族详解。

五、核心参数分类详解

5.1 身份与设备默认参数(username / password / model / model_map / resolve_dns)

全局 username/password 是所有节点的默认登录凭据;router.db 里节点级列(见 5.6 的 vars_map/列映射)可按节点覆盖。model 只对「清单里没写机型」的节点生效——节点级 model(router.db 第 2 列)优先于全局 model(实测:全局改为 ios 而清单写 sw01:linuxgeneric 时,/nodes.json 的 model 仍是 LinuxGeneric 且抓取成功)。

实测一:凭据改错 → 失败 → 还原。 把 password 改成错误值并重启:

sed -i 's/^password: .*/password: wrong-pass/' /etc/oxidized/config
systemctl restart oxidized
sleep 85
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; d=json.load(sys.stdin)[0]; print("status:",d["status"],"| last:",d["last"]["status"] if d.get("last") else None)'
journalctl -u oxidized -o cat --no-pager -n 200 | grep -iE 'raised' | tail -1

实测回显:

status: no_connection | last: no_connection
2026-10-22 09:29:37.096478 W [11287:Job 'sw01'] Oxidized::Node -- 10.89.58.20 raised Net::SSH::AuthenticationFailed with msg "Authentication failed for user admin@10.89.58.20"

解读:错误凭据下节点进入 no_connection 状态,日志按 retries: 3 每隔约 5 秒重试并抛 Net::SSH::AuthenticationFailed。还原后恢复:

sed -i 's/^password: .*/password: q1w2e3r4/' /etc/oxidized/config
systemctl restart oxidized
sleep 16
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; print("status:", json.load(sys.stdin)[0]["status"])'

实测回显:

status: success

实测二:全局 model 指向不匹配机型。 让清单不指定机型(router.db 只写 sw01),全局 model: ios(Cisco IOS 模型去登 Linux 设备):

echo 'sw01' > /etc/oxidized/router.db
sed -i 's/^model: .*/model: ios/' /etc/oxidized/config
systemctl restart oxidized
sleep 85
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; d=json.load(sys.stdin)[0]; print("model:",d["model"],"status:",d["status"],"last:",d["last"]["status"])'
journalctl -u oxidized -o cat --no-pager -n 60 | grep -iE 'raised' | tail -1

实测回显:

model: IOS status: no_connection last: no_connection
2026-10-22 09:52:50.065956 W [17187:Job 'sw01'] Oxidized::Node -- 10.89.58.20 raised Oxidized::PromptUndetect with msg "Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 6.8.0-138-generic x86_64)

解读:机型不匹配时典型报错是 Oxidized::PromptUndetect——IOS 模型认不出 Ubuntu 的 shell 提示符。还原:

sed -i 's/^model: .*/model: linuxgeneric/' /etc/oxidized/config
echo 'sw01:linuxgeneric' > /etc/oxidized/router.db
systemctl restart oxidized
sleep 12
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; d=json.load(sys.stdin)[0]; print("restore:",d["model"],d["status"])'

实测回显:

restore: LinuxGeneric success

model_map 用于把清单里的机型别名归一化(默认 juniper: junos、cisco: ios),比如清单里习惯写 cisco,会自动映射为 ios 模型,无需逐行改清单。resolve_dns: true 表示节点名会先做 DNS 解析(域名清单场景开启;纯 IP 清单可关掉省一次解析)。

5.2 调度与并发(interval / threads / use_max_threads / timeout / timelimit / retries / run_once / next_adds_job)

  • interval: 3600:每台设备两次抓取的间隔(秒),按节点错峰排队执行。改小即加密备份频率。
  • threads: 30:并发抓取线程数;use_max_threads: false 时按「interval 内均匀铺开」调度,true 时有多少设备就尽量开多少线程。
  • timeout: 20:单次 SSH/Telnet 会话超时(秒);timelimit: 300:单节点一轮抓取的总时限(秒);retries: 3:失败重试次数(5.1 实测中能看到 3 次重试日志)。
  • run_once: false:设为 true 则抓完一轮即退出(配合 cron/CI 做一次性全量备份)。
  • next_adds_job: false:设为 true 时 /node/next 直接把节点加入立即执行队列。

实测:interval 60 的生效验证。 把 interval 改为 60 并重启,随后改动一次设备侧配置(模拟设备变更),观察日志中入库动作落在一个 60 秒周期内:

sed -i 's/^interval: 3600$/interval: 60/' /etc/oxidized/config
systemctl restart oxidized
sleep 5
# 在设备上追加一行 motd 模拟配置变更
journalctl -u oxidized -o short --no-pager | grep 'Configuration updated' | tail -1

实测回显:

Oct 22 09:36:50 oxp1 oxidized[11399]: 2026-10-22 09:36:50.853534 I [11399:1380] Oxidized::Worker -- Configuration updated for /sw01

还原为 3600 并确认基线:

sed -i 's/^interval: 60$/interval: 3600/' /etc/oxidized/config
systemctl restart oxidized
sleep 10
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; d=json.load(sys.stdin)[0]; print("final:",d["status"])'

实测回显:

final: success

💡 说明:Configuration updated 只在设备配置发生变化时打印——配置没变时 Oxidized 不重复入库(这也是它判断「变更」做 diff 推送的基础)。因此验证 interval 生效要么制造一次设备变更看入库时间是否落在新周期内,要么临时开 debug: true 看每轮调度日志。

5.3 变量与分组(vars / groups / group_map / models)

  • vars: {}:全局机型变量,最常见的用法是给需要特权模式的机型传 enable 密码(源码 config.rb 内注释原文:could be 'enable'=>'enablePW'),机型模型里通过 vars(:enable) 引用;
  • groups: {}:分组级配置,同组节点共享一组凭据/参数(按机房、厂商分组管理账号);
  • group_map: {}:组别名映射(如 edge: access),清单里写别名归并到正式组名;
  • models: {}:机型级配置,如 models: { ios: { vars: { enable: q1w2e3r4 } } } 只对 ios 机型生效。

实测:CSV 第三列映射为 group。 给 source.csv.map 增加 group: 2,清单第三列写组名,groups 里声明该组:

source:
  default: csv
  csv:
    file: "/etc/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: 0
      model: 1
      group: 2
groups:
  core: {}
echo 'sw01:linuxgeneric:core' > /etc/oxidized/router.db
chown oxidized:oxidized /etc/oxidized/router.db /etc/oxidized/config
systemctl restart oxidized
sleep 12
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; d=json.load(sys.stdin)[0]; print("group:",d["group"],"status:",d["status"])'

实测回显:

group: core status: success

还原(清单去掉第三列、映射删掉 group: 2、groups: {} 复原):

echo 'sw01:linuxgeneric' > /etc/oxidized/router.db
systemctl restart oxidized
sleep 10
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; d=json.load(sys.stdin)[0]; print("baseline:",d["group"],d["status"])'

实测回显:

baseline: default success

💡 说明:分组的价值在组合拳——groups.core.vars 可给整组传专用凭据变量,/nodes/group/<组名>.json API 可按组查询,output.git.repo 支持按组拆分仓库(5.5)。

5.4 输入参数(input.*)

input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
  • default: ssh, telnet:按顺序尝试的登录方式,SSH 失败自动降级 Telnet(老设备场景);
  • debug: false:输入会话调试(可设为字符串指定会话日志文件),排障登录问题时开;
  • ssh.secure: false:是否严格校验主机密钥变更(内网设备换件频繁时保持 false,严要求环境设 true 并纳管 known_hosts);
  • ftp.passive: true:FTP 被动模式(个别老机型走 FTP 取配置时用);
  • utf8_encoded: true:会话内容按 UTF-8 解码(中文设备名/横幅场景保持 true)。

本组参数的默认值即生产可用值(实测模板原文),无需改动即可工作;仅在做输入层排障时临时打开 input.debug。

5.5 输出参数(output.file / output.git)

file 输出(默认):每设备一个纯文本文件,简单直观。

output:
  default: file
  file:
    directory: "/etc/oxidized/configs"

实测产物:

ls -la /etc/oxidized/configs/
total 12
drwxr-xr-x 2 oxidized oxidized 4096 Oct 22 09:17 .
drwxr-xr-x 4 oxidized oxidized 4096 Oct 22 09:17 ..
-rw-r--r-- 1 oxidized oxidized 3355 Oct 22 09:17 sw01

git 输出(生产推荐):每次变更自动 commit,自带版本历史与差异对比,REST API 的版本/差异端点依赖它。需要先 gem install rugged:

output:
  default: git
  git:
    user: Oxidized
    email: oxidized@example.com
    repo: "/etc/oxidized/oxidized.git"

切换后重启,首次抓取会初始化裸仓库并提交。验证 git 仓库与提交历史:

git --git-dir=/etc/oxidized/oxidized.git log --format='%h %an %ad %s' --date=iso | head -3

实测回显:

d247c3f Oxidized 2026-10-22 09:23:43 +0000 update /sw01
c3107e4 Oxidized 2026-10-22 09:23:09 +0000 update /sw01

解读:两次提交对应设备侧两次配置变更(update /sw01),提交人即 output.git.user/email。切回 file 输出(还原动作):

sed -i 's/^  default: git$/  default: file/' /etc/oxidized/config
systemctl restart oxidized
sleep 10
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; print("final:", json.load(sys.stdin)[0]["status"])'

实测回显:

final: success

💡 技术拓展:output.git.repo 支持两种形态——单一仓库(如上)或按分组分仓:repo: {core: "/var/lib/oxidized/core.git", access: "/var/lib/oxidized/access.git"},组内设备进对应仓库,适合按机房隔离权限。git 输出还支持 type_as_directory(把 secret 等特殊类型配置分目录存放)与 hook 联动推送远端(docs/Hooks.md 的 githubrepo)。

5.6 数据源参数(source.csv / source.sql)

CSV 源(默认):一行一台设备的平面清单,默认文件 /etc/oxidized/router.db、冒号分隔、第 0 列 name、第 1 列 model:

source:
  default: csv
  csv:
    file: "/etc/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: 0
      model: 1

实测清单与节点加载日志:

cat /etc/oxidized/router.db
sw01:linuxgeneric
2026-10-22 09:21:05.107395 I [8751:1380] Oxidized::Nodes -- Loaded 1 nodes

map 可按列位置映射任意节点属性(name/model/group/username/password/input/…),vars_map 则把列映射进节点 vars(如第 3 列作为 enable 密码:vars_map: {enable: 3});gpg: false 表示清单未加密(设 true 需装 gpgme gem 读 GPG 加密清单)。

SQL 源:设备清单存数据库,适合与 NetBox/CMDB 同步的场景。默认适配 SQLite(adapter: sqlite),需 gem install sequel sqlite3:

sqlite3 /etc/oxidized/nodes.db "CREATE TABLE devices (name TEXT PRIMARY KEY, rancid TEXT, ip TEXT, username TEXT, password TEXT); INSERT INTO devices VALUES ('sw01','linuxgeneric','10.89.58.20','admin','q1w2e3r4'); SELECT * FROM devices;"
chown oxidized:oxidized /etc/oxidized/nodes.db

实测回显:

sw01|linuxgeneric|10.89.58.20|admin|q1w2e3r4

把 source.default 从 csv 切到 sql 并声明映射(列名 → 节点属性):

source:
  default: sql
  sql:
    adapter: sqlite
    database: "/etc/oxidized/nodes.db"
    table: devices
    map:
      name: name
      model: rancid
      username: username
      password: password

重启后验证(加载成功且完成抓取):

systemctl restart oxidized
sleep 14
journalctl -u oxidized -o cat --no-pager -n 5 | grep -E 'Loaded'
curl -s http://127.0.0.1:8888/nodes.json | python3 -c 'import json,sys; d=json.load(sys.stdin)[0]; print("model:",d["model"],"status:",d["status"])'

实测回显:

2026-10-22 09:25:38.330830 I [11113:1380] Oxidized::Nodes -- Loaded 1 nodes
model: LinuxGeneric status: success

还原为 CSV 源并确认基线:

sed -i 's/^  default: sql$/  default: csv/' /etc/oxidized/config
systemctl restart oxidized
sleep 12
journalctl -u oxidized -o cat --no-pager -n 60 | grep 'Loaded' | tail -1

实测回显:

2026-10-22 09:25:52.309847 I [11131:1380] Oxidized::Nodes -- Loaded 1 nodes

💡 说明:SQL 源的 map.model: rancid 是惯例命名——表列名沿用 RANCID 时代的 rancid 列存放机型名(0.37.0 源码 source/sql.rb 的默认映射即如此)。adapter 还支持 mysql2/postgres(装对应驱动 gem),query 键可写自定义 SQL 过滤节点子集。

5.7 Web 扩展(extensions.oxidized-web)

extensions:
  oxidized-web:
    load: true
    listen: 0.0.0.0
    port: 8888
  • load:是否加载 Web/API 扩展(需已安装 oxidized-web gem);
  • listen:监听地址(默认 127.0.0.1,只本机访问;对外提供需改 0.0.0.0 并做好访问控制);
  • port:监听端口(默认 8888);
  • 其余可选:url_prefix(反代子路径)、vhosts(Host 头白名单)、hide_node_vars(API 响应中隐藏敏感节点变量名列表)。

实测:弃用参数告警。 0.37.0 中旧写法 rest: 0.0.0.0:8888 仍兼容但已弃用,启动日志会明确提示:

2026-10-22 09:16:54.861606 W [6523:1400] Oxidized::Core -- configuration: "rest" is deprecated. Migrate to "extensions.oxidized-web" and remove "rest" from the configuration

迁移到上表写法后重启,告警消失(实测日志仅剩加载与监听行):

2026-10-22 09:18:56.729768 I [6583:2260] Oxidized::API::Web -- Oxidized-web server listening on 0.0.0.0:8888

5.8 运行时杂项(pid / crash / stats.history_size / debug)

  • pid: "/etc/oxidized/pid":PID 文件。实测与 systemd 主进程一一对应:
cat /etc/oxidized/pid
systemctl show -p MainPID --value oxidized

实测回显(两命令输出一致,均为 11316):

11316
11316
  • crash.directory: "/etc/oxidized/crashes":进程崩溃时转储文件目录(crash.hostnames: false 决定转储文件名是否含主机名);
  • stats.history_size: 10:每节点保留最近 10 次抓取统计(/nodes/stats.json 可查);
  • debug: true:全局调试日志(量大,仅排障临时开启),等价命令行 oxidized -d。

六、生产配置模板

适用场景:几百台规模的混合厂商网络、8 GB 内存以上的独立备份服务器、按机房分组、Git 版本化输出 + SQLite 清单(示意;CSV 清单去掉 source.sql 段即可)。以下模板中的所有键值均为 0.37.0 合法键(本文各节已逐项实测):

---
username: admin
password: q1w2e3r4
model: ios                      # 清单未写机型时的兜底;多厂商环境建议每行清单显式写 model
resolve_dns: true
interval: 3600                  # 生产建议 3600;合规要求高的核心网可降到 900
debug: false
threads: 30                     # 设备超过 600 台可加到 50 并配合 use_max_threads: false
use_max_threads: false
timeout: 20
timelimit: 300
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
next_adds_job: false
vars: {}
groups:                         # 按机房/厂商分组管理
  core: {}
  access: {}
group_map: {}
models: {}
pid: "/etc/oxidized/pid"
extensions:
  oxidized-web:
    load: true
    listen: 0.0.0.0             # 若仅本机反代访问,改回 127.0.0.1
    port: 8888
crash:
  directory: "/etc/oxidized/crashes"
  hostnames: false
stats:
  history_size: 10
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
output:
  default: git
  git:
    user: Oxidized
    email: oxidized@example.com
    repo: "/etc/oxidized/oxidized.git"
  file:
    directory: "/etc/oxidized/configs"   # 保留 file 段便于临时切回
source:
  default: csv
  csv:
    file: "/etc/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: 0
      model: 1
      group: 2
      username: 3
      password: 4
  sql:
    adapter: sqlite
    database: "/etc/oxidized/nodes.db"
    table: devices
    map:
      name: name
      model: rancid
model_map:
  juniper: junos
  cisco: ios

模板解读:output 同时保留 git 与 file 两段,切换后端只改 default: 一行;source 同理保留 csv/sql 双段(磁盘充足时 file+git 双开仅占双份存储,风险更低)。

七、常见问题(FAQ)

Q1:改了 config 为什么不生效? 全局配置只在进程启动时加载。systemctl restart oxidized 后生效;REST API /reload 只重载节点清单(实测 5.1 节)。

Q2:启动报 configuration: "rest" is deprecated? 旧 Web 参数写法,按 5.7 迁移到 extensions.oxidized-web 即可。

Q3:启用 git 输出报 rugged not found? gem install rugged --no-document 后重启服务(rugged 编译需 cmake/libssl-dev,见安装指南依赖清单)。

Q4:启用 SQL 源报 sequel not found? gem install sequel sqlite3 --no-document(SQLite 场景),MySQL/PG 换对应驱动 gem 并改 adapter。

Q5:节点一直 no_connection? 三查:凭据是否正确(看日志 AuthenticationFailed)、机型是否匹配(PromptUndetect 说明模型认不出提示符)、网络/ACL 是否放行 SSH/Telnet。定位顺序:journalctl -u oxidized | grep raised → 5.1 实测的两类报错。

Q6:Configuration updated 很久不出现? 该日志只在配置变化时打印。设备没改配置就是不会出现,属正常;验证周期可用 5.2 的变更触发法。

Q7:/etc/oxidized/config 里的正则报 YAML 错误? 正则必须带 !ruby/regexp 标签(如 delimiter: !ruby/regexp /:/),否则按字符串解析导致源/提示符失效。

八、参考链接