PythonでParamikoによるファイル転送【No!SCP】

PythonでParamikoによるファイル転送【No!SCP】 プログラミング

「Python SCP」
「Python SCP ファイル転送」

このキーワードで検索していませんか?
ファイル転送を行いたい場合、通常はSCPを思い浮かべますよね。

でも、ファイル転送にはSCPである必要はありません。
SFTP(Secure FTP)でもファイル転送が可能です。
なお、SFTPはほとんどのサーバーで対応しています。

この記事では、PythonでのSFTPによるファイル転送を説明します。
Pythonでファイル転送を行う場合には、Paramikoライブラリが必要です。

本記事の内容

  • Paramikoライブラリのインストール  
  • 【動作検証】サーバーにアクセスする
  • 【動作検証】ローカルPCからリモートサーバーへファイル転送(アップロード)
  • 【動作検証】リモートサーバーからローカルPCへファイル転送(ダウンロード)
  • Paramikoをインストール・利用してみての感想

上記の項目に従えば、簡単にPythonでファイル転送が可能となります。

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

Paramikoライブラリ
http://www.paramiko.org/

公式の説明を日本語にすると以下。

ParamikoはSSHv2プロトコル[※]のPython(2.7, 3.4+)による実装で、クライアントとサーバの両方の機能を提供します。 低レベルの暗号化(Cryptography)のためのPython C 拡張モジュールを利用していますが、Paramiko自体はSSHネットワークのコンセプトに基づいた純粋なPythonインターフェイスです。

[※]
SSHはRFC 4251, RFC 4252,RFC 4253およびRFC 4254で定義されています。
このプロトコルの主要な実装は OpenSSHプロジェクトです。ParamikoはSSHの機能セットの大部分を実装していますが、差異が出ることもあります。

つまり、Paramikoは、PythonでSSH通信するためのライブラリです。
Paramikoを利用すれば、PythonでSSH通信によりサーバーにアクセスできるということです。

インストール

Paramikoライブラリをpipコマンドでインストールします。

pip install paramiko

次のように「Successfully」と表示されれば、インストール成功です。

Installing collected packages: pynacl, bcrypt, paramiko
Successfully installed bcrypt-3.1.7 paramiko-2.7.1 pynacl-1.4.0

【動作検証】サーバーにアクセスする

実際にサーバーログインしてみます。
以下のコードを実行して、成功するとサーバーのホスト名が表示されます。

import paramiko

#サーバー情報
host='■サーバーIP or ホスト名■'
host_username='■ログインユーザー■'
host_password='■ログインパスワード■'

#インスタンスを生成
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=host_username, password=host_password, timeout=10, look_for_keys=False)

stdin,stdout,stderr = client.exec_command('hostname')
for line in stdout:
    print(line)

client.close()

上記コードは、パスワード認証でのログインを行っています。
あと、これは最低限のセキュリティを確保する書き方です。

セキュリティを出来る限りで高くしたい方は、公式ページを参考にしてください。
オプションなども記載さています。

そもそも、自動ログイン自体は結構ヤバイ仕組みです。
そのため、サーバーにはIPなどでアクセス制限をしておくことをおススメします。
鍵やパスワードは流出する前提で対策しておくべきということですね。

【動作検証】ローカルPCからリモートサーバーへファイル転送(アップロード)

import paramiko

#サーバー情報
host='■サーバーIP or ホスト名■'
host_username='■ログインユーザー■'
host_password='■ログインパスワード■'

#paramikoインスタンスを生成
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=host_username, password=host_password, timeout=10, look_for_keys=False)

try:
    # SFTPセッション開始
    sftp_connection = client.open_sftp()

    # ローカルPCからリモートサーバーへファイルを転送
    sftp_connection.put('C:\\test.txt', '/tmp/test.txt')
finally:
    client.close()

try以降でファイル転送の処理を行なっています。
メソッド「put」が、アップロードです。

「C:\test.txt」(※)は、ローカルPCのC直下にあるtest.txtです。
この「C:\test.txt」をサーバーへ転送します。
その際のサーバー上のパスが「/tmp/test.txt」です。

※「C:\test.txt」ではエラーが出ます。
そのため、「C:\test.txt」と\を二つ記述しています。

【動作検証】リモートサーバーからローカルPCへファイル転送(ダウンロード)

ローカルPCは、Windowsを想定。
リモートサーバーは、Linuxを想定。

ファイルをダウンロードするためのコードです。
サーバーへSSH通信でアクセスする部分は、「サーバーにアクセスする」のコードと同じです。

import paramiko

#サーバー情報
host='■サーバーIP or ホスト名■'
host_username='■ログインユーザー■'
host_password='■ログインパスワード■'

#paramikoインスタンスを生成
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=host_username, password=host_password, timeout=10, look_for_keys=False)

try:
    # SFTPセッション開始
    sftp_connection = client.open_sftp()

    # リモートサーバーからローカルPCへファイルを転送
    sftp_connection.get('/tmp/test_2.txt', 'C:\\test_2.txt')
finally:
    client.close()

try以降でファイル転送の処理を行なっています。
メソッド「get」が、ダウンロードです。

「/tmp/test.txt」は、リモートサーバー上にあるファイルです。
この「/tmp/test.txt」をローカルPCへ転送します。
その際のローカルPC上のパスが「C:\test_2.txt」(※)です。

※「C:\test_2.txt」ではエラーが出ます。
そのため、「C:\test_2.txt」と\を二つ記述しています。

Paramikoをインストール・利用してみての感想

Python最高!!ですね。
PHP信者の私でも、改宗したくなるほどです。

と言っても、PHPにもいいところはたくさんあります。
だから、PHPとPythonの使い分けが重要になってくるでしょう。

さて、Paramikoの話をしましょう。

Pythonでファイル転送をする場合、SCPが必須だと考えている人が多いようです。
その証拠に、Paramikoライブラリとscpモジュールの組み合わせの記事が多く存在しています。

pip install scp

こうやって余計なモジュールをインストールしています。
あと、それに伴うscpモジュール部分のコードですね。

Pythonでファイル転送をするのが目的なら、scpモジュールは不要です。
実際、この記事ではParamikoだけでファイル転送を行っています。

今回は、ファイル転送をメインで説明してきました。
でも、Paramikoは他にも使える用途がありそうですね。

タイトルとURLをコピーしました