Ist es möglich, Python SimpleHTTPServer nur auf localhost auszuführen?

86

Ich habe eine VPN-Verbindung und wenn ich Python -m SimpleHTTPServer ausführe, dient es auf 0.0.0.0:8000, was bedeutet, dass auf es über localhost und über meine echte IP zugegriffen werden kann . Ich möchte nicht, dass Roboter mich scannen und interessiert sind, dass auf den Server nur über localhost zugegriffen wird.

Ist es möglich?

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

Jeder andere einfache http-Server, der sofort über die Befehlszeile ausgeführt werden kann, ist ebenfalls willkommen.

user1639431
quelle
4
Sie können einfach externe Verbindungen an diesem Port von Ihrer Firewall / Ihrem Router blockieren.
Burhan Khalid
7
Obwohl dies eine gute Frage für Python2 ist, kann hier angemerkt werden, dass in Python3 der Ersatz das sofortige http.serverBinden ermöglicht, z. B. python3 -m http.server --bind 127.0.0.1 8000würde ausreichen
humanityANDpeace
Nebenbemerkung : SimpleHTTPServerist Single-Threading und blockiert, was bedeutet, dass Sie keine weitere Anforderung ausführen können, bis die vorherige Anforderung beendet ist. Und es gibt keine Bereichsunterstützung, z. B. zum Streamen / Suchen einer Mediendatei von einer bestimmten Position. Eine bessere Alternative ist twisted( pip install twisted), mit der Sie ausführen können twistd -n web --path /. Es kann auch anonymes FTP mit tun twistd -n ftp -p 2121 -r /. Weitere Einzeiler für http-Server: gist.github.com/willurd/5720255 .
ccpizza

Antworten:

54

Wenn Sie die Quelle lesen, werden Sie feststellen, dass nur der Port in der Befehlszeile überschrieben werden kann. Wenn Sie den Host ändern möchten, auf dem er bereitgestellt wird, müssen Sie die test()Methode des SimpleHTTPServerund implementierenBaseHTTPServer selbst . Das sollte aber wirklich einfach sein.

So geht's ganz einfach:

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

Und um es zu benutzen:

> 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 ...
sberry
quelle
90

In Python-Versionen 3.4 und höher http.serverakzeptiert das Modul abind Parameter.

Laut den Dokumenten :

python -m http.server 8000

Standardmäßig bindet sich der Server an alle Schnittstellen. Die Option -b / - bind gibt eine bestimmte Adresse an, an die gebunden werden soll. Der folgende Befehl bewirkt beispielsweise, dass der Server nur an localhost gebunden wird:

python -m http.server 8000 --bind 127.0.0.1

Neu in Version 3.4: Das Argument --bind wurde eingeführt.

Jet Blue
quelle
75

Wie @sberry erklärte, ist es python -m ...nicht möglich , dies einfach mit der nice- Methode zu tun , da die IP-Adresse bei der Implementierung von fest codiert istBaseHttpServer.test Funktion fest .

Eine Möglichkeit, dies über die Befehlszeile zu tun, ohne zuerst Code in eine Datei zu schreiben, wäre

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

Ob das immer noch als Einzeiler gilt, hängt von Ihrer Terminalbreite ab ;-) Es ist sicherlich nicht leicht, sich daran zu erinnern.

Lukas Graf
quelle
4
Hinzufügen zu .bash_profile. Yum. Jetzt kann ich einfach tippen H. Vielen Dank! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Cory Mawhorter
4
Damit dies unter Python 10 unter Python 3.5.1 als einfacher http-Server funktioniert, musste ich es wie folgt python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" ändern : Beachten Sie die Änderung im Angebot und die Tatsache, dass sich Base und Simple HTTP Server jetzt in http.server befinden.
Alexander Varwijk
+1 bei der Verwendung von Profilalias habe ich meinen 'servelocal' genannt - es gibt ein bisschen Tanz, der Anführungszeichen ändert und entkommt, um die Bash-Syntax glücklich zu machen, aber das Ergebnis ist schön.
Sdupton
Sehr hilfreich ... :)
user3145373 ツ