繁体   English   中英

使用带有`java.lang.ProcessBuilder`的参数执行shell命令

[英]Execute shell commands with arguments with `java.lang.ProcessBuilder`

我有以下脚本,该脚本使用Java的java.lang.ProcessBuilder执行shell命令,如果不使用参数,该命令可以正常运行:

<cfif IsDefined("FORM.cmd")>
  <cfif Server.OS.Name CONTAINS "Mac" or Server.OS.Name CONTAINS "Linux" or Server.OS.Name IS "UNIX">
    <cfset cmd = "sh -c #FORM.cmd#">
  <cfelseif Server.OS.Name CONTAINS "Windows">
    <cfset cmd = "cmd.exe /c #FORM.cmd#">
  <cfelse>
    <cfset cmd = "sh -c #FORM.cmd#">
  </cfif>

  <cfscript>
    str = htmleditformat(REReplace(cmd,"""","'","ALL"));
    exec = str.split(" ");
    pb = createObject("java","java.lang.ProcessBuilder").init(exec);
    pb.redirectErrorStream(true);
    proc = pb.start();
    proc.waitFor();
    isr = createObject("java","java.io.InputStreamReader").init(proc.getInputStream());
    br = createObject("java","java.io.BufferedReader").init(isr);
    line = br.readLine();
    while (isDefined("line")) {
     writeoutput(line & '<br>');
     line = br.readLine();
    }
    br.close();
    isr.close();
  </cfscript>
</cfif>

如果我的#FORM.cmd#uname ,则输出与我期望的一样:

Linux

但是,如果我的#FORM.cmd#uname -a则脚本仅执行uname而不离开-a参数。 所以我想我会用一个Java数组来添加参数:

  <cfscript>
    args = createObject("java", "java.util.ArrayList").init();
    args.add("sh");
    args.add("-c");
    args.add("uname");
    args.add("-a");
    pb = createObject("java","java.lang.ProcessBuilder").init(args);
    pb.redirectErrorStream(true);
    proc = pb.start();
    proc.waitFor();
    isr = createObject("java","java.io.InputStreamReader").init(proc.getInputStream());
    br = createObject("java","java.io.BufferedReader").init(isr);
    line = br.readLine();
    while (isDefined("line")) {
     writeoutput(line & '<br>');
     line = br.readLine();
    }
    br.close();
    isr.close();
  </cfscript>

同样的问题。 我究竟做错了什么?

“ -a”作为sh而不是uname的参数被传递。 您需要将“ uname -a”放在相同的arg中,即:

args.add("sh");
args.add("-c");
args.add("uname -a");

如果它有助于弄清楚,要直接从命令行执行此操作,您需要输入:

sh -c "uname -a"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM