在 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
子程序。定义和Where
Options
部分的内容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"; }