2014-02-08 2 views
4

Я пытаюсь вызвать скрипт оболочки, содержащий команду SSH из java-программы. Однако это не удается с кодом ошибки 1.Вызов сценария оболочки содержит SSH из java

Моим кодом 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); 
    } 
} 

Я составил программу и поместил исполняемую банку в моей среде Unix.

сценарий оболочки, который вызывается из Java

ssh -l >test.log 

Я использовал следующую команду, чтобы запустить мою Java программу:

java -jar invokeScript.jar /tmp/upog/test.sh 

выход

Inside invoke Script 
The Exit Value 1. 

Если бы я есть немного другая команда в скрипте оболочки, например ls -al > test.log, код работает с успехом, и я получаю возвращаемое значение 0.

Также, если я вызываю скрипт оболочки, содержащий команду ssh, непосредственно в поле Unix, он работает нормально. коробка есть беспарольное подключения)

Но это упущение, если я звонить из Java ...

Любой совет ....

+0

Что такое значение «Filepath»? – EJP

+0

filePath будет содержать args [0], который является /tmp/upog/test.sh – upog

+0

Я считаю, что вы хотели выполнить команду Runtime.getRuntime(). Exec (arg1); '& not' Runtime.getRuntime(). Exec (filePath); ' – anishsane

ответ

5

invokeScript.jar отлично работает для меня здесь. Вопрос относится к /tmp/upog/test.sh. Если я пытаюсь запустить команду я получаю:

$ ssh -l >test.log 
ssh: option requires an argument -- l 
[...] 

вы имели в виду ssh -l someuser example.com >test.log?

Когда я проверить его с помощью сценария оболочки безошибочной, бег 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

есть два возможные возвращаемые значения: Возвращаемое значение 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

Смежные вопросы