genestete SSH-Verbindung

Goldfish

Bekanntes Mitglied
Hi Leute, ich hänge gerade ein wenig, da ich nicht rauskriege, wie bzw. ob ich sowas überhaupt machen kann.
Ich will mich mit Server B verbinden, welcher durch Firewalls abgeschirmt ist und nur eine Verbindung von Server A aus zulässt. Mit Server A hingegen kann ich mich von überall aus verbinden. Meine Frage also, kann ich eine solche Verbindung mittels Jsch oder ähnlichem herstellen und automatisiert ein einfaches "ls" auf dem Server ausführen?
Ich habs hinbekommen von Server A aus einen ShellChannel aufzumachen, welcher allerdings keine automatisierten Eingaben annimmt... ich hatte den System.out als OutputStream an den Channel gebunden, aber ein System.out.println wurde dann vom Channel ignoriert. Lediglich Tastatureingaben wurden angenommen.

Wäre super, wenn jemand ne Ahnung hat, wie ich das einfach in möglichst wenig Codezeilen bewerkstelligen kann.
 
Ist nur eine Idee, kann also totaler Blödsinn sein.
Server A ist nicht zufällig ein Linux und Server B ein Windows System? D.h. es gibt hier unterschiedliche Interpretationen des Zeilenumbruchs?
 
ne. Darum gehts leider nicht.
Server A und B sind beide Linux.
Problem ist nur, wie verbinde ich mich mittels java mit Server B aus einer Session, die mit Server A verbunden ist.
 
Okay, ich hab einen Weg gefunden, das ganze zu bewerkstelligen. Hab dabei aber ein weiteres Problem bekommen, welches ich lösen muss, damit das Problem als gelöst gilt.

Ich habs jetzt geschafft, mittels ByteArrayInputStream die KOmmandos an Server B zu schicken. die Ausgabe bekomme ich natürlich in einem Outputstream und die Ausgabe ist auch korrekt, wenn ich den OutputStream des Channels an System.out binde.
Aber wie zur Hölle lese ich, was in einen Outputstream geschrieben wird. Der Witz ist ja, dass die KLasse ja nur zum Schreiben gedacht ist...

Wenn ichs folgendermaßen mache, kommt leider nur Blödsinn dabei raus.

Java:
            byte[] bytes = new String("ssh myServer \n ls apoRundschreiben/send \n").getBytes();
            InputStream input = new ByteArrayInputStream(bytes);
            channel.setInputStream(input);
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            output.writeTo(System.out);
            channel.setOutputStream(output);
            channel.start();
            input = new ByteArrayInputStream(output.toByteArray());

            char c;
            int counter = 0;
            while ( (c = (char)input.read() ) != -1 && counter < 1000) {
                System.out.print(c);
                counter ++;
            }

Die Ausgabe sieht dann leider aus, wie hier

Code:
			￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿￿
 
Hab die Lösung gefunden.
Nagut, nicht ich, sondern mein Arbeitskollege und ich haben sie zusammen nach einem Brainstorming entdeckt.
Für alle die interessiert sind, mit JSCH kann man die Ausgabe über folgenden Weg bekommen. Das ganze ist zwar nicht schön formatiert, weshalb man schauen muss, wie man mit der Eingabe zurecht kommt, aber es geht zumindest.

Java:
ChannelShell channel = getNewChannel("shell");
        InputStream in = null;
        try {
            String cmd = "ssh myServer \n ls myDir \n";
            ByteArrayInputStream input = new ByteArrayInputStream(cmd.getBytes()) ;
            channel.setInputStream(input);
            channel.start();
            in = channel.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSchException e) {
            e.printStackTrace();
        }

        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String line;
        try {
            while (( line = br.readLine() ) != null) {
                System.out.println(line );
            }
        } catch (IOException e) {
            e.printStackTrace();
        }  
        connection.closeConnection();
 

Zurück
Oben