Servidor ftp de uma linha em python

101

É possível ter um comando de uma linha em python para fazer um servidor ftp simples? Eu gostaria de poder fazer isso como uma maneira rápida e temporária de transferir arquivos para uma máquina Linux sem ter que instalar um servidor ftp. De preferência, uma maneira de usar bibliotecas Python integradas, então não há nada extra para instalar.

zio
fonte
8
A menos que você use uma biblioteca python externa como pftftpdlib, duvido que possa fazer isso com uma linha de código. Python tem um cliente ftp embutido, mas não um servidor.
GWW
3
transferir arquivos para linux ??? por que você simplesmente não usa scp?
Leonmax
Por que não usar o sshfs ? Para taxas de transferência mais rápidas (em uma LAN), use a opção -o Ciphers=arcfour, ou seja sshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfour, copie, mova, renomeie e gerencie seus arquivos em seu sistema de arquivos. sshfs também está disponível para Mac OSX.
erik

Respostas:

132

Exemplo torcido obrigatório :

twistd -n ftp

E provavelmente útil:

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
fonte
4
Muito agradável! Mas o OP pediu para usar a biblioteca python padrão porque ele não queria instalar outras bibliotecas.
Andrea Spadaccini
19
Certo, eu mereço uma votação negativa, mas realmente, as pessoas deveriam conhecer o Twisted. E é claro que o Twisted está na instalação básica de muitos Linuxes.
Ali Afshar
5
Você não deve votar negativamente, o usuário disse "preferencialmente", não "necessário". Não há como fazer isso com as bibliotecas integradas do python, você DEVE instalar software de terceiros.
André Puel
4
@Andrea Spadaccini: gente do futuro aqui. De fato, achamos essa resposta muito útil. ;)
Benjamin Wohlwend
1
@BenjaminWohlwend: mais longe no futuro ... ainda muito útil. Parece que precisamos de um SimpleFTPServer integrado.
MGP de
89

Verifique o pyftpdlib de Giampaolo Rodola. É um dos melhores servidores ftp existentes para python. É usado no chromium do Google (seu navegador) e no bazar (um sistema de controle de versão). É a implementação mais completa em Python para RFC-959 (também conhecida como: especificação de implementação de servidor FTP).

Na linha de comando:

python -m pyftpdlib

Alternativamente, '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()

Existem mais exemplos no site se você quiser algo mais complicado.

Para obter uma lista de opções de linha de comando:

python -m pyftpdlib --help

Observe, se você deseja substituir ou usar uma porta ftp padrão, você precisará de privilégios de administrador (por exemplo, sudo).

Brian Bruggeman
fonte
1
A partir de 1.3.0: >>> from pyftpdlib import ftpserver:pyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
Daniel Reis
2
Atualizado quarta-feira 27 de agosto de 2014 para a versão atual. Não deveria haver avisos de depreciação, agora.
Brian Bruggeman
isso é seguro?
AmirHossein
@TechJS pyftpdlib oferece suporte a ftp sobre TLS (RFC 4217).
Brian Bruggeman
@BrianBruggeman Não por seguro quero dizer não expor ftp na internet, não fazer nada não intencional e não roubar meus dados, quero dizer, o código-fonte é seguro o suficiente para ser usado em ambientes de produção?
AmirHossein
39

Por que você não usa um servidor HTTP de uma linha ?

python -m SimpleHTTPServer 8000

servirá o conteúdo do diretório de trabalho atual sobre HTTP na porta 8000.

Se você usa Python 3, deve escrever

python3 -m http.server 8000

Consulte os documentos do módulo SimpleHTTPServer para 2.x e os documentos do http.server para 3.x.

A propósito, em ambos os casos o parâmetro port é opcional.

Andrea Spadaccini
fonte
29
Não acho que isso permite que ele faça upload de arquivos.
Roman Plášil
2
Sem currículo, conexão única, etc.
bugmenot123
@ RomanPlášil vai, basta executar o servidor em outra extremidade xD simplesmente como está
Reishin
26

Todas as respostas acima estavam assumindo que sua distribuição Python teria algumas bibliotecas de terceiros para atingir o objetivo "one liner python ftpd", mas esse não é o caso do que @zio estava perguntando. Além disso, SimpleHTTPServer envolve navegador da web para baixar arquivos, não é rápido o suficiente.

Python não pode fazer ftpd por si só, mas você pode usar netcat , nc:

ncé basicamente uma ferramenta incorporada de qualquer sistema semelhante ao UNIX (mesmo sistemas incorporados), por isso é perfeito para " uma forma rápida e temporária de transferir arquivos ".

Etapa 1, no lado do receptor, execute:

nc -l 12345 | tar -xf -

isso escutará na porta 12345, esperando pelos dados.

Etapa 2, no lado do remetente:

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

Você também pode colocar pvno meio para monitorar o andamento da transferência:

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

Depois que a transferência for concluída, ambos os lados do ncserão encerrados automaticamente e o trabalho estará concluído.

Miau
fonte
2
Falando em presumir ... Você assume que os clientes serão máquinas unix com tare ncdisponíveis. E se for o Windows?
jlh
16

Para usuários pyftpdlib. Eu encontrei isso no site pyftpdlib. Isso cria um ftp anônimo com acesso de gravação ao seu sistema de arquivos, portanto, use com o devido cuidado. Mais recursos estão disponíveis sob o capô para melhor segurança, então vá ver:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

Pode ser útil para aqueles que tentaram usar o método obsoleto acima.

sudo python -m pyftpdlib.ftpserver

tocador de CD
fonte
3
Você pode ignorar sudoa instalação em um venv
balki
1
não se esqueça de que existe a variante v3: pip3 install pyftpdlibe python3 -m pyftpdlib -w. Caiu como uma luva para mim.
Ron Klein
3

Instalar:

pip install twisted

Então o código:

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

Aprofunde-se:

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

Jonathan
fonte
3

A solução mais simples será usar a biblioteca pyftpd. Esta biblioteca permite que você gire o servidor FTP Python em uma linha. Ele não vem instalado por padrão, mas podemos instalá-lo usando o comando apt simples

apt-get install python-pyftpdlib

agora, a partir do diretório que você deseja servir, basta executar o módulo pythod

python -m pyftpdlib -p 21 
MVnD3X
fonte
Parece bom, mas que tipo de autenticação acontece? Recebo "530 Falha na autenticação."
guettli
1

Eu não sei sobre um servidor FTP de uma linha, mas se você fizer

python -m SimpleHTTPServer

Ele executará um servidor HTTP em 0.0.0.0:8000, servindo arquivos fora do diretório atual. Se você está procurando uma maneira de obter rapidamente os arquivos de uma máquina Linux com um navegador da web, não há como superar.

Alex
fonte
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
fonte
@karel Eles cobrem a mesma biblioteca, mas não parecem duplicatas para mim.
Mark Rotteveel