Server ftp satu baris dengan python

103

Apakah mungkin memiliki perintah satu baris dengan python untuk melakukan server ftp sederhana? Saya ingin dapat melakukan ini sebagai cara cepat dan sementara untuk mentransfer file ke kotak linux tanpa harus menginstal server ftp. Lebih disukai cara menggunakan pustaka python bawaan sehingga tidak ada tambahan untuk dipasang.

zio
sumber
8
Kecuali Anda menggunakan pustaka python eksternal seperti pftftpdlib, saya ragu Anda dapat melakukan ini dengan satu baris kode. Python memiliki klien ftp bawaan, tetapi bukan server.
GWW
3
mentransfer file ke linux ??? kenapa kamu tidak menggunakan scp saja?
Leonmax
Mengapa tidak menggunakan sshfs ? Untuk kecepatan transfer tercepat (dalam LAN) gunakan opsi -o Ciphers=arcfour, yaitu sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourdan salin, pindahkan, ganti nama, kelola file Anda di sistem file Anda. sshfs juga tersedia untuk Mac OSX.
erik

Jawaban:

132

Contoh Obligatory Twisted :

twistd -n ftp

Dan mungkin berguna:

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.
Ali Afshar
sumber
4
Sangat bagus! Tetapi OP meminta untuk menggunakan pustaka python standar karena dia tidak ingin memasang pustaka lain.
Andrea Spadaccini
20
Benar, saya memang pantas mendapat down-voting, tapi sungguh, orang harus tahu Twisted. Dan tentu saja Twisted ada di instalasi dasar banyak Linux.
Ali Afshar
5
Anda tidak boleh menolak, kata pengguna "lebih disukai", bukan "perlu". Tidak ada cara untuk melakukannya dengan pustaka bawaan python, Anda HARUS menginstal perangkat lunak pihak ketiga.
André Puel
4
@Andrea Spadaccini: orang-orang dari masa depan ada di sini. Kami menemukan jawaban ini sangat berguna. ;)
Benjamin Wohlwend
1
@BenjaminWohlwend: lebih jauh lagi ... masih sangat berguna. Sepertinya kita membutuhkan SimpleFTPServer di dalamnya.
MGP
90

Lihat pyftpdlib dari Giampaolo Rodola. Ini adalah salah satu server ftp terbaik di luar sana untuk python. Ini digunakan di google's chromium (browser mereka) dan bazaar (sistem kontrol versi). Ini adalah implementasi paling lengkap pada Python untuk RFC-959 (alias: spesifikasi implementasi server FTP).

Dari baris perintah:

python -m pyftpdlib

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

Ada lebih banyak contoh di situs web jika Anda menginginkan sesuatu yang lebih rumit.

Untuk mendapatkan daftar opsi baris perintah:

python -m pyftpdlib --help

Catatan, jika Anda ingin mengganti atau menggunakan port ftp standar, Anda memerlukan hak admin (misalnya sudo).

Brian Bruggeman
sumber
1
Sampai 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
Daniel Reis
2
Diperbarui Rabu 27 Agustus 2014 untuk versi saat ini. Seharusnya tidak ada peringatan penghentian, sekarang.
Brian Bruggeman
apakah ini aman?
AmirHossein
@TechJS pyftpdlib mendukung ftp melalui TLS (RFC 4217).
Brian Bruggeman
@BrianBruggeman Tidak dengan aman Maksud saya tidak mengekspos ftp melalui internet, tidak melakukan sesuatu yang tidak diinginkan dan tidak mencuri data saya, maksud saya apakah kode sumber cukup aman untuk digunakan di lingkungan produksi?
AmirHossein
40

Mengapa Anda tidak menggunakan server HTTP satu baris ?

python -m SimpleHTTPServer 8000

akan menyajikan konten direktori kerja saat ini melalui HTTP pada port 8000.

Jika Anda menggunakan Python 3, Anda harus menulis

python3 -m http.server 8000

