Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problemi con windows e jsch

    ciao!

    per connettermi a dei server linux attraverso ssh, usando java, ho usato la lirebria JSCH.
    se avvio il programma da linux o mac, non ho problemi.
    se invece lo avvio da windows, ho il problema che vedere in immagine (ultima riga).
    ho provato sia dal prompt classico, che da power shell.
    il pc ha windows 7 installato.
    in sostanza su windows, non sono in grado di usarlo.

    secondo voi quale può essere il problema?

    vi scrivo anche il codice per la connessione:
    codice:
    public class SshConnection {
    
        private Session session;
        private ChannelShell channel;
    
        public void getConnection(String user, String host, String password, int port) throws InterruptedException, JSchException {
            JSch jsch = new JSch();
            UserInfo ui = new MyUserInfo();
            session = jsch.getSession(user, host, port);
            session.setUserInfo(ui);
            session.setPassword(password);
            session.connect();
            channel = (ChannelShell) session.openChannel("shell");
            channel.setInputStream(System.in);
            channel.setOutputStream(System.out);
            channel.connect(3000);
            while (true) {
                if (channel.isClosed()) {
                    System.exit(channel.getExitStatus());
                } else {
                    Thread.sleep(1000);
                }
            }
        }
    
        public void setDisconnection() {
            channel.disconnect();
            session.disconnect();
        }
    }
    Immagini allegate Immagini allegate

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    se invece lo avvio da windows, ho il problema che vedere in immagine (ultima riga).
    Quelle sequenze di caratteri che vedi (ultima riga di output) sono le ben note sequenze di escape ANSI (ECMA-48 e altri).
    (http://en.wikipedia.org/w/index.php?...SI_escape_code)

    Sui Linux sono gestite nativamente dalla console. Su Windows no.

    Non conosco la JSch, ma puoi vedere questa ricerca: https://www.google.it/#q=jsch+ansi+escape
    E troverai molto probabilmente delle indicazioni utili.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Quelle sequenze di caratteri che vedi (ultima riga di output) sono le ben note sequenze di escape ANSI (ECMA-48 e altri).
    (http://en.wikipedia.org/w/index.php?...SI_escape_code)

    Sui Linux sono gestite nativamente dalla console. Su Windows no.

    Non conosco la JSch, ma puoi vedere questa ricerca: https://www.google.it/#q=jsch+ansi+escape
    E troverai molto probabilmente delle indicazioni utili.
    ciao andbin!

    in sostanza consigliano di usare replaceAll:
    codice:
    reply = reply.replaceAll("\\e\\[[\\d;]*[^\\d;]","");
    però c'è una cosa che non capisco.
    l'output, da quanto mi sembra, mi arriva da questo riga:
    codice:
    channel.setOutputStream(System.out);
    quindi in sostanza dovrei fare il replaceAll su un PrintStream giusto?

  4. #4
    allora, ho provato banalmente così:
    codice:
    public class AnsiStream extends PrintStream {
    
        public AnsiStream(OutputStream out) {
            super(out);
        }
    
        @Override
        public void print(String s) {
            s.replaceAll("\\e\\[[\\d;]*[^\\d;]", "");
        }
    
    }
    e poi:
    codice:
    channel.setOutputStream(new AnsiStream(System.out));
    i caratteri di escape ANSI non sono comparsi.
    ma il programma, dopo le prime righe in output, è andato in crash.
    però penso possa essere la strada giusta, anche se non so il perchè del crash!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    l'output, da quanto mi sembra, mi arriva da questo riga:
    codice:
    channel.setOutputStream(System.out);
    quindi in sostanza dovrei fare il replaceAll su un PrintStream giusto?
    No. La questione è più complessa. Questa riga dice al channel di JSch di usare direttamente System.out. Quindi qualunque cosa faccia il channel, esso scriverà per conto suo su System.out e in sostanza vuol dire che tu non hai controllo di ciò che viene ricevuto e poi buttato lì sopra.

    Il problema comunque è anche un altro. Se da Windows ti connetti ad una macchina Linux ed essa manda in output (quindi JSch riceve) delle sequenze di escape e tu volessi/potessi buttarle via, la visualizzazione potrebbe non essere corretta. Finché si tratta di "colori", chissenefrega ma le sequenze di escape ECMA-48 contemplano anche cose più sofisticate del tipo "cancella una parte dello schermo" o "sposta il cursore una riga più sopra).

    Queste cose "dovresti" replicarle ma su Windows e solo ragionando in termini di standard-output non puoi farle.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  6. #6
    ok.
    ho più o meno capito ciò che intendi.
    ma non ho capito se una soluzione esisterebbe, e in caso su cosa dovrei dirigermi.

    Queste cose "dovresti" replicarle ma su Windows e solo ragionando in termini di standard-output non puoi farle.
    nello specifico mi rivolgo a questa frase.
    replicarle su windows, intendi replicare i caratteri di escape nel terminale?
    se non in termini di standard-output, su cosa dovrei rivolgere l'attenzione?
    giusto per capire se sia una cosa fattibile!

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    nello specifico mi rivolgo a questa frase.
    replicarle su windows, intendi replicare i caratteri di escape nel terminale?
    se non in termini di standard-output, su cosa dovrei rivolgere l'attenzione?
    giusto per capire se sia una cosa fattibile!
    Su Windows, a livello di applicazioni "native" esiste una sezione delle API Win32 dedicata al controllo a "basso" livello della console, ovvero funzioni per gestire i colori, posizionare il cursore dove si vuole ecc...
    Java non ha una API del genere ... troppo specifica. Però potrebbero esserci librerie Java che fanno uso del Java Native Interface per accedere su Windows alle Win32 API per gestire la console. E qualcosa mi pare di aver sentito in passato, prova a cercare.

    Questa però è solo una parte del problema. Tu dovresti gestire lo stream di dati che ricevi tramite SSH. Detto in altro modo: invece di passare al channel il System.out, si potrebbe passare un PrintStream "custom" che interpreta gli escape e sfrutta una API per accedere completamente alla console.

    Ora, fare tutto questo da zero è una gran noia (e impegno) .... non te lo auguro di certo. Spererei che magari esista qualcosa di già fatto, non so ... una estensione di JSch o una libreria esterna che implementa già questo fantomatico PrintStream "custom".

    La questione è complessa .... lo so.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  8. #8
    bhe farlo da zero mi risulterebbe impossibile in questo momento.
    un pò perchè non ho le competenze (lo ammetto) e molto perchè non ho il tempo per mettermici su.
    in più era un programmino per me, quindi perderci tempo per ora non mi è molto utile.

    se trovo qualcosa, lo scrivo qui.
    sennò mi toccherà lasciar perdere purtroppo!

    in tutti i casi, grazie per le delucidazioni!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.