Edited at

paramiko+scpで共有サーバにファイル転送する

More than 1 year has passed since last update.

※2018年3月8日追記

scpだとディレクトリが転送できないことがわかりましたので修正いたしました!


経緯

python歴1ヶ月の初心者です。間違っていたらコメントで訂正をお願いいたします。

いつもはTeratermを使ってscpコマンドでファイルを共有サーバに転送していたけれど、これを自動的に行う必要がでてきたので、実装に至りました。

今回はpythonのライブラリであるparamikoを使いssh接続を行いscpでファイルを転送するところまでの実装です。

(今後はファイルを自動取得するスクリプトをマージして実装を行う予定です)

実装については以下の記事とGithubを参考に行いました。

『Paramiko + scp 導入 ~ SSH接続 ~ SCPでファイル転送』

https://qiita.com/int_main_void/items/1cdec761b745010629d5

『scp.py』

https://github.com/jbardin/scp.py


環境

Python 3.6.4

Anaconda 4.3.34

paramiko 2.4.0

(conda forgeでインストールすると2.3.1がインストールされました)

※with構文を使っているので、勝手にopen, closeの処理をしています。使わない場合はscp.close()をお忘れずに。


やってみた


  1. paramikoのインストール

    anaconda上でpip install paramiko


  2. ssh接続



ssh-transport.py

import paramiko

with paramiko.SSHClient() as ssh:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='XXX.XXX.XXX.XXX', port=22, username='username', password='password')

たったこれだけでssh接続。teratermいちいち開いてられませんね。

※with構文を使っているので、勝手にopen, closeの処理をしています。使わない場合はscp.close()をお忘れずに。


  1. scp client作成


ssh-transport1.py

import scp

with scp.SCPclient(ssh.get_transport()) as scp:
scp.put('filename', '/upload/to/remote/directory/')
scp.get('/upload/to/remote/directory/')

scpもこれだけでOKみたいです。

4. マージ


ssh-transport.py

import paramiko

import scp

with paramiko.SSHClient() as ssh:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='XXX.XXX.XXX.XX', port=22, username='username', password='password')
with scp.SCPclient(ssh.get_transport()) as scp:
scp.put('filename', '/upload/to/remote/directory/')
scp.get('/upload/to/remote/directory/')


これでファイル転送ができると思います。


今後の発展

今回は純粋に「scpでファイル転送」なので、これだけ短いプログラムでしたが、現在書いている「別サーバからファイル自動取得するスクリプト」とをマージさせたいと思います。