我怎么能执行shell脚本或可执行文件?

时间:2013-02-01 22:34:45

标签: c exec

这是我正在研究的学校项目。

我正在写一个Web服务器。如果请求的资源具有扩展名'cgi',我需要fork和exec该程序。如果cgi是已编译的可执行文件,则可以:

execl(path, (char*) 0);

但是如果cgi程序是需要解释的脚本,我需要做这样的事情:

execl("/bin/sh", path, path, (char*) 0);

如何编写代码以便处理任何一种情况?我的shell是如何做到这一点的?我应该使用file程序来确定它是可执行文件还是文本,如果它是文本,那么假设它需要被解释?

3 个答案:

答案 0 :(得分:8)

如果是脚本,为什么需要明确调用"/bin/sh"

只要脚本具有执行权限并且顶部有正确的shebang,您就应该能够执行它,就好像它是可执行文件一样。

答案 1 :(得分:0)

您可以要求shell使用-c选项为您运行命令。

如果命令是shell内置的,或shell脚本,shell将运行它;如果是外部命令,shell将执行二进制文件。

试试这个,看看它是否适合你:

execl("/bin/sh", "/bin/sh", "-c", path, (char*) 0);
编辑:纠正了上述电话。这应该现在起作用;我用

进行了测试
execl("/bin/sh", "/bin/sh", "-c", "set", NULL);

我的测试程序回显了默认的shell变量。然后我用

测试了
execl("/bin/sh", "/bin/sh", "-c", "/usr/bin/clear", NULL);

我的测试程序清除了终端模拟器的屏幕。

注意:关于这个答案的好处是它将运行你可以从shell运行的任何东西。因此,它将运行内置的shell命令,并且它将运行没有正确的#!/path/to/interpreter第一行的shell脚本。如果您想要运行的所有shell脚本都具有正确的#!第一行,则不需要此。这提供了一个稍微强大的解决方案,代价是执行可能不需要的shell。

答案 2 :(得分:0)

如果没有警告您的用户,您应该检查该文件是否具有exec权限。 您可以使用GlibC的lstat函数来执行该操作。 然后使用来自GlibC的execve为它提供路径和参数列表(你也可以从main获取env var,我建议你给你的程序提供环境而不是给(char *)0这是一个NULL指针)