Créer une commande console

Fermé
Foaly - 28 avril 2008 à 17:50
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 30 avril 2008 à 12:00
Bonjour tout le monde!

Je dévelloppe actuellement une appli (bot pour serv de jeu) pour Linux Slackeware, grâce à PureBasic, mais je préfères Windows et là je suis un peu pommé... Voilà mon problème : j'aimerais pourvoir lancer mon bot en arrière plan (au moyen de screen si j'ai bien compris), mais aussi pouvoir lui envoyer des ordres, tout celà en console, car j'accède au server en SSH. Par exemple mon soft s'appelle 'bot', pouvoir lui envoyer cette commande :
>bot command1 command2
sans qu'il se relance, juste pouvoir dire 'quand dans la console tu utilise la command 'bot', alors ça envoie les parametres vers ce programme'. Et aussi comment récupérer dans le prog? Est-ce qu'il faut appeler une fonction...? (montrez moi dans le langage que vous voulez je me débrouillerais :) )

Merci d'avance! :)

Foaly
A voir également:

8 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
29 avril 2008 à 10:48
Salut,

Il s'agit de communication inter-processus.
Plusieurs solutions s'offrent à toi: les sockets, les files de messages ou encore les segments de mémoire partagés, voire même les tubes.

Je pense que l'idéal serait les files de messages car les sockets c'est un peu lourd à utiliser, les segments de mémoire il faut les synchroniser, et les tubes euh...bof.

Par contre si ton programme est susceptible d'envoyer ses commandes à distance (depuis un autre ordinateur) alors oublie tout ça et utilise les sockets.

Un exemple pour les files de messages:
http://pages-perso.luminy.univ-amu.fr/erreur.php?code=404
0
Bonjour! Tout d'abord, merci de ta réponse! :)

En fait je suis pas sur que tu ai compris ma question (désolé je m'exprime mal) : en fait, je veut pouvoir lancer un programme en tache de fond, et pouvoir lui envoyer des commandes directement dans la console, pas depuis une autre appli. Une commande au même titre que cd, ls, top, screen, etc... Qqun m'a dit que c'était dans un fichier ou il y a les correspondances de marquée : la commande 'truc' renvoie au programme 'machin', et ça lui envoie les paramètres qu'il y a derrière. J'ai précisé que je commandais en SSH pour montrer que je n'avais accès qu'en console, mais le programme est installé sur le server lui. Donc ça reste en local.

Mais merci pour les infos, ça m'interresse quand même pour autre chose! :)

Foaly
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
29 avril 2008 à 20:21
Ah d'accord :-)
Ben ça c'est autre chose. En fait il faut que ton programme se mette en attente d'une entrée au clavier (fgets pour rester sécurisé, mais ya scanf aussi qui est dangereux). Et là tu analyses ce qu'on t'as passé en paramètre.

Bon là ça dépend des cas. Tu veux envoyer des commandes personnalisées genre "prout param1 param2" ou bien des vraies commandes de shell comme top ou un truc dans le genre?
0
Voilà :)
Je lance mon jeu avec
user@xxxxx:~$ screen -m -d -S Jeu-Server sh ctf.sh
et là le jeu est lancé, mais je reste en console avec le prompt
user@xxxxx:~$
Ensuite, je lance le bot :
user@xxxxx:~$ screen -m -d -S Jeu-Bot sh bot.sh
Et je lui envoie des commandes :
user@xxxxx:~$ prout param1 param2

Encore merci de m'accorder un peu de ton temps :)

Foaly
0

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

Posez votre question
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
29 avril 2008 à 21:19
Ok ben ma foi l'idéal c'est de créer une fonction par commande.

Tu utilises PureBasic alors je ne peux pas trop t'aider à ce niveau mais le schéma est le suivant:

Tu analyse le premier mot qui est la commande, tu trouves la fonction adéquate qui correspond à cette commande et tu lui passes les paramètres qui ont été donné à la suite...
0
Voilà, mais pour analyser la commande, il faut que je l'ai dans mon soft, et là par exemple si je veut lancer ma fonction 'ban' avec 'joueur' pour argument, pour commander le bot, forcément il va me dire qu'il ne connait pas la commande 'ban'. J'aimerais savoir si il existe un fichier par exemple ou y'a marqué la liste des commandes consoles existantes et à quelles fonctions elles correspondent, dans le noyau ou un logiciel lancé. Et ça serait dans ce fichier que la console regarderais pour dire : 'je file ma ligne de commande à telle fonction', ou bien 'je trouve pas cette commande, je le signale à l'utilisateur'. Ce fichier que j'éditerais pour ajouter 'ban' dans la liste des commandes consoles valides, à coté de cd, cp, ls, etc...
Sinon effectivement je fais du PB mais si dans un coin tu as un exemple en C ou tout autre langage je suis preneur, je me débrouillerais pour retranscrire :)

Bonne soirée

Foaly
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
29 avril 2008 à 22:10
Si il existe un fichier c'est à toi de le créer et en fonction de ton programme :-)
Je vais te donner un exemple en C.

