2. Junos CLI与配置模式精要
Junos 的 CLI 与多数网络操作系统最大的不同,在于它把“看状态”和“改配置”彻底分成两套模式,并且用一棵层次化的配置树来组织所有参数。理解这套模式切换、层次结构、提交与回滚机制,是后续所有自动化操作的基础——因为无论你用 PyEZ、NETCONF 还是 Ansible,最终落到设备上的动作,本质上都是“进入某个配置层次、设置某个叶子节点、然后 commit”。
操作模式与配置模式:两种视角,一条命令切换
登录 Junos 后默认处于操作模式(Operational Mode),提示符形如 user@router>。这个模式下你只能执行查看类、诊断类命令,例如 show interfaces、show route、ping、monitor traffic,它们不会改变设备配置。要修改配置,必须输入 configure 进入配置模式(Configuration Mode),提示符变为 user@router#。
两种模式之间还有几个关键差异需要记住:操作模式下命令是“即时执行”的,配置模式下你输入的所有 set、delete 只是修改了内存中的候选配置(candidate configuration),并未生效;只有执行 commit 后,候选配置才会被校验、应用并写入当前配置。退出配置模式用 exit,若存在未提交的修改,Junos 会提示你确认是否丢弃。
user@router> configure
Entering configuration mode
[edit]
user@router# set interfaces ge-0/0/0 unit 0 family inet address 192.0.2.1/24
user@router# show | compare
[edit interfaces ge-0/0/0 unit 0 family inet]
+ address 192.0.2.1/24;
user@router# commit
commit complete
注意 show | compare 这一步:它把候选配置与当前已提交配置做差异对比,+ 表示新增,- 表示删除。这是提交前最值得养成的习惯,尤其在批量脚本下发配置时,先 compare 再 commit 能避免误改。
配置层次结构:一棵可寻址的树
Junos 配置是一棵严格的树,从根 [edit] 开始,逐级向下:interfaces → ge-0/0/0 → unit 0 → family inet → address。每一层用空格分隔,形成一条“配置路径”。你可以用 edit 命令逐层下钻,也可以用 set 从任意位置一次性写完整路径。
层次结构带来两个实用能力:一是相对定位,进入某层后 set 只需写剩余路径;二是批量操作,在某一层执行 delete 或 show 会作用于该子树。例如在 [edit interfaces ge-0/0/0] 下执行 show,看到的是这个接口的全部配置,而不是整机配置。
[edit]
user@router# edit interfaces ge-0/0/0 unit 0 family inet
[edit interfaces ge-0/0/0 unit 0 family inet]
user@router# set address 192.0.2.1/24
user@router# top
[edit]
user@router# show interfaces ge-0/0/0
常用导航命令包括 top(回到根)、up(上一层)、exit(退出当前层或配置模式)。在自动化脚本里,更推荐用完整路径的 set,因为它不依赖当前所在层次,可重复执行且幂等性更好。
commit 机制:校验、应用与确认
commit 不是简单保存,它包含一串动作:先做语法与语义校验,再检查配置是否与当前运行状态冲突,然后生成新的配置版本并激活。如果校验失败,Junos 会报错并保持候选配置不变,你可以修正后重新提交。
几个高频变体值得掌握:commit check 只校验不应用,适合脚本预检;commit confirmed 5 提交后 5 分钟内若没有再次执行 commit 确认,设备会自动回滚到提交前状态——这是远程改配置的“安全绳”,能防止一条错误配置把自己关在门外;commit and-quit 提交并退出配置模式。
commit confirmed。若新配置导致连接中断,等待超时后设备自动恢复,你仍有机会重新登录修正。rollback:版本化回退
每次成功 commit,Junos 都会生成一个配置版本,默认保留最近 50 个(可调整)。rollback 不带参数表示回退到上一个版本;rollback 3 表示回退到 3 个版本之前;rollback 0 表示回到当前已提交版本,用于丢弃候选配置中的未提交修改。
user@router# rollback 1
load complete
user@router# show | compare
[edit interfaces ge-0/0/0 unit 0 family inet]
- address 192.0.2.1/24;
user@router# commit
commit complete
注意 rollback 只是把历史版本加载进候选配置,仍需 commit 才真正生效。你可以用 show system rollback compare 1 2 对比任意两个历史版本,这在排障时非常有用:确认“到底是哪次变更引入了问题”。
配置对比与归档
除了 show | compare 和 rollback compare,Junos 还支持把配置归档到文件或远程服务器。通过 set system archival configuration 可以配置在每次 commit 时自动将配置上传到 FTP/SCP 服务器,形成带时间戳的历史快照。这对审计和灾备恢复价值很高。
[edit system archival]
user@router# set configuration transfer-on-commit
user@router# set configuration archive-sites "scp://backup@198.51.100.10:/configs"
手工归档则可用 save 命令:save /var/tmp/router-2024.conf 把当前候选配置存成文本文件;load override 或 load merge 可把文件重新载入。自动化场景中,常见做法是脚本先 show configuration | display set 拉取当前配置做基线,再下发差异,最后用 show | compare rollback 0 验证实际改动是否与预期一致。
把这几件事串起来看:操作模式负责“观察”,配置模式负责“编辑”,层次树负责“定位”,commit 负责“生效”,rollback 与归档负责“可回退、可追溯”。在自动化体系中,脚本通常以 show configuration | display set 获取基线,用带完整路径的 set 或 load merge 构造候选配置,用 commit check 预检,用 commit confirmed 兜底,最后用 show | compare rollback 0 确认落地结果。掌握这套机制,后面无论是 PyEZ 的 Config 对象还是 NETCONF 的 candidate 数据存储,理解起来都会顺畅很多。