#exec 指令运行指定的应用程序或 shell 命令,并将输出(标准输出或 ISAPI WriteClient 数据)发送到客户端浏览器。必须使用 HTML 注释分隔符将指令括起来。
此指令仅可用于 STM 网页,无法用于 ASP 网页。没有相应的 ASP 脚本方法可以将多个 CGI 脚本或 ISAPI 应用程序的输出包含到一个网页中。
<!-- #exec CommandType = CommandDescription -->
CommandType
指定命令类型。命令可以是下列某种类型:
| 命令类型 | 含义 |
| CGI | 运行一个应用程序,如 CGI 脚本、ASP 应用程序或 ISAPI 应用程序。CommandDescription 参数是一个包含应用程序的完整虚拟路径的字符串,其后跟问号 (?) 及传递给应用程序的任何参数。参数由加号 (+) 分隔。由于运行 ISAPI 应用程序只是 SSI 文档处理的一部分,所以 ISAPI 应用程序受到如下限制: 如果任何 ISAPI 扩展试图通过 ServerSupportFunction 回调函数发送 URL 或进行重定向,都会将消息放入 HTML 流,而不会发送/重定向。 SSI 解释程序 (Ssinc.dll) 将无限期地等待应用程序返回 HSE_STATUS_PENDING,除非调用 ServerSupportFunction 完成会话。 可以在 MSDN 库中(在 ISAPI 参考下)找到有关 ServerSupportFunction 的说明。 |
| CMD | 运行 shell 命令。CommandDescription 参数是一个包含 shell 程序的完整物理路径的字符串,后跟任何命令行参数,这些参数由空格分隔。如果未指定完整路径,Web 服务器将搜索系统路径。 默认情况下将禁用此指令,因为它会威胁网站安全。要启用此指令,请将 DWORD 注册表值 SSIEnableCmdDirective 添加到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters 项,并将它设置为 1。所有使用了 #exec 指令的 STM 文件,其所在的 Web 文件夹都应禁用匿名访问。 有关使用注册表的一般信息,请参阅“注册表”。 |
要点
包含此指令的文件必须使用已映射到 SSI 解释程序的扩展名。否则,Web 服务器将不处理此指令。默认情况下,文件扩展名 .stm、.shtm 和 .shtml 将映射到 SSI 解释程序 (ssinc.dll)。使用 #echo 指令的 STM 网页既可以自运行,也可以通过 Response.Redirect 从 ASP 网页调用它来运行。用 Server.Transfer、Server.Execute 或 #include 从 ASP 网页中调用 STM 网页是行不通的,因为这样会迫使 STM 网页通过 asp.dll 而不是通过 ssinc.dll 进行解释。
如果安装了 Internet 信息服务管理单元,则可以修改默认扩展名映射并添加新映射,请参阅设置应用程序映射。由于不能将一个文件扩展名映射到多个可执行文件,所以不能在 ASP 文件中使用此指令。ASP 文件已映射到 asp.dll,并且必须保持此状态。
以下示例使用 CGI 命令类型运行 ASP 网页,因此不需要向注册表添加值。使用 Server.Execute、Server.Transfer 或 #include 从 Exec.asp 运行 Test.asp 效果可能会更好。但在这里,我们只是要讲解 STM 文件中的 #exec 指令。
--- Exec.asp ---
<FORM NAME="RunExec" METHOD="POST" ACTION="Exec.asp">
<INPUT TYPE="SUBMIT" VALUE="Run the #exec Directive" NAME="RunExec">
</FORM>
<%
If Len(Request.Form("RunExec")) Then
Response.Redirect("Exec.stm")
End If
%>
--- Exec.stm ---
<H3>Inside Exec.stm</H3> <!-- #exec CGI="/testfolder/test.asp?test=Hello" --> <FORM NAME="Return" METHOD="POST" ACTION="Exec.asp"> <INPUT TYPE="SUBMIT" VALUE="Return to Previous Page" NAME="Return"> </FORM>
--- Test.asp ---
<%
Response.Write "<BR>Inside Test.asp.<BR>"
Response.Write "Test = " & Request.QueryString("Test") & ".<BR>"
%>