Python サーバーへSSH接続してcsvファイルを読み込んだり、SFTP転送によりファイルコピーする「Paramiko」

 例えば、WindowsローカルPCにて、Linuxサーバ等とファイルをやり取りするには、FTPソフトであるFFFTPWinSCPなどを使用する方法があります。本記事では、そのようなソフトを使用するのではなくて、Pythonスクリプトで同様のことをする雛形コードを載せました。ライブラリ「Paramiko」を使用します。

 タイトルにあるSSHは、Secure Shellの略で、リモートコンピュータと対話型の操作を暗号化する通信プロトコルのことです。そして、SFTPは、SSH File Transfer Protocolの略で、安全にファイルの送受信を行う通信プロトコルのことです。

■ライブラリのインストール

pip install paramiko

 

■本プログラム

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import os
import glob
import math
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 18
import matplotlib.cm as cm
import matplotlib.image as mpimg

import getpass
import paramiko
import codecs

# 接続先サーバ
HOST = '**.**.**.**' # IP address
PORT = **

# ユーザーID
myID = input('userid: ')

# パスワード
myPASS = getpass.getpass('password: ')

# サーバーホストへのSHH接続
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
client.connect(HOST, port = PORT,
               username = myID, password = myPASS)


# In[2]:


# 接続の確認
stdin, stdout, stderr = client.exec_command('hostname')
for line in stdout:
    print(line)

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


# In[3]:


# ディレクトリを移動
target_dir = '/home/kh/work/test_bash'
sftp.chdir(target_dir)

# 移動の確認
entries = sftp.listdir()
for i, e in enumerate(entries):
    print(e)
    if i == 10:
        break


# In[4]:


# サーバ上のcsvファイルをローカルで読み込みたい場合
file_path = target_dir + '/data.csv'

# pandasでcsvファイルを読み込み
with sftp.open(file_path, 'r') as f:
    df = pd.read_csv(f,
                     sep = ',',
                     #na_values = ?, 
                     encoding = 'shift-jis',
                     #index_col = 0,
                    )
pd.reset_option('display.max_rows')
df


# In[5]:


# サーバ上の画像を抽出して、ローカルで並べて表示したい場合
file_path_list = glob.glob('picture_*.jpg')

# ファイルを一旦ローカルへコピー
new_file_list = []
for i, _file_path in enumerate(file_path_list, start = 1):
    _file_name = os.path.basename(_file_path)
    _new_file_name = f'zzz_{i}_{_file_name}'
    
    sftp.get(_file_path, _new_file_name)
    new_file_list.append(_new_file_name)

# 画像を表示
my_col = 3
my_row = math.ceil(len(file_path_list) / my_col)
fig = plt.figure(figsize = (16, 5), tight_layout = True)
for i, (_file_path, _legend) in enumerate(zip(new_file_list, legend_list)):
    plt.subplot(my_row, my_col, i + 1)
    plt.imshow(mpimg.imread(_file_path))
    plt.title(legend_name + _legend)
    ax = plt.gca()
    ax.axes.xaxis.set_visivle(False)
    ax.axes.yaxis.set_visivle(False)
fig.suptitle(my_title, fontsize = 32)

# ローカルへコピーしたファイルを削除
for f in new_file_list:
    os.remove(f)

以上

<広告>