2017-11-22 3 views
-1

Ich baue eine Android-App mit JSCH-Bibliothek, um einen Befehl auf einem Remote-Linux-Server auszuführen, und lesen Sie dann seine Ausgabe.Wie liest man die Ausgabe von jsch Befehl in Android?

Ich folgte der Antwort von this question, aber löste mein Problem nicht.

Nachstehend ist mein Aktivitätscode:

package com.example.pic_controller_2; 

     import android.graphics.drawable.Drawable; 
     import android.support.v7.app.AppCompatActivity; 
     import android.os.Bundle; 
     import android.app.Activity; 
     import java.io.BufferedInputStream; 
     import java.io.BufferedOutputStream; 
     import java.io.ByteArrayOutputStream; 
     import java.io.File; 
     import java.io.FileOutputStream; 
     import java.io.OutputStream; 
     import com.jcraft.jsch.Channel; 
     import com.jcraft.jsch.ChannelExec; 
     import com.jcraft.jsch.JSch; 
     import com.jcraft.jsch.JSchException; 
     import com.jcraft.jsch.Session; 
     import com.jcraft.jsch.ChannelSftp; 
     import android.view.View; 
     import android.os.AsyncTask; 
     import android.widget.Button; 
     import android.widget.ImageView; 
     import android.widget.Toast; 

public class TestActivity extends AppCompatActivity { 

    private String aaaa; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_test); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    public void show_picture_func (View v) { 

     new AsyncTask<Integer, Void, Void>(){  

      @Override 
      protected Void doInBackground(Integer... params) { 

       String SFTPHOST = "192.168.0.1"; 
       int SFTPPORT = 22; 
       String SFTPUSER = "pi"; 
       String SFTPPASS = "raspberry"; 
       String SFTPWORKINGDIR = "/home/pi/pic/"; 

       Session session = null; 
       Channel channel = null; 
       ChannelSftp channelSftp = null; 

       try { 
        JSch jsch = new JSch(); 
        session = jsch.getSession(SFTPUSER, SFTPHOST, SFTPPORT); 
        session.setPassword(SFTPPASS); 
        session.setConfig("StrictHostKeyChecking", "no"); 
        session.setTimeout(10000); 
        session.connect(); 

        ChannelExec channel1 = (ChannelExec)session.openChannel("exec"); 
        final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
        channel1.setOutputStream(baos); 
        channel1.setCommand("ls /home/pi/pic | sed -n 5p"); 
        aaaa = new String(baos.toByteArray()); 

       } catch (Exception ex) { 
        ex.printStackTrace(); 
        Toast.makeText(getApplicationContext(), "Error Connecting", Toast.LENGTH_LONG).show(); 
       } 
       return null; 
      } 


      @Override 
      protected void onPostExecute(Void unused) { 
       TextView textView1_2 = (TextView)findViewById(R.id.textView1); 
       textView1_2.setText(aaaa); 
      } 


     }.execute(1); 

    } 

} 

So wird die Ausgabe des ausgeführten Befehls in der Textview angezeigt werden soll. Aber das tut es nicht. Die Textansicht ändert sich in weiß!

Irgendwelche Vorschläge!?

+1

Das erste offensichtliche Problem ist, dass Sie nie 'channel1.connect()' aufrufen, so dass der Befehl nie ausgeführt wird. Das zweite Problem ist, dass Sie warten müssen, bis der Befehl abgeschlossen ist, bevor Sie 'toByteArray' aufrufen. –

+0

Danke @MartinPrikryl für Ihren Kommentar. Ich habe dieses Problem früher erkannt. Dumm von mir!! Es gab ein weiteres Linux-Command-Problem, das ich gepostet habe. – Omid1989

Antwort

0

Ich änderte den folgenden Abschnitt des Codes, von hier:

ChannelExec channel1 = (ChannelExec)session.openChannel("exec"); 
final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
channel1.setOutputStream(baos); 
channel1.setCommand("ls /home/pi/pic | sed -n 5p"); 
aaaa = new String(baos.toByteArray()); 

dazu:

ChannelExec channel1 = (ChannelExec)session.openChannel("exec"); 
final ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
channel1.setOutputStream(baos); 
channel1.setCommand("ls /home/pi/pic | sed -n 5p | xargs echo -n"); 
channel1.connect(); 
try{Thread.sleep(1000);}catch(Exception ee){} 
aaaa = new String(baos.toByteArray()); 

Und das Problem gelöst.

Verwandte Themen