কেবলমাত্র লোকালহোস্টে পাইথন সিম্পলএইচটিটিপি সার্ভার চালানো সম্ভব?


88

আমার একটি ভিপিএন সংযোগ রয়েছে এবং যখন আমি পাইথন-এম সিম্পল এইচটিটিপিএস সার্ভারটি চালাচ্ছি, এটি 0.0.0.0:8000 এ কাজ করে, যার অর্থ এটি লোকালহোস্ট এবং আমার আসল আইপি এর মাধ্যমে অ্যাক্সেস করা যায় । আমি চাই না যে রোবট আমাকে স্ক্যান করবে এবং আগ্রহী যে সার্ভারটি কেবল লোকালহোস্টের মাধ্যমে অ্যাক্সেস করা হবে।

এটা কি সম্ভব?

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

কমান্ড লাইন ব্যবহার করে তাত্ক্ষণিকভাবে কার্যকর করা যেতে পারে এমন অন্য কোনও সাধারণ HTTP সার্ভারটিও স্বাগত।


4
আপনি আপনার ফায়ারওয়াল / রাউটার থেকে কেবল সেই বন্দরে বাইরের সংযোগগুলি ব্লক করতে পারেন।
বুরহান খালিদ

8
যদিও python2 জন্য একটি ভাল প্রশ্ন, এটা এখানে উল্লেখ করা যেতে পারে যে python3 মধ্যে প্রতিস্থাপন http.serverসরাসরি বাঁধাই মঞ্জুরি দেয় যা যেমন python3 -m http.server --bind 127.0.0.1 8000যথেষ্ট হবে
humanityANDpeace

4
সিডিনোট : SimpleHTTPServerএকক থ্রেডিং এবং অবরুদ্ধকরণ, এর অর্থ পূর্ববর্তী অনুরোধটি শেষ না হওয়া পর্যন্ত আপনি আর একটি অনুরোধ করতে পারবেন না। এবং এর কোনও সীমাবদ্ধ সমর্থন নেই যেমন একটি নির্দিষ্ট অবস্থান থেকে মিডিয়া ফাইল স্ট্রিমিং / অনুসন্ধানের জন্য। আরও ভাল বিকল্প হ'ল twisted( pip install twisted) যা দিয়ে আপনি চালাতে পারেন twistd -n web --path /। এটি বেনামে এফটিপিও করতে পারে twistd -n ftp -p 2121 -r /। আরও HTTP সার্ভার ওয়ান-লাইনার: gist.github.com/willurd/5720255
সিসিপিজা

উত্তর:


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

97

পাইথন সংস্করণে ৩.৪ এবং তার বেশি সংস্করণগুলিতে http.serverমডিউল একটি bindপরামিতি গ্রহণ করে ।

ডক্স অনুসারে :

python -m http.server 8000

ডিফল্টরূপে, সার্ভার নিজেকে সমস্ত ইন্টারফেসের সাথে আবদ্ধ করে। অপশন -b / - বাইন্ড একটি নির্দিষ্ট ঠিকানা নির্দিষ্ট করে যেখানে এটি বাঁধতে হবে। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি সার্ভারকে কেবল লোকালহোস্টের সাথে আবদ্ধ করে তোলে:

python -m http.server 8000 --bind 127.0.0.1

সংস্করণ 3.4 এ নতুন: - বাইন্ড যুক্তিটি চালু হয়েছিল was


75

@ সাবেরি যেমন ব্যাখ্যা করেছেন, কেবল দুর্দান্ত 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
এটি .বাশ_প্রফাইলে যুক্ত করা হচ্ছে। ইউম এখন আমি টাইপ করতে পারি H। ধন্যবাদ! - gist.github.com/cmawhorter/f2a09bcf63c68b0cff10
কোরি মাওয়াহোটার

4
পাইথন ৩.৩.১ ব্যবহার করে উইন্ডোজ ১০-এ একটি সাধারণ HTTP সার্ভার হিসাবে এই কাজটি করার জন্য আমাকে এটিকে নিম্নরূপে পরিবর্তন করতে হয়েছিল: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" উদ্ধৃতিতে পরিবর্তনটি এবং বেস এবং সিম্পল এইচটিটিপি সার্ভারটি এখন http.server এ রয়েছে তা নোট করুন।
আলেকজান্ডার ভারভিজক

প্রোফাইল ওরফে ব্যবহার করার সময় +1, আমি আমার 'সার্ভেলোকাল' বলেছিলাম - বাশ সিনট্যাক্সকে খুশি করার জন্য কিছুটা নাচের পরিবর্তন ঘটছে এবং উদ্ধৃতি চিহ্ন থেকে বেরিয়ে আসবে, তবে ফলাফলটি দুর্দান্ত।
sdupton

খুব সহায়ক ... :)
ব্যবহারকারী 3145373 ツ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.