【发布时间】:2019-02-19 10:58:22
【问题描述】:
我正在运行基于 Python 的 CGI 脚本,但在浏览器中打印“dig”命令的输出时遇到了困难。我使用 Idle 运行相同的脚本,它可以工作。
这是脚本:
#!/usr/bin/python3.5
#================================================================
# Modules
import cgi
import subprocess
import re
#================================================================
# Create HTML page
form = cgi.FieldStorage()
regex_url = re.compile(r'(^https?:\/\/)(.*?)(\/.*)')
url = form.getvalue('url')
origin = form.getvalue('origin')
print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Lookup Tool</title>")
print ("<body>")
print ("<h1>DNS lookup tool</h1><br>")
print("<form method='post' action='/cgi-bin/test.py'>")
print("<p>Full URL including http/s: <input type='url' name='url'/></p>")
print("<p>Leave empty: <input type='text' name='origin'/></p>")
print("<input type='submit' value='Submit' />")
print("</form>")
host = regex_url.search(url)
hostname = host.group(2)
print("Hostname is: " + hostname )
resolver = subprocess.Popen(['dig', hostname], stdout=subprocess.PIPE)
print(resolver.communication())
我希望在网络浏览器中看到 dig www.google.com 的输出,但事实并非如此。但是,如果我执行“打印(主机名)”,那么 www.google.com 将打印在网页中。
我做错了什么
【问题讨论】:
-
dig是一个命令行实用程序。我不明白你的意思是它会打印在网页上 - 你想用你的 python 脚本打开一个网络浏览器吗?在这种情况下,您必须在浏览器(chrome 或 firefox 或 .w.e)上调用subprocess.Popen -
@vasia 但我使用的是“Popen”。我希望在我的网页上看到这个输出:; > DiG 9.8.3-P1 > www.google.com ;;全局选项:+cmd ;;得到答案:;; ->>HEADER
-
您的网页是什么意思?当我按原样运行您的脚本时,这就是我在 terminal 中得到的输出
-
@vasia 这是一个 CGI 脚本,在 Web 服务器上运行,因此它的输出可以出现在浏览器中。这是相当古老的技术,但对于简单的东西来说还是可以的。
-
.communicate返回一个元组,您需要从中提取标准输出数据。 OTOH,我想你还是应该看到 something。此外,发送结构正确的 HTML 也是一个好主意:给它一个doctype,关闭您的head和body标签等。
标签: python python-3.x subprocess cgi