2016-12-09 3 views
1

Wie der Mitbenutzer von diesem question und diesem tutorial erklären, versuche ich eine SimpleSsh-Verbindung einzurichten, um einen einzigen Befehl für eine App auszuführen. Es muss nicht einmal auf eine Antwort warten. HierBasic SSH-Verbindung über JSCH auf Android

ist der Code:

Hauptaktivität: Paket com.example.lucas.shutdown;

import android.os.AsyncTask; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 

public class MainActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    public void onCLick(View v){ 
     new AsyncTask<Integer, Void, Void>(){ 
      @Override 
      protected Void doInBackground(Integer... params) { 
       try { 
        executeRemoteShutdown(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }.execute(1); 
    } 

    public void executeRemoteShutdown(){ 
     String user = "ssh"; 
     String password = "123"; 
     String host = "192.168.1.4"; 
     int port=22; 
     try{ 
      JSch jsch = new JSch(); 
      Session session = jsch.getSession(user, host, port); 
      session.setPassword(password); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.connect(); 
      Channel channel = (ChannelExec) session.openChannel("exec"); 
      ((ChannelExec) channel).setCommand("shutdown /s"); 
      channel.connect(); 
      try{ 
       Thread.sleep(1000); 
      }catch(Exception ee){} 
      channel.disconnect(); 
      session.disconnect(); 
     } 
     catch(Exception e){} 
    } 
} 

Der Knopf, der die Aktion ausführt:

<Button 
    android:text="Shutdown" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" 
    android:id="@+id/button" 
    android:onClick="onCLick" /> 

Das gleiche Verfahren executeRemoteShutdown() bereits auf einem diferent Programm in Java funktioniert, aber das, was ich mit Mühe habe, ist, dass die conection und comand die Ausführung scheint nie zu geschehen. Ich folgte den Empfehlungen aus der Frage, die ich oben verlinkt habe, um die ssh-Methode auf einem anderen Thread auszuführen, eine Verzögerung hinzuzufügen, um auf den auf dem Host ausgeführten Befehl zu warten, bevor die Methode beendet wurde, und Internet-Erlaubnis für die Manifest-Datei zu geben.

Antwort

1

Ok hier gehen wir, Code ist in Ordnung, aber einige kleine Fehler sind in .. lassen Sie mich dies korrigieren, Sie auf die Schaltfläche rechts und ein paar kleine Änderungen implementieren und es funktioniert:

MainActivity :

import android.os.AsyncTask; 
    import android.support.v7.app.AppCompatActivity; 
    import android.os.Bundle; 
    import android.view.View; 
    import com.jcraft.jsch.Channel; 
    import com.jcraft.jsch.ChannelExec; 
    import com.jcraft.jsch.JSch; 
    import com.jcraft.jsch.Session; 

    public class MainActivity extends AppCompatActivity { 
     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 


    Button btn = (Button) view.findViewById(R.id.button); 
      btn.setOnClickListener(new View.OnClickListener() { 
       //start execution of ssh commands 
       @Override 
       public void onClick(View v){ 
        new AsyncTask<Integer, Void, Void>(){ 
         @Override 
         protected Void doInBackground(Integer... params) { 
          try { 
           executeSSHcommand(); 
          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
          return null; 
         } 
        }.execute(1);      
       } 
      }); 
} 

    public void executeSSHcommand(){ 
     String user = "xxx"; 
     String password = "xxx"; 
     String host = "192.168.xxx.xxx"; 
     int port=22; 
     try{ 

      JSch jsch = new JSch(); 
      Session session = jsch.getSession(user, host, port); 
      session.setPassword(password); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setTimeout(10000); 
      session.connect(); 
      ChannelExec channel = (ChannelExec)session.openChannel("exec"); 
      channel.setCommand("your ssh command here"); 
      channel.connect(); 
      channel.disconnect(); 
      // show success in UI with a snackbar alternatively use a toast 
      Snackbar.make(getActivity().findViewById(android.R.id.content), 
        "Success!", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
     catch(JSchException e){ 
      // show the error in the UI 
      Snackbar.make(getActivity().findViewById(android.R.id.content), 
        "Check WIFI or Server! Error : "+e.getMessage(), 
        Snackbar.LENGTH_LONG) 
        .setDuration(20000).setAction("Action", null).show(); 
     } 
    } 
} 

zusätzlich können Sie die Zeile "android: onClick =" löschen ONCLICK“" in Ihrem layout.xml

an meinem Projekt das funktioniert ganz gut auch ohne Verzögerung. von Fluch brauchen Sie Internet-Erlaubnis in der Manifest-Datei. aber ich denke, dass diese Erlaubnis sofort beim Start der Anwendung gewährt wird.
hoffe es hilft, manchmal kleine Dinge machen einen Unterschied.

freundlichen Grüßen
chwzr

+0

Dank! Ich habe dieses Projekt aufgrund dieses Problems zur Ruhe gebracht. Nach so langer Zeit werde ich es wieder aufleben lassen, hahaha. –

+0

Sie können die Verbindung nicht unmittelbar nach dem Verbinden/Starten des Befehls trennen. Sie möchten auf den Abschluss des Befehls warten, da er sonst nicht abgeschlossen wird. Siehe [Laufender Befehl über den Kanal "exec" mit JSch gibt keine Ausgabe zurück] (https://stackoverflow.com/questions/36380274/running-command-using-exec-channel-with-jsch-does-not-return- Any-Ausgabe) –

Verwandte Themen