我正在尝试为LFTP创建一个maven插件,并涉及从我的java应用程序调用LFTP命令行程序。
但是我无法使用单引号,双引号,espcaped单/双引号来处理传入的命令。
到目前为止我的代码是:
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:我尝试使用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:添加了更多清晰度。
答案 0 :(得分: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);
我没有看过他们的命令行解析器,但如果他们不完全信任它,我也不会。
答案 1 :(得分:0)
这里有一些例子:
请注意,它们不使用单引号(')字符,而是使用双引号构建带有双引号的java字符串,前面是带有反斜杠的双引号字符。
以下是一个显示:
的示例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");