Python SimpleHTTPServer'ı yalnızca localhost'ta çalıştırmak mümkün müdür?


88

Bir vpn bağlantım var ve python -m SimpleHTTPServer'ı çalıştırdığımda, 0.0.0.0:8000'de hizmet veriyor, yani localhost ve gerçek ip'im aracılığıyla erişilebiliyor . Robotların beni taramasını istemiyorum ve sunucuya yalnızca localhost aracılığıyla erişilebileceğini merak ediyorum.

Mümkün mü?

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

Komut satırı kullanılarak anında çalıştırılabilen diğer herhangi bir basit http sunucusu da memnuniyetle karşılanmaktadır.


4
Güvenlik duvarınızdan / yönlendiricinizden o bağlantı noktasındaki dış bağlantıları kolayca engelleyebilirsiniz.
Burhan Khalid

8
Python2 için iyi bir soru olsa da, burada python3'te değiştirme işleminin http.serverhemen bağlanmaya izin verdiği belirtilebilir , örneğin python3 -m http.server --bind 127.0.0.1 8000yeterli olacaktır
insanlık

1
Sidenote : SimpleHTTPServerTek iş parçacığı ve engellemedir, yani önceki istek sona erene kadar başka bir istekte bulunamayacaksınız. Ve örneğin belirli bir konumdan bir medya dosyasını yayınlamak / aramak için menzil desteği yoktur. Daha iyi bir alternatif, birlikte çalıştırabileceğiniz twisted( pip install twisted) dir twistd -n web --path /. Ayrıca anonim FTP de yapabilir twistd -n ftp -p 2121 -r /. Daha fazla http sunucusu tek satırlı : gist.github.com/willurd/5720255 .
ccpizza

Yanıtlar:


54

Kaynağı okursanız, komut satırında yalnızca bağlantı noktasının geçersiz kılınabileceğini göreceksiniz. Sunulduğu ana makineyi değiştirmek isterseniz,test() metodunu SimpleHTTPServerve BaseHTTPServerkendiniz. Ama bu gerçekten kolay olmalı.

İşte bunu oldukça kolay bir şekilde nasıl yapacağınız:

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()

Ve kullanmak için:

> 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 ...

97

Python 3.4 ve üzeri sürümlerde, http.servermodül bir bindparametreyi kabul eder .

Dokümanlara göre :

python -m http.server 8000

Varsayılan olarak, sunucu kendisini tüm arabirimlere bağlar. -B / - bind seçeneği, bağlanması gereken belirli bir adresi belirtir. Örneğin, aşağıdaki komut, sunucunun yalnızca localhost'a bağlanmasına neden olur:

python -m http.server 8000 --bind 127.0.0.1

3.4 sürümünde yeni: --bind argümanı tanıtıldı.


75

Gibi @sberry açıkladı da sadece güzel kullanarak yapıyorpython -m ... IP adresi uygulanmasında kodlanma çünkü mümkün olmayacaktır yöntemi BaseHttpServer.testişlevi.

Bunu önce bir dosyaya kod yazmadan komut satırından yapmanın bir yolu,

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

Bu hala tek bir astar olarak sayılırsa, terminal genişliğinize bağlıdır ;-) Kesinlikle hatırlamak çok kolay değil.


4
Bu .bash_profile dosyasına ekleniyor. Yum. Şimdi yazabilirim H. Teşekkürler! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Cory Mawhorter

4
Bunun Python 3.5.1 kullanarak Windows 10'da basit bir http sunucusu olarak çalışması için bunu aşağıdaki şekilde değiştirmem gerekiyordu: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" Alıntıdaki değişikliği ve Base ve Simple HTTP Sunucusunun artık http.server'da olduğunu unutmayın.
Alexander Varwijk

Profil takma adını kullanma üzerine +1, benimki 'servelocal' olarak adlandırdım - bash sözdizimini mutlu etmek için tırnak işaretlerini değiştirip kaçan bir dans var, ancak sonuç güzel.
sdupton

Çok yardımcı oldu ... :)
user3145373 ツ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.