Pythonでサーバー間のファイルをコピーする方法|scpコマンドとparamikoの使い方
Pythonを使って、あるサーバーから別のサーバーへファイルをコピーしたい場面は多くあります。SSH経由でファイルを転送する最も簡単な方法は、scpコマンドを利用することです。scpコマンドをPythonから呼び出すには、標準ライブラリのsubprocessモジュールを使用します。
方法1:subprocessモジュールでscpコマンドを実行する
subprocess.Popen()を使えば、シェルからscpコマンドを実行するのと同じようにファイルを転送できます。
コード例
import subprocess import os p = subprocess.Popen(["scp", "my_file.txt", "username@server:path"]) sts = os.waitpid(p.pid, 0)
ここで重要なのがos.waitpid()の呼び出しです。この処理により、ファイルのコピーが完全に完了するまでプログラムが待機します。waitpidを呼び出さない場合、転送が終わる前に次の処理へ進んでしまう可能性があるため注意してください。
方法2:paramikoとSCPClientを使う
もうひとつの方法として、SSH接続を直接開いてscpモジュール(SCPClient)を使うアプローチがあります。こちらはPythonのコード内でSSH接続を細かく制御できるため、より柔軟な実装が可能です。
まず、必要なライブラリをインストールしておきましょう。
pip install paramiko scp
コード例
from paramiko import SSHClient
from scp import SCPClient
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('user@server:path')
with SCPClient(ssh.get_transport()) as scp:
scp.put('my_file.txt', 'my_file.txt') # my_file.txtをサーバーへコピーコードのポイント
- load_system_host_keys():ローカルの既知ホスト情報を読み込み、接続先サーバーの認証に利用します。
- ssh.get_transport():確立したSSH接続のトランスポートオブジェクトを取得し、SCPClientに渡します。
- scp.put():ローカルファイルをリモートサーバーへアップロードします。逆にサーバーからダウンロードする場合はscp.get()を使用します。
- with文:処理完了後に自動的に接続リソースが解放されるため、安全です。
どちらの方法を選ぶべきか?
単純に一度だけファイルをコピーするなら、subprocessでscpコマンドを実行する方法が手軽です。一方、複数ファイルの転送や進捗状況の取得、エラーハンドリングなどを細かく制御したい場合は、paramiko+SCPClientの組み合わせがおすすめです。用途に応じて適切な方法を選択してください。
-
PythonでPowerPointファイルを自動作成する方法!python-pptxの基本を徹底解説
はじめに誰もが一度はPowerPointのプレゼンテーション資料を作成した経験があるのではないでしょうか。多くの場合、Microsoft PowerPointやGoogleスライドといったGUIツールを使うことが多いでしょう。しかし、ライセンスを持っていなかったり、インターネット環境にアクセスできなかったりすることもあります。あるいは、「プログラマーらしく」コードで自動生成したいと考える方もいるはずです。ご安心ください。そんなときこそPythonの出番です!この記事では、Pythonを使ってPowerPointファイルを作成し、コンテンツを追加する方法を解説します。それでは早速始めましょう!準
-
LinuxでSCPを使ってファイルを安全に転送する方法を徹底解説
Linuxサーバーへアクセスする方法はいくつかあります。GUI(ユーザーインターフェース)付きのサーバーであればVNCを利用できますが、より一般的なのは、SSH(Secure Shell)を使ってヘッドレスサーバーにログインする方法です。SSHは暗号化された安全なプロトコルで、SSHクライアント経由でリモートシステムにアクセスできます。しかし、単にファイルをサーバーへ送りたいだけという場面もあるでしょう。そんなときに便利なのが「SCP(Secure Copy)」です。SCPは堅牢なSSHプロトコル上で動作し、ネットワーク越しに素早くファイルをリモートシステムへ転送できます。この記事では、Li