IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Faire son propre InputStream pour Jsch


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2012
    Messages : 25
    Points : 46
    Points
    46
    Par défaut Faire son propre InputStream pour Jsch
    Bonjour à vous,
    je souhaite que mon programme envoie des commandes via SSH à mon serveur.
    Pour ça j'utilise la librairie Jsch avec l'exemple suivant que j'ai modifié à ma sauce pour que je puisse me connecter en rentrant juste mon mot de passe.
    Jusque là tout va bien, je peux naviguer sur mon serveur dans la console puisque l'entrée et la sortie sont gérées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    channel.setInputStream(System.in);
    channel.setOutputStream(System.out);
    Mais je voudrais mettre mon propre InputStream pour envoyer les commandes que je veux au shell.
    Donc j'ai fait ma classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    public class InputStreamSSH extends InputStream{
     
    	private volatile String input;
     
    	public InputStreamSSH(){
    		input = new String();
    	}
     
    	public int available() throws IOException{
    		return input.length();
    	}
     
    	@Override
    	public int read() throws IOException {
     
    		while(this.available() == 0){
    			try {
    				Thread.sleep(100);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    		int currentByte = input.getBytes()[0];
    		input = input.substring(1, input.length());
     
     
    		return currentByte;
     
    	}
     
    	public void write(String str){
    		input += str;
    	}
     
    	public boolean markSupported(){
    		return false;
    	}
     
     
    }
    en suivant la doc.
    Mais par exemple si j'essaye un "mkdir toast" rien ne se crée sur mon serveur (chemin bien vérifié).
    J'ai essayé en ajoutant le retour ligne et fin de ligne pour simuler la touche entrée, mais ça change rien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    final char CR = 13;
    final char FL = 10;
    return cmd + CR + FL;
    Ma classe InputStream est sûrement mal faîte..
    Ou j'ai oublié quelque chose ailleurs ?
    J'ai bien mit le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    channel.setInputStream(myInputStream);
    Et pour appeler write(String) de ma classe InputStream j'utilise un autre Thread.
    J'ai testé chaque méthode voir ses retours et de ce côté c'est bon.

    Merci d'avance de vos réponses, et si y'a une solution qui existe déjà et que j'ai loupé je veux bien la connaître, ou même si j'ai fait une erreur !
    Cordialement.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 794
    Points
    48 794
    Par défaut
    On ne fais jamais un new String en java, ça ne sert qu'à créer un objet inutile. Met directement la String que tu veux dedans, si t'as besoin d'une chaine vide:input ="";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(this.available() == 0){
    Il n'y a rien dans ton code qui fais que magiquement available va passer à autre chose que 0, cette boucle va juste boucler ad vitam.

    Comportement imprévisible. La méthode getByte() transforme la chaine en utilisant l'encodage par défaut de ta plateforme, ça peux vouloir être tout et n'importe quoi. On précise toujours l'encodage à utiliser explicitement.


    Si tu veux balancer des données dans un InputStream, utilise simplement PipedInputstream:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    PipedInputStream pis = new PipedInputStream();
    PipedOutputStream pos = new PipedOutputStream(pis);
    PrintStream ps = new PrintStream(pos,true,"UTF-8");
     
    channel.setOutputStream(System.out); // sortie du channel
    channel.setInputStream(pis); // entrée du channel
    channel.connect();
     
    pos.println("touch /tmp/test123");
    A noter que tu peux te simplifier encore plus la vie en utilisant la méthode getOutputStream du channel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    channel.setOutputStream(System.out); // sortie du channel
    PrintStream ps = new PrintStream(channel.getOutputStream(),true,"UTF-8"); // entrée du channel
    channel.connect();
    pos.println("touch /tmp/test123");

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Salut,


    Je dirais que tu ne redéfinies pas les méthode read(byte(]), et que l'implémentation par défaut ne doit pas bien fonctionner car ton read() ne retourne jamais -1...

    Sans même parler des objets temporaires créer un peu partout


    Mais surtout pourquoi s'embêter : les Piped(Input/Output)Stream permettent de faire cela simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PipedInputStream input = new PipedInputStream();
    channel.setInputStream(input);
     
    PipedOutputStream output = new PipedOutputStream(input);
    Tout ce qui est écrit dans "output" sera lu dans "input"...



    En plus tu peux l'englober dans un PrintStream pour l'utiliser plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PrintStream output = new PrintStream(PipedOutputStream(input), true);
     
    output.println("mkdir toast");

    a++

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2012
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2012
    Messages : 25
    Points : 46
    Points
    46
    Par défaut
    Je connaissais pas le PipedInputStream, merci pour vos commentaires

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Une heure pour faire son propre jeu vidéo !
    Par LittleWhite dans le forum Développement 2D, 3D et Jeux
    Réponses: 2
    Dernier message: 23/07/2013, 22h06
  2. Faire son propre serveur DNS?
    Par Death83 dans le forum Applications
    Réponses: 4
    Dernier message: 16/11/2006, 23h41
  3. [PHP-JS] Comment faire son propre BBcode
    Par Sniperman dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2006, 17h11
  4. Créer son propre éditeur pour un descendant de tpopupmenu
    Par sfpx dans le forum Composants VCL
    Réponses: 1
    Dernier message: 04/10/2005, 12h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo