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

87

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 et via mon IP réel. Je ne veux pas que les robots me scannent et je suis intéressé par le fait que le serveur ne sera accessible que via localhost.

C'est possible?

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

Tout autre serveur http simple qui peut être exécuté instantanément en utilisant la ligne de commande est également le bienvenu.

user1639431
la source
4
Vous pouvez simplement bloquer les connexions extérieures sur ce port depuis votre pare-feu / routeur.
Burhan Khalid le
8
Même si une bonne question pour python2, on peut noter ici que le remplacement python3 http.serverpermet la liaison tout de suite, par exemple , python3 -m http.server --bind 127.0.0.1 8000il suffirait
humanityANDpeace
1
Sidenote : SimpleHTTPServerest mono-thread et bloquant, ce qui signifie que vous ne pourrez pas faire une autre requête tant que la requête précédente n'est pas terminée. Et il n'a pas de support de plage, par exemple pour le streaming / la recherche d'un fichier multimédia à partir d'une position spécifique. Une meilleure alternative est twisted( pip install twisted) avec laquelle vous pouvez exécuter twistd -n web --path /. Il peut également faire du FTP anonyme avec twistd -n ftp -p 2121 -r /. Plus de one-liners de serveur http: gist.github.com/willurd/5720255 .
ccpizza du

Réponses:

54

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 devrez implémenter la test()méthode de SimpleHTTPServeret BaseHTTPServervous - même. 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 __name__ == "__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 ...
sberry
la source
95

Dans les versions 3.4 et supérieures de Python, le http.servermodule accepte un bindparamètre.

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 se lier. Par exemple, la commande suivante oblige le serveur à se lier uniquement à localhost:

python -m http.server 8000 --bind 127.0.0.1

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

Bleu jais
la source
75

Comme @sberry l'a expliqué, il python -m ...ne sera pas possible de le faire simplement en utilisant la méthode nice , car l'adresse IP est codée en dur dans l'implémentation de la BaseHttpServer.testfonction.

Une façon de le faire à partir de la ligne de commande sans écrire d'abord 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 seule ligne dépend de la largeur de votre terminal ;-) Ce n'est certainement pas très facile à retenir.

Lukas Graf
la source
4
Ajouter ceci à .bash_profile. Miam. Maintenant, je peux simplement taper H. Merci! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Cory Mawhorter
4
Pour que cela fonctionne comme un simple serveur http sur Windows 10 en utilisant Python 3.5.1 j'ai dû le changer comme suit: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" Notez le changement de devis et le fait que Base et Simple HTTP Server sont maintenant dans http.server.
Alexander Varwijk
+1 sur l'utilisation de l'alias de profil, j'ai appelé le mien 'servelocal' - il y a un peu de danse qui change et qui échappe les guillemets pour rendre la syntaxe bash heureuse, mais le résultat est agréable.
sdupton
Très utile ... :)
user3145373 ツ