Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中从内存加载脚本_C_Unix_Execve - Fatal编程技术网

在C中从内存加载脚本

在C中从内存加载脚本,c,unix,execve,C,Unix,Execve,我有一个脚本,以存储在字符串中的shebang开头。我希望执行此脚本而不将其写入临时文件 我看到execve使用文件名作为参数。是否可以对内存中的脚本执行相同的操作。脚本不是直接可执行的,在执行脚本时,内核会确定要启动哪个解释器,然后将文件名作为参数传递给解释器(在您的情况下是shell) 如果要执行存储在字符串中的脚本,可以直接启动所选的shell,并通过管道将字符串作为其标准输入传递 以下是使用以下方法进行此操作的方法: #包括 #包括 #包括 int main(int argc,char*

我有一个脚本,以存储在字符串中的shebang开头。我希望执行此脚本而不将其写入临时文件


我看到
execve
使用文件名作为参数。是否可以对内存中的脚本执行相同的操作。

脚本不是直接可执行的,在执行脚本时,内核会确定要启动哪个解释器,然后将文件名作为参数传递给解释器(在您的情况下是shell)

如果要执行存储在字符串中的脚本,可以直接启动所选的shell,并通过管道将字符串作为其标准输入传递

以下是使用以下方法进行此操作的方法:

#包括
#包括
#包括
int main(int argc,char*argv[])
{
文件*fp;

char*prefix=“/bin/bash正如您所说,脚本以一个shebang字符串开头,您不能直接通过管道将其输入到shell的标准输入中。但您可以模仿shell的操作:

  • 从shebang行中提取shell命令
  • 以管道作为标准输入开始
  • 将脚本的剩余部分通过管道传输到该shell命令中

更通用的版本将控制脚本字符串是否以
#!
开头。如果以
#!
开头,请使用上述方法,否则只需将整个字符串导入
/bin/sh
的一个实例(或您使用的任何shell)

我认为这是不可能的。但是,您可以将字符串通过管道传输到脚本-解释器的交互式版本。而且要非常非常小心。您希望脚本中的stdout和stderr放在哪里?我希望将脚本的输出使用到我的程序中。将shebang行传输到解释器将是无害的,因为这将是无效的OR作为注释,它也是。这样就不需要从传递的字符串中删除它了。@jlliagre:我知道在Unix世界中,解释程序使用
#
作为注释的开头是很常见的。但是shebang可以用于任何解释程序,例如PostgreSQL(
psql
)注释应该以两个破折号开头(
--
)。不确定它是否会接受shebang行…当内核执行脚本时,它会将文件名传递给解释器,而不剥离第一行。如果解释器将shebang行作为其标准输入传递给解释器,我会感到惊讶,但我明白你的意思。
#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;
}