「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/
公式の説明を日本語にすると以下。
[※]
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は他にも使える用途がありそうですね。