4

这是我正在做的一个学校项目。

我正在写一个网络服务器。如果请求的资源具有扩展名“cgi”,我需要分叉并执行程序。如果 cgi 是已编译的可执行文件,则此方法有效:

execl(path, (char*) 0);

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

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

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

4

3 回答 3

8

"/bin/sh"如果是脚本,为什么需要显式调用?

只要脚本在顶部具有执行权限和适当的shebang,您就应该能够像执行可执行文件一样执行它。

于 2013-02-01T22:47:12.727 回答
0

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

如果命令是内置的 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。

于 2013-02-01T22:40:14.030 回答
0

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

于 2013-02-01T23:26:41.200 回答