pusuke0418’s diary

異常にマルチタスクな社内SEのブログ

シンプルなWebスクレイピングとして

htmlから目的の部分がはっきりしていて、それが一意に決まって、後に特に処理も必要無いのであれば、Linuxシェルスクリプトがやぱり楽なのではないかという。
例えば、都営地下鉄から浅草線の運行情報を取りたい場合、

wget -O -  http://www.kotsu.metro.tokyo.jp/subway/schedule/ | grep -A 1 "class=\"asakusa\"" | sed -e 's/<[^>]*>//g' | sed -e 's/://g'


もとのhtmlには、

<th class="asakusa">浅草線:</th>
<td>現在、15分以上の遅延はありません。</td>

という部分があって、2行(もしかして遅延したときは変わるのかな?)。路線を表す部分は一意。それらの部分を取り出し→タグ削除→コロン削除。


結果は、

浅草線
現在、15分以上の遅延はありません。

ネットワーク認証のWeb認証

ネットワーク認証で用いられるWeb認証について概説です。ここでは、スイッチや無線AP/コントローラのようなネットワーク機器で行う認証についてです。

通常、ネットワークの認証は、802.1X, MACアドレス認証, Web認証に大別されます。多くのネットワーク機器の実装もそのようになっています。ただし、「Web認証」というプロトコルのような何かが存在するのではなく、あくまでWeb画面を使った認証、ということで、クレデンシャルの確認には通常RADIUSを利用してPAP/CHAPが、機器によってはLDAP等も利用されます(これはMACアドレス認証も同様です)

Web認証の特徴は、勿論ブラウザを使った方式であるということは前提でありますが、ユーザ名/パスワードでログインすることと、他2つの認証方式とは異なり、レイヤ3の通信で行われる認証であることかと思います。
利用シーンとしては、ホテルや企業、大学等でゲストへのネットワーク接続で提供される場合が多いです。

ブラウザを使った方式。
Webページとしてログイン画面を表示できるので、ロゴやメッセージも表示することができます。例えば、「リスクを承知してつかってね」メッセージとあわせ了承チェックボックスを表示したりも。
ブラウザを使うからといって、ブラウザを閉じたらネットワーク接続も終わるかというと、通常そうではないです。ネットワーク機器側ではMACアドレスIPアドレス等で接続状態が管理されているケースがほぼです。ただし、Webページで認証ログイン後ページにログアウトボタンが表示されるものもあります。それを押すと、ネットワーク機器に通知され切断(ログオフ)されます。

ユーザ認証であること。
証明書の発行とその端末へのインストールや、MACアドレスという固有情報の収集が不要です。ユーザIDの発行のみで利用が可能です。
期間を限定したユーザや、誰が発行したかの証跡を取ることができる機能を持ったRadiusシステムも市場で販売されています。

レイヤ3の通信で行われる認証。
これは、認証を行うために、既に通信ができていなければならないという矛盾した状態を発生させます。ただし、通常はDHCPによるIPアドレスの取得、DNSによる名前解決程度で済む場合が多いです。
多くの場合、ユーザがブラウザを開いてどこかのページを見ようとすると、名前解決を行い、見ようとしたページへのIPアドレスによる通信が発生した段階で、ネットワーク機器は本来の宛先を奪い取るまたはリダイレクトするなどして、Web認証画面をクライアントに表示します。

ゲストの利用が主。
毎度ブラウザを開いて認証しないとネットワークに接続できないということは、企業等組織内のユーザに導入するには、ユーザビリティが下がる行為です。一方で、外部のユーザからは、面倒でも「それを使えばインターネットが利用できる」ということになります。
ゲスト利用はよく無線LANで利用されていて、インターネット接続のみのポリシーがかけられています。ユーザIDの発行のみで利用でき、Web画面に情報も記載できるため、ゲスト用としてよく利用されます。

補足1。無線LANシステムでは、Web認証は追加の認証方式であり、接続時の認証・暗号化方式とは関係ありません。オープンなネットワークでは通信内容のセキュリティに注意します。

