从 C 中的内存加载脚本
Load script from memory in C
我有一个以字符串形式存储的 shebang 开头的脚本。我想执行此脚本而不将其写入临时文件。
我看到 execve
将文件名作为参数。是否可以对内存中的脚本执行相同的操作。
脚本不能直接执行,在执行脚本时,内核会识别要启动的解释器,然后将文件名作为参数传递给解释器,在您的例子中是 shell.
如果您想执行存储在字符串中的脚本,您可以直接启动您选择的 shell 并通过管道将您的字符串作为标准输入传递。
这是使用 popen:
的方法
#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;
}
正如您所说的脚本以 shebang 字符串开头,您不能直接将其通过管道传输到 shell 的标准输入中。但是你可以模仿 shell 会做的事情:
- 从 shebang 行中提取 shell 命令
- 以管道作为标准输入启动它
- 将脚本的剩余部分通过管道传输到 shell 命令
更通用的版本将控制脚本字符串是否以 #!
开头。如果是这样,请使用上述方式,否则只需将整个字符串通过管道传输到 /bin/sh
的实例(或您习惯的任何 shell)
我有一个以字符串形式存储的 shebang 开头的脚本。我想执行此脚本而不将其写入临时文件。
我看到 execve
将文件名作为参数。是否可以对内存中的脚本执行相同的操作。
脚本不能直接执行,在执行脚本时,内核会识别要启动的解释器,然后将文件名作为参数传递给解释器,在您的例子中是 shell.
如果您想执行存储在字符串中的脚本,您可以直接启动您选择的 shell 并通过管道将您的字符串作为标准输入传递。
这是使用 popen:
的方法#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;
}
正如您所说的脚本以 shebang 字符串开头,您不能直接将其通过管道传输到 shell 的标准输入中。但是你可以模仿 shell 会做的事情:
- 从 shebang 行中提取 shell 命令
- 以管道作为标准输入启动它
- 将脚本的剩余部分通过管道传输到 shell 命令
更通用的版本将控制脚本字符串是否以 #!
开头。如果是这样,请使用上述方式,否则只需将整个字符串通过管道传输到 /bin/sh
的实例(或您习惯的任何 shell)