1

LFTP 用の maven プラグインを作成しようとしていますが、これには Java アプリケーションから LFTP コマンド ライン プログラムを呼び出す必要があります。

ただし、単一引用符、二重引用符、エスケープされた単一/二重引用符を使用して、渡されたコマンドを処理することはできません。

これまでのコードは次のとおりです。

final String command = "lftp -e 'set ftp:ssl-protect-data true; put -O /data/upload/ src/test/resources/test-file.txt; bye' -u username,password -p 21 192.168.1.100"
final CommandLine cmdLine = CommandLine.parse(command.toString());
final DefaultExecutor executor = new DefaultExecutor();
executor.setWorkingDirectory(new File(baseDir));
final int result = executor.execute(cmdLine);

そして、次に何を試すべきかについての提案を探しています。

編集 #1: and を事前に作成された文字列として使用しようとしorg.apache.commons.exec.CommandLineましたが、次のエラーが発生します。

Unknown command `set ftp:ssl-protect-data true; put -O /data/upload/ src/test/resources/test-file.txt; bye'.
Exception in thread "main" org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
    at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:377)
    at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:160)
    at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:147)
    at org.welsh.build.automation.lftp.plugin.TestClass.main(TestClass.java:30)

しかし、生成されたコマンドを印刷して手動で実行すると、正常に動作します。

編集 #2:いくつかの明確さを追加しました。

4

2 に答える 2

4

Commons-execは、段階的に構築することでインスタンスを処理する方が簡単であることを強調していCommandLineます。

final CommandLine cmdLine = new CommandLine("lftp");
cmdLine.addArgument("-e");
cmdLine.addArgument("set ftp:ssl-protect-data true; put -O /data/upload/ src/test/resources/test-file.txt; bye");
...
executor.execute(cmdLine);

私は彼らのコマンドラインパーサーを見ていませんが、彼らがそれを完全に信頼していなければ、私もそうしません。

于 2013-01-09T16:29:43.780 に答える
0

ここにいくつかの例があります:

Apache Commons Exec

これらは一重引用符 (') 文字を使用せず、二重引用符の前にバックスラッシュを付けて、二重引用符で Java 文字列を作成することに注意してください。

以下は、そのことを示す 1 つの例です。

String line = "AcroRd32.exe /p /h \"" + file.getAbsolutePath() + "\"";

コマンド ラインを作成する別の方法を次に示します。

CommandLine cmdLine = new CommandLine("lftp");
cmdLine.addArgument("-e");
cmdLine.addArgument("set ftp:ssl-protect-data true; put -O /data/upload/ src/test/resources/test-file.txt; bye");
cmdLine.addArgument("-u");
cmdLine.addArgument("username,password");
cmdLine.addArgument("-p");
cmdLine.addArgument("21");
cmdLine.addArgument("192.168.1.100");
于 2013-01-09T16:43:50.587 に答える