Python で ssh、scp、ftp、rsync を利用する

Python では、ssh、scp、ftp、rsync などは subprocess では制御出来ない。

そこで、それを可能にする pexpect について解説する。

pexpect とは

単純に言えば「expect」コマンドの Python 版です。

しかしながら、コマンドの入出力が Python で操作できるため、「expect」よりも簡単に習得出来る。

例えば、コマンド出力を正規表現を用いて制御出来るため、補足が簡単になるなどのメリットがある。

pexpect のインストール

$ sudo dnf install python3-pexpect

コマンドの起動

pexpect.spawncommandargs=[]timeout=30maxread=2000searchwindowsize=Nonelogfile=Nonecwd=Noneenv=Noneignore_sighup=Falseecho=Truepreexec_fn=Noneencoding=Nonecodec_errors= ‘strict’Dimensions=Noneuse_poll=False )

これを実行する事により操作ハンドルが得られる。

なお、日本語環境では「encoding=’utf-8’」は必須。

コマンド出力の取得

expectpatterntimeout=-1searchwindowsize=-1async_=False**kw )

操作ハンドルに対して出力を得る。

なお、パターンは正規表現であり、配列で渡すことで、複数指定できる。

複数指定した場合は、ヒットした番号が得られる。(0始まり)

行の送信

sendlines=” )

パスワードの送信などに用いる。

コマンドの終了

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

参考:

Core pexpect components

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です