无法使用getruntime.exec()成功执行Shellscript

时间:2014-07-23 09:11:06

标签: java shell

我编写了一个代码来执行java脚本:

 String wrapper_script=homedir+"/blast_distribute.sh "+" --seqs="+seqs+" --i="+formobj.getUpFile().getFileName()+"  "+formobj.getSelected_program();

 script_exec=Runtime.getRuntime().exec(wrapper_script);

这对我来说非常适合,因为命令执行成功。现在我需要以其他用户身份运行此命令,因此我需要以如下格式执行命令:

  

su username -c' command'

所以我已经将上面的script_exec字符串编辑为:

String wrapper_script1="su - "+username+" -c "+"'"+wrapper_script+"'";

我已经打印了wrapper_script1,其中有diplays:

  

su - abhijeet -c' /home/abhijeet//blast_distribute.sh --seqs = 1562   --i = mPS_0.contigs.fasta'

如果我直接在Linux上运行相同的命令,它完全按照我的需要运行。但是当我正在运行时:

script_exec=Runtime.getRuntime().exec(wrapper_script1); 它无法正常工作,在我的错误流中,我收到错误

  

su:无法识别的选项' - seqs = 1562'试试`su --help'更多   信息。

我已经尝试了很多但无法解决问题。这个问题可能是什么原因?

1 个答案:

答案 0 :(得分:2)

您应该为此运行多个参数:

Runtime.getRuntime().exec(new String[] {"su", "-", username, "-c",
        homedir + "/blast_distribute.sh " + " --seqs=" + seqs + " --i=" + formobj.getUpFile().getFileName() + "  " + formobj.getSelected_program()
});

您收到错误,因为此处'不被视为封闭字符,而是su命令的参数。

让我们看一下细节。当您在控制台中键入一些命令su - jsmith -c 'aba --cabga'时,您正在做的是:“运行命令su,其中包含以下参数:-jsmith,{{1} },-c(多个单词的一个参数)“。

您应该在Java代码中执行相同的操作。在Java API中有一个特殊的命令,用于运行带有具体参数的具体命令,而不是像shell一样解析行:Runtime.exec(String[]):第一个参数是命令,下一个是参数。这就是我们在这个代码块中所做的。