我正在尝试让我的程序使用 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
然后命令字符串将该字符串传递给 system
或 popen
,然后灾难就会发生)。
关于c - 使用 execlp() 从字符串运行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21568524/