補足2。ゲストの利用が主と書きましたが、端末資産管理や検疫システムで、Web認証と連携するものをしばしば見かけます。その場合チェック済端末からはアプリケーションが自動でPOSTをかけ、ユーザは感知していないことが想定されます。

ネットワークスイッチコンフィグジェネレート

知り合いとスイッチのコンフィグ作りとかその確認てめんどくさいよね、そうですね、というような話になり、スクリプトとかかね、といっても、いちいちスクリプトのファイルに設定値書き込むのかね、とかライブラリ覚えたりとかスクリプト勉強したくないよね、ということに。

そして、そのとき話に出たのは、絶対に設定値パラメータシート埋めてから設定コンフィグ作って、流し込んでやってるけど、毎回繰り返しだよね、単純ゆえにミスるよねと。まぁ、そこが楽になれば難しいことや凝ったことしなくて良いよね、と。

じゃぁ、Excelで作ってるパラメータシートで毎回同じような設定入れるところをそのままExcel上でジェネレートすれば良いじゃないという方向。

例えば、下記のようなものは単純。ホスト名の設定

A B
1 項目
2 hostname L3SW-01

下記のように文字列をつなげるだけ。ここでは便宜的にC列に式を、D列に結果を書いています。

A B C D
2 hostname L3SW-01 =B5&" "&C5 hostname L3SW-01



では、条件分岐が出る部分はどうするのか、という話になります。例えば、インタフェース設定。モードがaccessかtrunkかで、関連して必要となるコマンドが変わってくる。特にciscoを意図しているわけではないけれども、例えば下記のようなスイッチに関する設定表だったとする。

A B C D
1 インタフェース 番号 タイプ VLAN
2 fastethernet 0/0 access 100
3 fastethernet 0/1 trunk 100,200,300
4 fastethernet 0/2 150

IFの分岐と、COUNTIFによる文字列の確認を利用する。長くなるので下に記します。上記の表でいうと、2行目のfa0/0のところに対応しています。これをひとつのセルの中に記述。

="interface "&A2&" "&B2&CHAR(10)&
IF(COUNTIF(C2,"access")," switchport mode access"&CHAR(10)&"switchport access vlan "&D2,
IF(COUNTIF(C2,"trunk")," switchport trunk encapsulation dot1q"&CHAR(10)&" 
switchport mode trunk"&CHAR(10)
&" switchport trunk allowed vlan "&D2,"
"インタフェースタイプ指定しましょう"))

ぐちゃぐちゃに見えるけれども、単にIF関数と、COUNTIF関数を使っている(もし指定のセルにaccessという文字があれば○○、accessが無く、trunkという文字があれば△△)。ところどころにはさまっているCHAR(10)というのは、改行コードで、同一セル内で改行させることができる。結果は、下記のようになる。例えば、先ほどのインタフェース表中、E列の最初の行にだけ書いて、あとはセルのはしっこをドラッグして下のほうのセルまでオートフィルすれば良いです。

E
interface fastethernet 0/0
switchport mode access
switchport access vlan 100"
interface fastethernet 0/1
switchport trunk encapsulation dot1q
switchport mode trunk
switchport trunk allowed vlan 100,200,300
interface fastethernet 0/2
インタフェースタイプ指定しましょう

ただし、ここで使っている式では、出力にセル内改行を含んでいるため、実際生成されたコマンドであるセルの内容を、例えばテキストエディタにでもコピペすると、下記のようにダブルクォテーションを含んでペーストされてしまう。

"interface fastethernet 0/0
 switchport mode access
 switchport access vlan 100"

Excelでのダブルクォテーションの発生を避けるためには、あらかじめ1セル1行のコマンドとするか、あるいは割り切ってテキストエディタにコピペした後一括でダブルクォテーションを削る。

作業テンプレ化しておけば、Aという設定にBという別機能の設定が必須だが忘れてしまった、ということも避けやすい、かも