78 votes

Est-il possible d'exécuter python SimpleHTTPServer sur localhost seulement ?

J'ai une connexion vpn et lorsque j'exécute python -m SimpleHTTPServer, il sert sur 0.0.0.0:8000, ce qui signifie qu'il est accessible via localhost. y via mon IP réel. Je ne veux pas que des robots me scannent et s'intéressent au fait que le serveur ne sera accessible que via localhost.

Est-ce possible ?

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

Tout autre serveur http simple qui peut être exécuté instantanément à l'aide de la ligne de commande est également le bienvenu.

123voto

Jet Blue Points 341

Dans les versions 3.4 et supérieures de Python, la fonction http.server accepte un bind paramètre.

Selon aux docs :

python -m http.server 8000

Par défaut, le serveur se lie à toutes les interfaces. L'option -b/--bind spécifie une adresse spécifique à laquelle il doit se lier. Par exemple, la commande suivante oblige le serveur à se lier à localhost uniquement :

python -m http.server 8000 --bind 127.0.0.1

Nouveau dans la version 3.4 : L'argument --bind a été introduit.

74voto

Lukas Graf Points 6070

Comme @sberry expliqué, il suffit de le faire en utilisant la belle python -m ... ne sera pas possible, car l'adresse IP est codée en dur dans l'implémentation de la fonction BaseHttpServer.test fonction.

Une façon de le faire à partir de la ligne de commande sans avoir à écrire le code dans un fichier serait la suivante

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

Si cela compte toujours comme un "one liner", cela dépend de la largeur de votre terminal ;-) Ce n'est certainement pas très facile à retenir.

53voto

sberry Points 28742

Si vous lisez la source, vous verrez que seul le port peut être modifié sur la ligne de commande. Si vous voulez changer l'hôte sur lequel il est servi, vous devrez implémenter la fonction test() de la méthode SimpleHTTPServer y BaseHTTPServer vous-même. Mais ça devrait être très facile.

Voici comment vous pouvez le faire, assez facilement :

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

Et de l'utiliser :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X