SNMPトラップをリモートホストに送信するために使用されるperlスクリプトがあります
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;
}
このコマンドを使用してこのスクリプトを呼び出しますperlsnmptrap.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 my
2.snmpMsg
3.now
スペース以外のメッセージを使用した場合-eg(my_snmpMsg_now)1つのメッセージとして受信します
私はperlスクリプトを初めて使用しますが、インフラストラクチャに関連する問題があるため、Javaを使用してSNMPトラップ送信プロセスを実装できず、Perlスクリプトを使用して、目的のためにJavaを使用して呼び出す必要があります。
エスケープ文字を使用してメッセージ文字列を渡そうとすると、同様に機能します。
この点に関する助けは大歓迎です。