Passer une variable C en Shell avec un system()

Passer une variable C en Shell avec un system() - C - Programmation

Marsh Posté le 19-02-2008 à 12:16:13    

Bonjour,
 
Mon probléme est le suivant :
 

Code :
  1. main()
  2. char username2=0


Code :
  1. printf("..::Creer un utilisateurs::.. \n \n" );
  2. printf("Veuillez entrer le nom de login: " );
  3. scanf("%s", &username2);
  4. system("/user/sbin/useradd %s", username2);


 
lorsque je compile j'ai l'erreur suivante :

Code :
  1. In function 'main'
  2. erreur: too many arguments to fonction 'system'


 
Info : Je suis sous mandriva 2008
 
Merci d'avance ;)


Message édité par So_H0use le 19-02-2008 à 13:38:56
Reply

Marsh Posté le 19-02-2008 à 12:16:13   

Reply

Marsh Posté le 19-02-2008 à 12:53:47    

Houlala
 
1) Tu penses pouvoir stocker une chaine dans un int ?
2) %c c'est pour un caractère, pas pour une chaine.
3) n'utilise pas scanf. Utilise plutôt fgets.
4) system prend une seule chaine de caractère en argument. Dans ton cas ça serait pas exemple system("/user/sbin/useradd toto" ). Bien sûr il faudra que tu génère la chaine en fonction de ce qui a été saisi par l'utilisateur. Tu peux utiliser sprintf pour ça.

Reply

Marsh Posté le 19-02-2008 à 13:32:42    

Ce sujet a été déplacé de la catégorie OS Alternatifs vers la categorie Programmation par Black_lord


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 19-02-2008 à 13:37:46    

Merci matafan, Peux tu m'expliquer comment sera la fonction avec un sprintf si j'ai pour utilisateur toto ?

Reply

Marsh Posté le 19-02-2008 à 13:50:24    

man sprintf :o
Mais mieux vaut privilégier snprintf, qui permet de contrôler la taille du buffer de sortie.
 
Sinon, main() doit explicitement retourner un int, username2 ne contient qu'un seul caractère tel que tu l'as déclaré, et scanf() çaÿ le mal utilisé comme ici.
 
Quant à system(), derrière il fait un sh -c "le parametre que tu as passé à system()".
 
Donc tu peux tout à fait passer plusieurs commandes d'un coup au shell, séparées par des points-virgule, et donc définir une variable d'environnement avant de lancer une commande.
 
Exemple :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char command[100];
  7.  
  8.   snprintf(command, 100, "taiste='%s' ; export taiste ; echo $taiste", "its teh mighty taiste" );
  9.  
  10.   system(command);
  11.  
  12.   return 0;
  13. }


 

$ gcc -Wall -pedantic taiste.c
$ a.out
its teh mighty taiste
$

Reply

Marsh Posté le 20-02-2008 à 20:33:49    

Elmoricq a écrit :


Exemple :

Code :
  1. snprintf(command, 100, "taiste='%s' ; export taiste ; echo $taiste", "its teh mighty taiste" );
  2. }




Code :
  1. snprintf(command, 100, "taiste='%s' ; export taiste ; echo $taiste", "it's the mighty taiste" );


;)


Message édité par Emmanuel Delahaye le 20-02-2008 à 20:34:15

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-02-2008 à 07:03:52    

C'est une private joke [:god]
 
Par contre ça me fait penser, pour le coup de la variable d'environnement, ça m'était sorti de l'esprit mais sur un environnement POSIX.2, c'est quand même plus simple d'utiliser putenv() [:dawa]

Reply

Marsh Posté le 21-02-2008 à 12:50:32    

Elmoricq a écrit :

C'est une private joke


Il y avait des fautes dans le texte anglais...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-02-2008 à 13:08:44    

C'est justement ça, la private joke, écrire "teh" au lieu de "the" (et its au lieu de it's). [:joce]

Message cité 1 fois
Message édité par Elmoricq le 21-02-2008 à 13:09:10
Reply

Marsh Posté le 22-02-2008 à 02:39:55    

Elmoricq a écrit :

C'est justement ça, la private joke, écrire "teh" au lieu de "the" (et its au lieu de it's). [:joce]


Ah, je suis largué, je dois être trop vieux.  


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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