È possibile eseguire python SimpleHTTPServer solo su localhost?


87

Ho una connessione vpn e quando eseguo python -m SimpleHTTPServer, funziona su 0.0.0.0:8000, il che significa che è possibile accedervi tramite localhost e tramite il mio ip reale. Non voglio che i robot mi scansionino e sono interessato al fatto che il server sarà accessibile solo tramite localhost.

È possibile?

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

Anche qualsiasi altro semplice server http che può essere eseguito immediatamente utilizzando la riga di comando è il benvenuto.


4
Potresti semplicemente bloccare le connessioni esterne su quella porta dal tuo firewall / router.
Burhan Khalid

8
Sebbene sia una buona domanda per python2, si può notare qui che in python3 la sostituzione http.serverconsente l'associazione immediatamente, ad esempio python3 -m http.server --bind 127.0.0.1 8000sarebbe sufficiente
umanità E

1
Nota a margine : SimpleHTTPServerè single-threading e blocco, il che significa che non sarai in grado di fare un'altra richiesta fino a quando la richiesta precedente non sarà terminata. E non ha supporto per la portata, ad esempio per lo streaming / la ricerca di un file multimediale da una posizione specifica. Un'alternativa migliore è twisted( pip install twisted) con cui puoi eseguire twistd -n web --path /. Può anche eseguire FTP anonimo con twistd -n ftp -p 2121 -r /. Altre battute per server http: gist.github.com/willurd/5720255 .
ccpizza

Risposte:


54

Se leggi il sorgente vedrai che solo la porta può essere sovrascritta dalla riga di comando. Se vuoi cambiare l'host su cui è servito, dovrai implementare il test()metodo di SimpleHTTPServere BaseHTTPServertu stesso. Ma dovrebbe essere davvero facile.

Ecco come puoi farlo, abbastanza facilmente:

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

E per usarlo:

> 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

Nelle versioni Python 3.4 e successive, il http.servermodulo accetta un bindparametro.

Secondo i documenti :

python -m http.server 8000

Per impostazione predefinita, il server si lega a tutte le interfacce. L'opzione -b / - bind specifica un indirizzo specifico a cui deve legarsi. Ad esempio, il seguente comando fa sì che il server si colleghi solo a localhost:

python -m http.server 8000 --bind 127.0.0.1

Novità nella versione 3.4: è stato introdotto l'argomento --bind.


75

Come spiegato da @sberry , python -m ...non sarà possibile farlo semplicemente utilizzando il metodo nice , perché l'indirizzo IP è codificato nell'implementazione della BaseHttpServer.testfunzione.

Un modo per farlo dalla riga di comando senza scrivere prima il codice su un file sarebbe

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

Se questo conta ancora come una riga dipende dalla larghezza del terminale ;-) Non è certamente molto facile da ricordare.


4
Aggiungendolo a .bash_profile. Yum. Ora posso semplicemente digitare H. Grazie! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Cory Mawhorter

4
Per fare in modo che funzioni come un semplice server http su Windows 10 utilizzando Python 3.5.1, ho dovuto modificarlo come segue: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" Notare la modifica della citazione e il fatto che Base e Simple HTTP Server sono ora in http.server.
Alexander Varwijk

+1 sull'uso dell'alias del profilo, ho chiamato il mio "servelocal" - c'è un po 'di danza che cambia e sfugge alle virgolette per rendere felice la sintassi di bash, ma il risultato è bello.
sdupton

Molto utile ... :)
user3145373 ツ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.