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


87

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

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

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

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


4
Вы можете просто заблокировать внешние соединения на этом порту с вашего брандмауэра / маршрутизатора.
Бурхан Халид

8
Хотя это хороший вопрос для python2, здесь можно отметить, что в python3 замена http.serverразрешает привязку сразу, например, python3 -m http.server --bind 127.0.0.1 8000будет достаточно
humanityANDpeace

1
Дополнительное примечание : SimpleHTTPServerоднопоточное и блокирующее, что означает, что вы не сможете выполнить другой запрос, пока не завершится предыдущий. И у него нет поддержки диапазона, например, для потоковой передачи / поиска мультимедийного файла из определенной позиции. Лучшая альтернатива - twisted( pip install twisted), с которой вы можете работать twistd -n web --path /. Он также может выполнять анонимный FTP с twistd -n ftp -p 2121 -r /. Дополнительные однострочные сообщения http-сервера: gist.github.com/willurd/5720255 .
ccpizza

Ответы:


54

Если вы прочтете исходный код, вы увидите, что только порт можно переопределить в командной строке. Если вы хотите изменить хост, на котором он обслуживается, вам нужно будет реализовать 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 ...

95

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

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

python -m http.server 8000

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

python -m http.server 8000 --bind 127.0.0.1

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


75

Как объяснил @sberry , просто сделать это с помощью python -m ...метода nice невозможно, потому что IP-адрес жестко запрограммирован в реализации BaseHttpServer.testфункции.

Способ сделать это из командной строки без предварительной записи кода в файл был бы

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

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


4
Добавляем это в .bash_profile. Ням. Теперь я могу просто печатать H. Благодарность! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Кори Мохортер,

4
Чтобы эта работа работала как простой 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()" Обратите внимание на изменение цитаты и тот факт, что базовый и простой HTTP-сервер теперь находятся на http.server.
Александр Варвейк

+1 при использовании псевдонима профиля я назвал свой «servelocal» - есть немного танца, меняющего и избегающего кавычек, чтобы сделать синтаксис bash приятным, но результат приятный.
sdupton 08

Очень полезно ... :)
user3145373 ツ 01
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.