paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

shellのみでcisco ASAのshowコマンドをスクレイピングする

今やってるPJでcisco ASAを構築するのですが、久しぶりに触るのでコマンドを忘れてしまいました。
そんな時に頼りになるのがコマンドリファレンスです。
しかし公式サイトを探すと膨大なページが出てきて探すのも読むのも大変です。

そんなわけで今回は今まで培ったテクでコマンドを抜いてみようと思います。 全部やるとこれまた大変なのでとりあえず構築後のステータス確認できるようにshowコマンドのみに絞ります。

今回はpythonを使わずshellだけでやります。

環境

職場では都合上cygwinを使っていますが、今回は自宅のubuntuを使います。

masashi@PC-ubuntu:~/asacommand$ lsb_release -a ; uname -a ; bash --version
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:    20.04
Codename:   focal
Linux PC-ubuntu 5.4.0-66-generic #74-Ubuntu SMP Wed Jan 27 22:54:38 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
GNU bash, バージョン 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

仕込み1 下調べ

まずはサイトを取得しないといけませんが、大抵のOSのコマンドはバージョン毎に固定で、サイトが変更されるものではないのでクローリングは行わずローカルに落としてから抽出しようと思います。

ASAのコマンドは膨大なので項目ごとに分けられています。

これがASAのSから始まるコマンドのURIです。

https://www.cisco.com/c/ja_jp/td/docs/security/asa/asa-command-reference/S/cmdref3.html

この中により詳細のコマンド毎のリンクがあります。 showコマンドは

https://www.cisco.com/c/ja_jp/td/docs/security/asa/asa-command-reference/S/cmdref3/s2.html

というURIとなっており、 s2.html 〜 s14.htmlまでがアルファベット順でshow XXX のコマンドの範囲になっています。

まずはこのリソースをローカルに落とします。

仕込み2 wgetでリソース取得

html取得と言ったらwgetcurlですね。
backgroundで動かせるオプションがあるので私はwgetの方が好みです。

wget正規表現が使えないのでechoでURIを出してから取得します。
xargsに渡すついでにプロセスも分けて時短します。
wgetとxargsは相性がいいですね。

今回は試しついでに計測してみますのでフォアグラウンドで実行します。

masashi@PC-ubuntu:~/asacommand$ time echo https://www.cisco.com/c/ja_jp/td/docs/security/asa/asa-command-reference/S/cmdref3/s{2..14}.html | tr " " "\n" | xargs -P 20 wget -q

real    0m1.137s
user    0m0.098s
sys 0m0.080s

わずか1秒ちょっとでs2.html 〜 s14.htmlまで取得です。素晴らしい。

追記

別件でxargsを使う機会があったのですが、ーPを使う場合は-nか-Lで引数を渡さないとうまく動かないようです。
改めて試してみましたが、動いていたのか結果は変わらずでした。

masashi@PC-ubuntu:~/asacommand$ time echo https://www.cisco.com/c/ja_jp/td/docs/security/asa/asa-command-reference/S/cmdref3/s{2..14}.html | tr " " "\n" | xargs -n1 -P 20 wget -q

real    0m1.183s
user    0m0.112s
sys 0m0.122s

ちゃんと取れてます。

masashi@PC-ubuntu:~/asacommand$ ls | sort -V
s2.html
s3.html
s4.html
s5.html
s6.html
s7.html
s8.html
s9.html
s10.html
s11.html
s12.html
s13.html
s14.html

仕込み3 htmlタグ調査

私はHTMLタグのスクレイピングをよく行うのですが、タグ情報が必要なのでコマンドが書かれているタグを調べます。

masashi@PC-ubuntu:~/asacommand$ grep '>show aaa' s2.html | head 
<li><a href="/c/ja_jp/td/docs/security/asa/asa-command-reference/S/cmdref3/s2.html">show aaa kerberos コマンド~ show asdm sessions コマンド</a></li>
                    <p>show aaa kerberos コマンド~ show asdm sessions コマンド</p>
