2012-03-16 141 views
0

我使用Ganymede ssh2從我的Java應用程序連接到服務器,並在那裏做一些工作。
它可以很好地工作,但問題是請求批准的ssh命令,例如。 命令Ganymed ssh2:如何解決命令行中的(y/n)提示

stop someService 

返回

Are you sure (y/n)? 

和之後適當的鍵行程(Y/N)它移動。

目前我使用SSH2 ganymed例如定實現,水木清華這樣的:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import ch.ethz.ssh2.Connection; 
import ch.ethz.ssh2.Session; 
import ch.ethz.ssh2.StreamGobbler; 

public class ConnectUtil(String hostname, String username, String password, String command) 
{ 

    try 
    { 
     Connection conn = new Connection(hostname); 
     conn.connect(); 

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

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

     Session sess = conn.openSession(); 

     sess.execCommand(command); 

     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); 
     } 
     sess.close(); 
     conn.close(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(System.err); 
    }  
} 

調用這個類的util與上述命令( '停止someService')後,在

被stucked
String line = br.readLine(); 

並且服務器超時後,所有內容都會中斷。

任何關於如何解決這個問題的想法都是值得歡迎的。

非常感謝, 米洛斯。

回答

1

假設Session有一個getStdin()方法,你應該寫回答這個問題。

無論是或者找出要求輸入的命令是否具有不會提示的「非交互式」模式。

+0

遺憾的是,此命令不會提示任何模式。但是,'Session'對象中有'getStdin()'。我試圖使用它,但無法弄清楚如何使用它。這是我添加的代碼:'\t \t \t Session sess = conn.openSession(); \t \t \t sess.execCommand(command); \t \t \t \t \t \t sess.getStdin()寫( 「PWD」 .getBytes())。 \t \t \t \t \t \t InputStream的標準輸出=新StreamGobbler(sess.getStdout()); \t \t \t \t \t \t的BufferedReader BR =新的BufferedReader(新的InputStreamReader(標準輸出));」有什麼不對,但不知道是什麼?! – trivunm 2012-03-16 23:30:42

+0

對不起,我添加的代碼是:'Session sess = conn.openSession(); \t \t \t sess.execCommand(command); \t \t \t \t \t \t sess.getStdin()。寫( 「Y」。的getBytes()); \t \t \t \t \t \t InputStream的標準輸出=新StreamGobbler(sess.getStdout()); \t \t \t \t \t \t的BufferedReader BR =新的BufferedReader(新的InputStreamReader(標準輸出));' – trivunm 2012-03-16 23:43:36

+0

一個作家包住標準輸入流,然後寫上 「Y \ N」,所以它發送回車 – artbristol 2012-03-17 08:53:12

0

如果您打算使用stdin而不是exec,那麼您必須先執行session.startShell()。閱讀常見問題。

-1

我使用此代碼...

sess.executeCommand("ena"+'\n' +"pass"+'\n' +"exit"+'\n');