Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Messages recommandés

Posté(e)

Salut,

 

Je recherche depuis un bon moment si il est possible d'envoyer une commande shell, par exemple ls via un appel système send() vers le serveur.

J'arrive bien à envoyer du texte mais pas une commande, y a t-il quelque chose de particulier à faire pour que le serveur puisse interpreter cette commande comme commande destinée au shell?

 

Nico

Posté(e)

C'est dans quel contexte ?!?

Quand tu dis que tu arrives à envoyer du texte, où s'affiche-t-il ?

As-tu programmé un client ET un serveur ? Juste un seul prog ? A quoi te connectes-tu ?

Tu peux utiliser un appel à un exec() (execl(), execlp(), execvp() ou execve(), celui que tu préfères !) pour faire exécuter ta commande à ton serveur...

Sinon, si tu ne cherches qu'à faire exécuter une commande à distance, regarde comment fonctionne rexec ou ssh...

Posté(e) (modifié)

En fait je me posais la question en voyant le prototype de send() où le second paramètre est un buffer et la quasi totalité des exemple que j'ai vu contiennent un champ texte uniquement.

 

Je me connecte à une autre machine sur le réseau, le but étant d'afficher le contenu d'un répertoire présent sur le serveur depuis une machine cliente en utilisant les sockets.

 

Je n'avais pas pensé aux commandes exec().

Donc théoriquement si je place une commande de ce type dans le buffer cela devrait fonctionner ?

 

 

Nico

Modifié par nico_be
Posté(e)

Non, ce n'est pas comme cela que ça fonctionne...

Le buffer te permet de faire parvenir du texte à un process éloigné.

Ce que ton process fait de ce texte dépend de la façon dont il est programmé.

Tu dois mettre au point un "protocole" entre ton client et ton serveur pour, soit faire exécuter tout ce que tu envoies comme texte, et récupérer le résultat de la commande en retour, soit envoyer un "top" à ton processus distant pour qu'il t'exécute un "ls" et te renvoie le résultat en retour (ou alors, tu lui envoies le nom du répertoire et il te répond avec son contenu...)

A toi de voir, a priori tu as carte blanche, non ?

Ce que tu envoies comme texte est totalement neutre. Tu pourrais même mettre un fragment de la mémoire dans le buffer si tu voulais :P

Posté(e)

Bon je pense que j'ai réussi à faire mon client, il est compilé, et j'ai mon exécutable...

 

Au niveau du serveur, j'ai quelques erreurs et warning à la compilation.

 

En relisant mon code, j'ai commencé à douter de cette ligne :

 

execl("/bin","ls","-l",NULL) > result.txt;

 

Je veux en fait exécuter la commande ls-l dans un processus fils que j'ai créé à cet effet et rediriger le résultat vers une fichier (result.txt)

 

Mon doute se porte sur la redirection, quand on est sur un shell je sais que ça fonctionne mais ici je suis dans un fichier C, est-ce toujours et si ce n'est pas le cas, comment dois-je faire ?

 

Nico

Posté(e)

tu fais ton execl() dans le source, tu compiles, et c'est le résultat de ton exécutable que tu devras rediriger (il me semble... enfin, vérifie qd même que le execl() conserve les stdin, stdout et stderr du processus père !)

  • 2 semaines après...
Posté(e)

Bon j'ai compilé, les 2 sockets communiquent entre eux ce qui est déjà pas mal, mais au niveau du execl je dois avoir un problème :

 

De cette façon j'ai carrément une erreur lors de la compil : execl("/bin","ls","-l",NULL) > result.txt;

 

Mais la redirection c'est le shell qui doit la faire, donc j'ai fait ça :

 

execl("/bin","ls","-l> result.txt",NULL); (j'ai essayé au préalable le fait de coller -l>result.txt dans un shell et ça fonctionne.

 

Maintenant j'ai plus d'erreur ça compile mais à l'éxécution j'ai un code d'erreur au niveau du waitpid qui est juste en dessous de l"execl et je suis sur que c'est du à l'execl (car le waitpid attend justement la mort du processus execl).

 

D'ailleurs après l'exécution du programme je suppose que je devrais retrouver le fichier result dans mon répertoire par défaut non ?

 

Alors si vous aviez une idée sur la manière de faire comprendre à execl que je veux rediriger le résultat de la commande vers un fichier ce serait cool ! :P

 

Nico

Posté(e)

Ca me parrait logique que ta redirection de la sortie standard ne fonctionne pas vu que c'est une fonction du Shell et non du programme que tu lances.

 

Je vois 2 solutions à ton probleme :

1. tu trouves une fonction "exec" qui te permette de spécifier la sortie standard

2. tu rediriges la sortie standard au lancement de ton serveur mais dans ce cas, tout est redirigé vers ce fichier

 

Automne

Posté(e)

Tout d'abord merci de ta réponse Automne :-P ,

 

C'est quand même curieux tout ça...

Rediriger le stdout, j'y ai pensé aussi mais ça va pas être possible :P tous les messages d'erreur, tout les retours des appels systèmes vers un fichier ça va pas être coton à gérer.

 

Au niveau des exec, y en a 6 : execl, execlp, execle, execlv,execvp et execve... ils se différencient principalement par le fait que pour certains on peut utiliser le PATH plutôt que d'écrire le chemin d'accès complet pour accéder à l'éxécutable (c'est les exec avec p dedans), et d'autres où on peut intégrer l'environnement (execle, execve), je trouve pas grand chose sur internet concernant les redirections, et tout ce que je trouve concerne les redirections en shell :-(

 

Bref :-P:-P:-P

 

Nico

Rejoindre la conversation

Vous publiez en tant qu’invité. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...