【问题标题】:Is it possible to run python SimpleHTTPServer on localhost only?是否可以仅在本地主机上运行 python SimpleHTTPServer?
【发布时间】:2012-08-29 10:17:46
【问题描述】:

我有一个 vpn 连接,当我运行 python -m SimpleHTTPServer 时,它在 0.0.0.0:8000 上提供服务,这意味着它可以通过本地主机通过我的真实 ip 访问。 我不希望机器人扫描我,并且对只能通过 localhost 访问服务器感兴趣。

有可能吗?

python -m SimpleHTTPServer 127.0.0.1:8000  # doesn't work.

也欢迎任何其他可以使用命令行立即执行的简单 http 服务器。

【问题讨论】:

  • 您可以简单地阻止防火墙/路由器在该端口上的外部连接。
  • 虽然对 python2 来说是一个很好的问题,但这里可能需要注意的是,在 python3 中,替换 http.server 允许立即绑定,例如 python3 -m http.server --bind 127.0.0.1 8000 就足够了
  • 旁注SimpleHTTPServer 是单线程和阻塞的,这意味着在前一个请求结束之前您将无法执行另一个请求。它没有范围支持,例如用于从特定位置流式传输/查找媒体文件。更好的选择是twisted (pip install twisted),您可以使用twistd -n web --path / 运行它。它还可以使用twistd -n ftp -p 2121 -r / 进行匿名FTP。更多http服务器单行:gist.github.com/willurd/5720255.

标签: python http command-line python-2.x simplehttpserver


【解决方案1】:

如果您阅读源代码,您会发现只有端口可以在命令行上被覆盖。如果你想改变它所服务的主机,你需要自己实现SimpleHTTPServerBaseHTTPServertest()方法。但这应该很容易。

你可以这样做,很容易:

import sys
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer


def test(HandlerClass=SimpleHTTPRequestHandler,
         ServerClass=BaseHTTPServer.HTTPServer):

    protocol = "HTTP/1.0"
    host = ''
    port = 8000
    if len(sys.argv) > 1:
        arg = sys.argv[1]
        if ':' in arg:
            host, port = arg.split(':')
            port = int(port)
        else:
            try:
                port = int(sys.argv[1])
            except:
                host = sys.argv[1]

    server_address = (host, port)

    HandlerClass.protocol_version = protocol
    httpd = ServerClass(server_address, HandlerClass)

    sa = httpd.socket.getsockname()
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
    httpd.serve_forever()


if __name__ == "__main__":
    test()

并使用它:

> python server.py 127.0.0.1     
Serving HTTP on 127.0.0.1 port 8000 ...

> python server.py 127.0.0.1:9000
Serving HTTP on 127.0.0.1 port 9000 ...

> python server.py 8080          
Serving HTTP on 0.0.0.0 port 8080 ...

【讨论】:

    【解决方案2】:

    正如 @sberry 解释的那样,简单地使用漂亮的 python -m ... 方法是不可能的,因为 IP 地址在 BaseHttpServer.test 函数的实现中是硬编码的。

    在不先将代码写入文件的情况下从命令行执行此操作的方法是

    python -c 'import BaseHTTPServer as bhs, SimpleHTTPServer as shs; bhs.HTTPServer(("127.0.0.1", 8888), shs.SimpleHTTPRequestHandler).serve_forever()'
    

    如果这仍然算作一个衬里取决于您的终端宽度;-) 这当然不是很容易记住。

    【讨论】:

    • 将此添加到 .bash_profile。嗯。现在我可以输入H。谢谢! -- gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
    • 要在 Windows 10 上使用 Python 3.5.1 作为一个简单的 http 服务器,我必须将其更改如下:python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" 请注意报价的变化以及 Base 和 Simple HTTP Server 的事实现在在 http.server 中。
    • +1 在使用配置文件别名时,我称我的为“servelocal”——为了让 bash 语法更快乐,有一些舞蹈改变和转义引号,但结果很好。
    • 非常有帮助... :)
    • 完美运行!只有一个问题 - 我怎样才能指向其他位置的路径?我想创建一个脚本来启动两台服务器...
    【解决方案3】:

    在 Python 3.4 及更高版本中,http.server 模块接受 bind 参数。

    根据to the docs

    python -m http.server 8000

    默认情况下,服务器将自己绑定到所有接口。选项 -b/--bind 指定它应该绑定的特定地址。例如,以下命令使服务器绑定到 localhost 仅:

    python -m http.server 8000 --bind 127.0.0.1

    3.4 版中的新功能:引入了 --bind 参数。

    【讨论】:

      猜你喜欢
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2023-02-03
      • 2021-06-04
      • 2023-03-14
      • 2015-01-15
      相关资源
      最近更新 更多