• STATISTIQUES
  • Il y a eu un total de 3 membres et 10221 visiteurs sur le site dans les dernières 24h pour un total de 10 224 personnes!


    Membres: 2 605
    Discussions: 3 580
    Messages: 32 820
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] osix
    Site de challenge qui utilise un système de level on chaque épreuve doit être réussie avant d'accédÃ...
    Challenges
    [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation
    [EN] Dare your mind
    JavaScript: 6, Crypto: 44, Stegano: 36, Logic: 13, Special: 27, Science: 11, Realistic: 7, Programming: 10, Crack It: 6,...
    Challenges
    [EN] Framework Metasploit
    Le Framework Metasploit est un logiciel gratuit, open source de tests de pénétration développ&ea...
    Vulnérabilités
    [FR] WeChall
    Audio: 3, Coding: 11, Cracking: 9, Crypto: 18, Encoding: 11, Exploit: 44, Forensics: 1, Fun: 6, HTTP: 6, Image: 8, Java:...
    Challenges
    [EN] SecurityFocus
    SecurityFocus a été conçu pour faciliter la discussion sur des sujets liés la sécu...
    Vulnérabilités

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!

    €



Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
[C][UNIX] interpréteur de commandes
03-12-2013, 23h21
Message : #1
Commodor Hors ligne
Ho ! Dodgson !
*



Messages : 64
Sujets : 9
Points: 36
Inscription : Nov 2011
[C][UNIX] interpréteur de commandes
Bonjour à tous Smile

voila j'ai décidé de vous partager le début d'un de mes petits projet, à savoir : Un interpréteur de commandes sous Unix.

L'occasion de vous familiariser avec la programmation système multi-tâches Smile

possibilités :
  • Entrer une commande de 50 params
  • commande locale : cd (cd sans params renvoi au HOME)
  • exécuter une commande en arrière plan (ex : "sleep 2 &" ou "sleep 2&"

voila c'est vraiment basique Tongue

Vous pouvez le modifier et ajouter un historique de commandes par exemple Wink (avec ou sans readline) et des couleurs (curses)


bref voila tout le code condensé en un fichier Sleepy
(cc -o monsh main.c)
Code C :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

char strlastcarac(char *chaine); /* cas où : sleep 2&  */
int strrmcarac(char *chaine, const char carac); /* rm '&' de la commande  */
void clean_stdin(char *chaine); /* vider stdin */

int main(void)
{
        char *Cmde, *homepath, *username, *TCmde[50], LCmde[512]={0}, outHomepath[512]={0}, outUsername[64]={0};
        int i, flag_BG;
        pid_t pid_fils;

        if((homepath=getenv("HOME"))==NULL) /* récupération de la variable 'HOME'  */
        {
                perror("getenv HOME");
                exit(-1);
        }

        if(strlen(homepath) > 512)
        {
                fprintf(stderr, "home path is too long\n");
                exit(-1);
        }

        strcpy(outHomepath, homepath);

        if((username=getenv("USER"))==NULL) /* récupération de la variable 'USER' */
        {
                perror("getenv USERNAME");
                exit(-1);
        }      

        if(strlen(username) > 64)
        {
                fprintf(stderr, "username is too long\n");
                exit(-1);
        }

        strcpy(outUsername, username);

        while(1) /* boucle principale */
        {
                i=0;
                flag_BG=0; /* flag du param '&' pour executer une commande en arrière plan */
                memset(LCmde, '\0', sizeof(LCmde)); /* vidage de la commande */

                printf("unix@%s> ", outUsername); /* prompt */
                scanf("%512[^\n]", LCmde);
                clean_stdin(LCmde);
               
                /* Si commande vide */
                if(strcmp(LCmde, "") == 0)
                        continue;

                TCmde[i] = strtok(LCmde, " ");  /* strtok pour séparer tout les paramètres */
                i++;

                while((TCmde[i] = strtok(NULL, " ")) != NULL)
                        i++;
       
                Cmde = TCmde[0];        

                if(strcmp(Cmde, "exit") == 0)
                        break;

                if(strcmp(Cmde, "cd") == 0) /* commande locale */
                {      
                        if(TCmde[1] == NULL) /* si aucun params alors on se place dans HOME */
                        {
                                if(chdir(outHomepath) != 0)
                                        perror("cd");
                        }

                        else
                        {
                                if(chdir(TCmde[1]) != 0)
                                         perror("cd");
                        }
                        continue;
                }

               
                if(TCmde[i-1] != NULL && strcmp(TCmde[i-1], "&") == 0) /* cas où : "sleep 2 &" */
                {
                        flag_BG = 1;
                        TCmde[i-1] = NULL;
                }
               

                if(TCmde[i-1] != NULL && strlastcarac(TCmde[i-1]) == '&') /* cas où : "sleep 2&" */
                {
                        flag_BG = 1;
                        if(strrmcarac(TCmde[i-1], '&') == -1)
                        {
                                fprintf(stderr, "error rm carac.\n");
                                exit(-1);
                        }

                }

                switch(pid_fils = fork())
                {
                        case 0 : execvp(Cmde, TCmde); perror(Cmde); exit(-1); /* process FILS , execution de la commande par recouvrement et en cherchant dans le PATH (passage des params par tableau)*/
                        case -1 : perror("fork"); exit(-1); /* En cas d'erreur de création de process*/
                        default : if(flag_BG == 0) /* process PERE */
                                        waitpid(pid_fils, NULL, 0);
                                  break;
                }

        }
        exit(0);
}

char strlastcarac(char *chaine)
{
        int i=0;
        do
        {
                i++;
        }while(chaine[i] != '\0');
        return chaine[i-1];
}

int strrmcarac(char *chaine, const char carac)
{
        int success = -1;   /* 0=success / -1=fail */
        int i=0;
        do
        {
                if(chaine[i] == carac)
                {
                        chaine[i] = '\0';
                        success = 0;
                        break;
                }
                i++;
        }while(chaine[i] != '\0');
       
        return success;
}


void clean_stdin(char *chaine)
{
        int c;
        do
        {
                c=getchar();
        }while(c != '\n' && c != EOF);
}
 
Hahaha you didn't say the magic word !
+1 (5) -1 (0) Répondre
03-12-2013, 23h24 (Modification du message : 03-12-2013, 23h33 par Junky.)
Message : #2
Junky Hors ligne
Snorky Master
*



Messages : 228
Sujets : 35
Points: 203
Inscription : Mar 2013
RE: [C][UNIX] interpréteur de commandes
Bonjour.

Merci beaucoup je m'en vais lire le code....

Junky

Edit: un p'tit pastebin n-pn ou hébergé sur un serveur pour le dl... Smile
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier

+1 (0) -1 (0) Répondre
04-12-2013, 10h09
Message : #3
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: [C][UNIX] interpréteur de commandes
c'est assez rustique, avant de mettre de la couleur et un historique je pense même qu'on pourrait faire un parsing plus robuste Wink (quid de "cd<espace><espace>" ou "sleep 2 &&&#" par exemple)
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (0) -1 (0) Répondre
04-12-2013, 14h35
Message : #4
thxer Hors ligne
:(){ :|:&amp; };:
*



Messages : 382
Sujets : 60
Points: 162
Inscription : Feb 2013
RE: [C][UNIX] interpréteur de commandes
Pas mal, merci pour le partage
Thxer.com
Twitter Thxer_

Code BASH :
echo "JkZ Palx" | sed 'y/lPZaJxk/MG3@tEH/'




+1 (0) -1 (0) Répondre
04-12-2013, 21h17
Message : #5
levur Hors ligne
Membre
*



Messages : 27
Sujets : 3
Points: 10
Inscription : Sep 2013
RE: [C][UNIX] interpréteur de commandes
Sympa,
Par contre je me demandais si il n'étais pas plus judicieux de mettre les cmd sous forme de fonction,
genre filesys.h pour les cmd s'en rapportant et edit.h pour un éditeur de text en ligne
[/bon après je dis ça, je dis rien]

Mais sinon pas mal ^^
Citation :Staline a hérité d'une Russie à la charrue, et l'a laissée avec l'arme atomique,
L'histoire n'oublie pas de telles personnes...
Churchill 1959 Chambre des Communes
+1 (0) -1 (0) Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut