web-dev-qa-db-fra.com

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

J'ai une connexion vpn et quand j'exécute python -m SimpleHTTPServer, il sert sur 0.0.0.0:8000, ce qui signifie qu'il est accessible via localhost et via mon adresse IP réelle, je ne veux pas que les robots me scanner et que le serveur ne soit accessible que via localhost.

C'est possible?

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

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

76
user1639431

Si vous lisez la source, vous verrez que seul le port peut être remplacé sur la ligne de commande. Si vous souhaitez modifier l'hôte sur lequel il est servi, vous devez implémenter vous-même la méthode test() de SimpleHTTPServer et BaseHTTPServer. Mais cela devrait être vraiment 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 __== "__main__":
    test()

Et pour 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 ...
49
sberry

Comme @ sberry expliqué, le faire simplement en utilisant la méthode Nice python -m ... Ne sera pas possible, car l'adresse IP est codée en dur dans la mise en œuvre de la fonction BaseHttpServer.test. .

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

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 une ligne dépend de la largeur de votre terminal ;-) Ce n'est certainement pas très facile à retenir.

73
Lukas Graf

Dans Python versions 3.4 et supérieures, le module http.server Accepte un paramètre bind.

Selon à la documentation :

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 elle doit être liée. Par exemple, la commande suivante force le serveur à se connecter à localhost uniquement:

python -m http.server 8000 --bind 127.0.0.1

Nouveau dans la version 3.4: l’argument --bind a été introduit.

69
Jet Blue