我正在尝试从java程序调用包含SSH命令的shell脚本。但是它失败了,错误代码为1。
我的java代码如下:
public class CallScript {
private static String filePath="";
private static String args1="";
public static void main(String[] args) throws Exception{
if(args!=null && args.length > 0){
filePath = args[0];
if(args.length > 1){
args1=args[1];
}
}else{
throw new Exception("File Path should be first Argument");
}
System.out.println(args.length);
invokeScript(filePath,args1);
}
private static void invokeScript(String filePath, String arg1) throws Exception{
System.out.println("Inside invoke Script " + arg1);
Process p = Runtime.getRuntime().exec(filePath);
p.waitFor();
int exitVal = p.exitValue();
System.out.println("The Exit Value " + exitVal);
}
}
我编译了程序并将可执行jar放在我的Unix环境中。
从java调用的shell脚本
ssh -l >test.log
我使用以下命令来运行我的java程序:
java -jar invokeScript.jar /tmp/upog/test.sh
输出
Inside invoke Script
The Exit Value 1.
如果我在shell脚本中有一些其他命令,如ls -al > test.log
,代码正在成功运行,我得到的返回值为0。
另外如果我在Unix框中直接调用包含ssh命令的shell脚本,它工作正常。(该框具有无密码连接)
但如果我从java打电话,它就失败了......
任何建议......
答案 0 :(得分:5)
invokeScript.jar 在这里适合我。问题似乎与 /tmp/upog/test.sh 有关。如果我尝试运行命令,我得到:
$ ssh -l >test.log
ssh: option requires an argument -- l
[...]
您的意思是ssh -l someuser example.com >test.log
吗?
当我使用无错误的shell脚本测试它时,运行ssh
有效:
$ cat >/tmp/upog/test.sh
#!/bin/bash
ssh example.com ls /tmp/upog >test.log
$ chmod +x /tmp/upog/test.sh
$ java -jar invokeScript.jar /tmp/upog/test.sh
1
Inside invoke Script
The Exit Value 0
$ cat test.log
bar
baz
foo
(使用 example.com 作为我实际服务器的替换文本)
答案 1 :(得分:1)
有两种可能的返回值: 返回值0表示成功 返回值> = 1表示错误。在这种情况下,应该寻找错误代码。这就是错误代码不同的原因。 有两种通用方法可以使用1作为标志来显示错误,而错误代码本身则位于其他位置。另一种方法是返回0作为成功,并且在错误的情况下返回错误代码本身,其> 0。在类似nix的系统中,主命令返回0或1。
ls -al > test.log
这里有两个命令,两个都是成功执行0 + 0 - 返回值0。
ssh -l >test.log
这里,第一个命令“ssh -l”因错误而执行,因为你没有提供任何参数。无论“> test.log”如何,你已经获得了1。
您的应用似乎正常 - 它会返回退出值。
如果您需要有关嵌套应用程序错误的更多信息。
你可以执行
ssh -l >test.log 2>&1
这里test.log会有错误。
或者您可以使用类似
的内容 BufferedReader err = new BufferedReader(
new InputStreamReader(p.getErrorStream())
); //
在你的Java应用程序中处理错误。
注意:java代码可能不正确,因为我很少使用它
Upd:已编辑的命令语法
错误2.&1
- >纠正2>&1