¿Es posible ejecutar Python SimpleHTTPServer solo en localhost?

87

Tengo una conexión vpn y cuando estoy ejecutando python -m SimpleHTTPServer, sirve en 0.0.0.0:8000, lo que significa que se puede acceder a través de localhost y a través de mi ip real. No quiero que los robots me escaneen y me interese que se acceda al servidor solo a través de localhost.

¿Es posible?

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

Cualquier otro servidor http simple que se pueda ejecutar instantáneamente usando la línea de comando también es bienvenido.

usuario1639431
fuente
4
Simplemente puede bloquear las conexiones externas en ese puerto desde su firewall / enrutador.
Burhan Khalid
8
Si bien es una buena pregunta para python2, se puede observar aquí que en python3 el reemplazo http.serverpermite la vinculación de inmediato, por ejemplo, python3 -m http.server --bind 127.0.0.1 8000sería suficiente
humanidad y
1
Nota al margen : SimpleHTTPServeres un solo subproceso y bloqueo, lo que significa que no podrá realizar otra solicitud hasta que finalice la solicitud anterior. Y no tiene soporte de rango, por ejemplo, para transmitir / buscar un archivo multimedia desde una posición específica. Una mejor alternativa es twisted( pip install twisted) con la que puede ejecutar twistd -n web --path /. También puede hacer FTP anónimo con twistd -n ftp -p 2121 -r /. Más frases breves del servidor http: gist.github.com/willurd/5720255 .
ccpizza

Respuestas:

54

Si lee la fuente, verá que solo el puerto se puede anular en la línea de comando. Si desea cambiar el host en el que se sirve, deberá implementar el test()método de SimpleHTTPServery BaseHTTPServerusted mismo. Pero eso debería ser realmente fácil.

Así es como puede hacerlo, con bastante facilidad:

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

Y para 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 ...
arándano
fuente
95

En las versiones 3.4 y superiores de Python, el http.servermódulo acepta un bindparámetro.

Según los documentos :

python -m http.server 8000

De forma predeterminada, el servidor se une a todas las interfaces. La opción -b / - bind especifica una dirección específica a la que debe vincularse. Por ejemplo, el siguiente comando hace que el servidor se vincule solo a localhost:

python -m http.server 8000 --bind 127.0.0.1

Nuevo en la versión 3.4: se introdujo el argumento --bind.

Azul azabache
fuente
75

Como explicó @sberry , simplemente hacerlo usando el python -m ...método nice no será posible, porque la dirección IP está codificada en la implementación de la BaseHttpServer.testfunción.

Una forma de hacerlo desde la línea de comandos sin escribir código en un archivo primero sería

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

Si eso todavía cuenta como una línea, depende del ancho de su terminal ;-) Ciertamente no es muy fácil de recordar.

Lukas Graf
fuente
4
Añadiendo esto a .bash_profile. Mmm Ahora solo puedo escribir H. ¡Gracias! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Cory Mawhorter
4
Para que esto funcione como un servidor http simple en Windows 10 usando Python 3.5.1 tuve que cambiarlo de la siguiente manera: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" Tenga en cuenta el cambio en la cita y el hecho de que Base y Simple HTTP Server ahora están en http.server.
Alexander Varwijk
+1 en el uso de alias de perfil, llamé al mío 'servelocal'; hay un poco de baile que cambia y se escapa de las comillas para hacer feliz la sintaxis de bash, pero el resultado es bueno.
sdupton
Muy útil ... :)
user3145373 ツ