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:
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é)