今やってる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取得と言ったらwgetかcurlですね。
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