调用shell脚本包含来自java的SSH

时间:2014-02-08 19:13:56

标签: java bash shell ssh

我正在尝试从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打电话,它就失败了......

任何建议......

2 个答案:

答案 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