On va dire que tu as deux commandes:
affiche arg1 arg2

Cette commande affichera arg1 suivi de arg2
Une autre:
additionne arg1 arg2

Cette commande affichera le résultat de arg1 + arg2

On va prendre deux fonctions de base pour traiter ça: affiche et additionne.
Si ces fonctions ne peuvent traiter la commande en question elles retournent 0, sinon elles retourne 1
int affiche(char *commande, char *arg1, char *arg2)
{
    if(!strcmp(commande, "affiche")){
        printf("%s %s\n", arg1, arg2);
        return 1;
    }
    return 0;
}

Voilà cette fonction regarde la commande entrée, si c'est bien affiche alors elle affiche les arguments er retourne 1, sinon ele retourne 0
L'addition:
int additionne(char *commande, char *arg1, char *arg2)
{
    int a, b;
    if(!strcmp(commande, "additionne")){
        a = atoi(arg1);
        b = atoi(arg2);
        printf("%d\n", a + b);
        return 1;
    }
    return 0;
}

Cette fonction additionne les deux paramètre et affiche le résultat puis retourne 1. Si la commande n'était pas bonne, on retourne 0.

Voilà on a nos deux fonctions.
Maintenant on va créer un type capable de contenir un pointeur vers ces fonctions:
typedef int (*pcommande)  (char *, char*, char*);

J'espère que tu as déjà vu les pointeurs de fonctions. C'est pas si compliqué que ça, dis toi pour l'instant qu'une variable de type pcommande peut pointer vers les fonctions affiche ou additionne.

On va créer un tableau avec des pointeurs vers nos deux fonctions:
pcommande commandes[2] = {affiche, additionne};

Pour l'exemple, commande[0]("truc", "bidule", "machin") appelera affiche("truc", "bidule", "machin")


On arrive dans le main, on va créer une boucle qui fait des fgets à répétition pour inviter l'utilisateur à entrer des commandes:
int main()
{
    char cmd[100], arg1[100], arg2[200];
    int i;
    int traite;
    while(1) //Boucle eternelle
    {
         printf(">");
         scanf("%s %s %s", cmd, arg1, arg2);
         traite = 0;
         for(i=0; i<2; i++)
        {
            if(commandes[i](cmd, arg1, arg2) ){
                traite = 1; //Commande traitée
                break; // On sort de la boucle parce que la commande a été traitée
            }
        }
        if(!traite){ //La commande n'a pas été traitée
            printf("La commande est incorrecte\n");
        }
     }
     return 0;


Bon je t'explique globalement le principe: tu fais une fonction par commande. Ces fonctions sont regourpée dans une table. Lors de la boucle de reception des commande, chaque commande est testée jusqu'à ce qu'il y en ait une qui accepte la commande (return 1) si c'est bon on prend une autre commande, sinon si aucune n'a réussi à prendre la commande, on affiche un message d'erreur.

Voilà ça te fait un petit shell de base.
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
29 avril 2008 à 22:19
Voilà ce que ça donne avec les fichiers d'en-têtes:
#include <stdio.h>
#include <string.h>

int affiche(char *commande, char *arg1, char *arg2)
{
    if(!strcmp(commande, "affiche")){
        printf("%s %s\n", arg1, arg2);
        return 1;
    }
    return 0;
}

int additionne(char *commande, char *arg1, char *arg2)
{
    int a, b;
    if(!strcmp(commande, "additionne")){
        a = atoi(arg1);
        b = atoi(arg2);
        printf("%d\n", a + b);
        return 1;
    }
    return 0;
}

typedef int (*pcommande)  (char *, char*, char*);

pcommande commandes[2] = {affiche, additionne};


int main()
{
    char cmd[100], arg1[100], arg2[200];
    int i;
    int traite;
    while(1) //Boucle eternelle
    {
         printf(">");
         scanf("%s %s %s", cmd, arg1, arg2);
         traite = 0;
         for(i=0; i<2; i++)
        {
            if(commandes[i](cmd, arg1, arg2) ){
                traite = 1; //Commande traitée
                break; // On sort de la boucle parce que la commande a été traitée
            }
        }
        if(!traite){ //La commande n'a pas été traitée
            printf("La commande est incorrecte\n");
        }
     }
     return 0;
}


Et voilà tu peux tester:
kilian@ceci-nest-pas-un-poste-de-travail:~/Desktop$ ./prout
>affiche machin bidule
machin bidule
>additionne 90 100
190
>hey hi heyho  
La commande est incorrecte
>

Tu viens de me faire découvrir un truc là, je m'éclate depuis tout à l'heure avec ce petit shell :-D
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527 > kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016
29 avril 2008 à 22:20
Note qu'il suffit d'ajouter une fonction dés que tu veux ajouter une commande.
0
Ca y est, j'ai compris! :)
Je m'obstinais bêtement à penser à autre chose, mais oui c'est comme ça qu'il faut faire. Il me reste plus qu'à transposer ça en PB.

Merci beaucoup de ton aide! Je m'y met tout de suite!

Foaly
0
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
30 avril 2008 à 12:00
:-)
0