SSH sessions

Doki

Neues Mitglied
Hallo zusammen,

ich hoffe ihr könnt mir weiterhelfen.
ich habe nur wenig Erfahrung mit Java.

ich will per Java über SSH aufs Raspberry zugreifen. (Commands schicken)
Das funktioniert auch soweit. Verbindung kann ich aufbauen und einzelne Befehle schicken.

Mein Ziel: Swingoberfläche bauen (kein Problem, hab ich schon oft gemacht)
Auf dieser GUI befinden sich Keylistener, die bei Tastenschlag bestimmte Methoden aufrufen sollen (hab ich auch schon)

Nur hab ich keine Ahnung, wie ich per diesen aufgerufenen Methoden einen Befehl per SSH schicken soll.

Mein SSH Zugriff funktioniert folgendermaßen:


  • connection aufbauen. (mit zugangsdaten)
  • Session starten.
  • Befehl schicken.
  • session beenden.
  • connection schließen.

Natürlich könnte ich einfach die gesammte Prozedur in die Methoden schreiben, aber ich will nicht bei jeden tastenschlag einen neue connection aufbauen usw...

code von Ganymed SSH-2

[Java]
package control;

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 Basic
{
public static void main(String[] args)
{
String hostname = "192.168.1.105";
String username = "pi";
String password = "ultrageheim";

try
{
/* Create a connection instance */

Connection conn = new Connection(hostname);

/* Now connect */

conn.connect();

/* Authenticate.
* If you get an IOException saying something like
* "Authentication method password not supported by the server at this stage."
* then please check the FAQ.
*/

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

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

/* Create a session */

Session sess = conn.openSession();

sess.execCommand("uname -a && date && uptime && who");

System.out.println("Here is some information about the remote host:");

/*
* This basic example does not handle stderr, which is sometimes dangerous
* (please read the FAQ).
*/

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);
}

/* Show exit status, if available (otherwise "null") */

System.out.println("ExitCode: " + sess.getExitStatus());

/* Close this session */

sess.close();

/* Close the connection */

conn.close();

}
catch (IOException e)
{
e.printStackTrace(System.err);
System.exit(2);
}
}


public void tastendruck(){ // wird bei tasten druck aufgerufen

sess.execCommand("sudo etwas... ");

}


public void tastendruck_2(){ // wird bei tasten2 druck aufgerufen

sess.execCommand("sudo etwas anderes.. ");

}


}


[/Java]


Ich hoffe ihr könnt mir helfen!

Vielen Dank! :)
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Wo ist denn das Problem? Folgender Vorschlag:

Du machst eine Proxy-Klasse für den Raspberry. Die Baut beim Instatiieren die Verbindung auf und schließt sie auf Wunsch wieder (bspw. via Closable).
In dieser Klasse definierst du dann eine Methode für jede Aktion, die der Raspberry ausführen kann.
Die GUI bekommt dann eine Referenz auf so ein Raspberry-Objekt und ruft dann die entsprechenden Methoden auf.
 

Doki

Neues Mitglied
Das Problem ist im Prinzip dass ich mich hiermit nicht so gut auskenne.

ich habs jetzt geschafft die Methode so aufzurufen, dass ich eine Session öffne und wieder schließe.

[Java]
public static void reboot(Session sess, Connection conn) throws IOException{ // wird bei tasten2 druck aufgerufen
sess = conn.openSession();
sess.execCommand("sudo reboot");

}

[/Java]

Wie kann ich diese Methode per Button aufrufen?
 
Zuletzt bearbeitet:

Tobse

Top Contributor
Du hast da gleich 2 dicke Fehler drin:

1. Die methode ist static.
Wenn du eine Verbindung und eine Session benutzen möchtest, um alle Befehle zu senden, musst du die Verbinung irgendwo speichern. Deshalb habe ich das Objekt vorgeschlagen.

2. Die Methode bekommt eine Session und eine Connection. Und das erste was sie macht, ist, die Session zu überschreiben? Denk nochmal über die Parameter nach.

Vielleicht ist dashier verständlicher:

Java:
class Raspberry {
    private Session mySession;

    public Raspberry(Session session) {
        mySession = session;
    }

    public void reboot()
        throws IOException {
        mySession.execCommand("sudo reboot");
    }
}

// GUI
class MyFrame extends JFrame {
    private Raspberry pi;
    public MyFrame()
    {
        pi = new Raspberry(...);

        //...
        button.addActionListener((e) -> pi.reboot());
    }
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
K associate collection with two open sessions Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben