yves9393 | 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 :
- fgets(requete,250,stdin);
- while (strcmp(requete,"exit\n" )){
- write(sd,requete,250);
- read(sd,ligne,taille);
- printf(ligne);
- fgets(requete,250,stdin);
- }
|
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 :
- while(condition) {
- i=0;
- tokens[i]=strtok(ligne," \n" );
- while (tokens[i] != NULL) tokens[++i]=strtok(NULL," \n" );
- if (fork()==0)
- {
- fflush(stdout);
- execvp(tokens[0],tokens);
- fflush(stdout);
- printf("Commande invalide\n" );
- exit(1);
- }
- wait(0);
- read(h, ligne, strlen(ligne));
- }
- }
|
|