क्या केवल लोकलहोस्ट पर अजगर सिंपलएचटीपीएससेवर चलाना संभव है?


87

मेरे पास एक वीपीएन कनेक्शन है और जब मैं अजगर-एम सिंपलएचटीटीपीएसवर चला रहा हूं, तो यह 0.0.0.0:8000 पर कार्य करता है, जिसका अर्थ है कि इसे लोकलहोस्ट और मेरे असली आईपी के माध्यम से एक्सेस किया जा सकता है । मैं नहीं चाहता कि रोबोट मुझे स्कैन करें और दिलचस्पी लें कि सर्वर केवल लोकलहोस्ट के माध्यम से एक्सेस किया जाएगा।

क्या यह संभव है?

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

कोई अन्य सरल http सर्वर जिसे कमांड लाइन का उपयोग करके तुरंत निष्पादित किया जा सकता है, उसका भी स्वागत है।


4
आप बस अपने फ़ायरवॉल / राउटर से उस पोर्ट पर बाहरी कनेक्शन को ब्लॉक कर सकते हैं।
बुरहान खालिद

7
जबकि python2 के लिए एक अच्छा सवाल है, यह यहाँ ध्यान दिया जा सकता है कि python3 में रिप्लेसमेंट http.serverबाध्यकारी को तुरंत अनुमति देता है, जैसे python3 -m http.server --bind 127.0.0.1 8000पर्याप्त होगा
humanityandpeace

1
सिडेनोट : SimpleHTTPServerएकल-थ्रेडिंग और ब्लॉकिंग है, जिसका अर्थ है कि आप पिछले अनुरोध के समाप्त होने तक एक और अनुरोध नहीं कर पाएंगे। और इसमें किसी विशेष स्थिति से मीडिया फ़ाइल को स्ट्रीमिंग / मांगने के लिए कोई सीमा समर्थन नहीं है। एक बेहतर विकल्प है twisted( pip install twisted), जिसे आप चला सकते हैं twistd -n web --path /। यह अनाम FTP के साथ भी कर सकता है twistd -n ftp -p 2121 -r /। अधिक http सर्वर एक-लाइनर्स: gist.github.com/willurd/5720255
ccpindra

जवाबों:


54

यदि आप स्रोत को पढ़ते हैं तो आप देखेंगे कि कमांड लाइन पर केवल पोर्ट को ओवरराइड किया जा सकता है। यदि आप उस होस्ट को बदलना चाहते हैं जिस पर इसे परोसा गया है, तो आपको और खुद की test()विधि को लागू करने की आवश्यकता होगी । लेकिन यह वास्तव में आसान होना चाहिए।SimpleHTTPServerBaseHTTPServer

यहाँ है कि आप इसे कैसे कर सकते हैं, बहुत आसानी से:

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

और इसका उपयोग करने के लिए:

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

92

पायथन संस्करण 3.4 और उच्चतर में, http.serverमॉड्यूल एक bindपैरामीटर को स्वीकार करता है ।

डॉक्स के अनुसार :

python -m http.server 8000

डिफ़ॉल्ट रूप से, सर्वर खुद को सभी इंटरफेस से बांधता है। विकल्प -b / - बाँध एक विशिष्ट पते को निर्दिष्ट करता है जिससे उसे बाँधना चाहिए। उदाहरण के लिए, निम्न कमांड केवल सर्वर को लोकलहोस्ट करने के लिए बाध्य करता है:

python -m http.server 8000 --bind 127.0.0.1

संस्करण 3.4 में नया: -बाइंड तर्क पेश किया गया था।


75

जैसा कि @sberry ने बताया, बस अच्छी python -m ...विधि का उपयोग करके ऐसा करना संभव नहीं होगा, क्योंकि BaseHttpServer.testफ़ंक्शन के कार्यान्वयन में आईपी पता हार्डकोड किया गया है।

कमांड लाइन से फाइल को कोड लिखे बिना इसे करने का एक तरीका होगा

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

यदि वह अभी भी एक लाइनर के रूप में गिना जाता है, तो आपके टर्मिनल चौड़ाई पर निर्भर करता है ;-) यह निश्चित रूप से याद रखना बहुत आसान नहीं है।


4
इसे .bash_profile में जोड़ना। यम। अब मैं सिर्फ टाइप कर सकता हूं H। धन्यवाद! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
Cory Mawhorter

4
पायथन 3.5.1 का उपयोग करके विंडोज़ 10 पर एक सरल http सर्वर के रूप में इस काम को करने के लिए मुझे इसे निम्नानुसार बदलना पड़ा: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" उद्धरण में परिवर्तन पर ध्यान दें और यह तथ्य कि बेस और सिंपल HTTP सर्वर अब http.server में हैं।
अलेक्जेंडर वरविज्क

+1 प्रोफाइल उपनाम का उपयोग करने पर, मुझे मेरा 'सेरवेलोकल' कहा जाता है - बैश सिंटैक्स को खुश करने के लिए नृत्य में थोड़ा बदलाव और उद्धरण चिह्नों से बचना है, लेकिन परिणाम अच्छा है।
sdupton

बहुत उपयोगी ... :)
user3145373 '
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.