我编写了一个代码来执行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'更多 信息。
我已经尝试了很多但无法解决问题。这个问题可能是什么原因?
答案 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[]):第一个参数是命令,下一个是参数。这就是我们在这个代码块中所做的。