プログラミング初心者がアーキテクトっぽく語る

見苦しい記事も多数あるとは思いますが訂正しつつブログと共に成長していければと思います

pexpectの基本的な使い方

pexpectはTelnetSSHで実施するような対話形式の作業を自動化するPythonのライブラリです。

pexpectでは、expectで指定する正規表現をうまく設計しないと思わぬ結果を招き、デバッグ作業に時間を取られることがあります。REST APIなどを利用したAPIベースの自動化手法と比較して使いやすいとは言えません。

しかしちょっとした手作業をPythonから自動化したいときには役に立つので知っておくとよいでしょう。


インストール

pip install pexpect

Import

import pexpect

基本的な使い方

connection = pexpect.spawn("ssh user@1.1.1.1 -p 1000", timeout=10, encoding='utf-8')
connection.expect("password:")
connection.sendline("my_password")
connection.expect("user#")
connection.sendline("exit")

spawnで対象機器に接続します。 「-p」はポート番号です。

expectで機器から特定の文字列が送信されてくるのを待ちます。受信した文字列は後述する方法で取得することができます。

sendlineで文字列を送ります。

接続を終了するときは「exit」を送るのが一般的です。


受信した文字列の取得

expectでマッチするまでの文字列

print(connection.before)

内容はexpectしている文字列次第ですが一般的にはsendlineで投入したコマンドとその出力結果が含まれます。 プロンプトは含まれていないことが多いです。

expectでマッチした文字列

print(connection.after)

一般的にはプロンプトが含まれます。


うまく動かないとき

意図しない箇所でexpectがマッチしている可能性が高いです。 出力内容を精査し、正規表現を見直しましょう。

結果に含まれる改行コードが「\r\n」か「\n」かもデバッグ等で確認するとよいです。