1

https://github.com/rspivak/sftpserverを参照として使用して、SFTP サーバーを実装しています。私自身のソリューションを展開する理由は、カスタム認証スキームと、特別な chrooting およびブラック/ホワイトリスト基準です。

私の問題は、一度に複数の接続を処理することです。私の現在のループは次のようになります。

# Wait for a connection
conn, addr = server_socket.accept()

# Open a transport for this connection
tr = Transport(conn)

# Load our private host key
key = RSAKey.from_private_key_file("sftp.key")
tr.add_server_key(key)

# Tell server to support SFTP
tr.set_subsystem_handler("sftp", SFTPServer, sftp.ChrootedSFTP)

# Start a SSH server for this connection and serv it
server = auth.ChrootedAuthServer(db_factory, "/path/to/chroot")
tr.start_server(server=server)

# Wait for client to establish SSH connection
ch = tr.accept()

私のソリューションは、超高速である必要はありません。約10の同時接続を処理でき、それぞれが時々データをプッシュします。どうすればこれを達成できますか?

4

3 に答える 3

1

私はこれが古いスレッドであることを知っており、以前に少し似た要件に直面したときにこれに出くわしました。本当は sftp サーバー全体を実装したくはありませんでしたが、まさにそのために paramiko を使い始めました。

私が実際に望んでいたのは、実際には明確に定義された API によって供給されていたファイルシステムの抽象化への sftp アクセスを提供することでした。

実際に必要なものに焦点を合わせ直すだけで、これがより簡単に実行できることに気付くためだけに、独自のソリューションを展開し始めました。したがって、これは質問に直接答えるものではありませんが、この方法でつまずいた他の人のために、ここに私のソリューションへの参照を追加すると役立つかもしれないと思いました.

私の解決策は、openssh と paramiko を組み合わせて使用​​することでした。

このソリューションを使用すると、ソケット接続、認証/キー交換などのセットアップのすべての^重労働^と、私のsftpサーバーはプロトコルコマンドを実装するだけです. sftp は、サブシステムを「実装」するコマンドの stdin/stdout を介して ssh サーバー プロセスが通信する単なる「サブシステム」であるため、この区別が可能であることに注意してください (参照: http://docstore.mik.ua/orelly/ network_2ndEd/ssh/ch05_07.htm )

したがって、元の質問に非常に大雑把に答えると、単純に sftp のようなインターフェースを何か (この場合は chroot されたファイルシステム) に提供することに関心がある場合は、処理について心配する必要さえありません。複数の同時 sftp 接続 -- opensshd に任せてください。トランスポートとチャネルに関係なく、paramiko 機能を拡張してカスタム sftp インスタンスを実装するだけです。

これが興味深い場合に備えて、私のアプローチの要点は次のとおりです

于 2014-07-21T10:19:28.680 に答える
0

subprocessingまたはモジュールを使用してthreading、クライアント接続のインスタンスごとに個別のプロセスを生成できます。この場合、メイン ループがスレッドを管理します。

接続をインスタンス化し、クライアントが接続するのを待ち続けることでこれを行うことができます。その場合、サブプロセスを開き、接続のハンドラーをサブプロセスに渡し、新しい接続用に新しいハンドラーを作成します。

于 2012-06-08T17:16:36.717 に答える