Python で ssh、scp、ftp、rsync を利用する
Python では、ssh、scp、ftp、rsync などは subprocess では制御出来ない。
そこで、それを可能にする pexpect について解説する。
pexpect とは
単純に言えば「expect」コマンドの Python 版です。
しかしながら、コマンドの入出力が Python で操作できるため、「expect」よりも簡単に習得出来る。
例えば、コマンド出力を正規表現を用いて制御出来るため、補足が簡単になるなどのメリットがある。
pexpect のインストール
$ sudo dnf install python3-pexpect
コマンドの起動
pexpect.spawn( command、args=[]、timeout=30、maxread=2000、searchwindowsize=None、logfile=None、cwd=None、env=None、ignore_sighup=False、echo=True、preexec_fn=None、encoding=None、codec_errors= ‘strict’、Dimensions=None、use_poll=False )
これを実行する事により操作ハンドルが得られる。
なお、日本語環境では「encoding=’utf-8’」は必須。
コマンド出力の取得
expect( pattern、timeout=-1、searchwindowsize=-1、async_=False、**kw )
操作ハンドルに対して出力を得る。
なお、パターンは正規表現であり、配列で渡すことで、複数指定できる。
複数指定した場合は、ヒットした番号が得られる。(0始まり)
行の送信
sendline( s=” )
パスワードの送信などに用いる。
コマンドの終了
sendeof( )
コマンドを終了したい場合に送信する。
例:
p = pexpect.spawn('scp /tmp/A/a.txt root@localhost:/tmp/B/b.txt', encoding='utf-8') index = p.expect([r'.*yes.*', r'(.*パスワード:)|(.*password:)', pexpect.EOF, pexpect.TIMEOUT]) if index == 1: #2番目の正規表現に一致(0はじまり) p.sendline('パスワード') print("password send") p.sendeof()