<html xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"><meta name="generator" content="pdf2htmlEX"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/css/base.min.css"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/css/fancy.min.css"><link rel="stylesheet" href="https://csdnimg.cn/release/download_crawler_static/4896355/raw.css"><script src="https://csdnimg.cn/release/download_crawler_static/js/compatibility.min.js"></script><script src="https://csdnimg.cn/release/download_crawler_static/js/pdf2htmlEX.min.js"></script><script>try{pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});}catch(e){}</script><title></title></head><body><div id="sidebar" style="display: none"><div id="outline"></div></div><div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/4896355/bg1.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div><div class="t m0 x3 h4 y3 ff2 fs0 fc1 sc0 ls0 ws0">第<span class="ff3">29</span>章<span class="_ _0"> </span><span class="ff3">cgi </span>脚<span class="_ _0"> </span>本</div><div class="t m0 x4 h5 y4 ff2 fs1 fc0 sc0 ls1 ws0">现在差不多每个人的<span class="_ _1"> </span><span class="ff3 ls0 ws1">P C<span class="_"> </span></span><span class="ls2">上都安装了<span class="_ _2"></span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws1">e b<span class="_"> </span><span class="ff2 ls3 ws0">服务器,在这样一本关于<span class="_ _4"> </span></span>s h e l l<span class="ff2 ls4 ws0">编程的书中似乎很</span></span></span></span></div><div class="t m0 x5 h5 y5 ff2 fs1 fc0 sc0 ls5 ws0">有必要包含一章关于<span class="_ _2"></span><span class="ff3 ls0 ws2">c g i</span><span class="ls6">脚本的内容。</span></div><div class="t m0 x4 h6 y6 ff2 fs1 fc0 sc0 ls5 ws0">本章包含以下内容:</div><div class="t m0 x4 h5 y7 ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _5"></span><span class="ff2">基本<span class="_ _5"></span></span><span class="ws2">c g i</span><span class="ff2">脚本。</span></div><div class="t m0 x4 h5 y8 ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _5"></span><span class="ff2 ls7">使用服务器端内嵌<span class="_ _6"></span></span><span class="ls8">(Server Side Includes,SSI)<span class="_ _5"></span></span><span class="ff2">。</span></div><div class="t m0 x4 h5 y9 ff3 fs1 fc0 sc0 ls0 ws0">• get<span class="_ _6"></span><span class="ff2">方法。</span></div><div class="t m0 x4 h5 ya ff3 fs1 fc0 sc0 ls0 ws0">• post<span class="_ _6"></span><span class="ff2">方法。</span></div><div class="t m0 x4 h5 yb ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _5"></span><span class="ff2 ls7">创建交互式脚本。</span></div><div class="t m0 x4 h5 yc ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _5"></span><span class="ff2 ls9">能够自动重载<span class="_ _7"></span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws2">e b<span class="_"> </span><span class="ff2 ws0">页面的<span class="_ _7"></span></span>c g i<span class="ff2 ws0">脚本。</span></span></span></span></div><div class="t m0 x4 h5 yd ff2 fs1 fc0 sc0 ls0 ws0">运行<span class="_ _7"></span><span class="ff3">W<span class="_ _8"></span><span class="ws3">e b<span class="_"> </span><span class="ff2 lsa ws0">服务器并不一定需要有网络环境,可以在本地主机上运行它。这里,我们假定</span></span></span></div><div class="t m0 x5 h5 ye ff2 fs1 fc0 sc0 lsb ws0">你已经安装了<span class="_ _2"> </span><span class="ff3">W<span class="_ _8"></span><span class="ls0 ws4">e b<span class="_"> </span><span class="ff2 ws0">服务器<span class="_ _2"></span></span>( a p a c h e<span class="_"> </span><span class="ff2 ws0">、<span class="_ _5"></span></span>C e r n<span class="_"> </span><span class="ff2 ws0">等等<span class="_ _7"></span><span class="ff3">)<span class="_ _5"></span></span><span class="ls2">以及浏览器<span class="_ _6"></span></span></span>( N e t s c a p e<span class="_"> </span><span class="ff2 ws0">、<span class="_ _5"></span><span class="ff3 lsc">Internet Explorer<span class="_ _5"></span></span>等等<span class="_ _5"></span><span class="ff3">)<span class="_ _5"></span></span>。</span></span></span></div><div class="t m0 x5 h5 yf ff2 fs1 fc0 sc0 lsd ws0">另外,该服务器应当允许运行<span class="_ _1"> </span><span class="ff3 ls0 ws5">c g i<span class="_"> </span></span><span class="lse">脚本。一般来说缺省值是禁止运行<span class="_ _9"> </span><span class="ff3 ls0 ws5">c g i</span><span class="lsf">脚本的,要运行,只要</span></span></div><div class="t m0 x5 h6 y10 ff2 fs1 fc0 sc0 ls10 ws0">将配置文件中相应的一行注释掉即可。后面我们会更详细地讨论这一问题。</div><div class="t m0 x4 h5 y11 ff2 fs1 fc0 sc0 ls11 ws0">如何安装并配置<span class="_ _1"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws6">e b<span class="_"> </span><span class="ff2 ls12 ws0">服务器已经超出了本书的讨论范围,不过我认为只需<span class="_ _a"> </span></span>2 0<span class="_"> </span><span class="ff2 ls13 ws0">分钟就可以</span></span></span></div><div class="t m0 x5 h5 y12 ff2 fs1 fc0 sc0 ls14 ws0">安装并运行一个<span class="_ _1"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws7">e b<span class="ff2 ls15 ws0">服务器。本章中的例子运行于<span class="_ _b"> </span><span class="ff3 lsa">apache W</span></span>e b<span class="ff2 ls16 ws0">服务器下,我所使用的浏览器</span></span></span></div><div class="t m0 x5 h5 y13 ff2 fs1 fc0 sc0 ls0 ws0">为<span class="_ _c"></span><span class="ff3 ws2">N e t s c a p e</span>。</div><div class="t m0 x4 h5 y14 ff2 fs1 fc0 sc0 ls17 ws0">本章不打算深入探讨有关<span class="_ _2"> </span><span class="ff3 ls0 ws8">H T M L<span class="_ _5"></span></span><span class="ls0">或<span class="_ _c"></span><span class="ff3">W<span class="_ _8"></span><span class="ws8">e b<span class="_"> </span><span class="ff2 ls18 ws0">的细节问题,因为市面上已经有大量关于这方面的</span></span></span></span></div><div class="t m0 x5 h5 y15 ff2 fs1 fc0 sc0 ls19 ws0">书籍。另外,如果要深入探讨<span class="_ _1"> </span><span class="ff3 ls0 ws2">H T M L<span class="_"> </span></span>的话,还要花费数章的笔墨。</div><div class="t m0 x5 h7 y16 ff4 fs2 fc1 sc0 ls0 ws0">29.1 <span class="ff5">什么是</span>Web<span class="_ _8"></span><span class="ff5">页面?</span></div><div class="t m0 x4 h5 y17 ff3 fs1 fc0 sc0 ls0 ws0">W<span class="_ _3"></span><span class="ws9">e b<span class="_"> </span><span class="ff2 ls1a ws0">页面或文挡是包含有<span class="_ _2"> </span></span>H T M L<span class="_ _5"></span><span class="ff2 ls1b ws0">标记的文件。当浏览器连接到一个<span class="_ _9"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws9">e b<span class="_"> </span><span class="ff2 ls1c ws0">页面上时,浏览器</span></span></span></span></span></div><div class="t m0 x5 h5 y18 ff2 fs1 fc0 sc0 ls17 ws0">就会根据相应的<span class="_ _7"></span><span class="ff3 ls0 wsa">H T M L</span>标记来显示该页面。<span class="_ _2"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 wsa">e b<span class="_"> </span><span class="ff2 ls1d ws0">页面中可以含有非常丰富的信息,它可以包含</span></span></span></div><div class="t m0 x5 h6 y19 ff2 fs1 fc0 sc0 ls1e ws0">指向其他页面的链接、各种色彩、高亮标题、各种字体、直线、表格,还可以包含图像和声</div><div class="t m0 x5 h6 y1a ff2 fs1 fc0 sc0 ls0 ws0">音。</div><div class="t m0 x4 h5 y1b ff3 fs1 fc0 sc0 ls0 ws0">W<span class="_ _3"></span><span class="ws3">e b<span class="_"> </span><span class="ff2 lsa ws0">页面可以分为两类:动态的页面和静态的页面。静态的页面是用于显示信息或下载</span></span></div><div class="t m0 x5 h6 y1c ff2 fs1 fc0 sc0 ls1e ws0">文件。而动态的页面是交互型的,它们可以按照你所提供的信息产生相应的结果。动态页面</div><div class="t m0 x5 h6 y1d ff2 fs1 fc0 sc0 ls1e ws0">还可以用于显示实时变化的信息,如股票价格,或用于完成某些监视任务。如果想要执行这</div><div class="t m0 x5 h6 y1e ff2 fs1 fc0 sc0 ls1f ws0">种类型的处理,就需要编写脚本。</div><div class="t m0 x4 h5 y1f ff2 fs1 fc0 sc0 lsb ws0">如果一个<span class="_ _6"></span><span class="ff3">W<span class="_ _8"></span><span class="ls0 ws3">e b<span class="_"> </span><span class="ff2 lsa ws0">服务器能够交换信息脚本,那么它必须支持一种被称为公共网关接口的协</span></span></span></div><div class="t m0 x5 h5 y20 ff2 fs1 fc0 sc0 ls5 ws0">议,即大家所熟悉的<span class="_ _6"></span><span class="ff3 ls0 ws2">c g i<span class="_"> </span></span><span class="ls0">。</span></div><div class="t m0 x5 h8 y21 ff4 fs2 fc1 sc0 ls0 ws0">29.2 cgi</div><div class="t m0 x4 h5 y22 ff3 fs1 fc0 sc0 ls0 wsb">c g i<span class="ff2 ls20 ws0">是一种规范,它规定了获取信息的脚本如何从服务器中取得信息或向服务器中写入信</span></div><div class="t m0 x5 h5 y23 ff2 fs1 fc0 sc0 ls1d ws0">息。这种脚本或<span class="_ _1"> </span><span class="ff3 ls0 wsc">c g i<span class="_ _7"></span></span><span class="ls21">脚本可以用任何语言来实现。最为流行的是<span class="_ _d"> </span><span class="ff3 ls0 wsc">P e r l<span class="_"> </span></span><span class="lsa">语言,不过你将会发现,</span></span></div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div></body></html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/4896355/bg2.jpg"><div class="t m0 x6 h5 y24 ff2 fs1 fc0 sc0 ls22 ws0">也可以用普通的<span class="_ _7"></span><span class="ff3 ls0 ws2">s h e l l<span class="_ _5"></span></span><span class="ls7">脚本来实现(见图<span class="_ _6"></span><span class="ff3 ls0 ws2">2 9 - 1</span><span class="ls0">)<span class="_ _e"></span>。</span></span></div><div class="t m0 x7 h9 y25 ff2 fs3 fc1 sc0 ls0 ws0">图<span class="ff3">29-1 </span>浏览器和服务器可以通过<span class="ff3">cgi</span>来交换信息</div><div class="t m0 x6 h7 y26 ff4 fs2 fc1 sc0 ls0 ws0">29.3 <span class="ff5">连接</span>Web<span class="_ _8"></span><span class="ff5">服务器</span></div><div class="t m0 x8 h5 y27 ff2 fs1 fc0 sc0 ls23 ws0">可以使用统一资源定位符<span class="_ _2"></span><span class="ff3 ls0 ws2">( U R L )<span class="_"> </span></span><span class="ls0">连接<span class="_ _5"></span><span class="ff3">W<span class="_ _3"></span><span class="ws2">e b<span class="_"> </span><span class="ff2 ws0">服务器。<span class="_ _6"></span></span>U R L<span class="_"> </span><span class="ff2 ls7 ws0">包含两部分信息:</span></span></span></span></div><div class="t m0 x9 h5 y28 ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _5"></span><span class="ff2">协议。</span></div><div class="t m0 x9 h5 y29 ff3 fs1 fc0 sc0 ls0 ws0">• <span class="_ _5"></span><span class="ff2 ls6">地址和数据。</span></div><div class="t m0 x8 h5 y2a ff2 fs1 fc0 sc0 ls24 ws0">其中,协议包括<span class="_ _6"></span><span class="ff3 ls0 wsd">h t t p<span class="_ _5"></span></span><span class="ls0">、<span class="_ _5"></span><span class="ff3 wsd">f t p</span>、<span class="_ _5"></span><span class="ff3 wsd">m a i l t o<span class="_ _5"></span></span>、<span class="_ _c"></span><span class="ff3 wsd">f i l e<span class="_"> </span></span>、<span class="_ _5"></span><span class="ff3 wsd">t e l n e t<span class="_"> </span></span>和<span class="_ _c"></span><span class="ff3 wsd">n e w s<span class="_"> </span></span><span class="ls25">。这里我们只关心<span class="_ _1"> </span></span><span class="ff3 wsd">h t t p<span class="_"> </span></span>协议<span class="_ _5"></span><span class="ff3">(<span class="_ _c"></span></span>超文本</span></div><div class="t m0 x6 h5 y2b ff2 fs1 fc0 sc0 ls0 ws0">传输协议<span class="_ _7"></span><span class="ff3">)<span class="_ _5"></span></span>。</div><div class="t m0 x8 h5 y2c ff2 fs1 fc0 sc0 ls2 ws0">地址一般是<span class="_ _6"></span><span class="ff3 ls0 wse">D N S<span class="_ _7"></span></span><span class="ls26">域名或服务器主机名,也可以是<span class="_ _b"> </span><span class="ff3 ls0 wse">I P<span class="_ _7"></span></span><span class="ls27">地址。其他数据可以是你所要访问文</span></span></div><div class="t m0 x6 h6 y2d ff2 fs1 fc0 sc0 ls28 ws0">件的实际路径名。</div><div class="t m0 x8 h5 y2e ff2 fs1 fc0 sc0 ls7 ws0">所有的连接都基于<span class="_ _6"></span><span class="ff3 ls0 ws2">T C P</span><span class="ls19">协议之上,缺省的端口号为<span class="_ _2"> </span><span class="ff3 ls0 ws2">8 0<span class="_"> </span></span><span class="ls0">。</span></span></div><div class="t m0 x8 h5 y2f ff2 fs1 fc0 sc0 ls0 ws0">如果<span class="_ _6"></span><span class="ff3">W<span class="wsf">e b<span class="_"> </span></span></span><span class="ls29">服务器在你的本地主机上,而相应的主页为<span class="_ _f"> </span></span><span class="ff3 wsf">i n d e x . h t m l<span class="_"> </span></span><span class="lsf">,那么可以使用下面的</span></div><div class="t m0 x6 h5 y30 ff3 fs1 fc0 sc0 ls0 ws2">U R L<span class="ff2 ws0">:</span></div><div class="t m0 x8 ha y31 ff6 fs4 fc0 sc0 ls0 ws10">h t t p : / / l o c a l h o s t / i n d e x . h t m l</div><div class="t m0 x8 h5 y32 ff2 fs1 fc0 sc0 ls2a ws0">一般来说,<span class="_ _2"></span><span class="ff3 ls0 ws11">i n d e x . h t m l<span class="_"> </span></span><span class="ls2b">是缺省下载的文件,即该页面是你的<span class="_ _10"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws11">e b<span class="_"> </span><span class="ff2 ls2c ws0">服务器的缺省页。这样,</span></span></span></span></div><div class="t m0 x6 h5 y33 ff2 fs1 fc0 sc0 ls5 ws0">你可以只输入如下的<span class="_ _6"></span><span class="ff3 ls0 ws2">U R L<span class="_"> </span></span><span class="ls0">:</span></div><div class="t m0 x8 ha y34 ff6 fs4 fc0 sc0 ls0 ws10">h t t p : / / l o c a l h o s t /</div><div class="t m0 x6 h7 y35 ff4 fs2 fc1 sc0 ls0 ws0">29.4 cgi<span class="ff5">和</span>HTM<span class="ff5">脚本</span></div><div class="t m0 x8 h5 y36 ff2 fs1 fc0 sc0 ls1f ws0">当浏览器发出下载页面的请求时,<span class="_ _10"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws6">e b<span class="_"> </span><span class="ff2 ls2d ws0">服务器将会对收到的<span class="_ _9"> </span></span>U R L<span class="_"> </span><span class="ff2 ls2e ws0">进行分析。如果其中含</span></span></span></div><div class="t m0 x6 h5 y37 ff2 fs1 fc0 sc0 ls0 ws0">有<span class="_ _c"></span><span class="ff3 ws12">c g i - b i n<span class="_"> </span></span><span class="ls2f">,服务器将打开一个连接,通常是连接相应<span class="_ _b"> </span></span><span class="ff3 ws12">c g i</span><span class="ls30">脚本的管道。该<span class="_ _6"></span></span><span class="ff3 ws12">c g i<span class="_ _5"></span></span><span class="ls1d">脚本所有的输入输</span></div><div class="t m0 x6 h5 y38 ff2 fs1 fc0 sc0 ls31 ws0">出都将通过该管道。如果该<span class="_ _10"> </span><span class="ff3 ls0 ws13">c g i<span class="_ _7"></span></span><span class="ls32">脚本用于显示<span class="_ _9"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws13">e b<span class="_"> </span><span class="ff2 ls31 ws0">页面,那么它的输出中必须要包含必要的</span></span></span></span></div><div class="t m0 x6 h5 y39 ff3 fs1 fc0 sc0 ls0 ws14">H T M L<span class="_"> </span><span class="ff2 ls33 ws0">标记,这样该页面才能够按照服务器所能够理解的格式被显示出来,因此我们有必要</span></div><div class="t m0 x6 h5 y3a ff2 fs1 fc0 sc0 ls0 ws0">了解一些<span class="_ _6"></span><span class="ff3 ws15">H T M L<span class="_"> </span></span>的知识。<span class="_ _6"></span><span class="ff3">W<span class="_ _3"></span><span class="ws15">e b<span class="_"> </span><span class="ff2 ls34 ws0">服务器将该页面返回给发出请求的浏览器显示出来。表<span class="_ _11"> </span></span>2 9 - 1<span class="_"> </span><span class="ff2 ws0">列出</span></span></span></div><div class="t m0 x6 h5 y3b ff2 fs1 fc0 sc0 ls9 ws0">了一些常用的<span class="_ _7"></span><span class="ff3 ls0 ws2">H T M L<span class="_ _5"></span></span><span class="ls0">标记。</span></div><div class="t m0 x6 h6 y3c ff4 fs1 fc1 sc0 ls0 ws0">29.4.1 <span class="ff5">基本</span>cgi<span class="ff5">脚本</span></div><div class="t m0 x8 h5 y3d ff2 fs1 fc0 sc0 ls0 ws0">所有的<span class="_ _6"></span><span class="ff3 ws16">c g i<span class="_"> </span></span><span class="ls35">脚本都应当位于<span class="_ _1"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws16">e b<span class="_"> </span><span class="ff2 ls25 ws0">服务器的<span class="_ _6"></span></span>c g i - b i n<span class="_"> </span><span class="ff2 ls36 ws0">目录中,不过在不同的服务器中该目录会</span></span></span></span></div><div class="t m0 x6 h5 y3e ff2 fs1 fc0 sc0 ls37 ws0">有所不同。可以通过查看配置文件<span class="_ _4"> </span><span class="ff3 ls0 ws17">s r m . c o n f</span><span class="ls0">中<span class="_ _5"></span><span class="ff3 ws17">S c r i p t A l i a s<span class="_"> </span></span><span class="ls31">一段来改变该目录的位置,并允许该</span></span></div><div class="t m0 x6 h5 y3f ff2 fs1 fc0 sc0 ls38 ws0">服务器运行<span class="_ _9"> </span><span class="ff3 ls0 ws18">c g i<span class="_"> </span></span><span class="ls39">脚本。所有的脚本文件名都应以<span class="_ _d"> </span><span class="ff3 ls0 ws18">. c g i<span class="_"> </span></span><span class="ls3a">做后缀。而其他<span class="_ _b"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws18">e b<span class="_"> </span><span class="ff2 ls3b ws0">页面都位于<span class="_ _9"> </span></span>h t m l<span class="_"> </span><span class="ff2 ws0">或</span></span></span></span></span></div><div class="t m0 x6 h5 y40 ff3 fs1 fc0 sc0 ls0 ws2">h t d o c s<span class="ff2 ls7 ws0">目录下,并且带有<span class="_ _6"></span></span>. h t m l<span class="_"> </span><span class="ff2 ls3c ws0">后缀。所有的脚本都应具有这样的权限。</span></div><div class="t m0 x8 ha y41 ff6 fs4 fc0 sc0 ls3d ws0">chmod 755 script.cgi</div><div class="t m0 x8 h5 y42 ff2 fs1 fc0 sc0 ls0 ws0">所有<span class="_ _5"></span><span class="ff3">W<span class="_ _8"></span><span class="ws19">e b<span class="_"> </span><span class="ff2 lsb ws0">页面连接的缺省用户身份为<span class="_ _4"> </span></span>n o b o d y<span class="_"> </span><span class="ff2 ls3e ws0">,不过可以通过配置<span class="_ _1"> </span></span>h t t p d . c o n f<span class="ff2 ls3f ws0">文件来改变这</span></span></span></div><div class="t m0 xa hb y43 ff7 fs5 fc2 sc0 ls0 ws0">326<span class="_ _12"> </span><span class="ff8 fs1 fc0">第五部分<span class="_ _13"> </span>高级<span class="_ _5"></span><span class="ff9 ws2">s h e l l</span>编程技巧</span></div><div class="c x1 y1 w2 h2"><div class="t m0 xb h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div><div class="t m0 x9 hc y44 ff2 fs6 fc0 sc0 ls0 ws0">用户使用浏览器连接</div><div class="t m0 xc hd y45 ff3 fs6 fc0 sc0 ls0 ws0">Web<span class="_ _3"></span><span class="ff2">页面</span></div><div class="t m0 xd hd y46 ff3 fs6 fc0 sc0 ls0 ws0">Web<span class="_ _3"></span><span class="ff2">服务器</span></div><div class="t m0 xe hd y47 ff2 fs6 fc0 sc0 ls0 ws0">(<span class="ff3">apache?</span>)</div><div class="t m0 xf hd y46 ff3 fs6 fc0 sc0 ls0 ws0">cgi<span class="ff2">脚本获取信息,进行处</span></div><div class="t m0 x10 hc y48 ff2 fs6 fc0 sc0 ls0 ws0">理后返回结果</div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/4896355/bg3.jpg"><div class="t m0 x11 h5 y24 ff2 fs1 fc0 sc0 ls40 ws0">一设置。尽管我曾经说过本章并不是关于<span class="_ _14"> </span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws1a">e b<span class="_"> </span><span class="ff2 ls41 ws0">服务器配置的,不过正好可以借这个机会检查</span></span></span></div><div class="t m0 x11 h5 y49 ff2 fs1 fc0 sc0 ls0 ws0">一下<span class="_ _5"></span><span class="ff3 ws1b">p a s s w d<span class="_"> </span></span><span class="ls1b">文件,看看<span class="_ _6"></span></span><span class="ff3 ws1b">n o b o d y<span class="_ _5"></span></span><span class="ls35">用户的登录是否被禁止。如果想防止任何用户以<span class="_ _10"> </span></span><span class="ff3 ws1b">n o b o d y<span class="_"> </span></span>的身份</div><div class="t m0 x11 h5 y4a ff2 fs1 fc0 sc0 ls42 ws0">从某一个物理端口上登录,只要在<span class="_ _11"> </span><span class="ff3 ls0 ws1c">/ e t c / p a s s w d<span class="_"> </span></span><span class="ls1e">文件中该用户口令域的第一个字符前面加入一</span></div><div class="t m0 x11 h5 y4b ff2 fs1 fc0 sc0 ls0 ws0">个星号<span class="_ _5"></span><span class="ff3">*<span class="_ _c"></span></span>即可。</div><div class="t m0 x12 he y4c ff5 fs3 fc0 sc0 ls0 ws0">表<span class="_ _c"></span><span class="ff4 ls11">29-1 <span class="_ _c"></span></span>基本<span class="_ _5"></span><span class="ff4 ws2">H T M L</span>标记</div><div class="t m0 x13 hd y4d ff3 fs6 fc0 sc0 ls0 ws1d">< H T M L > < / H T M L ><span class="_ _15"> </span>H T M L<span class="_"> </span><span class="ff2 ls43 ws0">文挡的开头和结束</span></div><div class="t m0 x13 hd y4e ff3 fs6 fc0 sc0 ls0 ws1d">< H E A D > < / H E A D ><span class="_ _16"> </span><span class="ff2 ls44 ws0">标题部分的开头和结束</span></div><div class="t m0 x13 hd y4f ff3 fs6 fc0 sc0 ls0 ws1d">< T I T L E > < / T I T L E ><span class="_ _17"> </span><span class="ff2 ls43 ws0">主题的开头和结束</span></div><div class="t m0 x13 hd y50 ff3 fs6 fc0 sc0 ls0 ws1d">< B O D Y > < / B O D Y ><span class="_ _15"> </span><span class="ff2 ls44 ws0">页面部分的开头和结束</span></div><div class="t m0 x13 hd y51 ff3 fs6 fc0 sc0 ls0 ws1d">< H n > < / H n ><span class="_ _18"> </span><span class="ff2 ls43 ws0">不同层次的标题,<span class="_ _7"></span><span class="ff3">1</span><span class="ls45">代表最大的字体</span></span></div><div class="t m0 x13 hd y52 ff3 fs6 fc0 sc0 ls0 ws1d">< P > < / P ><span class="_ _19"> </span><span class="ff2 ls43 ws0">段落的开头和结束</span></div><div class="t m0 x13 hd y53 ff3 fs6 fc0 sc0 ls0 ws1d">< B R ><span class="_ _1a"> </span><span class="ff2 ws0">换行</span></div><div class="t m0 x13 hd y54 ff3 fs6 fc0 sc0 ls0 ws1d">< H R ><span class="_ _1a"> </span><span class="ff2 ws0">水平线</span></div><div class="t m0 x13 hd y55 ff3 fs6 fc0 sc0 ls0 ws1d">< P R E > < / P R E ><span class="_ _1b"> </span><span class="ff2 ls46 ws0">预定义格式文本的开头和结束,其中的所有跳格、行都保持原样。</span></div><div class="t m0 x13 hd y56 ff3 fs6 fc0 sc0 ls0 ws1d">< B > < / B ><span class="_ _1c"> </span><span class="ff2 ws0">黑体</span></div><div class="t m0 x13 hd y57 ff3 fs6 fc0 sc0 ls0 ws1d">< I > < / I ><span class="_ _1d"> </span><span class="ff2 ws0">斜体</span></div><div class="t m0 x13 hd y58 ff3 fs6 fc0 sc0 ls0 ws1d">< O L > < / O L ><span class="_ _1e"> </span><span class="ff2 ws0">有序号的列表</span></div><div class="t m0 x13 hd y59 ff3 fs6 fc0 sc0 ls2a ws0"><A HREF=url>link</A><span class="_ _1f"> </span><span class="ff2 ls0">超文本链接</span></div><div class="t m0 x13 hd y5a ff3 fs6 fc0 sc0 ls0 ws1d">< F O R M > < / F O R M ><span class="_ _15"> </span><span class="ff2 ws0">表单</span></div><div class="t m0 x13 hd y5b ff3 fs6 fc0 sc0 ls0 ws1d">M E T H O D<span class="_ _20"> </span>p o s t<span class="_"> </span><span class="ff2 ws0">或<span class="_ _c"></span></span>g e t<span class="_"> </span><span class="ff2 ws0">方法</span></div><div class="t m0 x13 hd y5c ff3 fs6 fc0 sc0 ls0 ws1d">A C T I O N<span class="_ _21"> </span><span class="ff2 ws0">地址</span></div><div class="t m0 x13 hd y5d ff3 fs6 fc0 sc0 ls0 ws1e">< I N P U T. . . ><span class="_ _22"> </span><span class="ff2 ws0">数据输入</span></div><div class="t m0 x13 hd y5e ff3 fs6 fc0 sc0 ls0 ws1d">N A M E<span class="_ _23"> </span><span class="ff2 ws0">变量名</span></div><div class="t m0 x13 hd y5f ff3 fs6 fc0 sc0 ls0 ws1d">S I Z E<span class="_ _24"> </span><span class="ff2 ls47 ws0">以字符计的文本框的宽度</span></div><div class="t m0 x13 hd y60 ff3 fs6 fc0 sc0 ls0 ws1d">T Y P E<span class="_ _1a"> </span><span class="ff2 ls48 ws0">复选框、单选框、复位、提交</span></div><div class="t m0 x13 hd y61 ff3 fs6 fc0 sc0 ls0 ws1f">< S E L E C T. . . ><span class="_ _25"> </span><span class="ff2 ws0">下拉式菜单</span></div><div class="t m0 x13 hd y62 ff3 fs6 fc0 sc0 ls0 ws1d">N A M E<span class="_ _23"> </span><span class="ff2 ws0">变量名</span></div><div class="t m0 x13 hd y63 ff3 fs6 fc0 sc0 ls0 ws1d">S I Z E<span class="_ _24"> </span><span class="ff2 ls49 ws0">要显示的列表的项数</span></div><div class="t m0 x13 hd y64 ff3 fs6 fc0 sc0 ls37 ws0"><OPTION V<span class="_ _3"></span><span class="ls0 ws1d">A L U E ><span class="_ _26"> </span><span class="ff2 ls44 ws0">将用户选择的值返回给<span class="_ _6"></span></span>N A M E<span class="_"> </span><span class="ff2 ws0">变量</span></span></div><div class="t m0 x13 hd y65 ff3 fs6 fc0 sc0 ls0 ws1d">< / S E L E C T ><span class="_ _27"> </span><span class="ff2 ws0">结束列表框</span></div><div class="t m0 x14 h6 y66 ff2 fs1 fc0 sc0 ls3a ws0">如果脚本不能正常工作,应当首先查看错误日志,因为所有的错误都记录在这些日志中。</div><div class="t m0 x11 h5 y67 ff2 fs1 fc0 sc0 ls0 ws0">如果使用<span class="_ _c"></span><span class="ff3 ws20">a p a c h e<span class="_ _c"></span></span>作为<span class="_ _c"></span><span class="ff3">W<span class="_ _8"></span><span class="ws20">e b<span class="ff2 ls4a ws0">服务器,那么相应的日志文件位于<span class="_ _7"></span></span>/ e t c / h t t p d / l o g s<span class="ff2 ws0">或</span>/ u s r / l o c a l / a p a c h e / l o g s</span></span></div><div class="t m0 x11 h5 y68 ff2 fs1 fc0 sc0 ls4b ws0">目录下,这取决于<span class="_ _7"></span><span class="ff3">W<span class="_ _3"></span><span class="ls0 ws21">e b<span class="ff2 ls4c ws0">服务器的安装路径。<span class="_ _7"></span></span>c g i<span class="_"> </span><span class="ff2 ls4d ws0">脚本可以在命令行方式下运行测试,当然这时只</span></span></span></div><div class="t m0 x11 h6 y69 ff2 fs1 fc0 sc0 ls26 ws0">能看到文本形式的输出,但是这种输出结果有助于调试该脚本。</div><div class="t m0 x14 h5 y6a ff2 fs1 fc0 sc0 ls1b ws0">现在我们就来创建一个<span class="_ _28"> </span><span class="ff3 ls0 ws22">c g i</span><span class="ls25">脚本。把下面的内容输入到一个名为<span class="_ _4"> </span><span class="ff3 ls0 ws22">f i r s t p a g e . c g i<span class="_ _7"></span></span><span class="ls1d">的文件中,并</span></span></div><div class="t m0 x11 h5 y6b ff2 fs1 fc0 sc0 ls0 ws0">保存在<span class="_ _5"></span><span class="ff3 ws2">c g i - b i n<span class="_"> </span></span><span class="ls3c">目录下。不要忘记该文件应当具有权限<span class="_ _9"> </span></span><span class="ff3 ws2">7 5 5<span class="_"> </span></span>。</div><div class="t m0 x15 hb y43 ff8 fs1 fc0 sc0 ls0 ws0">第<span class="ff9">29</span>章<span class="_"> </span><span class="ff9 ls6">cgi <span class="_ _c"></span></span>脚<span class="_ _29"> </span>本<span class="_ _2a"> </span><span class="ff7 fs5 fc2">327</span></div><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/4896355/bg4.jpg"><div class="t m0 x8 h5 y24 ff2 fs1 fc0 sc0 ls17 ws0">如你所知,第一行表示<span class="_ _2"></span><span class="ff3 ls0 ws23">s h e l l<span class="_ _5"></span></span>解释器的路径。第一个<span class="_ _2"></span><span class="ff3 ls0 ws23">e c h o<span class="_"> </span></span><span class="ls4e">命令行告诉服务器这是一个<span class="_ _28"> </span><span class="ff3 ls0 ws23">M I M E</span></span></div><div class="t m0 x6 h5 y49 ff2 fs1 fc0 sc0 lsb ws0">题头;第二行<span class="_ _2"> </span><span class="ff3 ls0 ws24">e c h o<span class="_"> </span></span><span class="ls6">命令行用于显示一个空行。如果在<span class="_ _11"> </span><span class="ff3 ls0 ws24">M I M E</span><span class="ls3">题头后面没有一个空行,<span class="_ _4"> </span><span class="ff3 ls0 ws24">c g i<span class="_"> </span></span><span class="ls0">脚本</span></span></span></div><div class="t m0 x6 h6 y4a ff2 fs1 fc0 sc0 ls4f ws0">的输出将无法正确显示。</div><div class="t m0 x8 h5 y4b ff2 fs1 fc0 sc0 ls0 ws0">接着,<span class="_ _7"></span><span class="ff3 ws25">e c h o<span class="_ _5"></span></span><span class="ls30">命令输出了一个<span class="_ _2"> </span></span><span class="ff3 ws25">< H T M L ><span class="_ _5"></span></span><span class="ls2">标记,它告诉浏览器整篇文挡应以<span class="_ _2b"> </span></span><span class="ff3 ws25">H T M L<span class="_"> </span></span><span class="ls17">格式显示。</span></div><div class="t m0 x6 h5 y6c ff3 fs1 fc0 sc0 ls0 ws26">H T M L<span class="_"> </span><span class="ff2 lsb ws0">文挡可以显示从最大的<span class="_ _9"> </span></span>< H 1 ><span class="_"> </span><span class="ff2 ws0">到<span class="_ _c"></span></span>< H n ><span class="_"> </span><span class="ff2 ls50 ws0">的若干种不同字体。为了不过于费眼,<span class="_ _11"> </span></span>< H 6 ><span class="_"> </span><span class="ff2 ws0">是通</span></div><div class="t m0 x6 h6 y6d ff2 fs1 fc0 sc0 ls1e ws0">常可接受的最小字体。这里我们把文字居中,这样看起来更舒服一些。接下来,我们显示一</div><div class="t m0 x6 h5 y6e ff2 fs1 fc0 sc0 ls18 ws0">条水平线。最后,我们用<span class="_ _b"> </span><span class="ff3 ls0 ws27">< H 2 ><span class="_"> </span></span><span class="ls0">字体和<span class="_ _2"></span><span class="ff3 ws27">< C E N T E R ><span class="_"> </span></span><span class="lsa">标记居中显示了这样一行:<span class="_ _2c"></span><span class="ls0">“<span class="_ _5"></span><span class="ff3 lsa">Stand-By To</span></span></span></span></div><div class="t m0 x6 h5 y6f ff3 fs1 fc0 sc0 ls0 ws2">S t a n d - T<span class="_ _3"></span>o<span class="_"> </span><span class="ff2 ws0">”<span class="_ _e"></span><span class="ls7">,该脚本的输出以<span class="_ _6"></span><span class="ff3 ls0 ws2">< / H T M L ><span class="_ _5"></span></span><span class="ls0">标记结束。</span></span></span></div><div class="t m0 x8 h6 y70 ff2 fs1 fc0 sc0 ls2b ws0">如果忘记了某一个结束标记,不要紧</div><div class="t m1 x16 hf y70 ff2 fs7 fc0 sc0 ls0 ws0">—</div><div class="t m0 x17 h6 y70 ff2 fs1 fc0 sc0 ls51 ws0">你会很快发现这一点,因为在你试图浏览该页面</div><div class="t m0 x6 h6 y71 ff2 fs1 fc0 sc0 ls52 ws0">时,一些标记将会在浏览器中显示出来。</div><div class="t m0 x8 h5 y72 ff2 fs1 fc0 sc0 ls3c ws0">现在如果想浏览该页面,可以在浏览器的<span class="_ _9"> </span><span class="ff3 ls0 ws2">U R L</span><span class="ls5">框中输入这样一行:</span></div><div class="t m0 x8 ha y73 ff6 fs4 fc0 sc0 ls0 ws10">h t t p : / / y o u r _ s e r v e r / c g i - b i n / f i r s t p a g e . c g i</div><div class="t m0 x8 h5 y74 ff2 fs1 fc0 sc0 ls53 ws0">输入时用实际的服务器名来替代上面一行中的<span class="_ _9"> </span><span class="ff3 ls0 ws2">y o u r _ s e r v e r<span class="_"> </span></span><span class="ls0">。</span></div><div class="t m0 x8 h5 y75 ff2 fs1 fc0 sc0 ls28 ws0">如果你的机器已经联网,而你得到“<span class="_ _10"> </span><span class="ff3 ls0 ws28">D N S<span class="_"> </span></span><span class="ls1e">查找失败”的错误提示,那可能是由于浏览器</span></div><div class="t m0 x6 h5 y76 ff2 fs1 fc0 sc0 ls0 ws0">在<span class="_ _c"></span><span class="ff3 ws29">I n t e r n e t<span class="_"> </span></span><span class="ls54">上查找你刚刚编写的页面。不妨查看一下浏览器的连接选项;它可能设置为忽略本</span></div><div class="t m0 x6 h6 y77 ff2 fs1 fc0 sc0 ls12 ws0">机代理,在此处键入主机名并重新运行浏览器即可。</div><div class="t m0 x8 h5 y78 ff2 fs1 fc0 sc0 ls0 ws0">图<span class="_ _c"></span><span class="ff3 ws2">2 9 - 2</span><span class="ls55">显示了我们刚刚编写的页面。</span></div><div class="t m0 x18 h9 y79 ff2 fs3 fc1 sc0 ls0 ws0">图<span class="ff3">29-2 </span>脚本<span class="ff3">firstpage</span>的输出</div><div class="t m0 x6 h6 y7a ff4 fs1 fc1 sc0 ls0 ws0">29.4.2 <span class="ff5">显示</span>shell<span class="ff5">命令输出</span></div><div class="t m0 x8 h5 y7b ff2 fs1 fc0 sc0 ls19 ws0">现在我们在脚本中加上一条<span class="_ _2"> </span><span class="ff3 ls0 ws2">s h e l l</span><span class="ls12">命令,这样就可以在浏览器中显示该命令的输出。</span></div><div class="t m0 x8 h5 y7c ff2 fs1 fc0 sc0 ls40 ws0">我们将显示当前登录的用户数,这通过将<span class="_ _2d"> </span><span class="ff3 ls0 wse">w h o<span class="_"> </span></span><span class="ls56">命令的输出经管道传递给<span class="_ _4"> </span><span class="ff3 ls0 wse">w c<span class="_ _7"></span></span><span class="ls4">命令就可以实</span></span></div><div class="t m0 x6 h6 y7d ff2 fs1 fc0 sc0 ls40 ws0">现。还将显示当前的日期。</div><div class="t m0 xa hb y43 ff7 fs5 fc2 sc0 ls0 ws0">328<span class="_ _12"> </span><span class="ff8 fs1 fc0">第五部分<span class="_ _13"> </span>高级<span class="_ _5"></span><span class="ff9 ws2">s h e l l</span>编程技巧</span></div><div class="c x1 y1 w2 h2"><div class="t m0 xb h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://csdnimg.cn/release/download_crawler_static/4896355/bg5.jpg"><div class="t m0 x14 h5 y7e ff2 fs1 fc0 sc0 ls3 ws0">在这个脚本的开头,我们取得了当前的日期和连接数。日期居中显示。变量<span class="_ _2e"> </span><span class="ff3 ls0 ws2a">U S E R S<span class="_"> </span></span><span class="ls0">也被</span></div><div class="t m0 x11 h5 y7f ff2 fs1 fc0 sc0 ls17 ws0">显示出来。通过一个<span class="_ _6"></span><span class="ff3 ls0 ws2b">i f<span class="_"> </span></span>语句来判断用户数是否少于<span class="_ _28"> </span><span class="ff3 ls0 ws2b">1 0<span class="_"> </span></span><span class="ls1d">,如果是,则显示这样的信息“现在还早</span></div><div class="t m0 x11 h6 y80 ff2 fs1 fc0 sc0 ls2d ws0">或现在是晚餐时间”<span class="_ _e"></span><span class="ls0">。</span></div><div class="t m0 x14 h5 y81 ff2 fs1 fc0 sc0 ls0 ws0">标记<span class="_ _7"></span><span class="ff3 ws2c">< P R E ><span class="_"> </span></span><span class="ls57">保留其间的所有空格和跳格。如果希望显示系统命令的输出,如用<span class="_ _13"> </span></span><span class="ff3 ws2c">d f<span class="_"> </span></span>命令显</div><div class="t m0 x11 h5 y82 ff2 fs1 fc0 sc0 ls58 ws0">示文件系统的情况,或只是使用简单的<span class="_ _11"> </span><span class="ff3 ls0 ws2d">e c h o<span class="_ _7"></span></span><span class="ls1">命令,那么应当使用<span class="_ _9"> </span><span class="ff3 ls0 ws2d">< P R E ></span><span class="ls59">标记。在本例中我本</span></span></div><div class="t m0 x11 h5 y83 ff2 fs1 fc0 sc0 ls14 ws0">来没有必要使用<span class="_ _2"> </span><span class="ff3 ls0 ws24">< P R E ><span class="_ _7"></span></span><span class="ls5a">标记,但我想我还是应该及早介绍它的这种应用,这样即使读者今后</span></div><div class="t m0 x11 h5 y84 ff2 fs1 fc0 sc0 ls5b ws0">遇到这样的问题,也不会感到迷惑。要显示该页面,可以使用如下的<span class="_ _11"> </span><span class="ff3 ls0 ws2">U R L<span class="_"> </span></span><span class="ls0">:</span></div><div class="t m0 x14 ha y85 ff6 fs4 fc0 sc0 ls0 ws10">h t t p : / / y o u r _ s e r v e r / c g i - b i n / p a g e t w o . c g i</div><div class="t m0 x14 h5 y86 ff2 fs1 fc0 sc0 ls53 ws0">输入时用实际的服务器名来替代上面一行中的<span class="_ _9"> </span><span class="ff3 ls0 ws2">y o u r _ s e r v e r<span class="_"> </span></span><span class="ls0">。</span></div><div class="t m0 x14 h5 y87 ff2 fs1 fc0 sc0 ls0 ws0">图<span class="ff3 ws2">2 9 - 3<span class="_ _c"></span></span><span class="ls4f">显示了刚才编辑的页面。</span></div><div class="t m0 x19 h9 y7d ff2 fs3 fc1 sc0 ls0 ws0">图<span class="ff3">29-3 </span>脚本<span class="ff3">pagetwo.cgi</span>的输出</div><div class="t m0 x15 hb y43 ff8 fs1 fc0 sc0 ls0 ws0">第<span class="ff9">29</span>章<span class="_"> </span><span class="ff9 ls6">cgi <span class="_ _c"></span></span>脚<span class="_ _29"> </span>本<span class="_ _12"> </span><span class="ff7 fs5 fc2">329</span></div><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">下载</div></div></div><div class="pi" data-data='{"ctm":[1.860465,0.000000,0.000000,1.860465,0.000000,0.000000]}'></div></div>