เป็นไปได้ไหมที่จะรัน python SimpleHTTPServer บน localhost เท่านั้น


88

ฉันมีการเชื่อมต่อ vpn และเมื่อฉันใช้ python -m SimpleHTTPServer มันให้บริการบน 0.0.0.0:8000 ซึ่งหมายความว่าสามารถเข้าถึงได้ผ่าน localhost และผ่านทาง ip จริงของฉัน ฉันไม่ต้องการให้โรบ็อตสแกนฉันและสนใจว่าเซิร์ฟเวอร์จะเข้าถึงได้ผ่านทาง localhost เท่านั้น

เป็นไปได้ไหม?

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

เซิร์ฟเวอร์ http แบบธรรมดาอื่น ๆ ที่สามารถดำเนินการได้ทันทีโดยใช้บรรทัดคำสั่งก็ยินดีต้อนรับเช่นกัน


4
คุณสามารถบล็อกการเชื่อมต่อภายนอกบนพอร์ตนั้นได้จากไฟร์วอลล์ / เราเตอร์ของคุณ
Burhan Khalid

8
ในขณะที่เป็นคำถามที่ดีสำหรับ python2 ก็อาจจะตั้งข้อสังเกตว่าในที่นี่ python3 ทดแทนhttp.serverช่วยให้มีผลผูกพันทันทีเช่นpython3 -m http.server --bind 127.0.0.1 8000จะพอเพียง
humanityANDpeace

1
Sidenote : SimpleHTTPServerเป็นเธรดเดียวและการบล็อกซึ่งหมายความว่าคุณจะไม่สามารถทำคำขออื่นได้จนกว่าคำขอก่อนหน้าจะสิ้นสุด และไม่มีการรองรับช่วงเช่นสำหรับการสตรีม / ค้นหาไฟล์สื่อจากตำแหน่งเฉพาะ ทางเลือกอื่นที่ดีกว่าคือtwisted( pip install twisted) ซึ่งคุณสามารถใช้งานtwistd -n web --path /ได้ นอกจากนี้ยังสามารถทำ FTP twistd -n ftp -p 2121 -r /ไม่ระบุชื่อกับ เพิ่มเติม http เซิร์ฟเวอร์หนึ่งสมุทร: gist.github.com/willurd/5720255
ccpizza

คำตอบ:


54

หากคุณอ่านซอร์สคุณจะเห็นว่ามีเพียงพอร์ตเท่านั้นที่สามารถแทนที่ได้ในบรรทัดคำสั่ง หากคุณต้องการเปลี่ยนโฮสต์ที่ให้บริการคุณจะต้องใช้test()วิธีการSimpleHTTPServerและBaseHTTPServerตัวคุณเอง แต่นั่นควรจะง่ายจริงๆ

นี่คือวิธีที่คุณสามารถทำได้อย่างง่ายดาย:

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

98

ใน Python เวอร์ชัน 3.4 ขึ้นไปhttp.serverโมดูลจะยอมรับbindพารามิเตอร์

ตามเอกสาร :

python -m http.server 8000

ตามค่าเริ่มต้นเซิร์ฟเวอร์จะผูกตัวเองกับอินเทอร์เฟซทั้งหมด อ็อพชัน -b / - bind ระบุแอดเดรสเฉพาะที่ควรผูก ตัวอย่างเช่นคำสั่งต่อไปนี้ทำให้เซิร์ฟเวอร์ผูกกับ localhost เท่านั้น:

python -m http.server 8000 --bind 127.0.0.1

ใหม่ในเวอร์ชัน 3.4: - ผูกอาร์กิวเมนต์ถูกนำมาใช้


75

ตามที่@sberryอธิบายไว้เพียงแค่ทำโดยใช้python -m ...วิธีการที่ดีจะไม่สามารถทำได้เนื่องจากที่อยู่ IP ถูกเข้ารหัสในการใช้งาน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
เพื่อให้งานนี้เป็นเซิร์ฟเวอร์ http แบบง่ายบน windows 10 โดยใช้ Python 3.5.1 ฉันต้องเปลี่ยนดังนี้: python -c "import http.server as hs; hs.HTTPServer(('127.0.0.1', 8888), hs.SimpleHTTPRequestHandler).serve_forever()" สังเกตการเปลี่ยนแปลงในใบเสนอราคาและความจริงที่ว่า Base และ Simple HTTP Server อยู่ใน http.server แล้ว
Alexander Varwijk

+1 ในการใช้นามแฝงของโปรไฟล์ฉันเรียกฉันว่า 'servelocal' - มีการเต้นรำเล็กน้อยที่เปลี่ยนและหลีกเลี่ยงเครื่องหมายคำพูดเพื่อให้ไวยากรณ์ของ bash มีความสุข แต่ผลลัพธ์ก็ออกมาดี
sdupton

มีประโยชน์มาก ... :)
user3145373 ツ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.