【问题标题】:Invoking shell script contains SSH from java调用 shell 脚本包含来自 java 的 SSH
【发布时间】:2014-03-06 05:10:00
【问题描述】:

我正在尝试从 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 调用它会失败...

任何建议....

【问题讨论】:

  • 'filePath' 的值是多少?
  • filePath 将保存 args[0] ,即 /tmp/upog/test.sh
  • 我相信你想做Runtime.getRuntime().exec(arg1);而不是Runtime.getRuntime().exec(filePath);
  • 我想执行shell脚本,它存在于'filePath'中,目前没有使用args1

标签: java bash shell ssh


【解决方案1】:

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 作为我实际服务器的替换文本)

【讨论】:

    【解决方案2】:

    有两种可能的返回值: 返回值为 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代码可能不正确,因为我很少使用它

    更新:编辑的命令语法 错误2.&1 -> 正确2>&1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 2017-03-26
      • 1970-01-01
      • 2013-05-10
      相关资源
      最近更新 更多