我试图在java程序中执行以下shell命令:
curl -k -X POST -H "Content-Type:application/json" -d '{"COMMAND":"DISCSTATUS","USER":"PMDC"}'
https://167.254.226.215/DcnWebSvr/DcnSvrCmd
返回字符串
{"Result":"SUCCESS"}
从终端,这个命令工作正常。但是,当我尝试从java程序中执行此操作时,我得不到相同的结果。
这是我的代码:
StringBuffer output = new StringBuffer();
ProcessBuilder builder = new ProcessBuilder("curl","-k", "-X", "POST","- H","\"Content-Type:application/json\"",
"-d","'{\"COMMAND\":\"DISCSTATUS\",\"USER\":\"PMDC\"}'",
"https://167.254.226.215/DcnWebSvr/DcnSvrCmd");
builder.redirectErrorStream(true);
try {
Process process = builder.start();
InputStream is = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = reader.readLine()) != null) {
output.append(line + "\n");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return output.toString();
但是,它没有输出正确的字符串。相反,它似乎将命令识别为某种转移,因为这是我得到的输出:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 40 0 0 100 40 0 164 --:--:-- --:--:-- --:--:-- 165
我只是忽略了一些语法错误吗?我错过了什么?
答案 0 :(得分:1)
您希望使用curl --silent
来取消进度信息。
答案 1 :(得分:0)
解决了我的问题。问题是我使用的是单引号,而我在ProcessBuilder中并不需要它们。与此相同:
答案 2 :(得分:-1)
这是由于误解了命令解释器(例如shell)如何处理命令行与如何在进程中启动它。
ProcessBuilder
需要原始参数。
从shell开始,请考虑一下:
# Both commands will be the same
ls
"ls"
是的,这是一回事。报价实际上由THE SHELL解释。但是幕后的真实过程只能看到shell事先处理过的东西 - 在这种情况下,只是一个简单的ls
。
在你的shell中试试;你会发现所有这些都有相同的结果:
'l's
'ls'
'l'"s"
'l''s'
尝试查看对ProcessBuilder
的参数意味着什么...我所说的不仅与命令相关,而且与所有参数有关...