1

我正在尝试将一些纯文本密钥传递给第三方外部程序,然后将输出捕获到字符串。一切似乎都在工作,除了第三方程序不接受输入为“正常”。我收到“输入太长”错误。但是当在 bash shell 中将相同的文本集运行到相同的二进制文件时,它会按预期工作。我似乎找不到任何会附加额外字符的东西。

我一直在关注这个例子:如何将字符串参数传递给使用 Apache Commons Exec 启动的可执行文件?

public String run(List<String> keys) throws ExecuteException, IOException{

    //String text = String.join(System.lineSeparator(), keys);  
    String text = "9714917";
    CommandLine cmd = new CommandLine("/third/party/bin/program");

    Executor executor = new DefaultExecutor();
    ByteArrayOutputStream stdout = new ByteArrayOutputStream();
    ByteArrayOutputStream stderr = new ByteArrayOutputStream();
    ByteArrayInputStream stdin = new ByteArrayInputStream(text.getBytes("UTF-8"));

    PumpStreamHandler streamHandler = new PumpStreamHandler(stdout, stderr, stdin);

    executor.setStreamHandler(streamHandler);
    executor.setWatchdog(new ExecuteWatchdog(10000));
    executor.execute(cmd,environment);


return stdout.toString("UTF-8");
}

如果我是正确的,这应该与在 shell 中输入相同

echo "9714917" | /third/party/bin/program 

哪个有效。我可以让stderr打印得很好,甚至可以得到stdout(由于密钥被拒绝,它恰好是空白的)任何帮助表示赞赏。

4

1 回答 1

1

第 3 方程序需要在输入流中有一个终止的新行(正如echo命令放入其输出中的那样),因此以下应该可以工作(由@Neurobug 确认):

ByteArrayInputStream stdin = new ByteArrayInputStream((text + "\n").getBytes("UTF-8"));
于 2015-05-20T18:36:46.023 回答