Чи можна запустити python SimpleHTTPServer лише на localhost?


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
Ви можете просто заблокувати зовнішні підключення на цьому порту з вашого брандмауера / маршрутизатора.
Бурхан Халід

7
Хоча хороший питання для python2, то тут можна відзначити , що в Python3 заміна http.serverдозволяє зв'язуванні відразу ж, наприклад , python3 -m http.server --bind 127.0.0.1 8000вистачило б
humanityANDpeace

1
Sidenote : 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()метод SimpleHTTPServerand і 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 ...

92

У версіях 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 ...методу буде неможливо, оскільки 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()" Зверніть увагу на зміну котирувань та той факт, що Base і Simple HTTP Server зараз перебувають на http.server.
Олександр Варвійк

+1 щодо використання псевдоніму профілю, я назвав свій "сервелокальним" - є трохи танцю, що міняє та уникає лапок, щоб зробити синтаксис bash щасливим, але результат приємний.
sdupton

Дуже корисно ... :)
user3145373, ツ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.