SSH & JAVA

Résolu
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012 - 10 mai 2007 à 14:12
 sss&é - 6 févr. 2016 à 22:40
bonjour,
je suis debutant, et je veux savoir comment a partir d'une application developer en java sous windows peut ouvrir une session SSH pour executer une commande
Merc pour vos aides

40 réponses

alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
23 mai 2007 à 12:11
j'ai bien vu ce site et j'ai bien lu la definition j'ai eu confusion au depart j'ai cru que je dois ouvrir un shell de ma machine windows sur machine linux et comme ca je peux aussi envoyer un fichier de machine win vers lin??
je crois que ce si est impossible est ce ce c'est est juste ou pas
ssh me permet seulement d'executer des commandes sur unix en local!!!
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 12:31
Salut,

oui en effet ssh ne te permet pas d'envoyer des fichiers ou de reçevoir des fichier il permet juste d'optenir une connection securisé sur le pc distant histoire de pouvoir l'administrer comme si tu etais devant.
Maintenant pour ce qui est de l'envoi de fichier il faut utilier SCP(Secure Copy Protocol) ou encore SFTP (SSH File Transfer Protocol), qui sont disponible dans l'api que tu utilises.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
23 mai 2007 à 12:44
merci pour cette explication,
mais comment je sais que l'api que j'utilise possede scp ??..
j'ai eu confusion car j'ai deux API (la premiere ganymed-ssh2 et la deuxieme Minterm ) la quelle je dois utiliser
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 12:48
Salut,

je l'ai vu dans l'api de ganymed l'autre je n'ai pas regardé en detail

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
23 mai 2007 à 13:02
ok je prend  pour ganymed je crois la classe SCPClient  mais il ya pas un exemple comment je l'uitilse et cette classe vraiment permet de copier un fichier exitant sous windows vers machne linux???..
sachant que linux a ssh par defaut et j'ai installe sous windows un serveurssh :opensshd
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 13:33
Salut,

cherche bien dans les codes d'exemple il montre comment faire.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
23 mai 2007 à 16:32
merci pou votre aide et votre encouragement j'ai bien cherche et j'ai trouve, j'ai la tester en connectant deux machine (unix & window) et le fichier est bien transferer  a l'aide de la classe scpclient. C'est genial!!!!

 j'ai voulu executer ce script a partir de ma classe *  mais j'ai des problem de car le fichier a ete ecrit sous window et peut etre il ya creation des  caractere speciaux non comprehensible par unix pas  donc je dois executer commande dos2unix
 Mon probleme comment executer une commande
* voici mon code
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.SCPClient;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.StreamGobbler;

