IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Passer une variable C en Shell avec un system()


Sujet :

Linux

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Passer une variable C en Shell avec un system()
    Bonjour,

    Mon probléme est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main()
     int username2=0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf("..::Creer un utilisateurs::.. \n \n");
    printf("Veuillez entrer le nom de login: ");
    scanf("%c", &username2);
    system("/user/sbin/useradd %c", username2);

    lorsque je compile j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    In function 'main'
    erreur: too many arguments to fonction 'system'
    Info : Je suis sous mandriva 2008

    Merci d'avance

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    tu n as pas le droit de faire cela, la commande system n accepte qu une seule chaine de caractères, et tu ne peux pas introduire plusieurs éléments.
    essaies ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char commande[BUFF_SIZE];
     
    sprintf(commande,"/user/sbin/useradd %c", username2);
    system(commande);
    par exemple

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ashin Voir le message
    tu n as pas le droit de faire cela, la commande system n accepte qu une seule chaine de caractères, et tu ne peux pas introduire plusieurs éléments.
    Exact. Les "%" sont des marqueurs spécifiques aux fonctions de type "printf()" et la fonction "system()" ne sait pas ce que c'est...

    Citation Envoyé par Ashin Voir le message
    essaies ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char commande[BUFF_SIZE];
     
    sprintf(commande,"/user/sbin/useradd %c", username2);
    system(commande);
    par exemple
    Il n'y a qu'un seul caractère dans "username2" ? C'est possible mais je trouve cela étrange. D'un coté il est défini en tant qu'int, de l'autre on lui entre un "nom de login". Bizarre tout ça...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char username2[256];
    printf("Entrez un nom de login");
    scanf("%s", username2);
    sprintf(commande,"/user/sbin/useradd %s", username2);
    Mis à part ce détail, le code est bon...

    Citation Envoyé par electro38 Voir le message
    Info : Je suis sous mandriva 2008
    T'as pas de bol mais on t'aidera quand-même...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    j ai recopié son code sans même chercher a comprendre

    oui effectivement un login qu avec des chiffres , remarque pourquoi pas mais bon de toute façon ça aurait été %d; l utilisation d un tableau de char est mieux approprié dans ton cas comme te l a dit Sve@r ou un char * a la limite.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ashin Voir le message
    ou un char * a la limite.
    Avec un char* faudra penser à allouer de la mémoire sinon fume...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    oui allouer puis libérer par la suite, il trouvera des tutos j en doute pas.
    mais bon notre ami n a pas l air de s y intéresser énormément a son problème

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    C'est génial tous ces buffers de taille fixe dans lesquels vous écrivez joyeusement des données qui peuvent etre arbitrairement longues... Il se passe quoi si je file un login de plus de 256 ou BUFF_SIZE caractères ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    C'est génial tous ces buffers de taille fixe dans lesquels vous écrivez joyeusement des données qui peuvent etre arbitrairement longues... Il se passe quoi si je file un login de plus de 256 ou BUFF_SIZE caractères ?
    il se passe que tu vas mettre 1h a te logger

    sérieusement je vois pas trop l utilité d'utiliser par exemple une liste chaînée pour un login qui ne dépassera vraisemblablement les 20caractères. D'ailleurs dans la réalité les login ont une taille de buffer fixe.

    Néanmoins je suis d'accord avec toi, beaucoup de personnes utilisent des buffers de taille fixe (de 1000 par exemple voire plus ) pour éviter de se fatiguer en oubliant le phénomène de dépassement ...

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    J'ai jamais parlé de liste chainees ou quoi que ce soit. Par contre, filer des exemples avec scanf/sprintf c'est bien, mais filer des exemples avec des buffer overflow evidents, ca me parait une tres mauvaise idee. Pour le scanf, j'ai jamais gere d'entree console donc je proposerai pas d'alternative, par contre pour le sprintf, verifier la longueur du login ou utiliser asprintf me parait etre la moindre des choses.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par teuf13 Voir le message
    C'est génial tous ces buffers de taille fixe dans lesquels vous écrivez joyeusement des données qui peuvent etre arbitrairement longues... Il se passe quoi si je file un login de plus de 256 ou BUFF_SIZE caractères ?
    Dans l'absolu t'as raison évidemment. Il vaut mieux utiliser fgets() que scanf(). Mais comme son problème ne portait pas là dessus on n'est pas intervenu à ce sujet qui sortait du champ du topic mais c'est vrai qu'on aurait pu...

    Citation Envoyé par teuf13 Voir le message
    mais filer des exemples avec des buffer overflow evidents, ca me parait une tres mauvaise idee.
    Oui.

    Citation Envoyé par teuf13 Voir le message
    Pour le scanf, j'ai jamais gere d'entree console donc je proposerai pas d'alternative
    Boaf la plus simple est le fgets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char login[256];
    printf("Entrez votre login :"), fflush(stdout);
    fgets(login, 256, stdin);
    et ça permet même de gérer le problème d'une entrée texte dans un int
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char saisie[256];
    int nb;
    printf("Entrez votre nombre :"), fflush(stdout);
    fgets(saisie, 256, stdin);
    if (sscanf(saisie, "%d", saisie) != 1)
        printf("Saise incorrecte\n");
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. passer une variable perl à un commande shell
    Par titomiss dans le forum Langage
    Réponses: 1
    Dernier message: 19/02/2008, 20h07
  2. [Custom Tags 1.2] Passer une variable comme valeur d'attribut d'un tag jsp
    Par Pi2 dans le forum Taglibs
    Réponses: 7
    Dernier message: 16/09/2005, 14h44
  3. Passer une variable entre deux fenêtres
    Par DeezerD dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 17/08/2005, 09h52
  4. [Struts] Passer une variable dans l'url
    Par pilz dans le forum Struts 1
    Réponses: 2
    Dernier message: 30/03/2005, 15h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo