2016-04-03 7 views
1

Ich versuche, einen Befehl auf einem Linux-Server mit SSH von Android mit JSch auszuführen.Running-Befehl mit "exec" -Kanal mit JSch gibt keine Ausgabe zurück

So weit ich weiß, verbinde ich mich mit dem Server, aber wenn ich versuche, die Ergebnisse des Befehls abzurufen, bekomme ich nichts.

eine Verbindung zum Server:

public class SSHCommand { 

    public static String executeRemoteCommand(
      String username, 
      String password, 
      String hostname, 
      int port) throws Exception { 

     JSch jsch = new JSch(); 
     Session session = jsch.getSession(username, hostname, port); 
     session.setPassword(password); 

     // Avoid asking for key confirmation 
     Properties prop = new Properties(); 
     prop.put("StrictHostKeyChecking", "no"); 
     session.setConfig(prop); 

     session.connect(); 

     // SSH Channel 
     ChannelExec channelssh = (ChannelExec) 
       session.openChannel("exec"); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     channelssh.setOutputStream(baos); 

     // Execute command 
     channelssh.setCommand("ls"); 
     channelssh.connect(); 
     channelssh.disconnect(); 

     return baos.toString(); 
    } 
} 

Daten abrufen:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final String TAG = "TESTING"; 

     new AsyncTask<Integer, Void, Void>(){ 
      @Override 
      protected Void doInBackground(Integer... params) { 
       try { 
        Log.d(TAG, SSHCommand.executeRemoteCommand("username", "password", "192.168.0.1", 22)); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }.execute(1); 
    } 
} 

Was bin ich hier?

Antwort

2

Sie trennen sofort nach dem Start des Befehls, bevor eine Ausgabe zurückgegeben wird.

Sie müssen warten, bis der "exec" -Kanal geschlossen wird (sobald der Befehl beendet ist).

Siehe die official JSch example for the "exec" channel.

byte[] tmp=new byte[1024]; 
while(true){ 
    while(in.available()>0){ 
    int i=in.read(tmp, 0, 1024); 
    if(i<0)break; 
    System.out.print(new String(tmp, 0, i)); 
    } 
    if(channel.isClosed()){ 
    if(in.available()>0) continue; 
    System.out.println("exit-status: "+channel.getExitStatus()); 
    break; 
    } 
    try{Thread.sleep(1000);}catch(Exception ee){} 
} 
+0

Vielen Dank! das hat funktioniert – Will