初めに
毎月決まったサーバから決まった画像ファイル取得して定例会資料を作っていましたが、
WinSCPで潜っていき取得してくるのが面倒になり、Pythonにて自動化しようと決意。
調べたところparamikoとscpを使えばできそうだったので、やってみました。
動作環境
実行側:Windows Server 2012
取得先:CentOS Linux 7
※ ともにクローズドネットワーク
インストール
インターネットに接続されている端末の場合通常のpipで問題ありません
py -m pip install paramiko
オフライン環境の場合、1度ダウンロードしてからインストールを行います。
py -m pip download -d C:\tmp --no-binary :all: paramiko
上記コマンドを打ったところ、
ERROR: Command errored out with exit status 1:
というエラーが出てダウンロードできませんでした。
しばらく戦ったところ、
py -m pip download -d C:\tmp paramiko
でダウンロードできました。
--no-binary
オプションは、バイナリではなくソースをダウンロードする
(環境に左右されにくくする)ものですが、それをつけているとうまく動かないみたいです。
ダウンロードしたファイルをインストール先にもっていって以下コマンドでインストールします。
pip install --no-index --find-links=tmp paramiko
いつもの方法でなぜできなかったのかは不明でしたが、私の環境では上記で問題なく使用できるようになりました。
使用
一先ずimport paramiko
ができるか試しましょう。
できなければインストール方法に問題があります。
ファイル転送のコード
始めに必要なコードを載せておきます。
import paramiko
import scp
# サーバへのログイン情報
host = "IPアドレス"
user = "ユーザ名"
pas = "パスワード"
# 出力先ディレクトリ
out_path = r"C:\temp"
# 対象ファイルパス
target_path = "/var/tmp/hoge.log"
# サーバ接続
with paramiko.SSHClient() as sshc:
sshc.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sshc.connect(hostname=host, port=22, username=user, password=pas)
# SCPによるコピー処理
with scp.SCPClient(sshc.get_transport()) as scpc:
scpc.get(remote_path=target_path, local_path=out_path)
説明
私もまだいろいろ試していないので細部は理解できていませんが、まぁなんとなく。
scpc.get(remote_path=target_path, local_path=out_path)
ここの引数二つに関しては、文字列型のみ受け付けるようです。
何かと便利なPathオブジェクトはstr()
等で文字列に変換してから渡しましょう。
ちなみに要素を宣言しなくても、
scpc.get(target_path, out_path)
で問題なく動きます。ただ、この関数にはほかにも引数があるので、おまじない的に指定しています。
使用感
シンプルで非常に使いやすく感じました。
Linuxの場合階層区切りが\
ではなく/
なので、単純な文字列で結合しやすいです。
(当然windowsの\
も文字列として扱えるが)
自分の場合下のように、ループで回しつつ対象ファイルリストを作成しました。
for day in day_list:
target_list.append(f"{port}/result{port}-{day}.png")
他にもparamiko
でコマンド実行したりできますがそれは別で纏めます。