เซิร์ฟเวอร์ ftp หนึ่งบรรทัดใน python


105

เป็นไปได้ไหมที่จะมีคำสั่งบรรทัดเดียวใน python เพื่อสร้างเซิร์ฟเวอร์ ftp แบบธรรมดา? ฉันต้องการให้เป็นวิธีที่รวดเร็วและรวดเร็วในการถ่ายโอนไฟล์ไปยังกล่อง linux โดยไม่ต้องติดตั้งเซิร์ฟเวอร์ ftp ควรเป็นวิธีการใช้ไลบรารี python ในตัวดังนั้นจึงไม่มีอะไรเพิ่มเติมในการติดตั้ง


8
ถ้าคุณไม่ใช้ไลบรารี python ภายนอกเช่น pftftpdlib ฉันสงสัยว่าคุณสามารถทำได้ด้วยโค้ดบรรทัดเดียว Python มีไคลเอนต์ ftp ในตัว แต่ไม่ใช่เซิร์ฟเวอร์
GWW

3
โอนไฟล์ไปยัง linux ??? ทำไมคุณไม่ใช้ scp?
Leonmax

ทำไมไม่ใช้sshfs ? สำหรับอัตราการถ่ายโอนที่เร็วที่สุด (ใน LAN) ให้ใช้ตัวเลือก-o Ciphers=arcfourเช่นsshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourและคัดลอกย้ายเปลี่ยนชื่อจัดการไฟล์ของคุณในระบบไฟล์ของคุณ sshfs ยังสามารถใช้ได้กับ Mac OSX
erik

คำตอบ:


134

ตัวอย่างTwistedบังคับ:

twistd -n ftp

และอาจมีประโยชน์:

twistd ftp --help

Usage: twistd [options] ftp [options].
WARNING: This FTP server is probably INSECURE do not use it.
Options:
  -p, --port=           set the port number [default: 2121]
  -r, --root=           define the root of the ftp-site. [default:
                    /usr/local/ftp]
  --userAnonymous=  Name of the anonymous user. [default: anonymous]
  --password-file=  username:password-style credentials database
  --version         
  --help            Display this help and exit.

4
ดีมาก! แต่ OP ขอใช้ไลบรารี python มาตรฐานเพราะไม่ต้องการติดตั้งไลบรารีอื่น
Andrea Spadaccini

20
ใช่ฉันสมควรได้รับการโหวตลดลง แต่จริงๆแล้วผู้คนควรรู้จัก Twisted และแน่นอนว่า Twisted อยู่ในการติดตั้งพื้นฐานของ Linuxes จำนวนมาก
Ali Afshar

ฉันไม่ได้ลงคะแนนเพราะมันเป็นคำตอบที่ดีถ้ามี O สักหน่อยและผู้คนจากอนาคตจะพบว่ามีประโยชน์เมื่อพวกเขาค้นหาปัญหาที่คล้ายกัน
Andrea Spadaccini

1
@MichaelA ควรทำงานบน windows อย่างแน่นอน ps มันมาเยือนอนาคตของตัวเองอย่างประหลาด
Ali Afshar

2
การติดตั้งแบบบิดบนแพลตฟอร์มส่วนใหญ่ทำได้ง่ายพอ ๆ กับpip install -U twistedที่ไม่ได้กล่าวถึงโดยตรงบนเว็บไซต์ที่เชื่อมโยง
Steve Barnes

92

ตรวจสอบpyftpdlibจาก Giampaolo Rodola เป็นหนึ่งในเซิร์ฟเวอร์ ftp ที่ดีที่สุดสำหรับ python ใช้ในโครเมียมของ Google (เบราว์เซอร์) และ bazaar (ระบบควบคุมเวอร์ชัน) เป็นการใช้งาน Python สำหรับRFC-959 ที่สมบูรณ์แบบที่สุด(aka: FTP server installation spec)

จากบรรทัดคำสั่ง:

python -m pyftpdlib

อีกทางเลือกหนึ่งคือ 'my_server.py':

#!/usr/bin/env python

from pyftpdlib import servers
from pyftpdlib.handlers import FTPHandler
address = ("0.0.0.0", 21)  # listen on every IP on my machine on port 21
server = servers.FTPServer(address, FTPHandler)
server.serve_forever()

มีตัวอย่างเพิ่มเติมในเว็บไซต์หากคุณต้องการบางสิ่งที่ซับซ้อนมากขึ้น

ในการรับรายการตัวเลือกบรรทัดคำสั่ง:

python -m pyftpdlib --help

หมายเหตุหากคุณต้องการลบล้างหรือใช้พอร์ต ftp มาตรฐานคุณจะต้องมีสิทธิ์ระดับผู้ดูแลระบบ (เช่น sudo)


1
ในฐานะของ 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
แดเนียลเรส์

2
อัปเดตเมื่อวันพุธที่ 27 สิงหาคม 2014 สำหรับเวอร์ชันปัจจุบัน ตอนนี้ไม่ควรมีคำเตือนการเลิกใช้งาน
Brian Bruggeman

ปลอดภัยไหม
AmirHossein

@TechJS pyftpdlib รองรับ ftp ผ่าน TLS (RFC 4217)
Brian Bruggeman

@BrianBruggeman ไม่โดยปลอดภัยฉันหมายถึงไม่เปิดเผย ftp ทางอินเทอร์เน็ตไม่ทำอะไรโดยไม่ตั้งใจและไม่ขโมยข้อมูลของฉันฉันหมายความว่าซอร์สโค้ดปลอดภัยเพียงพอที่จะใช้ในสภาพแวดล้อมการผลิตหรือไม่
AmirHossein

40

ทำไมคุณไม่ใช้เซิร์ฟเวอร์HTTPบรรทัดเดียวแทนล่ะ?

python -m SimpleHTTPServer 8000

จะให้บริการเนื้อหาของไดเร็กทอรีการทำงานปัจจุบันผ่าน HTTP บนพอร์ต 8000

หากคุณใช้ Python 3 คุณควรเขียนแทน

python3 -m http.server 8000

ดูเอกสารโมดูลSimpleHTTPServerสำหรับ 2.x และเอกสารhttp.serverสำหรับ 3.x

อย่างไรก็ตามในทั้งสองกรณีพารามิเตอร์พอร์ตเป็นทางเลือก


30
ฉันไม่คิดว่าสิ่งนี้ทำให้เขาสามารถอัปโหลดไฟล์ได้
Roman Plášil

2
ไม่มีประวัติย่อการเชื่อมต่อเดียว ฯลฯ
bugmenot123

@ RomanPlášilมันจะแค่เรียกใช้เซิร์ฟเวอร์ในส่วนอื่น ๆ xD เหมือนเดิม
Reishin

27

คำตอบข้างต้นทั้งหมดสมมติว่าการแจกจ่าย Python ของคุณจะมีไลบรารีของบุคคลที่สามเพื่อให้บรรลุเป้าหมาย "one liner python ftpd" แต่นั่นไม่ใช่กรณีของสิ่งที่ @zio ถาม นอกจากนี้ SimpleHTTPServer ยังเกี่ยวข้องกับเว็บ broswer สำหรับการดาวน์โหลดไฟล์มันยังไม่เร็วพอ

งูใหญ่ไม่สามารถทำ ftpd ด้วยตัวเอง แต่คุณสามารถใช้netcat , nc:

ncโดยพื้นฐานแล้วเป็นเครื่องมือในตัวจากระบบใด ๆ ที่คล้าย UNIX (แม้แต่ระบบฝังตัว) ดังนั้นจึงเหมาะอย่างยิ่งสำหรับ " วิธีการถ่ายโอนไฟล์ที่รวดเร็วและชั่วคราว "

ขั้นตอนที่ 1 ที่ด้านตัวรับให้รัน:

nc -l 12345 | tar -xf -

สิ่งนี้จะฟังบนพอร์ต 12345 รอข้อมูล

ขั้นตอนที่ 2 ทางฝั่งผู้ส่ง:

tar -cf - ALL_FILES_YOU_WANT_TO_SEND ... | nc $RECEIVER_IP 12345

คุณยังสามารถวางpvตรงกลางเพื่อติดตามความคืบหน้าของการถ่ายโอน:

tar -cf - ALL_FILES_YOU_WANT_TO_SEND ...| pv | nc $RECEIVER_IP 12345

หลังจากการโอนเสร็จสิ้นทั้งสองฝ่ายncจะปิดโดยอัตโนมัติและงานที่ทำเสร็จแล้ว


2
การพูดสมมติ ... คุณคิดว่าไคลเอนต์จะเป็นเครื่องยูนิกซ์ที่มีtarและncพร้อมใช้งาน ถ้าเป็น windows ล่ะ?
jlh

17

สำหรับผู้ใช้ pyftpdlib ฉันพบสิ่งนี้ในเว็บไซต์ pyftpdlib สิ่งนี้จะสร้าง ftp ที่ไม่ระบุชื่อพร้อมการเข้าถึงการเขียนไปยังระบบไฟล์ของคุณดังนั้นโปรดใช้ด้วยความระมัดระวัง มีคุณสมบัติเพิ่มเติมอยู่ใต้ฝากระโปรงเพื่อความปลอดภัยที่ดีขึ้นดังนั้นไปดู:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

อาจเป็นประโยชน์สำหรับผู้ที่ลองใช้วิธีที่เลิกใช้แล้วข้างต้น

sudo python -m pyftpdlib.ftpserver


3
คุณสามารถข้ามได้sudoหากคุณติดตั้งใน venv
balki

1
อย่าลืมว่ามีตัวแปร v3: pip3 install pyftpdlibและpython3 -m pyftpdlib -w. เป็นเสน่ห์สำหรับฉัน
Ron Klein

4

ทางออกที่ง่ายกว่าคือไลบรารี pyftpd ของผู้ใช้ ไลบรารีนี้ช่วยให้คุณสามารถหมุนเซิร์ฟเวอร์ Python FTP ในบรรทัดเดียว มันไม่ได้มาติดตั้งตามค่าเริ่มต้น แต่เราสามารถติดตั้งได้โดยใช้คำสั่ง apt ง่าย ๆ

apt-get install python-pyftpdlib

ตอนนี้จากไดเร็กทอรีที่คุณต้องการให้บริการเพียงแค่เรียกใช้โมดูล pythod

python -m pyftpdlib -p 21 

ดูดี แต่การตรวจสอบสิทธิ์แบบใดเกิดขึ้น? ฉันได้รับ "530 การตรวจสอบสิทธิ์ล้มเหลว"
guettli

3

ติดตั้ง:

pip install twisted

จากนั้นรหัส:

from twisted.protocols.ftp import FTPFactory, FTPRealm
from twisted.cred.portal import Portal
from twisted.cred.checkers import AllowAnonymousAccess, FilePasswordDB
from twisted.internet import reactor

reactor.listenTCP(21, FTPFactory(Portal(FTPRealm('./'), [AllowAnonymousAccess()])))
reactor.run()

เจาะลึก:

http://twistedmatrix.com/documents/current/core/examples/


1

ฉันไม่รู้เกี่ยวกับเซิร์ฟเวอร์ FTP บรรทัดเดียว แต่ถ้าคุณทำ

python -m SimpleHTTPServer

มันจะเรียกใช้เซิร์ฟเวอร์ HTTP บน 0.0.0.0:8000 โดยให้บริการไฟล์จากไดเร็กทอรีปัจจุบัน หากคุณกำลังมองหาวิธีนำไฟล์ออกจากกล่อง linux ด้วยเว็บเบราว์เซอร์อย่างรวดเร็วคุณจะไม่สามารถเอาชนะมันได้


1
apt-get install python3-pip

pip3 install pyftpdlib

python3 -m pyftpdlib -p 21 -w --user=username --password=password

-w = write permission

-p = desired port

--user = give your username

--password = give your password

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