从C

时间:2016-04-21 13:18:10

标签: c unix execve

我有一个以存储在字符串中的shebang开头的脚本。我想在不将其写入临时文件的情况下执行此脚本。

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

2 个答案:

答案 0 :(得分:1)

脚本不能直接执行,在执行脚本时,内核会识别要启动的解释器,然后将文件名作为参数传递给解释器,在您的情况下是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;
}

答案 1 :(得分:1)

正如您所说,脚本以shebang字符串开头,您无法直接将其传递到shell的标准输入中。但你可以模仿shell会做什么:

  • 从shebang行
  • 中提取 shell命令
  • 以管道作为标准输入启动它
  • 将剩余的脚本传递到 shell命令

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