Lihat dokumen modul SimpleHTTPServer untuk 2.x dan dokumen http.server untuk 3.x.

Omong-omong, dalam kedua kasus, parameter port bersifat opsional.

Andrea Spadaccini
sumber
29
Saya rasa ini tidak memungkinkan dia untuk mengunggah file.
Roman Plášil
2
Tidak ada resume, koneksi tunggal, dll.
bugmenot123
@ RomanPlášil itu akan, jalankan saja server di ujung lain xD sesederhana apa adanya
Reishin
27

Jawaban di atas semuanya mengasumsikan distribusi Python Anda akan memiliki beberapa pustaka pihak ketiga untuk mencapai tujuan "one liner python ftpd", tetapi itu bukan kasus yang ditanyakan @zio. Selain itu, SimpleHTTPServer melibatkan web broswer untuk mengunduh file, ini tidak cukup cepat.

Python tidak dapat melakukan ftpd dengan sendirinya, tetapi Anda dapat menggunakan netcat , nc:

ncpada dasarnya adalah alat bawaan dari semua sistem mirip UNIX (bahkan sistem tertanam), jadi sangat cocok untuk "cara cepat dan sementara untuk mentransfer file ".

Langkah 1, di sisi penerima, jalankan:

nc -l 12345 | tar -xf -

ini akan mendengarkan pada port 12345, menunggu data.

Langkah 2, di sisi pengirim:

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

Anda juga dapat meletakkan pvdi tengah untuk memantau kemajuan transfer:

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

Setelah transfer selesai, kedua sisi ncakan berhenti secara otomatis, dan pekerjaan selesai.

meong
sumber
2
Berbicara tentang asumsi ... Anda berasumsi bahwa klien akan menjadi mesin unix dengan tardan nctersedia. Bagaimana jika itu jendela?
jlh
16

Untuk pengguna pyftpdlib. Saya menemukan ini di situs web pyftpdlib. Ini menciptakan ftp anonim dengan akses tulis ke sistem berkas Anda, jadi gunakanlah dengan hati-hati. Lebih banyak fitur tersedia di balik terpal untuk keamanan yang lebih baik, jadi lihat saja:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Mungkin berguna bagi mereka yang mencoba menggunakan metode usang di atas.

sudo python -m pyftpdlib.ftpserver

pemutar CD
sumber
3
Anda dapat melewati sudojika Anda menginstal di venv
balki
1
jangan lupa bahwa ada varian v3: pip3 install pyftpdlibdan python3 -m pyftpdlib -w. Bekerja seperti pesona bagi saya.
Ron Klein
3

Install:

pip install twisted

Lalu kodenya:

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

Dapatkan lebih dalam:

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

Jonathan
sumber
3

Solusi yang lebih sederhana adalah menggunakan pustaka pyftpd pengguna. Perpustakaan ini memungkinkan Anda untuk memutar server FTP Python dalam satu baris. Itu tidak terinstal secara default, tetapi kita dapat menginstalnya menggunakan perintah apt

apt-get install python-pyftpdlib

sekarang dari direktori yang ingin Anda layani jalankan saja modul pythod

python -m pyftpdlib -p 21 
MVnD3X
sumber
Kelihatannya bagus, tetapi jenis otentikasi apa yang terjadi? Saya mendapatkan "530 Otentikasi gagal."
guettli
1

Saya tidak tahu tentang server FTP satu baris, tetapi jika Anda tahu

python -m SimpleHTTPServer

Ini akan menjalankan server HTTP di 0.0.0.0:8000, melayani file dari direktori saat ini. Jika Anda sedang mencari cara untuk mengeluarkan file dari kotak linux dengan browser web dengan cepat, Anda tidak bisa mengalahkannya.

Alex
sumber
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
Shashwot Risal
sumber
@ Karel Mereka menutupi perpustakaan yang sama, tetapi mereka tidak tampak seperti duplikat bagi saya.
Mark Rotteveel