在 NETCONF Perl 客户端应用程序中以交互方式收集参数
在 NETCONF Perl 客户端应用程序中,脚本可以通过命令行以交互方式获取对象所需的 NET::Netconf::Manager 参数。
NETCONF Perl 分配包括多个示例 Perl 脚本,用于在运行 Junos OS 的设备上执行各种功能。每个示例脚本都会从调用脚本 NET::Netconf::Manager 的用户提供的命令行选项中获取对象所需的参数。脚本使用 getopts Perl 模块中 Getopt::Std 定义的功能从命令行中读取选项,然后以名为 %opt的 Perl 哈希记录选项。(生产环境中使用的脚本可能无法以交互方式获得参数,因此本节对于了解示例脚本非常重要。)
以下示例引用了 https://github.com/Juniper/netconf-perl/tree/master/examples/get_chassis_inventory NETCONF Perl GitHub 存储库中的 get_chassis_inventory.pl 示例脚本。
在 Junos OS 16.1 版之前,每个 Junos OS 版本都包括与版本相关的 NETCONF Perl 客户端的全新版本。从 Junos OS 16.1 版开始,NETCONF Perl 客户端与版本无关,托管在 GitHub 和 CPAN 上,可以管理运行任何 Junos OS 版本的设备。NETCONF Perl 发行版的与版本相关的示例脚本与 GitHub 和 CPAN 上托管的与版本无关版本中的示例脚本不同。
该功能的第一个参数 getopts 定义可接受选项,这些选项因应用而异。选项字母后的冒号表示它采用参数。
第二个参数 \%opt, 指定这些值记录在 %opt 散列中。如果用户未至少提供一个选项、提供无效选项或提供 -h 该选项,则脚本将 output_usage 调用子程序,该子程序会向屏幕打印使用消息。
my %opt;
getopts('l:p:d:f:m:o:h', \%opt) || output_usage();
output_usage() if $opt{'h'};
以下代码为 get_chassis_inventory.pl 示例脚本定义output_usage子程序。定义和WhereOptions部分的内容my $usage特定于脚本,并且因每个应用程序而异。
sub output_usage
{
my $usage = "Usage: $0 [options] <target>
Where:
<target> The hostname of the target device.
Options:
-l <login> A login name accepted by the target device.
-p <password> The password for the login name.
-m <access> Access method. The only supported method is 'ssh'.
-f <xmlfile> The name of the XML file to print server response to.
Default: chassis_inventory.xml
-o <filename> output is written to this file instead of standard output.
-d <level> Debug level [1-6]\n\n";
croak $usage;
}
get_chassis_inventory.pl 脚本包括以下代码,用于从命令行获取对象所需NET::Netconf::Manager参数的值。遵循完整的代码示例,详细讨论各种功能单元。
# Get the hostname
my $hostname = shift || output_usage();
# Get the access method, can be ssh only
my $access = $opt{'m'} || 'ssh';
use constant VALID_ACCESS_METHOD => 'ssh';
output_usage() unless (VALID_ACCESS_METHOD =~ /$access/);
# Check for login name. If not provided, prompt for it
my $login = "";
if ($opt{'l'}) {
$login = $opt{'l'};
} else {
print STDERR "login: ";
$login = ReadLine 0;
chomp $login;
}
# Check for password. If not provided, prompt for it
my $password = "";
if ($opt{'p'}) {
$password = $opt{'p'};
} else {
print STDERR "password: ";
ReadMode 'noecho';
$password = ReadLine 0;
chomp $password;
ReadMode 'normal';
print STDERR "\n";
}
在上述代码示例的第一行中,脚本使用 Perl shift 函数从命令行末尾读取主机名。如果缺少主机名,则脚本将 output_usage 调用子程序来打印使用消息,用于指定需要主机名。
my $hostname = shift || output_usage();
接下来,脚本确定要使用哪种访问协议,将 $access 变量设置为命令行选项的值 -m 。如果指定的值与常量定义 VALID_ACCESSES 的唯一有效值不匹配,则脚本将 output_usage 调用子程序以打印使用消息。
my $access = $opt{'m'} || 'ssh';
use constant VALID_ACCESS_METHOD => 'ssh';
output_usage() unless (VALID_ACCESS_METHOD =~ /$access/);
然后,脚本会确定用户名,将 $login 变量设置为命令行选项的值 -l 。如果未提供选项,则脚本会进行提示,并使用 ReadLine 函数(在标准 Perl Term::ReadKey 模块中定义)从命令行读取选项。
my $login = "";
if ($opt{'l'}) {
$login = $opt{'l'};
} else {
print STDERR "login: ";
$login = ReadLine 0;
chomp $login;
}
脚本最终会确定用户名的密码,将 $password 变量设置为命令行选项的值 -p 。如果未提供选项,则脚本将提示输入选项。它使用 ReadMode 功能(在标准 Perl Term::ReadKey 模块中定义)两次:首先防止密码在屏幕上出现明显回显,然后在读取密码后将 shell 返回到正常(回显)模式。
my $password = "";
if ($opt{'p'}) {
$password = $opt{'p'};
} else {
print STDERR "password: ";
ReadMode 'noecho';
$password = ReadLine 0;
chomp $password;
ReadMode 'normal';
print STDERR "\n";
}