JSCH SSH Verbindung, wie dauerhaft verbunden bleiben

  • Antworten:6
Frank579
  • Forum-Beiträge: 4

18.08.2019, 12:23:50 via Website

Hallo zusammen,

muss direkt zugeben bin noch relativ neu im Bereich Java und Android

ich bin gerade dabei mir eine App zu schreiben um auf meine Raspi per ssh Befehle auszuführen, funktioniert auch schon soweit ...

bisher habe ich 1Button der die Verbindung per JSCH aufbaut und den Befehl ausführt, das Klappt schon mal

Jetzt würde ich gerne weitere Buttons einfügen die andere befehle ausführen, möchte aber nicht jedes mal die Verbindung neu aufbauen,Befehl senden und schliessen., oder muss/sollte ich das ???

Mir schwebt vor das beim öffnen der App die Verbindung hergestellt wird , evtl. sogar über einen separaten Button , mal schauen ... und dann je nach dem welchen Button ich drücke den entsprechenden Befehl senden.

An dem Punkt bräuchte ich mal ein Paar Anregungen / Tips wie ich das am besten hin bekomme.

Vielen Dank für eure Hilfe

— geändert am 18.08.2019, 12:44:36 durch Moderator

Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.08.2019, 12:39:57 via Website

Hallo Frank,
herzlich wilkommen hier im Forum :)


Ich habe deinen Thread mal in den Entwicklerbereich geschoben.

Jesemal eine neue Verbindung aufzubauen macht in der Tat kein Sinn.
Ich würde das in einem extra Thread machen, welcher die Verbindung aufrecht erhält und asynchron Senden/Empfangen kann.

Zudem kommt es immer auf deinen Anwendungsfall an, ob eine SSH überhaupt sinvoll ist oder ob du doch lieber eine WebApi über http nutzen könntest.
Brauchst du spezielle features von SSH? Diese kann ein WebServer auch ausführen.
Zudem: Willst du die App am ende außerhalb deines Heimnetzes nutzen können?

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren
Frank579
  • Forum-Beiträge: 4

18.08.2019, 12:54:40 via Website

Hallo,

Zum Anwendungsfall kann ich dir sagen das ich auf meinem Raspi diverse Programme ausführen möchte ...

und JA soll auch von unterwegs möglich sein, wobei ich einen VPN Tunnel auf dem Handy zu meinen NW habe, also ich dann ja auch "im Heimnetzwerk" bin.

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

18.08.2019, 13:02:51 via Website

Ok per VPN geht das natürlich, wobei ich im allgemeinen eher WebApi einsetze, aber das bleibt ja jedem selbst überlassen ;)

Schau dir mal an wie Threads funktionieren und wie du Daten in ein Thread übergibt bzw. Antworten wieder raus bekommst. Damit müsste sich das schon lösen lassen.
Für denn Fall dass du SSH Antworten auch anzeigen willst, musst du diese evtl, den ensprechenden "Sendebefehlen" zuordnen, damit du weißt wie die Antwort zu verarbeiten ist.

— geändert am 18.08.2019, 13:03:02

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Frank579
Kommentieren
Frank579
  • Forum-Beiträge: 4

18.08.2019, 13:18:35 via Website

Danke für den Tip, werde ich mir mal anschauen :)
Das mit den Antworten kommt dann evtl. später mal dazu, Step by Step :D erst mal das eine hin bekommen dann kommt der Luxus (silly)

Hilfreich?
Kommentieren
Frank579
  • Forum-Beiträge: 4

19.08.2019, 12:34:09 via Website

Hallöchen ich schon wieder ,

habe gestern versucht mich in das Thema Threads / Handler einzulesen komme aber einfach nicht weiter. :(
kannst du mir vielleicht nochmal etwas Starthilfe geben :)

bin schon ein ganzes Stück gekommen Komme aber einfach nicht an die datebn aus dem JSCH dran habe einiges versucht, bin ratlos (thinking)
hänge euch einfach mal den Code (was noch übrig ist) an vileich habt ihr ja einen ansatz für mich ....

Das verbinden klappt mit rückmeldung :) jetzt möchte ich erst mal über den 2. butten wieder trennen, denke wenn das funktioniert komme ich auch mit den befehlen weiter, hoffe ich (angel)

    final Thread Verbinden = new Thread(new Runnable() {
        @Override
        public void run() {

      Session session;
        JSch jsch;
        try {
            jsch = new JSch();
            session = jsch.getSession("pi", "192.168.2.11", 22);
            session.setPassword("+++++");
            Properties prop = new Properties();
            prop.put("StrictHostKeyChecking", "no");
            session.setConfig(prop);
            session.connect();
            if (session.isConnected()) {
                System.out.println(this.getClass().getSimpleName() + " CONNECTED");
            } else {
                System.out.println(this.getClass().getSimpleName() + " NOT CONNECTED");
            }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    );

findViewById(R.id.verbinden).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread (Verbinden).start();
};
});

findViewById(R.id.trennen).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
   session.disconnect();

    }
}
);
}

}

Hilfreich?
Kommentieren
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

19.08.2019, 12:56:08 via Website

Hallo Frank,

zuerstmal würde ich den Thread in eine eigene Klasse aulagern, bringt dir mehr übersicht.
Zudem musst du schauen ob du am Ende nur SSH Anfragen in einem Thread ausführen musst oder die komplette Session Threaded sein muss.

Allerdings hätte ich sowas in der Art probiert:

class SSH{

private Session session;

public boolean connect(string server,strung user,string pw){
//login SSH and store Session in this.session -- use Thread if it has to be threaded
}

public boolean disconnect(){
//disconnect session -- if needed use Thread
}


//und dann dir MEthoden schreiben, die mit der privaten Session arbeiten, und teilweise immer in Trheads ausgeführt werden.
//Für Antworten aus dem SSH, benötigst du evtl. Callbackt und ein invoke in den MainThread.
//Alternativ: AsyncTasks für kurze Asynchrone (Thread) ausführungen.


}

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Kommentieren