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

标签 c linux shell

我正在尝试让我的程序使用 exelp() 运行 shell 命令。用户基本上输入一个 shell 命令,该命令被存储,然后由新 shell 中的 exelp() 执行。

假设用户输入“ls -l/bin/??”,该输入又被变量 command[] 捕获。我怎样才能让这个文本字符串在 shell 环境中执行。

我最了解如何做到这一点是通过执行 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 是由 shell 完成的扩展结果 ...

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

关于c - 使用 execlp() 从字符串运行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21568524/

相关文章:

c - 如何创建一个简单的驱动程序? [乌类图]

php - 在 lampp 服务器中从 php 运行 ffmpeg 时找不到 GLIBCXX_3.4.9

linux - Windows Home Server 之类的 Ubuntu 远程备份软件

linux - 为什么 ln -s 中的尾部斜线很重要?

c - 输入/输出流?

C程序计算子串

python - 如何在 python 脚本上实现 "recursive"选项

java - 如何在Linux上获得用户定义的系统颜色?

bash - 用于打开 GNU screen 或具有许多相同进程的类似脚本

linux - 在文件中搜索字符串的最后一次出现并 append 到它