在 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 上返回sysctlhw.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'.