在 Junos 设备上使用 sysctl() 扩展功能
Junos OS 和 Junos OS Evolved 在 *类似 nix 的操作系统上运行,使您能够检索各种内核状态和进程信息。您可以在自动化脚本中调用 sysctl()
扩展函数来检索相同的内核状态信息,类似于您在 sysctl
shell 中使用命令检索这些值的方式。此 sysctl()
函数采用的变量名称与在 shell 中为 sysctl
命令提供的变量名称相同。变量名称是 MIB 样式的名称,使用一组虚线的组件。由于 Junos OS 基于 FreeBSD,而 Junos OS Evolved 在 Linux 上原生运行,因此每个操作系统的 sysctl 变量和变量名称不同。
您可以在 shell 中执行 sysctl -a
命令,以查看可用状态的完整列表以及作为函数参数 sysctl()
提供的相应名称。但是,输出可能非常广泛。
例如,在 Junos OS 上,以下示例 SLAX 操作脚本将检索并打印 sysctl 状态 kern.hostname
和 hw.product.model
:
version 1.1; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match / { <op-script-results> { var $host = jcs:sysctl("kern.hostname"); expr jcs:output($host); var $model = jcs:sysctl("hw.product.model"); expr jcs:output($model); } }
user@router1> op sysctl-junos router1 mx960
同样,在 Junos OS 演化版上,以下示例 SLAX 操作脚本将检索并打印 sysctl 状态 kernel.hostname
和 kernel.osrelease
:
version 1.1; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match / { <op-script-results> { var $host = jcs:sysctl("kernel.hostname"); expr jcs:output($host); var $osrelease = jcs:sysctl("kernel.osrelease"); expr jcs:output($osrelease); } }
user@router2-re0> op sysctl-evo router2-re0 5.2.60-yocto-standard-g9a086a2b7
对于 Junos OS 演化版,返回类型始终为字符串 (“s”)。如果省略类型参数,则默认值为“s”。
Junos OS 和 Junos OS Evolved 具有不同的 sysctl
状态名称,因为底层操作系统不同。例如,在 Junos OS 中,您可以检索内核状态 hw.product.model
,但 Junos OS Evolved 没有类似的 sysctl
变量名称。在这些情况下,您可以使用 RPC 或其他方式检索相同的信息。
例如,以下 SLAX 操作脚本执行 get-software-information
RPC 以检索 Junos OS Evolved 上的模型名称,这相当于在 Junos OS 上返回sysctl
hw.product.model
值。
version 1.1; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; match / { <op-script-results> { var $local = jcs:open(); var $rpc = "get-software-information"; var $result = jcs:execute($local, $rpc); expr jcs:output($result/product-model); } }
user@router2-re0> op sysctl-evo-model ptx10008
如果在脚本中调用 sysctl()
函数并指定不存在的 sysctl 变量名称,则 Junos OS 不会生成错误,但 Junos OS Evolved 会 sysctl error: No such file or directory
生成错误。
例如,假设 sysctl()
函数请求的值 hw.product.model
,这是 Junos OS 上有效的 sysctl 变量名称,但在 Junos OS Evolved 上不是有效的 sysctl 变量名称。如果在运行 Junos OS Evolved 的设备上执行脚本,则脚本会发出以下输出:
user@router2-re0> op sysctl-evo-invalid error: sysctl error: No such file or directory error: xmlXPathCompiledEval: No result on the stack. error: runtime error: file /var/db/scripts/op/sysctl-evo-invalid.slax line 10 element variable error: Failed to evaluate the expression of variable 'model'.