Pythonの1行FTPサーバー


101

Pythonで1行のコマンドを使用して単純なFTPサーバーを実行することは可能ですか?FTPサーバーをインストールせずにファイルをLinuxボックスに転送するための迅速かつ一時的な方法として、これを実行できるようにしたいと考えています。できれば、組み込みのPythonライブラリを使用して、追加でインストールする方法はありません。


8
pftftpdlibなどの外部pythonライブラリを使用しない限り、1行のコードでこれを実行できるとは思えません。PythonにはFTPクライアントが組み込まれていますが、サーバーはありません。
GWW、2011

3
ファイルをLinuxに転送しますか?なぜscpを使わないのですか?
Leonmax 14

sshfsを使用しないのはなぜですか?(LANで)最速の転送速度を得るには、オプションを使用します-o Ciphers=arcfour。つまりsshfs $REMOTEHOST:$DIRECTORY $MOUNTPOINT -o Ciphers=arcfour、ファイルシステム内のファイルをコピー、移動、名前変更、管理します。sshfsはMac OSXでも利用できます。
erik、2015

回答:


132

必須のツイストの例:

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、2011

19
確かに、私は反対投票に値しますが、実際には、人々はTwistedを知っているべきです。そしてもちろんTwistedは多くのLinuxのベースインストールにあります。
Ali Afshar

5
反対票を投じるべきではなく、ユーザーは「必要」ではなく「好ましい」と述べた。Pythonの組み込みライブラリでこれを行う方法はありません。サードパーティのソフトウェアをインストールする必要があります。
アンドレ・Puel

4
@Andrea Spadaccini:ここから未来の人々。実際、この回答は非常に役に立ちました。;)
Benjamin Wohlwend、2012

1
@BenjaminWohlwend:遠い将来...まだ非常に便利です。ビルトインにSimpleFTPServerが必要なようです。
MGP

89

Giampaolo Rodolaのpyftpdlibをチェックしてください。これは、Python向けの最高のFTPサーバーの1つです。それはグーグルのクロム(彼らのブラウザ)とバザー(バージョン管理システム)で使われています。RFC-959の Pythonでの最も完全な実装です(別名:FTPサーバー実装仕様)。

コマンドラインから:

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

より複雑なものが必要な場合は、Webサイトに他の例があります。

コマンドラインオプションのリストを取得するには:

python -m pyftpdlib --help

標準のFTPポートを上書きまたは使用する場合は、管理者権限(sudoなど)が必要です。


1
1.3.0のとおりです>>> from pyftpdlib import ftpserverpyftpdlib\ftpserver.py:54: DeprecationWarning: pyftpdlib.ftpserver module is deprecated
ダニエル・レイス

2
現在のバージョンに合わせて2014年8月27日水曜日に更新。現在、非推奨の警告はありません。
ブライアンブルージュマン2014

これは安全ですか?
AmirHossein 2017

@TechJS pyftpdlibはTLS over TLSをサポートしています(RFC 4217)。
ブライアンブルージュマン2017

@BrianBruggemanいいえ、安全です。インターネット経由でFTPを公開したり、意図しない処理を行ったり、データを盗んだりしないことを意味します。つまり、本番環境で使用するのに十分安全なソースコードですか。
AmirHossein 2017

39

代わりに、1行のHTTPサーバーを使用しないのはなぜですか。

python -m SimpleHTTPServer 8000

ポート8000​​でHTTPを介して現在の作業ディレクトリのコンテンツを提供します。

Python 3を使用する場合は、代わりに

python3 -m http.server 8000

2.xのSimpleHTTPServerモジュールドキュメントおよび3.xのhttp.serverドキュメントを参照してください。

ちなみに、どちらの場合でも、portパラメータはオプションです。


29
これで彼がファイルをアップロードできるとは思いません。
ローマンプラシル2014

2
再開なし、単一の接続など
bugmenot123

RomanPlášil@それは、ちょうど別の端にサーバーを実行することがある単にXD
Reishin

26

上記の回答はすべて、Pythonディストリビューションに「1つのライナーpython ftpd」の目標を達成するためのサードパーティライブラリが含まれていることを前提としていますが、@ zioが求めていることではありません。また、SimpleHTTPServerは、ファイルをダウンロードするためのWebブラウザーを必要とします。

Pythonはそれ自体で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
想定について...あなたは、クライアントがUNIXマシンでtarあり、nc利用可能であると想定しています。ウィンドウの場合はどうなりますか?
jlh

16

pyftpdlibユーザーの場合。これはpyftpdlibのWebサイトで見つかりました。これにより、ファイルシステムへの書き込みアクセス権を持つ匿名FTPが作成されますので、十分に注意して使用してください。より良いセキュリティのために、より多くの機能が内部で利用可能ですので、見てください:

sudo pip3 install pyftpdlib

python3 -m pyftpdlib -w  

## updated for python3 Feb14:2020

上記の非推奨の方法を使用してみた人には役立つかもしれません。

sudo python -m pyftpdlib.ftpserver


3
sudovenvにインストールする場合はスキップできます
balki '

1
v3のバリアントがあることを忘れないでください:pip3 install pyftpdlibpython3 -m pyftpdlib -w。私にとって魅力のように働いた。
ロンクライン

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/


3

より簡単な解決策は、ユーザーpyftpdライブラリを使用することです。このライブラリを使用すると、Python FTPサーバーを1行でスピンできます。デフォルトではインストールされませんが、シンプルなaptコマンドを使用してインストールできます

apt-get install python-pyftpdlib

今あなたが提供したいディレクトリからpythodモジュールを実行するだけです

python -m pyftpdlib -p 21 

よさそうですが、どのような認証が行われますか?「530 Authentication failed」と表示されます。
guettli 2018

1

1行のFTPサーバーについては知りませんが、

python -m SimpleHTTPServer

0.0.0.0:8000でHTTPサーバーを実行し、現在のディレクトリからファイルを提供します。Webブラウザで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.