Python'da bir satır ftp sunucusu


105

Basit bir ftp sunucusu yapmak için python'da tek satırlık bir komuta sahip olmak mümkün mü? Bunu bir ftp sunucusu kurmak zorunda kalmadan bir linux kutusuna dosya aktarmanın hızlı ve geçici bir yolu olarak yapabilmek istiyorum. Tercihen yerleşik python kitaplıklarını kullanmanın bir yolu, böylece yüklemek için fazladan bir şey yok.


8
Pftftpdlib gibi harici bir python kitaplığı kullanmadığınız sürece, bunu bir satır kodla yapabileceğinizden şüpheliyim. Python'un yerleşik bir ftp istemcisi vardır, ancak bir sunucusu yoktur.
GWW

3
dosyaları linux'a transfer etmek ??? neden sadece scp kullanmıyorsun?
Leonmax

Neden sshfs kullanmıyorsunuz ? En hızlı aktarım hızları için (bir LAN'da) seçeneği kullanın -o Ciphers=arcfour, yani sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfourdosya sisteminizdeki dosyalarınızı kopyalayın, taşıyın, yeniden adlandırın, yönetin. sshfs, Mac OSX için de mevcuttur.
erik

Yanıtlar:


134

Zorunlu Bükülmüş örnek:

twistd -n ftp

Ve muhtemelen faydalı:

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
Çok hoş! Ancak OP, diğer kitaplıkları kurmak istemediği için standart python kitaplığını kullanmak istedi.
Andrea Spadaccini

20
Doğru, eksi oylamayı hak ediyorum, ama gerçekten, insanlar Twisted'ı bilmeli. Ve tabii ki Twisted, birçok Linux'un temel kurulumunda.
Ali Afshar

Olumsuz oy vermedim çünkü bu güzel bir cevap, her ne kadar az da olsa, ve gelecekten insanlar benzer sorunları aradıklarında bunu faydalı bulacaklar.
Andrea Spadaccini

1
@MichaelA kesinlikle pencerelerde çalışmalıdır. ps Kendi geleceğimi ziyaret etmek garip.
Ali Afshar

2
Çoğu platformda, bükülmüş kurulum, pip install -U twistedbağlantılı sitede doğrudan bahsedilmediği kadar kolaydır .
Steve Barnes

92

Check out pyftpdlib Giampaolo Rodola dan. Python için en iyi ftp sunucularından biridir. Google'ın chromium'unda (tarayıcıları) ve bazaar'da (bir sürüm kontrol sistemi) kullanılır. RFC-959 için Python'daki en eksiksiz uygulama (aka: FTP sunucusu uygulama özelliği).

Komut satırından:

python -m pyftpdlib

Alternatif olarak 'sunucum.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()

Daha karmaşık bir şey istiyorsanız, web sitesinde daha fazla örnek var.

Komut satırı seçeneklerinin bir listesini almak için:

python -m pyftpdlib --help

Standart bir ftp bağlantı noktasını geçersiz kılmak veya kullanmak istiyorsanız, yönetici ayrıcalıklarına (örn. Sudo) ihtiyacınız olacağını unutmayın.


1
1.3.0 itibarıyla >>> from pyftpdlib import ftpserver::pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
Daniel Reis

2
Güncel sürüm için 27 Ağustos 2014 Çarşamba güncellendi. Artık kullanımdan kaldırma uyarıları olmamalı.
Brian Bruggeman

bu güvenli mi
AmirHossein

@TechJS pyftpdlib, TLS üzerinden ftp'yi destekler (RFC 4217).
Brian Bruggeman

@BrianBruggeman Hayır, güvenli derken ftp'yi internet üzerinden ifşa etmemeyi, kasıtsız bir şey yapmamayı ve verilerimi çalmamayı kastediyorum, yani kaynak kodu üretim ortamlarında kullanılacak kadar güvenli mi?
AmirHossein

40

Neden bunun yerine tek satırlık bir HTTP sunucusu kullanmıyorsunuz ?

python -m SimpleHTTPServer 8000

mevcut çalışma dizininin içeriğini HTTP üzerinden 8000 portunda sunacaktır.

Python 3 kullanıyorsanız, bunun yerine yazmalısınız

python3 -m http.server 8000

2.x için SimpleHTTPServer modülü belgelerine ve 3.x için http.server belgelerine bakın.

Bu arada, her iki durumda da port parametresi isteğe bağlıdır.


30
Bunun dosya yüklemesine izin verdiğini sanmıyorum.
Roman Plášil

2
Özgeçmiş yok, tek bağlantı vb.
bugmenot123

@ RomanPlášil, sunucuyu başka bir uçta olduğu gibi çalıştıracak xD
Reishin

27

Yukarıdaki cevapların tümü, "tek satırlık python ftpd" hedefine ulaşmak için Python dağıtımınızın bazı üçüncü taraf kitaplıklarına sahip olacağını varsayıyordu, ancak @zio'nun sorduğu durum bu değil. Ayrıca, SimpleHTTPServer dosyaları indirmek için web tarayıcısı içerir, yeterince hızlı değildir.

Python kendisi tarafından Ftpd yapamaz, ancak kullanabilirsiniz netcat , nc:

nctemelde herhangi bir UNIX benzeri sistemden (hatta gömülü sistemler) yerleşik bir araçtır, bu nedenle " dosyaları aktarmanın hızlı ve geçici yolu " için mükemmeldir .

Adım 1, alıcı tarafında şunu çalıştırın:

nc -l 12345 | tar -xf -

bu veri beklerken 12345 portunu dinleyecektir.

2. Adım, gönderen tarafında:

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

Ayrıca pv, aktarımın ilerlemesini izlemek için ortaya koyabilirsiniz :

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

Aktarma tamamlandıktan sonra, her iki tarafı da ncotomatik olarak kapanır ve iş tamamlanır.


2
Varsayımdan bahsetmişken ... İstemcilerin unix makineleri ile birlikte tarve ncuygun olacağını varsayıyorsunuz . Ya pencerelerse?
jlh

17

Pyftpdlib kullanıcıları için. Bunu pyftpdlib web sitesinde buldum. Bu, dosya sisteminize yazma erişimi olan anonim ftp oluşturur, bu nedenle lütfen dikkatli kullanın. Daha iyi güvenlik için kaputun altında daha fazla özellik mevcuttur, bu nedenle gidin:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Yukarıdaki kullanımdan kaldırılan yöntemi kullanmayı deneyenler için yararlı olabilir.

sudo python -m pyftpdlib.ftpserver


3
Sen atlayabilirsiniz sudoBir venv içinde yüklerseniz
Balki

1
v3 varyantı olduğunu unutmayın: pip3 install pyftpdlibve python3 -m pyftpdlib -w. benim için bir cazibe gibi çalıştı.
Ron Klein

4

Daha basit çözüm, kullanıcı pyftpd kitaplığı olacaktır. Bu kütüphane, Python FTP sunucusunu tek satırda döndürmenizi sağlar. Varsayılan olarak kurulu gelmez, ancak basit apt komutunu kullanarak kurabiliriz

apt-get install python-pyftpdlib

şimdi hizmet etmek istediğiniz dizinden pythod modülünü çalıştırın

python -m pyftpdlib -p 21 

İyi görünüyor, ancak ne tür bir kimlik doğrulaması oluyor? "530 Kimlik Doğrulaması başarısız" mesajı alıyorum.
guettli

3

Yüklemek:

pip install twisted

Ardından kod:

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

Daha derine inin:

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


1

Tek hatlı bir FTP sunucusu bilmiyorum, ama biliyorsan

python -m SimpleHTTPServer

0.0.0.0:8000 üzerinde bir HTTP sunucusu çalıştıracak ve dosyaları mevcut dizinin dışına sunacaktır. Bir web tarayıcısı ile dosyaları bir linux kutusundan hızlı bir şekilde almanın bir yolunu arıyorsanız, onu yenemezsiniz.


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 Aynı kitaplığı kapsıyorlar ama bana kopya gibi görünmüyorlar.
Mark Rotteveel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.