techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

ftpにあれこれするのを自動化したい

Motivation

ftpに上げたり下げたりするのがちょーめんどくさい。 python自動化するんや!みたいな気持ちに。

pexpectってモジュールがある

対話型のアプリに対して入力を行っていくモジュール。 sshやftpなどの入力を逐次入れていくようなアプリの自動化の為のツール。

公式Doc Core pexpect components — Pexpect 4.2.1 documentation

超よくまとまっているBlog pexpect - 対話アプリの自動運転|Engineering のまにまに

これを使ってftpにアップロードするツールを作る

簡単に使い方

基本的には公式Docまたは上記のBlogにサンプルが揃っているのでそちらを参照するのが良いと思う。 補足として、Python3で実行するのであればspawnではなくspawnuを利用しないと、TypeError: must be str, not bytesが起きてしまう。 これはspawn()の戻りがbytesなのに対し、expect()にstrを指定することが問題だと理解した。

spawn

起動するアプリケーションを指定する。引数を指定することもできる。 サブプロセスとして起動してpexpectが管理してくれる

expect

引数に与えた正規表現が出力に出るまで待つ。 そこまでの出力はbeforeにセットされる。マッチした出力はafterにセットされる expect(pexpect.EOF)とすれば、終了まで待ち受ける

sendline

アプリケーションに改行とともに入力を行う。

作ったサンプル

# -*- coding=utf-8 -*-
__author__ = 'kobashin'

import pexpect
import sys

def main():
    child = pexpect.spawnu("ftp ftp.example.com")
    child.logfile_read = sys.stdout
    child.expect("Name (.*):")
    child.sendline("hogehoge")
    child.expect("Password:")
    child.sendline("fugafuga")
    child.expect("ftp>")
    child.sendline("epsv4")
    child.expect("ftp>")
    child.sendline("ls")
    child.expect("ftp>")
#  この後色々  
    child.close()


if __name__ == "__main__":
    main()