<li><a href="#pgfId-1493821">show aaa kerberos</a></li>
<li><a href="#pgfId-1362247">show aaa local user</a></li>
<li><a href="#pgfId-1548368">show aaa login-history</a></li>
<li><a href="#pgfId-1448582">show aaa-server</a></li>
  <h2 class="pCT_ChapTitle"><a name="pgfId-1186909"></a><a name="show_aaa_kerberos_コマンド~_show_asdm_sessions_コマンド"></a><a name="51328"></a>show aaa kerberos コマンド~ show asdm sessions コマンド 
  <h2 class="pCRC_CmdRefCommand"><a name="pgfId-1493821"></a><a name="show_aaa_kerberos"></a>show aaa kerberos</h2> 
    <span><a name="pgfId-1564126"></a><code class="cExPlain">ciscoasa</code># <span class="cExBold">show aaa kerberos keytab</span> </span> 
  <h2 class="pCRC_CmdRefCommand"><a name="pgfId-1362247"></a><a name="show_aaa_local_user"></a>show aaa local user</h2> 

この辺のタグが良さそうですね。

<li><a href="#pgfId-1493821">show aaa kerberos</a></li>
<li><a href="#pgfId-1362247">show aaa local user</a></li>
...

ページ内リンクっぽいですが、コマンドを抽出する分には大丈夫でしょう。

抽出

htmlタグの中身を抽出するならプログラミング言語でのスクレイピングを思いつきますが、 shellでも十分に拾えます。

  • grepがやはり頼りになる

grepの-PはPerl正規表現が使えるようになるオプションです。
ホント有能。大好き。
タグの中身だけ抜くように正規表現を書きます。(詳細は参考サイトで)

masashi@PC-ubuntu:~/asacommand$ grep -oP '<li><a href="#pgfId-\d+">\K.*?(?=</a>)' s2.html
show aaa kerberos
show aaa local user
show aaa login-history
show aaa-server
show access-list
show activation-key
show ad-groups
show admin-context
show alarm settings
show arp
show arp-inspection
show arp rate-limit
show arp statistics
show arp vtep-mapping
show asdm history
show asdm image
show asdm log_sessions
show asdm sessions

OK!
いいですね。

一気に取得してリダイレクトしちゃいます。

masashi@PC-ubuntu:~/asacommand$ grep -oP '<li><a href="#pgfId-\d+">\K.*?(?=</a>)' s*.html > "show command.txt"

確認

masashi@PC-ubuntu:~/asacommand$ cat 'show command.txt' | sort -V | head
s2.html:show aaa kerberos
s2.html:show aaa local user
s2.html:show aaa login-history
s2.html:show aaa-server
s2.html:show access-list
s2.html:show activation-key
s2.html:show admin-context
s2.html:show ad-groups
s2.html:show alarm settings
s2.html:show arp
masashi@PC-ubuntu:~/asacommand$ cat 'show command.txt' | sort -V | tail
s14.html:show wccp
s14.html:show webvpn anyconnect
s14.html:show webvpn csd(廃止)
s14.html:show webvpn group-alias
s14.html:show webvpn group-url
s14.html:show webvpn hostscan
s14.html:show webvpn kcd
s14.html:show webvpn sso-server(廃止)
s14.html:show xlate
s14.html:show zone
masashi@PC-ubuntu:~/asacommand$ wc 'show command.txt' 
  428  1270 12431 show command.txt

show a 〜 show zまで取れてます。OK!
これを参考に試験項目も作らないとですね。

まとめ

shellのみでリソース取得から特定タグのスクレイピングまで行いました。

プログラミング言語でのスクレイピングはクローリングやjavascript対応といった小技を合わせるのには便利ですが、今回の様なサイトの操作にはshellでも全然間に合います。

一度ローカルに落としておくのがミソで、いくら試してもサイトに負荷がかからないのがいいですね。

参考サイト

プリキュアで学ぶワンライナーWebスクレイピング - Qiita

ここでshellでのスクレイピングを覚えましたw