我试图运行一个perl脚本,该脚本读取包含500个条目的文本文件,一次读取一个条目并发送命令。
命令为server hostname
,其中hostname的值是文本文件中的主机名列表。
我是编程新手,根据我的理解,我们需要打开包含主机名的文件并将其读取open (ENABLE, "<hostanmes.txt") || die "could not open output file";
使用for循环读取其中的512个主机名for($i=1; $i<=512; $i++)
但我不确定如何将此文件连接到命令server hostname
程序不完整。我很震惊,不太确定。有人可以帮帮我吗?
#!/usr/bin/perl
## Library import
use Net::SSH::Expect;
use strict;
use warnings;
use autodie;
print "\n [INFO] script Execution Started \n";
my $ssh = Net::SSH::Expect->new (host => "ip addr",
password=> 'pwd',
user => 'username',
raw_pty => 1);
my $login_output = $ssh->login();
print "\n [INFO] add host rules \n";
open (ENABLE, "<hostanmes.txt") || die "could not open output file";
for($i=1; $i<=512; $i++)
{
my $cfg = $ssh->exec("config");
my $cmd = $ssh->exec("server www.google.com");
my $cmd = $ssh->exec("exit");
}
close(ENABLE);
答案 0 :(得分:3)
答案的本质是你可以通过在字符串中命名它们来将双引号字符串中的标量或数组变量的值插入。例如
my $x = 42;
print "x = $x\n";
将打印
x = 42
以下是关于您的计划的其他一些要点
任何模块的use
都应该在 use strict
和use warnings
之后,这通常应该是程序的第一行
最佳做法是使用词法文件句柄和open
的三参数形式,如果你有use autodie
,那么它是没有意义的检查已经完成的开放成功,因为它已经为您完成。所以
open (ENABLE, "<hostanmes.txt") || die "could not open output file";
应该是
open my $enable, '<', 'hostnames.txt';
除非您出于其他原因需要数组索引,否则最好在Perl中迭代数组值。
以下是对代码的重写,并考虑了这些要点。看起来它会做你需要的事情
use strict;
use warnings;
use autodie;
use Net::SSH::Expect;
print "\n[INFO] script Execution Started\n";
my $ssh = Net::SSH::Expect->new(
host => "ip addr",
password => 'pwd',
user => 'username',
raw_pty => 1,
);
my $login_output = $ssh->login;
print "\n[INFO] add host rules\n";
open my $enable, '<', 'hostnames.txt';
while (my $server = <$enable>) {
chomp $server;
$ssh->exec('config');
$ssh->exec("server $server");
$ssh->exec('exit');
}
答案 1 :(得分:0)
一旦你拥有它就迭代ENABLE你应该使用一个简单的while循环:
while(<ENABLE>){
chomp;
//each line read from ENABLE will be stored in $_ per loop
}
这样你就不需要for循环来迭代了。所以从本质上讲,你会运行&#34;服务器主机名&#34;这个while循环中的命令:
...
while(<ENABLE>) {
chomp;
$ssh->exec("server $_");
}
...
Check here了解详情。