VALUE-DOMAINはIPアドレスとサーバー番号がわかりやすい。
- s1.coreserver.jp → 202.172.28.2
- s2.coreserver.jp → 202.172.28.3
だが、さくらインターネットはそういう割り振りを行っていない様子。膨大な数の契約をしているわけでもないし、中の人でもないから確かなことはわからないけれど、一部のサーバーの番号割り振りはMACアドレスの末尾と一致するようだ(でも、その法則に一致しないものもあるようで、なんとも言えないのだが・・)。
ちょうど前回、「pc.casey.jp » IPアドレスとMACアドレスを取得する」を書いたので、ついでにそれっぽいものを作ってみた。
スポンサードリンク
レシピ
MACアドレスの取得
まず、MACアドレスを取得する復習。これは前回の記事を参照されたい。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' XX:XX:XX:XX:8D:40
2つのオクテットだけ取得
このうち、必要なのは右側の2つのオクテットなので、そのようにする。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' | cut -d: -f5-6 8D:40
不要文字の削除
さらに、「:」は不要なので削除する。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{printf $5;}' | cut -d: -f5-6 | sed -e 's/://' 8D40
16進数の明示
これでMACアドレスの2オクテットの取り出しが完了した。さらに「0x」を付加して16進数であることを明示する。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' | cut -d: -f5-6 | sed -e 's/://' | awk '{print "0x"$1}' 0x8D40
16進数を10進数に変換
16進数を10進数に変換する。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' | cut -d: -f5-6 | sed -e 's/://' | awk '{print "0x"$1}' | awk '{printf("%d\n",strtonum($1));}' 36160
文字列の加工
printfを使っているついでに文字列を追加する。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' | cut -d: -f5-6 | sed -e 's/://' | awk '{print "0x"$1}' | awk '{printf("www%d.sakura.ne.jp\n",strtonum($1));}' www36160.sakura.ne.jp
(追記)修正バージョン
awkが連続して登場していたので整理した。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' | cut -d: -f5-6 | sed -e 's/://' | awk '{printf("www%d.sakura.ne.jp\n",strtonum("0x"$1));}' www36160.sakura.ne.jp
(追記)複数NICの場合
複数NICの場合も実行される。
$ LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' | cut -d: -f5-6 | sed -e 's/://' | awk '{printf("www%d.sakura.ne.jp\n",strtonum("0x"$1));}' www587XX.sakura.ne.jp www587XX.sakura.ne.jp www587XY.sakura.ne.jp www452XZ.sakura.ne.jp
(追記)エラー
CentOSとUbuntuの幾つかのバージョンを使って試験しているが、そのうち1つでエラーになった。
$ LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{print $5;}' | cut -d: -f5-6 | sed -e 's/://' | awk '{printf("www%d.sakura.ne.jp\n",strtonum("0x"$1));}' awk: line 2: function strtonum never defined
対処方法
この問題はUbuntuを実行しているシステムで発生した。strtonumは「libbsd-dev」によって提供されているようなのでインストールしたがエラーは発生した。
結局「sudo apt-get install gawk」としたところ「gawk」と「libsigsegv2」がインストールされたようで、この状態では問題が起きなかった。
別のバージョン
あれ?ちょっと違う・・・??オクテットが10進数か16進数かで違うのかな。
(この例だと16進数になってしまっているけれど)「8D:40」だと「www8D40.sakura.ne.jp」となるハズ・・。もう一度言うけど10進数ならね。
# LANG=C /sbin/ifconfig | grep 'HWaddr' | awk '{printf $5;}' | cut -d: -f5-6 | sed -e 's/\([0-9A-F]\{2\}\):\([0-9A-F]\{2\}\)/www\1\2.sakura.ne.jp/i' www8D40.sakura.ne.jp
ということで作りなおしたのが上記。うーん。このスクリプト、どこで出番があるんだろう・・。サーバー新規構築時のホスト名の自動設定とか?
参考文献
- 組み込み Linux 開発の手引き – 10進数⇔16進数
- Linuxコマンド逆引き大全 – 【 文字列を置換する 】:ITpro
- [ubuntu] How to install glibc 2.16 on Ubuntu desktop 11.10 x64
- Ubuntu Manpage: strtonum – reliably convert string value to an integer
# perlとは正規表現がちょっと違うのね。軽くハマった。
コメント