Sessionブロックのコマンドの待ち受けについて
いつもお世話になっております。
https://support.kompira.jp/column/session_block/
こちらの記事を参考に対話的にコマンドを実行したいと思っています。
様々な機器で使用できるように、正規表現の .* で受け取り、実行させたいと思っています。
ですが、パスワードを入力するところで詰まってしまいます。
理由を教えていただければと思います。
以下が実行コードです。
行おうとしていることはLinuxからCiscoの機器にログインして、rootになり、コマンドを実行することです。
(#パスワードを挿入の部分で <s ?? r".*: "> -> にすると、意図した動作になります)
[ __use_pty__ = true] ->
{ session s |
#UserNameとIPアドレスはマスクしています
[s.send: 'ssh -o StrictHostKeyChecking=no -l <UserName> <IPアドレス>\n'] ->
#パスワードを挿入
<s ?? r".* "> ->
[s.send:'Password\n'] ->
#rootに移行
<s ?? r".* "> ->
[s.send: 'enable\n'] ->
<s ?? r".* "> ->
[s.send: 'Password\n'] ->
<s ?? r".* "> ->
[s.send: 'ter len 0\n'] ->
<s ?? r".* "> ->
[s.send: 'show version\n'] ->
<s ?? r".* ">
}
実行結果が以下になります
(show versionの実行結果は取得できていますが、カットしています)
[kompira@localhost]$ <SESSION: 23086019-a7aa-4d97-b6d4-868584226659> ssh -o StrictHostKeyChecking=no -l <UserName> <IPアドレス> [Linuxのhost名]$ < StrictHostKeyChecking=no -l <UserName> <IPアドレス>
Password enable Password: C ################################################################################ # # # Ciscoのhost名 # # # ################################################################################ Ciscoのhost名>ter len 0
Ciscoのhost名>show version
以上よろしくお願いします。
-
正式なコメント
フィックスポイントの高橋です。
セッションモードではコンソール画面に表示されるデータを扱える半面、例えばその区切り位置が毎回同じになるとは限らないなど、扱いが難しい場面も存在します。
ですが、パスワードを入力するところで詰まってしまいます。
パスワードを入力する手前で「Password:」といったプロンプトを待ちたいと思うわけですが、ここに想定外の表示データが送信されてきているようなときに、パターンによっては意図どおりにマッチしないことなどはありえるかと思います。
そこで、実際にどのような表示データが送信されているかを確認してから、パターンを検討してみるという手法が考えられます。
たとえば、パスワード送信前に <s ?? r".* "> で待ち受けている箇所を、以下のようなコードに置き換えてみてください。
{ while true |
<s: 3> =>
{ if $STATUS | break } ->
print("{0} RECV: {1!r}".format(now(), $RESULT))
} ->これは、パターンで待ち受けているのではなく、<s: 3> とタイムアウトを指定して3秒間セッションから表示データの受信が無い場合にループを抜けて次のジョブに進みます。表示データを受信した場合には $RESULT でその内容を表示していますので、どのようなデータを受信しているかを確認してみてください。(場合によっては何度か繰り返していると差分があるかもしれません)
弊社で実験したところ、期待する Password: プロンプトの前に最初に送信している ssh コマンドのエコーバックが表示データとして受信されることなどが観測できています。
たとえば、想定と違う表示データを受信していて指定したパターンでは適切にマッチしていなかったり、あるいは、Password: プロンプトより手前に受信したデータに反応して、パスワードを送信してしまっているとそれを適切に扱えていなかったりするかもしれません。
社内の実験では、後者のケースとして ssh -o StrictHostKeyChecking... というコマンドが表示されたことに、<s ?? r".* "> がマッチして、パスワードの送信が早すぎてその後先に進まなくなっているような動作は確認できました。
様々な機器で使用できるように、正規表現の .* で受け取り、実行させたいと思っています。
上記の狙いはよくわかりますが、おそらく機器ごとにプロンプトのパターンや接続時に表示されるデータが様々かと思いますので、.* などマッチしやすい正規表現では適切にプロンプトの待機ができない場面も多くなってしまうのではないかと考えらえます。実際に受信するデータを確認してパターンを検討してみてください。
たとえば、パスワード入力のプロンプト待ちは以下のように
<s ?? r'.*Password: $$'> ->
enable 後のプロンプト待ちは以下のように、
<s ?? r'[-\w]+#$$'> ->
してみたところ、何度か試した限りでは安定的に動作しているようでした。
これは社内の Cisco IOS 機器での実験結果であり、機種や設定によって変動するかと思いますのでその点ご留意いただければ幸いです。
以上、参考になさってみてください。
コメントアクション
サインインしてコメントを残してください。
コメント
2件のコメント