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

Réseau C Discussion :

Commande System() via socket


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Commande System() via socket
    Bonjour à tous, est-il possible via une socket d'effectuer des commandes system() ?
    Je m'explique: je cherche à envoyer une commande via un client, que le serveur recupererai dans une variable pour ensuite l'exectuer via la fonction system() puis renvoyer le resultat au client ?

    Merci d'avance

  2. #2
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    si j'ai bien compris tu veux lancer des commandes à distance.

    Tu peux utiliser une librairie comme libssh par exemple.

    Cependant, il n'est pas obligatoire de programmer un client et un serveur spécifique (surtout le serveur), Avec ssh tu peux utiliser par exemple exécuter une commande distante de la façon suivante:

    ssh -l <user> <machine> "<commande distante>"

    http://www.linuxhowtos.org/Tips%20an...e_commands.htm
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  3. #3
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Pour être un peu plus précis, je cherche à rajouter à mon serveur d'authentification déjà créer, quelques fonctions simple qui permettrai de pouvoir récupérer des informations sur le serveur.

    A ce stade le client envoi un login et un mot de passe au serveur, qui vérifient dans son annuaire, puis renvoi au client si l'authent est ok ou non. Le client s'arrète ensuite.

    J'aimerai que si l'authentification soit ok, le client puisse envoyer une commande au serveur qui puissent etre géré via system() puis renvoyé au client.

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Par quel protocole passe tu, difficile de devenir précis sans cette info?

    Dans le principe pour la suite tu devra envoyer une requête contenant :
    - un moyen pour le serveur d'identifier que tu veux exécuter une commande distante
    - la commande a exécuter.

    la réponse devra contenir le resultat.

    le call-flow devrai ressembler a ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Client                            Serveur
     |<---- connexion de la socket ---->|
     |                                  |
     |-- Requete Authent (login,mdp) -->| 
     |<-- Réponse Authent Ok -----------|
     |                                  |
     |-- Requete CMD (commande)-------->|
     |<-- Réponse CMD (resultat)--------|
     |
    Cela nécessitera de modifier le code du serveur/client pour gérer cette nouvelle requête.
    quelque part dans le code du client/serveur tu as l'exemple avec la requête d'authent, il te suffit de t'en inspirer pour créer et gérer la nouvelle requête.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #5
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci pour ton aide,

    J'utilise TCP dans un tunnel SSL.

    Apres tes conseils voici le détails fonctionnel :

    1/ Lorsque le client reçoi du serveur "Login OK" on propose à l'utilisateur de taper une commande : printf("veuillez taper une command: ");

    2/ On stock ce que l'utilisateur entre dans une variable : char command[12]
    Puis on l'envoi au serveur : SSL_write(ssl,command,strlen(command)); si j'ai bien compris

    3/ Le serveur la récupère, la stck dans une variable : char command[12]

    4/ Puis à l'aide de la commande system("command") on l'execute

    5/ Il ne reste plus qu'à mettre le résultat de la commande dans une variable que l'on envoi au client : char retourcommand[8096]

    Peux-tu me dire ce que tu en penses ?

    Est-il possible avec system() de rediriger la sortie standard directement vers une variable ou dois-je passer par la création d'un fichier ?


    J'ai trouvé ces paramètres là avec la commande system() :
    A > fichier Exécute la commande A et redirige sa sortie standard (stdout) dans fichier en écrasant son contenu ou en créant fichier si celui-ci n'existe pas
    A | B Exécute A et envoie le contenu de sa sortie standard dans l'entrée standard de B

  6. #6
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    petit programme pour tester est-ce que cela pourrait marcher comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char mavariable[12]
    File * fichier
     
    int main ()
    File * fichier
    fichier=fopen("command.txt","w")
    printf("entrez une commande :");
    scanf("%s,mavariable")
    system("mavariable > command.txt");
    fclose (fichier);
     
    return 0;

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par pedrolastiko Voir le message
    2/ On stock ce que l'utilisateur entre dans une variable : char command[12]
    11 caractères pour une commande, cela ne laisse pas beaucoup de place ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    a la place d'utiliser system() je te conseille de jeter un oeil sur popen()/pclose() pour récupérer directement l'exécution de ta commande dans ton programme.

    http://www.linux-kheops.com/doc/man/...3/popen.3.html

    Exemple exécutant la commande ls récupéré de
    http://www.opengroup.org/onlinepubs/...ons/popen.html
    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
     
    #include <stdio.h>
    ...
     
    FILE *fp;
    int status;
    char path[PATH_MAX];
     
    fp = popen("ls *", "r"); 
    if (fp == NULL)
        /* Handle error */;
     
     
    while (fgets(path, PATH_MAX, fp) != NULL)
        printf("%s", path);
     
     
    status = pclose(fp);
    if (status == -1) {
        /* Error reported by pclose() */
        ...
    } else {
        /* Use macros described under wait() to inspect `status' in order
           to determine success/failure of command executed by popen() */
        ...
    }
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  9. #9
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    11 caractères pour une commande, cela ne laisse pas beaucoup de place ...
    Je pensait à des petites commandes du type

    uname, ps, ...

    mais je vais effectivement agrandir un peu

    Merci !

  10. #10
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    je ne suis pas certain que ce soit très saint comme façon de faire....
    Citation Envoyé par pedrolastiko Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char mavariable[12]
    File * fichier
     
    int main ()
    File * fichier
    fichier=fopen("command.txt","w") /* Tu ouvre un fichier en écriture */
    printf("entrez une commande :");
    scanf("%s,mavariable")
    system("mavariable > command.txt"); /* tu écrase le fichier ouvert en écriture */
    fclose (fichier);
     
    return 0;
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  11. #11
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Re-Salut !!
    J'ai trouvé un exemple de fonction popen :
    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
     
    #include <stdio.h>
     
    main()
    {
      FILE *fp;
      char line[130];			/* line of data from unix command*/
     
      fp = popen("ls -l", "r");		/* Issue the command.		*/
     
    					/* Read a line			*/
      while ( fgets( line, sizeof line, fp))
      {
        printf("%s", line);
      }
      pclose(fp);
    }
    J'ai du coup plusieur question:

    1/ Ou se crée le fichier (son nom ?) qui va recevoir le resultat de la fonction popen ? Ne dois-je pas rajouter un FP = fichier.txt quelque part ?

    2/ Est-il possible d'envoyer la commande directement via la socket ? ou dois-je lire le fichier , puis envoyer le contenu du fichier par la socket ??

  12. #12
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par pedrolastiko Voir le message
    Re-Salut !!
    J'ai trouvé un exemple de fonction popen :
    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
     
    #include <stdio.h>
     
    main()
    {
      FILE *fp;
      char line[130];			/* line of data from unix command*/
     
      fp = popen("ls -l", "r");		/* Issue the command.		*/
     
    					/* Read a line			*/
      while ( fgets( line, sizeof line, fp))
      {
        printf("%s", line);
      }
      pclose(fp);
    }
    J'ai du coup plusieur question:

    1/ Ou se crée le fichier (son nom ?) qui va recevoir le resultat de la fonction popen ? Ne dois-je pas rajouter un FP = fichier.txt quelque part ?
    Pas de fichier au sens propre du terme mais un pipe, l'exemple que tu montre est censé tourner tel-que.

    Sous unix/linux beacoup d'Entrées/Sorties sont gérés comme des fichiers dans le sens ou tu as les fonctions suivantes
    • open
    • read/write
    • close


    Dans l'exemple que tu as, la lecture se fait grâce à la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      while ( fgets( line, sizeof line, fp))
    2/ Est-il possible d'envoyer la commande directement via la socket ? ou dois-je lire le fichier , puis envoyer le contenu du fichier par la socket ??
    A toi de décider si tu souhaite exécuter la commande complétement avant d'envoyer le résultat ou si tu souhaite
    l'envoyer morceaux par morceaux.

    tu pourrais très bien faire pour l'envoi par morceaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      while ( fgets( line, sizeof line, fp))
          send(.....,line,...) /* envoi sur la socket */
    ou bien stocker chaque ligne dans un tableau et les retourner quand tu sais que l'a commande s'est bien terminée.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  13. #13
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Voici ce que j'ai fait :

    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
    #include <stdio.h> 
    #include <stdlib.h> 
     
     
    int main()
    {
    	FILE *fp;
    	char line[1000];	/*line of data from unix command*/		
    	char command[100];	/*line of user entrer command*/
     
    	printf("Veuillez saisir une commande: \n");
            scanf("%s", (char * ) command);
     
    	fp = popen(command, "r");/* Issue the command.*/
     
    	while ( fgets( line, sizeof line, fp))/*Read a line*/
    	{
    		printf("%s", line);
    	}
    	pclose(fp);
     
    	return EXIT_SUCCESS; // return 0; 
    }
    Cela fonctionne parfaitement enfin presque car carcatère "espace" n'est pas pris en compte ...J'obtient la meme réponse avec "ls" et "ls -l".

    "char" gère bien le caractère espace non ????

    En faisait des printf de la variable "command" je m"apercoit qu'elle est tronqué au niveau de l'espace ???

  14. #14
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par pedrolastiko Voir le message
    Voici ce que j'ai fait :

    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
    #include <stdio.h> 
    #include <stdlib.h> 
     
     
    int main()
    {
    	FILE *fp;
    	char line[1000];	/*line of data from unix command*/		
    	char command[100];	/*line of user entrer command*/
     
    	printf("Veuillez saisir une commande: \n");
            scanf("%s", (char * ) command);
     
    	fp = popen(command, "r");/* Issue the command.*/
     
    	while ( fgets( line, sizeof line, fp))/*Read a line*/
    	{
    		printf("%s", line);
    	}
    	pclose(fp);
     
    	return EXIT_SUCCESS; // return 0; 
    }
    Cela fonctionne parfaitement enfin presque car carcatère "espace" n'est pas pris en compte ...J'obtient la meme réponse avec "ls" et "ls -l".

    "char" gère bien le caractère espace non ????

    En faisait des printf de la variable "command" je m"apercoit qu'elle est tronqué au niveau de l'espace ???
    l'espace est considéré comme un séparateur pour scanf.

    tu peux aussi utiliser fgets à la place de scanf pour ne pas avoir les problèmes d'espaces lors de la lecture de la commande.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fgets(command,sizeof(command),stdin);
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  15. #15
    Futur Membre du Club
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Merci a toi Jabbounet pour ton aide t'es un chef !!!

    Petite dernière question:

    voici le code (coté serveur) que j'ai réalisé grace a toi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SSL_read(ssl,bufcommand, sizeof(bufcommand) -1); //Lecture de la commande envoyé par le client
    printf("Commande recue: %s \n",bufcommand); //affichage de cette commande
    fp = popen(bufcommand, "r");/* Issue the command.*/
    while (fgets(line, sizeof line, fp))/*Read a line*/
    {
    SSL_write(ssl,line,sizeof(line) - 1); // Envoi resultat commande	
    printf("%s",line); //affichage sur le serveur du résultat de la commande
    }
    printf("\n");					
    pclose(fp);
    Le probleme est que sur le client je ne recois que la première ligne de la fonction envoyée.
    J'ai essayer de mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SSL_write(ssl,fp,sizeof(fp) - 1);
    mais de cette façon cela ne fonctionne pas non plus les caractère qui arrivent au client son illisible ..

    Je pense que j'ai raté quelque chose là ....


    pour info le code coté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    printf("Veuillez entrez une commande : \n> "); //TESTSHELL
    fgetc(stdin);
    fgets(command,sizeof(command),stdin); //TESTSHELL on stock la commande de l'utilisateur
    SSL_write(ssl,command,strlen(command)); //TESTSHELL on envoi la commande au serveur
    SSL_read(ssl,retourcommand,8096); //TESTSHELL on recupère le retour de la commande du serveur qu'on stoque dans retourcommand
    printf("%s\n",retourcommand); //TESTSHELL on affiche ce que le serveur a envoye

  16. #16
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    je pense qu'il te faut autant de SSSL_read coté client que de SSL_write coté serveur

    Tu as un boucle du coté de ton serveur que l'on ne retrouve pas coté client.
    le tout sera de savoir quand s'arrête la boucle coté client.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2011, 14h36
  2. [System.Net.Sockets] Connexion via un proxy
    Par kendras dans le forum Développement
    Réponses: 15
    Dernier message: 17/02/2009, 14h52
  3. Réponses: 7
    Dernier message: 11/07/2007, 20h10
  4. Prblème avec la commande system
    Par AnneOlga dans le forum C++Builder
    Réponses: 8
    Dernier message: 04/03/2004, 16h05
  5. La commande systeme
    Par sunshine33 dans le forum MFC
    Réponses: 11
    Dernier message: 13/01/2004, 11h34

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