【Python3】ParamikoのSFTPを使用してファイルのダウンロード・アップロードをする方法

おはこんばんにちは、せなです。

今回はParamikoのSFTPを使用してファイルをダウンロードする方法を解説します。

環境

  • Python 3.9
  • paramiko 2.8.1

Paramikoについて

ParamikoはSSHv2で実装されているPythonライブラリです。
クライアントとサーバーの両方の機能を使用することができます。

以下のコマンドでインストールできます。
pip3 install paramiko

詳しいインストール方法については以下の公式ページを参考にしてください。
https://www.paramiko.org/installing.html

ファイルダウンロード

以下、サンプルコードです。
定数を変更することでファイルのダウンロードが行えます。

import paramiko
from paramiko.ssh_exception import BadHostKeyException, BadAuthenticationType, AuthenticationException, SSHException

# 定数
HOSTNAME = "Host名 or IPアドレス"
USERNAME = "ユーザー名"
PASSWORD = "パスワード"
REMOTEDIR = "ダウンロードパス"
REMOTEFILE = "ダウンロードファイル名"
LOCALDIR = "保存パス"
LOCALFILE = "保存ファイル名"


def ssh_connect():
	"""
	SSH接続
	"""
	client = paramiko.client.SSHClient()
    #  HostKyeの読み込み
    client.load_system_host_keys()
    #  HostKeyがない場合にHost名とHostKyeを保存
    client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
    try:
        client.connect(hostname=HOSTNAME, username=USERNAME, password=PASSWORD, timeout=10, auth_timeout=30)
    except BadHostKeyException:
    	# hostkeyの不一致
        print("The host key given by the SSH server did not match what we were expecting.")
    except BadAuthenticationType:
        # 認証タイプが許可されていない(パスワード認証が許可されていないなど)
        print("Exception raised when an authentication type is used, but the server isn’t allowing that type.")
    except SSHException:
    	# sshプロトコルの失敗
        print("Exception raised by failures in SSH2 protocol negotiation or logic errors.")
    except AuthenticationException:
    	# 不明なエラーで認証に失敗
        print("Exception raised when authentication failed for some reason")
    return client
    
def sftp_download(remote_file, local_file):
	"""
	SFTPダウンロード
	"""
	# ssh接続
    with ssh_connect() as client:
    	# sftp
        with client.open_sftp() as sftp:
            # ファイルパス
            remotepath = REMOTEDIR + remote_file
            localpath = LOCALDIR + local_file
            # ダウンロード
            sftp.get(remotepath=remotepath,localpath=localpath)
    return
                
if __name__ == '__main__':
    sftp_download(remote_file=REMOTEFILE, local_file=LOCALFILE)

ファイルアップロード

アップロードの方法はダウンロードとほとんど変わりません。
以下サンプルソースも定数を変更することで使用できます。

import paramiko
from paramiko.ssh_exception import BadHostKeyException, BadAuthenticationType, AuthenticationException, SSHException

# 定数
HOSTNAME = "Host名 or IPアドレス"
USERNAME = "ユーザー名"
PASSWORD = "パスワード"
REMOTEDIR = "アップロード先パス"
REMOTEFILE = "アップロード先ファイル名"
LOCALDIR = "アップロード元パス"
LOCALFILE = "アップロード元ファイル名"

def ssh_connect():
	"""
	SSH接続
	"""
	client = paramiko.client.SSHClient()
    #  HostKyeの読み込み
    client.load_system_host_keys()
    #  HostKeyがない場合にHost名とHostKyeを保存
    client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
    try:
        client.connect(hostname=HOSTNAME, username=USERNAME, password=PASSWORD, timeout=10, auth_timeout=30)
    except BadHostKeyException:
        # hostkeyの不一致
        print("The host key given by the SSH server did not match what we were expecting.")
    except BadAuthenticationType:
        # 認証タイプが許可されていない(パスワード認証が許可されていないなど)
        print("Exception raised when an authentication type is used, but the server isn’t allowing that type.")
    except SSHException:
        # sshプロトコルの失敗
        print("Exception raised by failures in SSH2 protocol negotiation or logic errors.")
    except AuthenticationException:
        # 不明なエラーで認証に失敗
        print("Exception raised when authentication failed for some reason")
    return client
    
def sftp_upload(remote_file, local_file):
	"""
	SFTPアップロード
	"""
	# ssh接続
    with ssh_connect() as client:
    	# sftp
        with client.open_sftp() as sftp:
            # ファイルパス
            remotepath = REMOTEDIR + remote_file
            localpath = LOCALDIR + local_file
            # アップロード
            sftp.put(remotepath=remotepath, localpath=localpath)
    return
        
if __name__ == '__main__':
    sftp_upload(remote_file=REMOTEFILE, local_file=LOCALFILE)

最後に

お読み頂きありがとうございます。
最近使用する機会があったので、Paramikoを使用したSFTPについて簡単に記載してみました。

ダウンロード・アップロードだけではなくSSH接続後にサーバー内の操作ができたりするのでその辺りについても、書けたらなと思います。

ではでは〜

Python

Posted by sena