1

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を使用して呼び出す必要があります。

エスケープ文字を使用してメッセージ文字列を渡そうとすると、同様に機能します。

この点に関する助けは大歓迎です。

4

1 に答える 1

1

次のようにコーディングする必要があります。

  String SNMPMSG  = "my snmpMsg now";
  String[] commandAndArgs = new String[]{
          "./snmptrap.pl",
          "-h",
          "myhost", 
          SNMPMSG
  };
  Process p = Runtime.getRuntime().exec(commandAndArgs);

あなたが現在行っている方法の問題は、メッセージを囲む引用符 (Perl コマンドの単一の引数にするため) がシェル主義であることです。メソッドはexec(String)引用符を理解していません。代わりに、空白文字がある「引数」にコマンド文字列を単純に分割します。その結果、Perl コマンドが間違った数の引数を認識し、余分な引用符文字を含む引数が表示されます。

于 2012-06-02T14:44:00.237 に答える