使用带有“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" 放在同一个参数中,即:
args.add("sh");
args.add("-c");
args.add("uname -a");
如果它有助于澄清,要直接从命令行执行此操作,您需要键入:
sh -c "uname -a"
我有以下脚本,它使用 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" 放在同一个参数中,即:
args.add("sh");
args.add("-c");
args.add("uname -a");
如果它有助于澄清,要直接从命令行执行此操作,您需要键入:
sh -c "uname -a"