Sessionブロックのコマンドの待ち受けについて

コメント

2件のコメント

  • 正式なコメント
    Ichiro Takahashi

    フィックスポイントの高橋です。

    セッションモードではコンソール画面に表示されるデータを扱える半面、例えばその区切り位置が毎回同じになるとは限らないなど、扱いが難しい場面も存在します。

    ですが、パスワードを入力するところで詰まってしまいます。

    パスワードを入力する手前で「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 機器での実験結果であり、機種や設定によって変動するかと思いますのでその点ご留意いただければ幸いです。

    以上、参考になさってみてください。

    コメントアクション パーマリンク
  • Aki

    承知しました。ご回答ありがとうございます。

    0
    コメントアクション パーマリンク

サインインしてコメントを残してください。