Как передать строковый аргумент исполняемому файлу, запущенному с помощью Apache Commons Exec?

Мне нужно передать текстовый аргумент для stdin команды, запущенной с помощью Apache Commons Exec (для любопытных, команда - это gpg, а аргумент - это кодовая фраза для хранилища ключей; gpg не имеет аргумента, чтобы явно указать парольную фразу, только чтобы принять ее из stdin).

Кроме того, мне это нужно для поддержки как Linux, так и Windows.

В сценарии оболочки я бы использовал

cat mypassphrase|gpg --passphrase-fd

или

type mypassphrase|gpg --passphrase-fd

, но тип не работает в Windows, поскольку это не исполняемый файл, а команда, встроенная в интерпретируемую команду (cmd.exe).

код не работает (по вышеуказанной причине) ниже. Создавать для этого всю оболочку слишком некрасиво, я искал более элегантное решение. К сожалению, есть некоторые проблемы несовместимости между библиотекой BouncyCastle и PGP, поэтому я не могу использовать полностью программное решение за (очень короткое) время, которое у меня есть.

Заранее спасибо.

CommandLine cmdLine = new CommandLine("type");
cmdLine.addArgument(passphrase);
cmdLine.addArgument("|");
cmdLine.addArgument("gpg");
cmdLine.addArgument("--passphrase-fd");
cmdLine.addArgument("0");
cmdLine.addArgument("--no-default-keyring");
cmdLine.addArgument("--keyring");
cmdLine.addArgument("${publicRingPath}");
cmdLine.addArgument("--secret-keyring");
cmdLine.addArgument("${secretRingPath}");
cmdLine.addArgument("--sign");
cmdLine.addArgument("--encrypt");
cmdLine.addArgument("-r");
cmdLine.addArgument("recipientName");
cmdLine.setSubstitutionMap(map);
DefaultExecutor executor = new DefaultExecutor();
int exitValue = executor.execute(cmdLine);
11
задан skaffman 14 January 2011 в 21:01
поделиться