Kotlin SSH Verbindung mit JSch

missy72

Bekanntes Mitglied
Guten Morgen,

Kann mir jemand sagen, warum meine Funktion beim zweiten Aufrufen in Zeile 8 immer hängen bleibt ?
Schon mal Danke.

Java:
 fun sshPrintDirectory(){

        channelExec.setCommand("pwd")
        val inputStream = channelExec.inputStream

        channelExec.connect()

        val result = inputStream.bufferedReader().use {
            it.readText() }

        println(result)

        inputStream.close()
        channelExec.disconnect()

    }
 
Ich kann der Beschreibung erst einmal nicht ganz folgen. Wann genau passiert was? Was ist der genaue Ablauf?

Wenn Du die Methode mehrfach aufrufst: In der Methode wird der channel disconnected. Ohne neue Verbindung wirst Du da kaum einen Befehl absetzen können.
 
Ich habe eine Klasse erstellt für die SSH Verbindung -> SSHConnection.
Bis jetzt habe ich drei Funktionen: sshOpen, sshPrintDirectory und sshClose.
In meiner Main erstelle ich ein ein Object der Klasse und rufe die Funktion sshOpen auf.
Um die Funktion erstmal zu teste rufe ich zwei mal nacheinander die Funktion sshPrintDirectory auf.
Beim ersten Mal, bekomme ich wie erwartet mein Verzeichnis zurück (PWD).
Dann rufe ich die Funktion sshPrintDirectory gleich noch mal auf, weiter nichts.
In der Zeile, in der ich mein Inputstream in der var result speichern möchte (Zeile 29), bleibt das Programm hängen. Dieses muss ich dann selbst stoppen.


Java:
class SSHConnection() {

    val jsch = JSch()
    lateinit var session: Session
    lateinit var channelExec: ChannelExec


    fun sshOpen(){

        val username = "root"
        val host     = "192.168.1.4"
        val port     = 22
        val password = "root"

        session = jsch.getSession(username, host, port)
        session.setConfig("StrictHostKeyChecking", "no")
        session.setPassword(password)
        session.connect()
        channelExec = session.openChannel("exec") as ChannelExec
    }

    fun sshPrintDirectory(){

        channelExec.setCommand("pwd")
        val inputStream = channelExec.inputStream

        channelExec.connect()
       
        val result = inputStream.bufferedReader().use {
            it.readText() }
        println("test")
        println(result)

        inputStream.close()
        channelExec.disconnect()

    }

    fun sshClose(){

        channelExec.disconnect()
        session.disconnect()
       
    }
 
Damit öffnest Du den Channel:
channelExec = session.openChannel("exec") as ChannelExec

Damit schließt Du den Channel:
channelExec.disconnect()

Du darfst bei sshPrintDirectory natürlich nicht den Channel schließen, denn sonst kann natürlich beim zweiten Aufruf damit nicht gearbeitet werden.
Du willst den Channel also nur im sshClose schließen.
 
Supi war doch ganz einfach.
Ich habe das channelExec.connect völlig fasch interpretiert. Ich dachte ich öffne und schließe den Channel immer wieder.
Zeile 35 gelöscht nun läuft alles.

Vielen Dank mal wieder.
 

Neue Themen


Zurück
Oben