Charger le script depuis la mémoire en C

J’ai un script commençant par un shebang stocké dans une chaîne. Je voudrais exécuter ce script sans l’écrire dans un fichier temporaire.

J’ai vu que execve prend un nom de fichier comme argument. Est-il possible de faire la même chose avec un script en mémoire.

Un script n’est pas directement exécutable, lors de l’exécution d’un script, le kernel identifie l’interpréteur à lancer, puis transmet le nom du fichier comme argument à l’interpréteur, dans votre cas, un shell.

Si vous souhaitez exécuter un script stocké dans une chaîne, vous pouvez directement lancer le shell de votre choix et transmettre votre chaîne comme entrée standard via un canal.

Voici comment le faire en utilisant popen :

 #include  #include  #include  int main(int argc, char *argv[]) { FILE *fp; char *prefix="/bin/bash <<'%EOF%'\n"; char *script="#!/bin/bash\necho foo\ndate\n"; char *suffix="%EOF%\n"; char *command; char buf[1024]; command=malloc(strlen(prefix)+strlen(script)+strlen(suffix)+1); sprintf(command,"%s%s%s",prefix,script,suffix); fp=popen(command, "r"); if(fp == NULL) { perror("Error\n"); exit(1); } while(fgets(buf, sizeof(buf), fp) != NULL) { printf("%s", buf); } pclose(fp); return 0; } 

Comme vous dites que le script commence par une chaîne de caractères shebang, vous ne pouvez pas le placer directement dans l’entrée standard d’un shell. Mais vous pouvez imiter ce qu’un shell aurait fait:

  • extraire la commande shell à partir de la ligne shebang
  • le démarrer avec un tuyau comme entrée standard
  • diriger le rest du script dans cette commande shell

Une version plus généraliste contrôlerait si la chaîne de script commence par un #! . Si c’est le cas, utilisez la méthode ci-dessus, sinon placez simplement la chaîne entière dans une instance de /bin/sh (ou du shell auquel vous êtes habitué)