スポンサーリンク

[python] SFTPサーバをsftpserverライブラリを使って構築する

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コマンドをWindowsで使えるようにする

 

OpenSSLで秘密鍵の生成

下記のコマンドで秘密鍵の生成を行います。

まず、秘密鍵を保存しておくフォルダを作ります。

秘密鍵の保存先は、「/tmp/test_rsa.key」なので

通常はC:/にtmpフォルダを作ります。

その後、以下のコマンドを実行して秘密鍵を作成します。

openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout /tmp/test_rsa.key

 

tmpフォルダに作られたtest_rsa.keyをテキストエディタで開きます。

先頭行にある—–BEGIN PRIVATE KEY—–を—–BEGIN RSA PRIVATE KEY—–に変更します。

これは、pythonがRSAのファイルと認識するために必要です。

 

実際にSFTPサーバを立ち上げ、pythonで接続してみる

コマンドプロンプトを起動し、SFTPサーバのトップディレクトリして扱うパスに移動して、

下記のコマンド実行してSFTPサーバを起動します。

sftpserver -k /tmp/test_rsa.key

 

では、下記の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('.'))

サンプルコードを実行すると、ルートディレクトリ内のファイル、ディレクトリが出力されます。

 

 

参考

関連記事