【问题标题】:Issue with arguments passed to a perl script using Java使用 Java 将参数传递给 perl 脚本的问题
【发布时间】:2012-06-02 14:00:39
【问题描述】:

我有一个用于向远程主机发送 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;
   }    

我使用这个命令调用这个脚本 perl snmptrap.pl -h myhost "我现在的 snmpMsg"

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.现在

如果我使用了非空格的消息 - 例如(my_snmpMsg_now),它将作为一条消息接收

我对 perl 脚本非常陌生,由于基础设施相关问题,我无法使用 java 实现 snmp 陷阱发送过程,需要使用 perl 脚本并使用 java 调用它。

尝试使用转义字符传递消息字符串也可以。

我们非常感谢这方面的任何帮助。

【问题讨论】:

标签: java perl snmp


【解决方案1】:

你应该这样编码:

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

您当前执行此操作的方式的问题是消息周围的引号(使其成为 Perl 命令的单个参数)是一种 shell 主义。 exec(String) 方法不理解引号。相反,它只是将命令字符串拆分为包含空格字符的“参数”。结果是 Perl 命令看到错误数量的参数,以及带有无关引号字符的参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多