TcpRuleRecvUntil の例

この例では、telnet セッションに対して記録したスクリプトを改良する方法について説明します。

telnet セッションを記録ルールなしで記録すると、次に示すように、数多くの WebTcpipRecvExact() 関数呼び出しがスクリプトに記録されます。

記録ルールを使用せずに記録した Telnet スクリプトの一部

WebTcpipSend(hWeb0, "l");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "s\r\n");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipRecvExact(hWeb0, NULL, 2);
WebTcpipRecvExact(hWeb0, NULL, 1220);

TrueLog Explorer は、サーバー レスポンスを分析するために使用できます。各サーバー レスポンスは、コマンド プロンプトで終わります。コマンド プロンプトは、3 文字のシーケンス、ブランク、ハッシュ、ブランクで終わります。これは、サーバー レスポンスのデータの終端として正しい選択であると思われます。

記録ルールは、この種のサーバー レスポンスに対して書き出すことができます。ルールは、この特殊な終端シーケンスで終わるサーバー レスポンスを監視し、これらのサーバー レスポンスに対して、関数 WebTcpipRecvExact() の代わりに関数 WebTcpipRecvUntil() をスクリプト化するように Rcorder に指示します。

Telnet の TCP/IP 記録ルール

<?xml version="1.0" encoding="UTF-8" ?>
<RecordingRuleSet>
  <TcpRuleRecvUntil>
    <Name>Telnet Command Prompt</Name>
    <Active>true</Active>
    <Identify>
      <TermData> # </TermData>
      <IgnoreWhiteSpaces>false</IgnoreWhiteSpaces>
    </Identify>
    <Conditions>
      <NoBlockSplit>true</NoBlockSplit>
    </Conditions>
  </TcpRuleRecvUntil>
</RecordingRuleSet>

終端データを、属性 Identify\TermData で指定します。終端データでは、空白類が意味を持つため、空白類を無視しないように属性 Identify\IgnoreWhiteSpaces で指定する必要があります。

サーバー レスポンスにたまたま同じ終端シーケンスがレスポンス中のほかの場所に含まれていたとしても、このルールを適用すべきではありません。よって、条件 NoBlockSplit を指定すべきです。これは、終端データの終わりが telnet サーバーから受信した TCP/IP パケットの終わりと一致しなければならないことを意味し、そうでなければルールは適用されません。

記録ルールを使用して記録した Telnet スクリプトの一部

WebTcpipSend(hWeb0, "l");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "s");
WebTcpipRecvExact(hWeb0, NULL, 1);
WebTcpipSend(hWeb0, "\r\n");
WebTcpipRecvUntil(hWeb0, NULL, 0, NULL, " # ");

この例は、ルールが機能することを示しています。このスクリプトは、再生時にさまざまなサーバー レスポンスを処理しやすくなっています。

終端シーケンスは、他の Telnet サーバーでは異なる場合があります。オペレーティング システムやユーザー設定に依存することにご注意ください。よって、ここで示すルールは、すべての Telnet サーバーに対して機能する汎用のルールではありません。しかし、終端文字シーケンスを変更することによって、簡単に適用させることができます。TrueLog Explorer を使用することで、他の Telnet サーバーに対する適切な終端バイト シーケンスを簡単に決定できます。