我有一个perl脚本,用于将SNMP陷阱发送到远程主机
my (@varbinds,$hostname);
GetOptions(
"hostname=s" =>\$hostname,
);
$hostnode = `hostname`; # Unix command to find the hosts name
chomp $hostnode;
push (@varbinds, ".0.1",OCTET_STRING, $hostnode);
for (my $i;$i <= $#ARGV;$i++){
push (@varbinds, ".0.".($i + 3),OCTET_STRING, $ARGV[$i]);
}
my ($session, $error) = Net::SNMP->session(
-hostname => $hostnode,
-community => 'public',
-port => 162,
-version => 2,
);
my $result = $session->snmpv2_trap(
-varbindlist => \@varbinds
);
$session->close();
print " SNMP Trap Hostname -> $hostnode\n";
for (my $i;$i <= $#varbinds;$i++)
{
print "\n\t\t$varbinds[$i], $varbinds[($i+1)],$varbinds[($i+2)]";
$i += 2;
}
我使用此命令调用此脚本 perl snmptrap.pl -h myhost“my snmpMsg now”
其中myhost是期待我的snmp陷阱的远程主机
当我调用此perl脚本时,远程主机正确接收snmp消息。
当我尝试在java类中调用这个perl脚本时出现问题。
我使用的代码如下所示。
String SNMPMSG = "\"my snmpMsg now\" ";
String script_url = "./snmptrap.pl "+" -h myhost "+SNMPMSG;
Process p = Runtime.getRuntime().exec(script_url);
InputStream stdin= p.getInputStream();
BufferedReader reader = new BufferedReader (new InputStreamReader(stdin));
while ((line = reader.readLine ()) != null) {
System.out.println(" " + line);
}
奇怪的是,这个myhost期望snmp消息根据其空间截获消息,并收到3条消息。
1我的
2.snmpMsg
3.now
如果我使用非空格的消息 - 例如(my_snmpMsg_now)它收到一条消息
我是perl脚本的新手,由于基础设施相关问题,我无法使用java实现snmp陷阱发送过程,需要使用perl脚本并使用java调用它。
尝试传递消息带有转义字符的字符串dint也可以。
对此方面的任何帮助表示高度赞赏。
答案 0 :(得分:1)
您应该像这样编码:
String SNMPMSG = "my snmpMsg now";
String[] commandAndArgs = new String[]{
"./snmptrap.pl",
"-h",
"myhost",
SNMPMSG
};
Process p = Runtime.getRuntime().exec(commandAndArgs);
您当前正在执行此操作的方式的问题是消息周围的引号(使其成为Perl命令的单个参数)是shell-ism。 exec(String)
方法无法理解引号。相反,它只是将命令字符串拆分为“参数”,其中有空格字符。结果是Perl命令看到错误的参数数量,以及带有无关引号字符的参数。