Shell controlable à distance avec socket

Shell controlable à distance avec socket - C - Programmation

Marsh Posté le 14-04-2014 à 21:36:27    

Bonjour,
cela fait quelques jours maintenant que j'essaie de faire un shell controlable à distance sans succès. Il m'est demandé de "créer un shell simple controlable à distance, avec redirection de stdout et stderr ", donc je dois créer un serveur possédant un shell .
Je ne peux malheureusement pas poster mon code (car il s'agit d'un projet pour l'école et je suis pas le seul à l'avoir), donc je vous expose mon problème le plus clairement possible
Après de multiples essais j'ai quelque chose qui tourne, mis à part que j'ai un souci vraiment vraiment embêtant : Lorsque je fais une requête qui ne produit aucun affichage ( chmod 700 monFichier par exemple), mon client attend une réponse du serveur qui n'arrive jamais !
Je pense donc que le problème vient du client, voilà ce qu'il fait :
1.Il se connecte au serveur
2.fgets sur stdin pour obtenir la requête a envoyer au serveur ("echo salut" par exemple).
3.entre dans une boucle ,pour envoyer plusieurs requête si je le désire.
4.Write vers le serveur de la requete précédemment demandée (voir point 2).
5.Read depuis le serveur. (etant donné que stdout est redirigé, le serveur m'envoie le resultat du exec)
6. Affichage de la réponse.

Code :
  1. fgets(requete,250,stdin);
  2. while (strcmp(requete,"exit\n" )){
  3.   write(sd,requete,250);
  4.   read(sd,ligne,taille);
  5. printf(ligne);
  6. fgets(requete,250,stdin);
  7. }


Donc voilà, ca marche avec "echo salut" "ls -l" , mais dès que je veux faire une requête n'affichant pas de résultat (comme chmod ) mon client ne réagit plus (étant donné qu'il attend une réponse qui ne viendra jamais !).
Je ne vois pas comment m'y prendre, comme puis-je dire a mon programme " bon si t'as pas de réponse tu continues."
Merci de bien vouloir m'aider, ( et désolé de pas pouvoir poster tout mon code)
 
Coté serveur :

Code :
  1. while(condition) {
  2. i=0;
  3.  tokens[i]=strtok(ligne," \n" );
  4.  while (tokens[i] != NULL) tokens[++i]=strtok(NULL," \n" );
  5.  if (fork()==0)
  6.  {
  7.   fflush(stdout);
  8.   execvp(tokens[0],tokens);
  9.   fflush(stdout);
  10.   printf("Commande invalide\n" );
  11.   exit(1);
  12.  }
  13.  wait(0);
  14.  read(h, ligne, strlen(ligne));
  15.   }
  16.  }


 
 
 

Reply

Marsh Posté le 14-04-2014 à 21:36:27   

Reply

Marsh Posté le 15-04-2014 à 09:21:59    

Il faut regarder du coté de la fonction select de tête, qui permet de savoir s'il y a qqchose sur un read (avec un timeout)
 
Un bon vieux "man select" devrait te donner un exemple intéressant...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed