バージョンと俳句を表示するだけでなく、すべての非表示のJunosコマンドを検索する

みなさんこんにちは!



この記事は、Junosオペレーティングシステムの隠しコマンドに関するものです。 Junos OS(これにはMX、SRX、EX、QFX、T、Jシリーズなどが含まれます)を実行しているジュニパーの機器で作業した人は、おそらくシステムの「公式」(文書化された)コマンドに加えて文書化されていないコマンドもあることを知っています。 それらの特徴は、コンテキストヘルプ(疑問符を入力した場合)によってコマンドラインインターフェイスに表示されず、自動補完が機能しないことです。つまり、コマンドを知って完全に入力する必要があります(すべての文字)。 どうやら、これらのチームの中で最も有名な(そして最も役に立たない)ショーバージョンと俳句は、ネットワークエンジニアの生活についての「日本の」3詩を提供します。



実際、多くの隠れたチームがあります。 ベンダーは完全なリストをどこにも提供していませんが、たとえば、公式のジュニパーフォーラムには、かなり大きなセットの付箋があります。 そのため、メーカーはこのようなコマンドの使用に反対していません。単に保証するものではありません。機能することも、機器を設置することもできます。



この記事では、最初のブランチ内で、すべての非表示の動作モードJunosコマンドのリストを取得する方法について説明します。 この方法はかなり単純な観察に基づいていますが、グーグルで調べたところ、以前にこの形式で問題が提起された証拠を見つけることができませんでした。 Pythonスクリプトの例が含まれています。







アイデア



このアプローチの主なアイデアは非常にシンプルですが、それを理解するには、JunosデバイスのCLIにアクセスできることをお勧めします。



たとえば、「show version」コマンドを検討してください。 「show version a」と入力すると(最後に-常にEnterを押します)、コマンド出力は次のようになります。

lab@jsrxA-1> show version a ^ syntax error.
      
      





「バージョンcを表示」の場合、

 lab@jsrxA-1> show version c ^ syntax error, expecting <command>.
      
      





前者の場合、隠された拡張子(および俳句)があり、後者の場合-いいえ。 ご覧のとおり、隠された継続がある場合のCLIの応答は、次の2つの点で異なります。



したがって、文字を1つずつ並べ替えます(手動で、ただし自動化する方がよい)が、隠されたコマンドを見つけることができます-通常のコマンドほど明確ではありませんが、Junos自身がそれらを伝えます!



予備メモ



スクリプトを書く前に、隠れたコマンドが開発者によって何らかの理由で隠されていることを読者に警告する必要があります。 それらのいくつかは、デバイスを破壊したり、ファイルシステムを損傷したりする可能性があります したがって、一度に1つずつでも、細心の注意を払って使用する必要があります。 私たちの場合、ブルートフォースによって検索が行われると、この警告が発生し、ユーザートラフィックを処理する機器でこのようなスクリプトを実行することはありません。 結局のところ、ファイルの削除、システムのゼロ化の要求、ルーティングの再開などを含むすべてのコマンドを並べ替えます。 したがって、ネットワークに接続されていない鉄片でのみプレイしてください。鉄片は殺すのは残念ではなく、仮想SRX(別名Firefly Perimeter)で遊んでください。



また、Junosには非常に便利で高度なXMLベースのAPIがありますが、コマンドを見つけるためのアプローチはCLIの機能に基づいているため、このタスクに使用することはできません。 したがって、通常のtelnetセッションを開き、コマンドを与えてテキスト出力を解析します。



この記事では、操作モードコマンドの検索に限定します。 構成もあり、多くの興味深いものが隠されています(同じコミットがいっぱいです)。 隠しコマンドの検索も同様に実行できます。



アルゴリズム



そのため、特定のコマンド(スクリプトのcommandStart)から始めて、コマンドのすべての可能なオプションを調べ、そのたびに(アルファベット配列から)文字を追加してEnterを入力します。 Junosが応答して送信する出力は次のとおりです。

  1. 「構文エラー」をSります(同時に、帽子はコマンドの継続の存在を示します)-隠されたコマンドの存在の兆候、さらに反復して、新しい文字を追加します。
  2. 「<command>を予期している構文エラー」についての誓い-

    ここでは、キャップの位置を分析する必要があります。 上記の「バージョンcの表示」の例のように、現在のレターにある場合は、先に進むことはありません。隠しコマンドはありません。

    次のように、彼女がコマンドの継続を指す場合:

     lab@jsrxA-1> show version and ^ syntax error, expecting <command>.
          
          





    この場合、チームには継続性があり、さらに先へ進む必要があります(ここでのチームは、背景に応じて非表示になる場合と表示されない場合があります)。

  3. 構文エラーを誓うことなくコマンドの出力だけですが、たとえば次のようなあいまいな入力を誓うことで可能です。

     lab@jlab-Firefly-3> show chassis cluster i ^ 'i' is ambiguous. Possible completions: interfaces Display chassis cluster interfaces ip-monitoring Display IP monitoring related information
          
          





    この場合、検索を継続する必要があります。 さらに、隠しコマンドが含まれている場合があります(この場合、シャーシクラスター情報を表示します)。



また、一部のコマンドの出力が複数の画面を占有する可能性があることを考慮する必要があり、これにより招待状「---(more)---」が発行されます。 この場合、ヘルメットスペースのみです。



スクリプト



実際、ここにあります(またはgithubにあります )。

スクリプト(Python 3)
 import telnetlib import re HOST = "192.168.65.161" user = "lab" password = "lab123" commandStart = "show version " # note space at the end alphabet = "abcdefghijklmnopqrstuvwxyz-1234567890." PAUSE = 3 def SearchCommands (cmd, on_hidden_now=False): for nChar in range(0, len(alphabet)): char = str(alphabet[nChar]) tn.write(cmd.encode('ascii') + char.encode('ascii') + b"\n") totData="" finished = False while (not finished): inpData = tn.read_until(prompt.encode('ascii'), PAUSE) totData = totData + inpData.decode('ascii') if "---(more" in inpData.decode('ascii'): tn.write(b" ") else: finished = True cmdNext = cmd + str(char) synt_error_exp_cmd = False synt_error_period = False if "syntax error, expecting <command>." in totData: synt_error_exp_cmd = True if "syntax error." in totData: synt_error_period = True if not (synt_error_exp_cmd or synt_error_period): # normal output or ambiguity if on_hidden_now: print("hidden command >> " + cmdNext) else: SearchCommands(cmdNext, on_hidden_now) # ie False else: l = re.findall(' *\^', totData) lenToHat = len(l[len(l)-1]) if synt_error_period: if lenToHat > lenPrompt + len(cmdNext): SearchCommands(cmdNext, True) # Hidden command in progress if synt_error_exp_cmd: if (lenToHat == 2 + lenPrompt + len(cmdNext)): if on_hidden_now: print("hidden command >> " + cmdNext + " (incomplete)") # else: print("Entering: " + cmdNext) SearchCommands(cmdNext+" ", on_hidden_now) if lenToHat > 2 + lenPrompt + len(cmdNext): SearchCommands(cmdNext, on_hidden_now) tn = telnetlib.Telnet(HOST) tn.read_until(b"login: ") tn.write(user.encode('ascii') + b"\n") tn.read_until(b"Password:") tn.write(password.encode('ascii') + b"\n") loginText = tn.read_until(b"> ").decode('ascii') prompt = re.search(".*@.*", loginText).group() print("Working with prompt = " + prompt) lenPrompt = len(prompt) SearchCommands(commandStart)
      
      







作業例:

show versionブランチの実行
隠しコマンド>> show version and(incomplete)

隠しコマンド>>バージョンと非難を表示

隠しコマンド>>バージョンと俳句を表示

隠しコマンド>>広範なバージョンを表示

隠しコマンド>> show version forwarding-context

隠しコマンド>> show version invoke-on(不完全)

隠しコマンド>> show version invoke-on

隠しコマンド>> show version invoke-on o

隠しコマンド>>バージョンno-forwardingを表示

隠しコマンド>> show version scc-dont-forward

隠しコマンド>>バージョンSDKを表示



ショーシャーシブランチの開始
隠しコマンド>>シャーシの正確な統計情報を表示

隠しコマンド>> show chassis beacon

隠しコマンド>> show chassis broadcom

隠しコマンド>> show chassis cfeb

隠しコマンド>> show chassis cip

隠しコマンド>> show chassis clocks

隠しコマンド>> show chassis cluster ethernet-switching(不完全)

隠しコマンド>>シャーシクラスタ情報を表示

隠しコマンド>> show chassis cluster ip-monitoring(不完全)

隠しコマンド>> show chassis craft-interface

隠しコマンド>> show chassis customer-id

隠しコマンド>> show chassis ethernet-switch

隠しコマンド>> show chassis fabric(不完全)

隠しコマンド>> show chassis fchip

隠しコマンド>> show chassis feb

隠しコマンド>> show chassis fpc-feb-connectivity

隠しコマンド>> show chassis hsl(不完全)

隠しコマンド>> show chassis hsr

隠しコマンド>> show chassis hss(不完全)

隠しコマンド>> show chassis hst

隠しコマンド>> show chassis in-service-upgrade

隠しコマンド>> show chassis ioc-npc-connectivity

隠しコマンド>> show chassis lccs

隠しコマンド>> show chassis message-statistics(不完全)

隠しコマンド>> show chassis message-statistics i

隠しコマンド>> show chassis network-services

隠しコマンド>> show chassis nonstop-upgrade

隠しコマンド>> show chassis power-budget-statistics

隠しコマンド>> show chassis psd

隠しコマンド>> show chassis redundancy(incomplete)

隠しコマンド>> show chassis redundancy-power-system

隠しコマンド>> show chassis scb

隠しコマンド>> show chassis sfm

隠しコマンド>> show chassis sibs

隠しコマンド>> show chassis spmb

隠しコマンド>> show chassis ssb

隠しコマンド>>シャーシの同期を表示

隠しコマンド>> show chassis tfeb

隠しコマンド>> show chassis timers

隠しコマンド>> show chassis usb(不完全)

隠しコマンド>>シャーシゾーンの表示



show security idpブランチの起動(SRX240上)
隠しコマンド>> show security idp active-policy

隠しコマンド>> show security idp application-ddos(不完全)

隠しコマンド>> show security idp application-identification(incomplete)

隠しコマンド>> show security idp detector(不完全)

隠しコマンド>> show security idp detector a

隠しコマンド>> show security idp detector c

隠しコマンド>> show security idp detector p

隠しコマンド>> show security idp ips-cache

隠しコマンド>> show security idp logical-system(不完全)



ご覧のとおり、スクリプトは一部のコマンドを未完了としてマークします-継続するはずのコマンドです。 Junosコマンドの続きが非表示にならない場合、そのようなコマンドもスクリプトにありますが、短縮形で発行されます(show chassis message-statistics iはshow chassis message-statistics ipcです)。



スクリプトで起こりうるすべてのエラーと状況を処理するという目標はありませんでした。そのため、スクリプトが応答するインターフェース記述にシナックスエラー行があるか、ターミナルへのロギングがオンになっていると、作業ロジックに違反する可能性があります。



別の問題は、入力として任意の名前を受け入れるコマンドです。たとえば、show interfaces AnyInterfaceNameIsOKHere(このようなインターフェイスがない場合はエラーが生成され、他の同様のコマンドは何も生成しない場合があります)。 明らかな理由から、show interfacesで設定する際のスクリプトは、最大再帰深度を超えているというエラーでクラッシュします。 ただし、commandStart = "show interfaces ge-0 / 0/0"を使用した検索は正常に機能します。

show interfaces ge-0 / 0/0で実行
隠しコマンド>> show interfaces ge-0 / 0/0 forwarding-context

隠しコマンド>> show interfaces ge-0 / 0/0 ifd-index

隠しコマンド>> show interfaces ge-0 / 0/0 ifl-index

隠しコマンド>> show interfaces ge-0 / 0/0インスタンス

隠しコマンド>> show interfaces ge-0 / 0/0 no-forwarding

隠しコマンド>> show interfaces ge-0 / 0/0 scc-dont-forward





おわりに



隠しコマンドの大部分は、この機器またはこのバージョンのソフトウェアではサポートされていない(または意味をなさない)ために隠されていることを理解する必要があります。 それらの多くは役に立たないが、それらの中には「ナゲット」がある(たとえば、シャーシクラスター情報を表示する)。 私はジュニパーのインストラクターとして働いているので、生徒からよく質問があります。すべての隠されたチームのリストをどこで入手するかです。 それで、私は皆にこの記事を紹介します。 誰かがこのレシピの恩恵を受けることを願っています。



All Articles