C 如何执行shell脚本或可执行文件?

C 如何执行shell脚本或可执行文件?,c,exec,C,Exec,这是我正在做的一个学校项目 我正在写一个网络服务器。如果请求的资源具有扩展名“cgi”,我需要fork并执行程序。如果cgi是一个已编译的可执行文件,则可以: execl(path, (char*) 0); 但如果cgi程序是一个需要解释的脚本,我需要做如下操作: execl("/bin/sh", path, path, (char*) 0); 如何编写代码使其能够处理这两种情况?我的外壳是如何做到这一点的?我是否应该使用文件程序来确定它是可执行文件还是文本,如果它是文本,则假定需要对其进行

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

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

execl(path, (char*) 0);
但如果cgi程序是一个需要解释的脚本,我需要做如下操作:

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

如何编写代码使其能够处理这两种情况?我的外壳是如何做到这一点的?我是否应该使用
文件
程序来确定它是可执行文件还是文本,如果它是文本,则假定需要对其进行解释?

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

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

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

execl("/bin/sh", "/bin/sh", "-c", path, (char*) 0);
编辑:更正了上述调用。现在应该可以了;我试过了

execl("/bin/sh", "/bin/sh", "-c", "set", NULL);
execl("/bin/sh", "/bin/sh", "-c", "/usr/bin/clear", NULL);
我的测试程序响应默认的shell变量。然后我测试了一下

execl("/bin/sh", "/bin/sh", "-c", "set", NULL);
execl("/bin/sh", "/bin/sh", "-c", "/usr/bin/clear", NULL);
我的测试程序清除了终端模拟器的屏幕


注意:这个答案的好处是,它将运行您可以从shell运行的任何东西。因此,它将运行内置的shell命令,并且它将运行没有正确的
#的shell脚本/路径/到/解释器
第一行。如果您想要运行的所有shell脚本都具有正确的
#第一行,您不需要这个。这提供了一个稍微更健壮的解决方案,但代价是执行一个可能不需要的shell。

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


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

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

错误:“无法执行二进制文件”不起作用。请记住,任何程序的第一个参数(即,
argv[0]
)都是实际的程序名……对不起,我不习惯调用
execl()
。我将编辑答案。@TrevorDixon:当您从shell提示符执行脚本时会发生什么?剧本的第一行是什么样子的?达尼特,你说得对。我打错了!我的测试脚本缺少了shebang的“bang”部分。我觉得很尴尬。谢谢大家!@特雷弗迪克森:事实上,我很惊讶没有
,它就不能工作。执行权限以
#
开头的脚本通常由
/bin/sh
执行。不过,这可能取决于您的操作系统。