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('.'))
サンプルコードを実行すると、ルートディレクトリ内のファイル、ディレクトリが出力されます。
参考
関連記事

