2012-06-02 62 views
1

我有一個用於將SNMP陷阱發送到遠程主機問題使用Java

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腳本傳遞給perl腳本參數的perl snmptrap.pl -^h爲myhost「我現在snmpMsg」

其中myhost的是期待我的SNMP陷阱

當我調用遠程主機正確接收SNMP消息這個perl腳本的遠程主機。

當我嘗試在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爲此目的調用它。

試圖通過消息字符串轉義字符力量以及工作。

在這方面的任何幫助是高度讚賞。

+0

使用[exec(String \ [\])](http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#exec \( java.lang.String中[] \))。 –

回答

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命令看到了錯誤的參數數量和帶有多餘引號字符的參數。

+0

這真的很有幫助..謝謝 – Sanath