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()