2016-04-21 17 views
2

Ich habe ein Skript mit einem Shebang in einer Zeichenfolge gespeichert. Ich möchte dieses Skript ausführen, ohne es in eine temporäre Datei zu schreiben.Laden Skript aus dem Speicher in C

Ich sah, dass execve einen Dateinamen als Argument verwendet. Ist es möglich, dasselbe mit einem Skript im Speicher zu tun?

+3

Ich glaube nicht, dass dies möglich ist. Sie könnten die Zeichenfolge jedoch an eine interaktive Version des Skript-Interpreters übergeben. – EOF

+0

Und auch sehr, _sehr_ vorsichtig sein. – edmz

+0

Wohin willst du stdout und stderr von deinem Skript gehen? – cdarke

Antwort

1

Ein Skript ist nicht direkt ausführbar, beim Ausführen eines Skripts identifiziert der Kernel den zu startenden Interpreter und übergibt den Dateinamen als Argument an den Interpreter, in Ihrem Fall eine Shell.

Wenn Sie ein in einer Zeichenfolge gespeichertes Skript ausführen möchten, können Sie die Shell Ihrer Wahl direkt starten und die Zeichenfolge als Standardeingabe über eine Pipe übergeben.

ist hier Art und Weise, es zu tun popen mit:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

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; 
} 
1

Wie Sie sagen, dass das Skript mit einem shebang String beginnt, können Sie nicht direkt Rohr in die Standardeingabe von einer Shell. Aber Sie können imitieren, was eine Schale getan hätte:

  • den Shell-Befehl extrahieren aus der Shebang-Zeile
  • es mit einem Rohr als Standardeingabe beginnen
  • Rohr des verbleibende des Skripts in die Kommando-Shell

eine generalistische Version, ob das Skript String mit einem #! beginnt steuern würde. Wenn dies der Fall ist, verwenden Sie den obigen Weg, andernfalls piped die ganze Zeichenfolge in eine Instanz von /bin/sh (oder was auch immer Shell, die Sie gewohnt sind)

+1

Piping die Shebang-Linie an den Interpreter wäre harmlos, wie es als Kommentar ignoriert werden würde, was es auch ist. Es besteht dann keine Notwendigkeit, es aus der übergebenen Zeichenfolge zu entfernen. – jlliagre

+0

@jlliagre: Ich weiß, dass es in der Unix-Welt üblich ist, dass Interpreten '#' als Anfang eines Kommentars verwenden. Aber der Shebang könnte für jeden Interpreter benutzt werden, zum Beispiel für den PostgreSQL ('psql'), für den die Kommentare mit zwei Bindestrichen (' --') beginnen sollen. Unsicher, ob die Shebang-Linie akzeptiert wird ... –

+0

Wenn der Kernel ein Skript ausführt, übergibt er den Dateinamen an den Interpreter, ohne die erste Zeile zu entfernen. Ich wäre überrascht, wenn ein Dolmetscher versagt, wenn er die Shebang-Linie als Standardeingabe übergibt, aber ich verstehe. – jlliagre

Verwandte Themen