pythonで、SFTPサーバを立てるのにsftpserverライブラリを使えば簡単に構築できます。
SFTPサーバをローカルで使いたい時や、テスト用にSFTPサーバを使いたい場合に利用できます。
環境
Windows 10
python 3.7.1
sftpserver 0.3
sftpserverのインストール
まずはpipコマンドでsftpserverをインストールします。
pip install sftpserver
OpenSSLのインストール
sftpserverでは認証に秘密鍵を必要とするので、openSSLで作ります。
Windowにはopensslコマンドがないので下記を参考に設定してください。
OpenSSLで秘密鍵の生成
下記のコマンドで秘密鍵の生成を行います。
まず、秘密鍵を保存しておくフォルダを作ります。
秘密鍵の保存先は、「/tmp/test_rsa.key」なので
通常はC:/にtmpフォルダを作ります。
その後、以下のコマンドを実行して秘密鍵を作成します。
tmpフォルダに作られたtest_rsa.keyをテキストエディタで開きます。
先頭行にある—–BEGIN PRIVATE KEY—–を—–BEGIN RSA PRIVATE KEY—–に変更します。
これは、pythonがRSAのファイルと認識するために必要です。
実際にSFTPサーバを立ち上げ、pythonで接続してみる
コマンドプロンプトを起動し、SFTPサーバのトップディレクトリして扱うパスに移動して、
下記のコマンド実行してSFTPサーバを起動します。
では、下記のpythonファイルを使って実行してみてください。
sftpserverコマンドを実行している所のファイル、ディレクトリが出力されるはずです。
サンプルコード
import paramiko pkey = paramiko.RSAKey.from_private_key_file('/tmp/test_rsa.key') transport = paramiko.Transport(('localhost', 3373)) transport.connect(username='admin', password='admin', pkey=pkey) sftp = paramiko.SFTPClient.from_transport(transport) print(sftp.listdir('.'))
実行結果例
['tmp', 'soft', '新しいフォルダー']
解説
sftpserverのホストはlocalhost, ポート番号は3373がデフォルト設定で決められています。
その情報と、秘密鍵を使って認証してSFTPサーバに接続しています。
pythonでsftpserverコマンドを実行させ、SFTPサーバを起動させる。
コマンドプロンプトから起動させるのではなく、
pythonでsftpserverを起動させます。
sftpserver起動のモジュール sftp_server.py
# -*- coding: utf-8 -*- import os import hashlib from time import sleep from subprocess import Popen from shutil import rmtree class SftpServer(): def setUp(self): """sftpserver起動 """ # SFTPテストサーバ用のディレクトリ self.sftproot = '/' # self.sftprootのパスに移動 os.chdir(self.sftproot) # コマンドの実行 self.proc = Popen([ '{0}'.format('sftpserver'), '-k', '{0}'.format('/tmp/test_rsa.key'), '-l', 'WARNING', ]) # 起動の待ち時間 sleep(1) def tearDown(self): """sftpserver停止 """ # sftpserverコマンド実行プロセスの停止 self.proc.terminate()
sftip_serverのモジュールの使用例
サンプルコード
import paramiko from sftp_server import SftpServer server = SftpServer() server.setUp() pkey = paramiko.RSAKey.from_private_key_file('/tmp/test_rsa.key') transport = paramiko.Transport(('localhost', 3373)) transport.connect(username='admin', password='admin', pkey=pkey) sftp = paramiko.SFTPClient.from_transport(transport) print(sftp.listdir('.'))
サンプルコードを実行すると、ルートディレクトリ内のファイル、ディレクトリが出力されます。
参考
関連記事