CGI脚本简单地讲是个运行在Web服务器上的程序, 有浏览器的输入触发. 这个脚本通常象服务器和系统中其他程序如数据库的桥梁。
CGI 脚本难道不是一个真正的脚本?按照你的服务器的支持, 他们可能是一个编译好的程序或者批命令文件或者其他可执行的东西. 为了简单起见,我们统称他们为脚本scripts.
一个URL指向一个CGI脚本. 一个CGI脚本的URL能如普通的URL一样在任何地方出现。 服务器接收请求, 按照那个URL指向的脚本文件(注意文件的位置和扩展名),执行脚本. 脚本执行基于输入数据的操作,包括查询数据库、计算数值或调用系统中其他程序. 脚本产生某种Web服务器能理解的输出结果. 服务器接收来自脚本的输出并且把它传回浏览器,让用户了解结果。 |
我们具体能用CGI做些什么: 我在这里举个例子吧
1 比如我们服务端想获取客户端的一些个性能参数 2 可以在页面操作管理linux主机 3 我们可以用他来做后端,处理数据,并return回去
cgi相当的全,可以抓取http的数据,比如用户的ip地址,用户的请求的模式,数据包的大小等等~
步骤:
打开apache配置文件http.conf,进行如下修改: (1)LoadModule python_module modules/mod_python.so (2) <Directory "/var/www/cgi-bin"> Options +ExecCGI +FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> (3) 增加 AddHandler cgi-script .py .sh
我们能马上就实现的~
这个是把shell脚本当成CGI
这个是以python的方式运行这个CGI
这个是GET数据
sh做CGI的脚本
#!/bin/bash echo -e "Content-type: text/html;charset=utf-8\n\n" echo CGI/1.0 test script report:$(uuidgen)'<br>' echo argc is $#. argv is "$*".'<br>' echo SERVER_SOFTWARE = $SERVER_SOFTWARE '<br>' echo SERVER_NAME = $SERVER_NAME '<br>' echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE '<br>' echo SERVER_PROTOCOL = $SERVER_PROTOCOL '<br>' echo SERVER_PORT = $SERVER_PORT '<br>' echo REQUEST_METHOD = $REQUEST_METHOD '<br>' echo HTTP_ACCEPT = "$HTTP_ACCEPT" '<br>' echo PATH_INFO = "$PATH_INFO" '<br>' echo PATH_TRANSLATED = "$PATH_TRANSLATED" '<br>' echo SCRIPT_NAME = "$SCRIPT_NAME" '<br>' echo QUERY_STRING = "$QUERY_STRING" '<br>' echo REMOTE_HOST = $REMOTE_HOST '<br>' echo REMOTE_ADDR = $REMOTE_ADDR '<br>' echo REMOTE_USER = $REMOTE_USER '<br>' echo AUTH_TYPE = $AUTH_TYPE '<br>' echo CONTENT_TYPE = $CONTENT_TYPE '<br>' echo CONTENT_LENGTH = $CONTENT_LENGTH echo '11111111111111' echo $(dir) echo $(ifconfig)
python做CGI的脚本!
#!/usr/bin/python # -*- coding: utf-8 -*- import os print "Content-type: text/html;charset=utf-8\n\n" print "<center>hello world</center>" print "<pre>" a=os.popen('free').read() print a print "</pre>" print "<pre>" a=os.popen('uptime').read() print a print "</pre>" print "<pre>" a=os.popen('df -HT').read() print a print "</pre>" print "<pre>" a=os.popen('netstat -an|grep ES').read() print a print "</pre>"
get的方式传递参数
#!/usr/bin/python # Import modules for CGI handling import cgi, cgitb # Create instance of FieldStorage form = cgi.FieldStorage() # Get data from fields first_name = form.getvalue('first_name') last_name = form.getvalue('last_name') print "Content-type:text/html\r\n\r\n" print "<html>" print "<head>" print "<title>Hello - Second CGI Program</title>" print "</head>" print "<body>" print "<h2>Hello %s %s</h2>" % (first_name, last_name) print "</body>" print "</html>"
可以用 /cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI 进行测试~
简单写个HTML页面 ,action指向到CGI的地址上
<formaction="/cgi-bin/hello_get.py"method="get"> First Name: <inputtype="text"name="first_name"><br/> Last Name: <inputtype="text"name="last_name"/> <inputtype="submit"value="Submit"/> </form>
我们在来实现文件的上传~
这个一个简单的页面~
<html> <body> <formenctype="multipart/form-data" action="save_file.py"method="post"> <p>File: <inputtype="file"name="filename"/></p> <p><inputtype="submit"value="Upload"/></p> </form> </body> </html>
后端是~
#!/usr/bin/python import cgi, os import cgitb; cgitb.enable() form = cgi.FieldStorage() # Get filename here. fileitem = form['filename'] # Test if the file was uploaded if fileitem.filename: # strip leading path from file name to avoid # directory traversal attacks fn = os.path.basename(fileitem.filename) open('/tmp/' + fn, 'wb').write(fileitem.file.read()) message = 'The file "' + fn + '" was uploaded successfully' else: message = 'No file was uploaded' print """\ Content-Type: text/html\n <html> <body> <p>%s</p> </body> </html> """ % (message,)
用cgi实现url的redirect跳转 !
#!/usr/bin/env python import cgi url = "http://example.com/" print "Status: 302 Moved" print "Location: %s" % url print
cgi和apache,nginx等web服务器一块用,很爽的~