繁体   English   中英

从字符串使用execlp()运行shell命令

[英]Running a shell command with execlp() from a string

我试图让我的程序使用exelp()运行外壳命令。 用户输入基本上被存储,然后通过执行的外壳命令exelp()在一个新的壳。

可以说,用户输入“LS -l / bin中/ - ”,这又通过可变捕获command[] 我怎样才能得到这个文本字符串壳envionment内执行。

我最近来了解如何做到这一点是通过做execlp("/bin/sh", "-c", command, (char *)NULL); ,其中/bin/sh启动一个迷你shell, -c使shell可以获取字符串,倒数第二个参数只是前面捕获的字符串。 我知道, system()是一个不错的选择,但我想用execlp用于教育目的来做到这一点。

我在这里想念什么? 提前致谢。

也许您在问如何在C程序中将shell单词扩展为参数子序列。 参见glob(7)

然后考虑glob(3)wordexp(3)

你应该明白,当你输入ls -l /bin/?? 它是shell的职责扩大?? ; /bin/ls程序是execve(2) -ed, 由外壳完成扩展结果 ...

或者,您可以将其保留在由system(3)popen(3)函数启动的/bin/sh -c shell中。 如果将某些用户输入传递给这些功能,请当心代码注入并适当引用任何用户输入。 假设您运行由ls -l和一些用户输入组成的字符串; 如果恶意用户给出a; rm -rf $HOME a; rm -rf $HOME作为文件名,如果不引用它,将感到抱歉(因为在没有预防措施的情况下,您的程序将构建ls -la; rm -rf $HOME命令字符串然后会将其传递给systempopen然后灾难发生)。

您正在将const char**而不是const char *作为第三个参数

尝试execlp("/bin/sh", "-c", "ls", "-l", "/bin/", 0)或创建另一个以“ -c”作为第一个参数的char **,然后使用execv

我猜它正在编译,因为这两个参数是指针,但是它们的类型错误

编辑

当您像这样调用execlp时。 就像您说command是const char[] ,但是在定义中您只需要放置const char*就好像您调用了该函数一样

execlp(const char*, const char*, const char **, char*) //wrong obviously

所以您有两种解决方案。 第一个使用bin / sh -c的方法是合并所有参数并将其传递给execlp

int main(int argc, char **av)
{
  char  **args;
  int   i;
  char  *cmd;
  size_t size;

  args = malloc(sizeof(char*) * (4));
  args[0] = "sh";
  args[1] = "-c";
  i = 1;
  size = 0;
  cmd = malloc(1);
  *cmd = '\0';
  while (i < argc)
    {
      cmd = realloc(cmd, strlen(cmd) + 1 + strlen(av[i]));
      strcat(&(cmd[size]), av[i]);
      size += strlen(cmd);
      strcat(&(cmd[size]), " ");
      size++;
      i++;
    }
  args[2] = cmd;
  execvp("/bin/sh", args);
}

但这不是很干净

最好的方法(对我来说更合逻辑)我认为是找到二进制文件的地址,因此在您的情况下是/ bin / ls,然后使用execvp传递它

就像是:

char *get_binary_addr(const char* fct)
{
  return "/bin/ls"; //ofc you will parse your /bin to find binary addr
}

int main(int argc, char **av)
{
  char  **args;

  args = malloc(sizeof(char*) * argc);
  memcpy(&(args[0]), &(av[1]), argc * sizeof(char*));
  execvp(get_binary_addr(av[0]), args);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM