Máy chủ ftp một dòng trong python


101

Có thể có một dòng lệnh trong python để thực hiện một máy chủ ftp đơn giản không? Tôi muốn có thể thực hiện việc này như một cách nhanh chóng và tạm thời để chuyển tệp sang hộp linux mà không cần phải cài đặt máy chủ ftp. Tốt hơn là một cách sử dụng thư viện python tích hợp sẵn, vì vậy không có gì thêm để cài đặt.


8
Trừ khi bạn sử dụng thư viện python bên ngoài như pftftpdlib, tôi nghi ngờ bạn có thể làm điều này với một dòng mã. Python có một ứng dụng khách ftp được tích hợp sẵn, nhưng không phải là một máy chủ.
GWW

3
chuyển tập tin sang linux ??? tại sao bạn không chỉ sử dụng scp?
Leonmax

Tại sao không sử dụng sshfs ? Để có tốc độ truyền nhanh nhất (trong mạng LAN), hãy sử dụng tùy chọn -o Ciphers=arcfour, tức là sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourvà sao chép, di chuyển, đổi tên, quản lý tệp trong hệ thống tệp của bạn. sshfs cũng có sẵn cho Mac OSX.
erik

Câu trả lời:


132

Ví dụ về Twisted bắt buộc :

twistd -n ftp

Và có lẽ hữu ích:

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
Rất đẹp! Nhưng OP đã yêu cầu sử dụng thư viện python tiêu chuẩn vì anh ta không muốn cài đặt các thư viện khác.
Andrea Spadaccini

19
Đúng vậy, tôi xứng đáng bị bỏ phiếu, nhưng thực sự, mọi người nên biết Twisted. Và tất nhiên Twisted có trong bản cài đặt cơ bản của nhiều Linux.
Ali Afshar

5
Bạn không nên bỏ phiếu, người dùng nói "tốt nhất", không "cần thiết". Không có cách nào để làm điều đó với các thư viện nội trang python, bạn PHẢI cài đặt phần mềm của bên thứ ba.
André Puel,

4
@Andrea Spadaccini: những người đến từ tương lai ở đây. Chúng tôi thấy câu trả lời này thực sự rất hữu ích. ;)
Benjamin Wohlwend

1
@BenjaminWohlwend: xa hơn trong tương lai ... vẫn rất hữu ích. Có vẻ như chúng ta cần một máy chủ SimpleFTPServer trong nội trang.
MGP

89

Kiểm tra pyftpdlib từ Giampaolo Rodola. Đây là một trong những máy chủ ftp tốt nhất hiện có cho python. Nó được sử dụng trong chrome của google (trình duyệt của họ) và chợ (hệ thống kiểm soát phiên bản). Đây là cách triển khai đầy đủ nhất trên Python cho RFC-959 (hay còn gọi là: Thông số triển khai máy chủ FTP).

Từ dòng lệnh:

python -m pyftpdlib

Hoặc '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()

Có nhiều ví dụ hơn trên trang web nếu bạn muốn một cái gì đó phức tạp hơn.

Để nhận danh sách các tùy chọn dòng lệnh:

python -m pyftpdlib --help

Lưu ý, nếu bạn muốn ghi đè hoặc sử dụng cổng ftp tiêu chuẩn, bạn sẽ cần các đặc quyền của quản trị viên (ví dụ: sudo).


1
Tính đến 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
Daniel Reis

2
Cập nhật Thứ 4 ngày 27 tháng 8 năm 2014 cho phiên bản hiện tại. Bây giờ không nên có cảnh báo không dùng nữa.
Brian Bruggeman

cái này có an toàn không?
AmirHossein

@TechJS pyftpdlib hỗ trợ ftp qua TLS (RFC 4217).
Brian Bruggeman

@BrianBruggeman Không, ý tôi là không để lộ ftp qua internet, không làm bất cứ điều gì ngoài ý muốn và không đánh cắp dữ liệu của tôi, ý tôi là mã nguồn có đủ an toàn để sử dụng trong môi trường sản xuất không?
AmirHossein

39

Thay vào đó, tại sao bạn không sử dụng máy chủ HTTP một dòng ?

python -m SimpleHTTPServer 8000

sẽ phục vụ nội dung của thư mục làm việc hiện tại qua HTTP trên cổng 8000.

Nếu bạn sử dụng Python 3, bạn nên viết

python3 -m http.server 8000

Xem tài liệu mô-đun SimpleHTTPServer cho 2.x và tài liệu http.server cho 3.x.

Nhân tiện, trong cả hai trường hợp, tham số cổng là tùy chọn.


29
Tôi không nghĩ rằng điều này cho phép anh ta tải tệp lên.
Roman Plášil

2
Không có tiếp tục, kết nối duy nhất, v.v.
bugmenot123

@ RomanPlášil nó sẽ, chỉ cần chạy máy chủ ở một đầu khác xD đơn giản như nó vốn có
Reishin

26

Tất cả các câu trả lời ở trên đều giả định rằng bản phân phối Python của bạn sẽ có một số thư viện của bên thứ ba để đạt được mục tiêu "một lớp lót python ftpd", nhưng đó không phải là trường hợp của những gì @zio đang yêu cầu. Ngoài ra, SimpleHTTPServer liên quan đến trình quản lý web để tải xuống tệp, nó không đủ nhanh.

Python không thể làm ftpd bởi chính nó, nhưng bạn có thể sử dụng netcat , nc:

ncvề cơ bản là một công cụ được tích hợp sẵn từ bất kỳ hệ thống giống UNIX nào (ngay cả hệ thống nhúng), vì vậy nó hoàn hảo cho "cách nhanh chóng và tạm thời để truyền tệp ".

Bước 1, ở phía người nhận, chạy:

nc -l 12345 | tar -xf -

điều này sẽ lắng nghe trên cổng 12345, đang chờ dữ liệu.

Bước 2, về phía người gửi:

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

Bạn cũng có thể đặt pvở giữa để theo dõi tiến trình chuyển:

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

Sau khi quá trình chuyển giao kết thúc, cả hai bên ncsẽ tự động thoát và hoàn thành công việc.


2
Nói về giả định ... Bạn giả sử rằng các máy khách sẽ là những máy unix có tarnccó sẵn. Nếu đó là cửa sổ thì sao?
jlh

16

Đối với người dùng pyftpdlib. Tôi tìm thấy điều này trên trang web pyftpdlib. Điều này tạo ra ftp ẩn danh với quyền ghi vào hệ thống tệp của bạn, vì vậy hãy sử dụng cẩn thận. Nhiều tính năng khác có sẵn để bảo mật tốt hơn, vì vậy chỉ cần xem:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Có thể hữu ích cho những người đã thử sử dụng phương pháp không được dùng ở trên.

sudo python -m pyftpdlib.ftpserver


3
Bạn có thể bỏ qua sudonếu bạn cài đặt ở venv
balki

1
đừng quên rằng có biến thể v3: pip3 install pyftpdlibpython3 -m pyftpdlib -w. đã làm việc như một cái duyên đối với tôi.
Ron Klein

3

Tải về:

pip install twisted

Sau đó, mã:

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

Tìm hiểu sâu hơn:

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


3

Giải pháp đơn giản hơn sẽ là thư viện pyftpd của người dùng. Thư viện này cho phép bạn quay máy chủ FTP Python trong một dòng. Nó không được cài đặt theo mặc định, nhưng chúng ta có thể cài đặt nó bằng lệnh apt đơn giản

apt-get install python-pyftpdlib

bây giờ từ thư mục bạn muốn phục vụ chỉ cần chạy mô-đun pythod

python -m pyftpdlib -p 21 

Có vẻ tốt, nhưng loại xác thực nào xảy ra? Tôi nhận được "530 Xác thực không thành công."
guettli 18/09/18

1

Tôi không biết về máy chủ FTP một dòng, nhưng nếu bạn biết

python -m SimpleHTTPServer

Nó sẽ chạy một máy chủ HTTP trên 0.0.0.0:8000, cung cấp các tệp ra khỏi thư mục hiện tại. Nếu bạn đang tìm cách nhanh chóng tải các tệp khỏi hộp linux bằng trình duyệt web, bạn không thể đánh bại nó.


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 Chúng bao gồm cùng một thư viện, nhưng chúng không giống các bản sao đối với tôi.
Đánh dấu Rotteveel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.