我正在编写一个在Apache服务器上运行的python脚本。我的第一个目标是列出可用的网络接口,然后为每个网络接口构建一个表单以输入一些感兴趣的参数。我的问题是,当我从命令行运行以下脚本时,我得到了预期的结果(带有表单的格式化的html网页),如果我从网上评估它,即将脚本放在我的Web服务器中并远程通过http://myipaddr/cgi-bin/myscript.py
访问它,我只得到提交按钮而不是表单。
#!/usr/bin/python
# import required modules
import re
import cgi
from subprocess import *
var=Popen("ifconfig", stdout=PIPE, shell=True).stdout.read()
result = re.findall("wlan[1-9]", var)
def DisplayForm():
HTMLFormL1= '\n\nInterface:<BR> <INPUT TYPE=TEXT NAME="interface%d" size=60><BR>\n'
HTMLFormL2= 'Number of packets to send:<BR> <INPUT TYPE=TEXT NAME="npackets%d" size=60><BR>\n'
HTMLFormL3= 'Transmission channel:<BR> <INPUT TYPE=TEXT NAME="channel%d" size=60><BR>\n'
HTMLFormL4= 'Sleep time in usec:<BR> <INPUT TYPE=TEXT NAME="sleeptime%d" size=60><BR><BR><BR>\n'
HTMLForm = HTMLFormL1 + HTMLFormL2 + HTMLFormL3 + HTMLFormL4
HTMLStart = '<FORM METHOD="POST" ACTION="caos.py">\n<INPUT TYPE=HIDDEN NAME="key" VALUE="process">\n'
for num in range(len(result)):
HTMLForm_idx = HTMLForm % (num, num, num, num)
HTMLStart = "%s%s" % (HTMLStart, HTMLForm_idx)
HTMLBody = HTMLStart + '\n<BR><P><INPUT TYPE="SUBMIT" VALUE="Configure">\n</FORM>\n'
print "Content-Type: text/html\n\n"
HTMLHeader ='<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">\n<html>\n<head>\n<META NAME="keywords" CONTENT="blah blah -- your ad here">\n<title>CAOS</title>\n</head>\n<body>'
HTMLFooter ='</body>\n</html>'
print HTMLHeader
print HTMLBody
print HTMLFooter
#--- Begin of "main"
form = cgi.FieldStorage()
try:
key = form["key"].value
except:
key = None
if key != "process":
DisplayForm()
我已经找到了类似的问题,但我在网上找不到类似的东西。我很可能是在做一些愚蠢的事,但我自己也搞不清楚。如果有人能指出正确的方向,我会很高兴。
干杯, BMAN
答案 0 :(得分:0)
可能正在运行不同版本的python。 检查您的ssh用户和Web服务器用户(www)是否从同一路径运行相同的python。
答案 1 :(得分:0)
尝试发表评论Popen
并将result
替换为模拟值。如果Popen导致问题(我怀疑),您可能希望以不同于stdout管道的方式获取值。