Можно ли запустить python SimpleHTTPServer только на локальном хосте?

У меня есть vpn-соединение, и когда я запускаю python -m SimpleHTTPServer, он обслуживает 0.0.0.0:8000, что означает, что к нему можно получить доступ через локальный хост и через мой реальный IP-адрес. Я не хочу, чтобы меня сканировали роботы, и заинтересован в том, чтобы доступ к серверу был только через локальный хост.

Является ли это возможным?

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

Также приветствуется любой другой простой http-сервер, который можно запустить мгновенно с помощью командной строки.


person user1639431    schedule 04.09.2012    source источник
comment
Вы можете просто заблокировать внешние соединения на этом порту с вашего брандмауэра/маршрутизатора.   -  person Burhan Khalid    schedule 04.09.2012
comment
Хотя это хороший вопрос для python2, здесь можно отметить, что в python3 замена http.server позволяет сразу привязываться, например, python3 -m http.server --bind 127.0.0.1 8000 будет достаточно   -  person humanityANDpeace    schedule 08.08.2016
comment
Примечание: SimpleHTTPServer является однопоточным и блокирующим, что означает, что вы не сможете выполнить другой запрос, пока предыдущий запрос не будет завершен. И у него нет поддержки диапазона, например. для потоковой передачи/поиска медиафайла с определенной позиции. Лучшей альтернативой является twisted (pip install twisted), которую вы можете запустить с помощью twistd -n web --path /. Он также может использовать анонимный FTP с twistd -n ftp -p 2121 -r /. Другие однострочники по http-серверу: gist.github.com/willurd/5720255.   -  person ccpizza    schedule 11.09.2018


Ответы (3)


Если вы прочтете исходный код, то увидите, что в командной строке можно переопределить только порт. Если вы хотите изменить хост, на котором он обслуживается, вам нужно будет реализовать метод test() для SimpleHTTPServer и BaseHTTPServer самостоятельно. Но это должно быть очень легко.

Вот как вы можете это сделать, довольно легко:

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 ...
person sberry    schedule 04.09.2012

В версиях Python 3.4 и выше модуль http.server принимает параметр bind.

Согласно документам:

python -m http.server 8000

По умолчанию сервер привязывается ко всем интерфейсам. Параметр -b/--bind указывает конкретный адрес, к которому он должен привязываться. Например, следующая команда заставляет сервер привязываться только к локальному хосту:

python -m http.server 8000 --bind 127.0.0.1

Новое в версии 3.4: введен аргумент --bind.

person Jet Blue    schedule 27.11.2016

Как объяснил @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()'

Если это все еще считается одним вкладышем, зависит от ширины вашего терминала ;-) Это, конечно, не очень легко запомнить.

person Lukas Graf    schedule 04.09.2012
comment
Добавляем это в .bash_profile. Ням. Теперь я могу просто набрать H. Спасибо! -- gist.github.com/cmawhorter/f2a09bcf63c68b0cff10 - person Cory Mawhorter; 21.10.2014
comment
Чтобы этот сервер работал как простой http-сервер в Windows 10 с использованием Python 3.5.1, мне пришлось изменить его следующим образом: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" Обратите внимание на изменение цитаты и тот факт, что Base и Simple HTTP Server теперь находятся в http.server. - person Alexander Varwijk; 27.05.2016
comment
+1 за использование псевдонима профиля, я назвал свой «servelocal» - есть что-то вроде изменения танца и выхода из кавычек, чтобы сделать синтаксис bash счастливым, но результат приятный. - person sdupton; 09.07.2016
comment
Очень полезно... :) - person user3145373 ツ; 01.05.2019
comment
работает отлично! только один вопрос - как я могу указать путь в другое место? Я хотел бы создать один скрипт, который запустит два сервера... - person s-kaczmarek; 17.05.2021