public class Basic
{
    public static void main(String[] args)
    {
        String hostname = "150.130.120.1";
        String username = "alias100";
        String password = "alias100";

        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);
            }
            //******ICI avant de sortir
            //on doit copy fichier de windows vers linux
            SCPClient C=new SCPClient(conn);
            C.put("C:\\test.sh", "/root/");   
            //OK sa marche
            //executer 2 commande a distance
            //1 conversion probleme de caractere dos2unix quelle classe j'uilise
           
            //2 executer script
       
            /* 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);
        }
    }
}

Merci pour vos aides
0
bonjour, je veux lire ficher via le serveur ssh en java ou copier comment faire merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 17:22
Salut,

faut que tu le fasse en 2 temps :

1 tu envois le fichier
2 tu fais un loggin ssh et tu lance la commande pour ce faire regarde le code d'exemple 'Basic.java' et surtout le passage ou il fait :
//ici il execute des commandes sur le poste serveur donc adapte et n'hesite pas à le faire en plusieurs fois
sess.execCommand("uname -a && date && uptime && who");

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 20:00
Salut,

je viens de penser, sinon tu peux faire, dans un premier temps une connexion ssh sur le serveur, et ensuite faire un scp depuis le serveur sur le poste client et faire le reste des commandes sur le serveur...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
23 mai 2007 à 20:12
oui apres avoir fait la copie j'ai ajouter ce code
//on doit copy fichier de windows vers linux
            SCPClient C=new SCPClient(conn);
            C.put("C:\\test.sh", "/root/");   
            //OK sa marche
            //executer 2 commande a distance
            //1 conversion probleme de caractere dos2unix quelle classe j'uilise
        sess.execCommand("dos2unix /root/test.sh");

mais il m'affiche en exception a remote execute has already start!!
   
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 20:21
Salut,

dans ce cas essais soit de :
 1 - combiner les commandes (voir explication ci-après)
 2 - fermer la com et la reouvrir ....

pour l'explication des conditions sur les commandes :

si tu fais 'uname -a && date', la commande 2 (soit date) ne sera executé seulement et seulement si la commande 1 (soir uname -a) renvoi 0 (équivalent à System.exit(0)) soit qu'il n'y ai pas eu d'erreurs.

si tu fais 'uname -a || date', la commande 2 (soit date) ne
sera executé seulement et seulement si la commande 1 (soir uname -a)
renvoi une valeur différente de 0 soit que la commande 1 soit sortie en erreur.

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
23 mai 2007 à 20:30
combiner les commandes avec && est une bonne idee mais si Cmd1 doit etre bien excuter avant de passer a cmd2 le cas de || si cmd1 contient erreur il y'aura pas execution de cmd2???
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
23 mai 2007 à 20:38
Salut,

tu peux utiliser la commande sleep si tu as besoin d'attendre (oublie pas que sous unix le sigle '&' (seul) à la fin d'une commande execute celle ci en processe détaché et n'attendra pas la fin de l'execution)

sinon apres il reste l'option : coté client tu génère un script shell à la volée que fais tout ce que tu veux, tu l'envoi via scp au serveur ou tu le recup depui le serveur via scp (ou sftp biensur) et ensuite tu execute coté serveur, bon je sais que c'est lourd mais bon ...

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
24 mai 2007 à 08:20
bonjour,
je crois que la partie de code dans Basic sa ne sert a rien c'est qoui son utilite??
    /* 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);
            }

ceci j'ai pas compris
Mais une chose que j'ai oublie lorsque je connecte ma linux avec wind il entre avec le compte root comment je le donne un droit specifique avec sudo???
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 mai 2007 à 09:05
le code basic execute des commandes coté serveur et les li coté client.... sérieux arrete toi là et ne va surtout pas plus loing si tu ne comprend meme pas la classe Basic qui est surper basique ......................
pour sudo ref : 'man sudo' ou encore 'google sudo'

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
24 mai 2007 à 09:14
ok ne vous fachier pas ;;;vous etes tres gentil j'ai consulte le google avant d'ecrir ma question bon pour sudo je vais voir forum linux,
Mais svp svp, le code que j'ai ecrit sa sert vraiment a qoui pourqoui il recupere la sortie stdout de session???
Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 mai 2007 à 09:37
Salut,

rassure toi je ne me fache pas.... sinon oui c'est bien pour recup stdout et te permettre de voir les resultats des commandes que tu passe au serveur ssh(commandes qui sont propre à l'os sur le quel ce trouve le serveur)

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
24 mai 2007 à 12:11
Merci pour votre encouragement,
mon code marche bien sur machine linux envoie copie de fichier  de mon appli vers machine linux et l'execute bien
C'est formidable

Pour windows, je dois bien configuere  mon serveur sshd pour qu'il n'accepte aucune connexion qu'avec login et mot de passe

Mais avec la meme classe basic est ce que je peux envoyer mon file *.bat et excuter en  dos???

Merci
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
24 mai 2007 à 12:30
Salut,

je ,e pense pas il te faut passer par une classe qui envoi des fichiers et non des commandes en mode connecté

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

OoWORAoO
0
alias100 Messages postés 129 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 2 décembre 2012
25 mai 2007 à 09:38
Salut,
j'ai pas compris votre reponse:
"il faut passer par une classe qui envoi des fichiers et non des commandes en mode connecté"

pour cas linux , j'ai envoye fichier avec scp et j'ai met les commandes dans l'instruction sess.execCommand("who && chmod 777 test.sh");
et ca marche l'execution des commandes

Mais pour windows (qui contient un serveur ssh); j'ai met instruction suivante
    SCPClient C=new SCPClient(conn);
   
    C.put("C:\\test.txt", "C:\");       

    // Creer une session

    Session sess = conn.openSession();

    sess.execCommand("dir dossier");

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

il affiche erreur dans scp?? est ce qu'elle ne fonctionne pas entre deux windows???
Merci pour vous aides
0
Rejoignez-nous