2012-02-14 111 views
1

我有一個bash腳本,它使用sshpass和ssh自動登錄到不同的機器和觸發器命令。當從命令行觸發時,bash腳本運行良好,但是當它從Java應用程序調用時,它無法繼續。從命令行使用sshpass和命令行工作,而不是從java exec

sshpass -p 'password' ssh [email protected] './SleepDisplay && exit' 

的bash腳本做了很多其他的事情,我也沒有辦法直接在Java中實現ssh登錄。我似乎無法弄清楚,爲什麼它會失敗。除了ssh以外的一切都運行良好。

+2

你不會說'這不是working'得到任何幫助。什麼不工作?代碼在哪裏?你如何執行命令? – 2012-02-14 12:31:37

+0

考慮編輯你的問題,以包含你的java上下文中的行,以及(更重要的)任何你可以捕獲的錯誤信息。 java中的調用返回失敗狀態嗎?你能否將shell調試嵌入到上面的命令中,即'set -vx; sshpass ...'。你的JAVA和你運行shell代碼的終端有相同的PATH嗎?考慮添加'echo $ PATH; set -vx; sshpass ...來驗證PATH是正確的。祝你好運。 – shellter 2012-02-14 14:13:57

回答

1

當經由Runtime.exec()執行命令,所述第一元件可執行,那麼所有其他參數在分別通過在陣列的其餘部分。

但是,您可能(可能)將整個linux命令作爲可執行文件傳遞,這不起作用。

試試這個:

String[] cmdarray = {"sshpass", "-p", "'password'", "ssh", "[email protected]", "'./SleepDisplay && exit'"}; 
Runtime.getRuntime().exec(cmdarray); 
+0

問題是exec()只調用bash腳本 'Runtime.getRuntime().exec('bashscriptname')' sshpass在腳本里面有很多其他命令,工作正常。 – nxtwrld 2012-02-15 23:03:46

0

你可以嘗試使用ganymed-ssh2 Java庫,它讓你能夠如此使用Java執行和執行shell腳本和...... 下面使用這個庫是表明一個例子:

{ 
    String hostname = "127.0.0.1"; 
    String username = "joe"; 
    String password = "joespass"; 

    try 
    { 
     /* Create a connection instance */ 

     Connection conn = new Connection(hostname); 

     /* Now connect */ 

     conn.connect(); 

     /* Authenticate. 
     * If you get an IOException saying something like 
     * "Authentication method password not supported by the server at this stage." 
     * then please check the FAQ. 
     */ 

     boolean isAuthenticated = conn.authenticateWithPassword(username, password); 

     if (isAuthenticated == false) 
      throw new IOException("Authentication failed."); 

     /* Create a session */ 

     Session sess = conn.openSession(); 

        // here execute which command separate for ";" 
     sess.execCommand("uname -a && date && uptime && who"); 

     System.out.println("Here is some information about the remote host:"); 

     /* 
     * This basic example does not handle stderr, which is sometimes dangerous 
     * (please read the FAQ). 
     */ 

     InputStream stdout = new StreamGobbler(sess.getStdout()); 

     BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); 

     while (true) 
     { 
      String line = br.readLine(); 
      if (line == null) 
       break; 
      System.out.println(line); 
     } 

     /* Show exit status, if available (otherwise "null") */ 

     System.out.println("ExitCode: " + sess.getExitStatus()); 

     /* Close this session */ 

     sess.close(); 

     /* Close the connection */ 

     conn.close(); 

    } 
    catch (IOException e) 
    { 
     e.printStackTrace(System.err); 
     System.exit(2); 
    } 
} 
1

開放首先執行命令並執行命令。嘗試如下:

String COMMAND = "sshpass -p 'password' ssh [email protected] './SleepDisplay && exit'"; 
String[] SHELL_COMMAND = { "/bin/sh", "-c", COMMAND }; 
... 
Runtime runtime = Runtime.getRuntime(); 
Process process = runtime.exec(SHELL_COMMAND); 

希望我能給你一個有幫助的提示。