Python: SFTPでファイルをGET・PUTする方法

PythonでSFTP(Secure FTP)通信を行う場合は paramikoというライブラリを使うと 簡単にファイルのgetやput (ダウンロードやアップロード)が行えます。

一応書いておきますが、FTPでの平文による通信はおすすめしません。 完全に閉じたネットワークならまだしも、 公のネットワークを利用する場合は 通信内容が暗号化されたSFTPによるデータ転送を行うようにしてください。

まず、paramikoのインストールから

pip install paramiko

ParamikoはドキュメントがWeb上で大量に公開されていますが、 その中でも今回のSFTP通信で参考になるのは次の「Client」と「SFTP」の2ページです。 必要に応じて参照してください。

Client — Paramiko documentation
SFTP — Paramiko documentation

SFTP通信の流れ

SFTP通信を行う場合の流れは次のようになります。

SFTP接続の準備
 ↓
SFTP接続の開始
 ↓
ファイルのput・get
 ↓
接続の終了

サンプルコード

サンプルコードは次の通りです。 編集する必要があるのは、 赤字で記述している最初のconfigと最後の方のget、putの部分です。

import paramiko

# SFTP接続準備
config = {
	"host" : "サーバー名",
	"port" : ポート番号,
	"username" : "ユーザー名",
	"password"   : "パスワード"
}

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(config['host'], 
               port = config['port'],
               username = config['username'],
               password = config['password'])

# SFTPセッション開始
sftp_con = client.open_sftp() 

# GETの場合
sftp_con.get("リモートパス", "ローカルパス")

# PUTの場合
sftp_con.put("ローカルパス", "リモートパス")

# クローズ
client.close()

サーバー情報の編集

config = {
	"host" : "サーバー名",
	"port" : ポート番号,
	"username" : "ユーザー名",
	"password" : "パスワード"
}

SSH(SFTP)通信を行うサーバー名(又はIPアドレス)、 ポート番号、ユーザー名、パスワード記述します。 SSH(SFTP)通信のデフォルトポート番号は22ですが、 サーバーによっては独自のポート番号を使っているので 確認してください。
ちなみにレンタルサーバーのXserverの場合は「10022」、 ロリポップの場合は「2222」です。 他のサーバーは「サーバー名 ssh」でググってください。

SSH設定 | エックスサーバー
SSHについて ロリポップ!レンタルサーバー

GET・PUTの書き方

# GETの場合
sftp_con.get("リモートパス", "ローカルパス")

# PUTの場合
sftp_con.put("ローカルパス", "リモートパス")

getでダウンロードする場合と、 putでアップロードする場合で リモートパスとローカルパスの順番が異なるので 注意してください。

ディレクトリについては、 リモート側がログインディレクトリローカル側はカレントディレクトリがデフォルトのディレクトリとなります。 そこからの相対パスで記述するか、 又は絶対パスでファイルパスを指定します。 もちろんディレクトリを移動しても構いません(後述)。

記述例を紹介。

# GETの記述例(相対パス)
sftp_con.get("test.txt", "test.txt")

上記の場合、サーバー側のログインディレクトリにあるtest.txtを ローカル側のカレントディレクトリにtest.txtとしてダウンロードします。

# GETの記述例(絶対パス)
sftp_con.get("/user/home/test.txt", "D:\\temo\\test.txt")

上は絶対パスで記述しています。 ローカル側のファイルパスは「D:\\temp\\test.txt」のように 「\」を2つ繋げます。

ディレクトリを移動する

ディレクトリを移動するにはchdir()メソッドを使います。

sftp_con.chdir("web/test");

上記の場合相対パスで記述しているので、 ログインディレクトリの下にある"web/test"ディレクトリに移動します。 絶対パスでも指定可能です。 ただし、chdirは実際にディレクトリを移動しているのではなく、 paramikoによるエミュレートです。

chidirメソッドについては次の記事を参考にしてください。
(関連記事:Paramikoでディレクトリ移動(chdir)の方法と注意点

ディレクトリのファイルリストを取得したい場合はlistdir()メソッドか listdir_attr()メソッドを使用します。 (関連記事: Paramikoでファイルのリストを表示する方法

Python