value-domain.comのDDNSを自動で更新するスクリプト

固定IPアドレスを持ってないので,IPアドレスが変わる度value-domainにお知らせしなければなりません.
しかし,IPアドレスが変更されるとSSHも通りませんので出先だと手の施しようがなくなります.

固定IPアドレスは高いので,以下のような要件を満たすシェルスクリプトを書きました.

こうしたい:

・うちで使ってるdebian lennyで動く
・value-domainでだけ使えればいい
・crontabに登録して,10分に1回IPアドレスに変更がないか確認させる
・WAN側IPアドレスを知るのに,外部サーバに問い合わせを行わない(10分に1回問い合わせたらご迷惑でしょう?)

スクリプトのテキスト版はこちら

#!/bin/sh

# Set your account information of VALUE-DOMAIN.com
vdomain=`echo 'hogehoge.com'`;
vpass=`echo 'password'`;

# WAN port
wan_if=`echo 'ppp0'`;

# Getting the current directory of this script
current_dir=`echo $(cd $(dirname $0);pwd)`

# Get older ip address
oldip=`cat $current_dir/getip`;

# Get current ip address
`ifconfig $wan_if | grep "inet addr" | awk '{print $2}' | sed 's@addr:@@'` > $current_dir/getip;

# You can also use this line;
# wget -O $current_dir/getip "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip";

sleep 5;
newip=`cat $current_dir/getip`;

# Renew (or do not renew)
if [ "$oldip" != "$newip" ]; then
wget -O $current_dir/getip_status "http://dyn.value-domain.com/cgi-bin/dyn.fcg?d=$vdomain&p=$vpass&h=*&i=$newip";
echo "`date` $oldip -> $newip" >> $current_dir/log;
fi

$ sudo crontab -l

*/10 * * * * /bin/sh /usr/local/sbin/vd/vd.sh >/dev/null 2>&1

ファイル構成は

vd.sh       (上記スクリプト本体)
log        (IPアドレスに変更があったときに書いておくファイル)
getip       (アドレスをメモしておく,/tmpに置いた方がよかったかも)
getip_status  (最後にIPアドレスが変更されたときの,value-domain.comからの応答を書いておく)

です.

ifconfigで外側IPアドレスを取得しているので,外側IPアドレスの付与を受けているインターフェースを持つマシンでしか使えません.
まあつまり,PCルータで回す用です.

NAT内で使うには,外部サーバに頼るか,その他の工夫が必要です.
DDNS更新スクリプト(運用編)へ続く

追記@2011-02-26
意外と閲覧数が多いことに気付いたので,一部訂正&テキスト版を置きました

追記@2011-11-09
上記スクリプトをマルチアカウント版に改良してくださった方がいます.感謝.
ValueDomain用のdynamicDNS更新のBashスクリプト

既知のバグ@2011-11-09
Terminalを日本語環境で使用していると上手く動かないようです.つまり,

$ echo $LANG

を実行してja_JP.UTF-8などが表示される場合,使えないということです.(うちの環境ではen_US.utf8が表示されます)
これは,IPアドレスを取得する行,つまり

`ifconfig $wan_if | grep "inet addr" | awk '{print $2}' | sed 's@addr:@@'` > $current_dir/getip;

がコテッコテで環境依存な取得方法であることに由来しています.
動かすには,この行を改良するか言語をen_US.utf8に設定する必要があります.
外部サーバに問い合わせするのを許容するなら,例えば以下のように変更すればいいと思います.

wget -O $current_dir/getip "http://dyn.value-domain.com/cgi-bin/dyn.fcg?ip";

Firefox3.5がよく固まる

Firefox3.5がURL予測や検索キーワード予測でよく固まる.
しかも,一度固まると一部の操作を除いてキーボードとマウス操作を受け付けなくなる.

色々な解決方法が提案されているみたいですが,軽微な場合以下の方法でも解決できます;

1:Ctrl - Alt - F1
2:画面が黒くなる
3:ログインする
4:$ ps -A | grep firefox
5:kill (FirefoxのPID)
6:Ctrl - Alt - F7

Ubuntu本体が固まってなければ,まあこれでなんとかなる.

LAN内でSSHを使う

有限な机上スペースを効率的に使うため,SSHをインストールしました.
偉そうなこと言ってますが家が狭いだけです.

OS(参考程度に) :
SSHサーバ:Debian lenny
SSHクライアント(LAN内):Ubuntu 9.10
SSHクライアント(LAN外):Solaris9と10

SSHをインストールする前に,ルータ(iptables)の設定をしました.
当面はLAN内でのみの運用としたいので

定数に

ssh_port='22'

INPUT RULESに

$IPTABLES -A INPUT -i $wan_port -p tcp --dport $ssh_port -j DROP

としました(Port22は変えたほうがいい).

{ もっとも,SSHサーバはNAT内であり,ルータのNAT設定をしていないのだから
この行を追加しようがしまいが外から繋がらないことに変わりはない.要は気持ちの問題である.}

LAN内の端末間のFORWARDは元々許可されています.

# LAN内の他端末からのアクセスを許可
$IPTABLES -A FORWARD -s $lan_range -d $lan_range -j ACCEPT

本題.SSHをインストールします.

sudo apt-get install ssh

/etc/ssh/sshd_configを書き換えます.

sshd の設定(sshd_config)
Ubuntuでsshdの設定をしてリモートから接続できるようにする

書き換えたら

sudo /etc/init.d/ssh restart

まずはsuの制限をかける程度にして,認証に成功したら公開鍵認証に切り替えることにしました

早速,LAN内のクライアントから

$ ssh -p 22 user@hostname
The authenticity of host '[hostname]:22 ([***]:22)' can't be established.
RSA key fingerprint is ***.
Are you sure you want to continue connecting (yes/no)? yes

fingerprint取られて通常通りのPassとUserで通ります.
特に何も弄ってないのですが,X使うもの(geditとか)も動きました.

一方,LAN外から叩いてみると

ssh -p 22 user@team2ch.org
ssh: connect to host team2ch.org port 22: Connection refused

入れません.NAT設定してない上にINPUTで蹴ってるわけだから入れたらいやですが.

さて,公開鍵認証にしよう.
Password認証やらPAMやらはnoにして,公開鍵認証の項目のみyesにします.

PubkeyAuthentication yes

その後,サーバの~/.ssh/authorized_keysにクライアントの公開鍵を追記してsshをrestartすればOKです.
UbuntuからDebianのiceweaselを起動しても,そこそこ動いてくれます.

結論:これは便利だ.今まで怠けて設定してなかったことが悔やまれる.当たり前だが,ルータの設定と許可IPアドレスの範囲さえ変えれば外からもいけるわけだし.

Ubuntu9.04 -> 9.10

安定していたJaunty Jackalopeから,噂のKarmic Koalaにdist-upgradeしました.
作業自体は慣れっこなので手こずらなかったです.ただし,以下のようなことが起きています:

・Firefoxのお気に入りが全部消えました.Backup取らなかった人が悪いのですが.
Firefoxがやたらと落ちるようになりました.困ったものですが,しばらくは様子見としましょう.
ググったら,同じ症状の人がいました.env GTK_IM_MODULE=xim firefox %uで回避.
・Firefoxの表示の一部が東風明朝になって見え辛いです.ただし,操作ミスでフォント全消し(笑)したら直りました.一瞬焦ったけど,まあなんとかなるもんだ.
・Input methodはuimにしました.でもやっぱSCIMが使いやすいですね.iBusは一度も使ってませんごめんなさい.
・/etc/fstabを掃除しろと怒られました.これもまあ,僕が悪いんだけど.
・当たり前ですがkernel 2.6.31が使えます.Upgradeした一番の理由がこれです.

$ uname -rm
2.6.31-15-generic x86_64

・FeistyからGutsyにしたときと似た感じがします.

geditの文字コード判定が弱すぎる件

geditが好きである.しかし,最近やたらと文字化けする.

ググったら解決した.
geditの文字コード判定がおかしい

2010-12-09 追記
もうちょい詳しく書いておく.ユーザ権限でgconf-editorを起動して

apps -> gedit-2 ->preferences -> encodings

のauto-detectedを,例えば以下のように書き換える

robots.txtとBasic認証付きのサイトでwgetを使う

今日びそんな自意識過剰なセキュリティが強いんだか弱いんだか分からないサイトは滅多に存在しませんが,残念ながら遭遇してしまいました.一瞬悩んだのでメモしておきましょう.

$ wget -e robots=off -r -l 2 http://user:pass@hoge.com/index.html

または

$ wget -e robots=off -r -l 2 --http-user='USER' --http-passwd='PASS' http://hoge.com/index.html

でなんとかなります.passに!等の記号が含まれてるときは!とでもしてやればOK.

前のエントリーにもちょっと書きましたね

3.5インチHDDを消去して中古屋に売ろう

みなさん,HDD消去してますか?僕はサボってたので6台溜まってしまいました.

IMG_2807

困ったものです.消しかたにも色々な流儀があるわけですが,まあぼちぼちやりましょう.
ゼロフィルとかローレベルフォーマットでいいじゃんと言う人は嫌いです.

ランダムな数で埋める方法として手軽なのは

# dd if=/dev/urandom of=/dev/sdb

でしょうか.でも今回は

# shred -n 2 -v /dev/sdb

としてみました.-n 2だと2回書き込みです.-vは標準出力にログ出力.

ランダムデータ(1)−ランダムデータ(2)−"00" の順に、HDD全領域に3回書き込む

というのは米国国防総省標準規格です.つまりこの後ゼロフィルすればNSA規格です.ちょろいもんだ.

ゼロで埋めるのは

# dd if=/dev/zero of=/dev/sdb

だと直感で分かるのですが,1で埋める方法が思い浮かびませんでした./dev/oneをCで実装できないこともないようですが,頭のいい方法を見つけました

# cat /dev/zero | tr 00 377 | dd of=/dev/sdb

0を1に置換する方法です.8進377は2進11111111ですね.

IMG_2810

すぐ終わんべとタカをくくってUSB2.0で繋いでやったのですが,3.5時間やって1Passの17%しか終わっていません.日が暮れてしまいました.マジで.
USB2.0の規格上の速度が480Mbpsですから,実測100Mbpsとしても160G終わるのに3.5時間程度なはずなんですがね.もちろん他にボトルネックがない仮定でですが.PenM@1.1GHzなのがよろしくないのでしょうか.

というわけでデスクトップ(Ubuntu,Core2Duo E8400)に繋ぎ直してやってみました.それでもUSBでやるのは意地ですね.
埃かぶってるように見えますが,光の加減です.ごめんなさい嘘です写真撮ったあとちゃんと拭きました.

IMG_2814

1時間で160G中,1Passの17%まで進みました.
作業中とても邪魔ですし,直接繋ぐことを強くお薦めします.少なくともLaptopで手軽にできる作業ではないようです.

おまけ:ddの進捗を表示させる方法 from ddの進行状況を調べる方法@理想未来はどうなった?

# dd if=/dev/zero of=/dev/null& pid=$!
# watch -n 10 kill -USR1 $pid

参考URL:@IT:ファイルを完全に消去するには
KNOPPIIXを使ってハードディスクの内容を抹消する方法

Debian etch -> lenny

Apache入りのDebianをetchからlennyにdist-upgradeしました.7ヶ月前にやれとか言われそうですが,1年の猶予があるんだからよいではないか.
GUIツールからやればいいお!(キリッ)と思っていたのですが,そうはいかんようです.まあたいした手間ではないのですが.

/etc/apt/sources.listをlenny用のリポジトリに書き換える.

deb http://ftp.jp.debian.org/debian lenny main contrib non-free
deb http://security.debian.org lenny/updates main contrib non-free
deb http://ftp.jp.debian.org/debian-volatile lenny/volatile main contrib # volatile を使う場合。
deb http://www.jp.backports.org lenny-backports main contrib non-free # backports を使う場合。

書き換える意味は玄箱アップグレード(etch -> lenny)[失敗]によれば

>4.5.4. まずは apt と aptitude の両方または一方をアップグレード
>いくつかのバグ報告によれば、etch に含まれるバージョンの aptitude パッケージや
>apt パッケージでは、多くの場合、lenny へのアップグレードを行えません。
つまり、パッケージマネージャがlennyのは賢くなってるからそれ先にインストールしろと。
apt-lineにさらにlennyを追加。squeezeを入れるかどうかはまだ決めてない。
随分とapt-lineも増殖してきたものだ。

ということらしい.

その後
# apt-get update
# apt-get dist-upgrade

ググったらX周りの不具合が多そうだったのですが,うちの環境では上手くいきました.GUI使わないけど.

CPU交換

Pentium Dual-Core E2140(SLA93)からCore2Duo E8400(SLB9J)に換えた.
換えた理由は

・両方共TDPが65Wだから
・E8400の価格がこなれてきた
・E2140も2年くらい使ったし,もういいだろう

といったところ.まあなにより,発熱が同じなら性能が高いほうがよい.

マザーボードはGA-P35-DS3(rev1.0)という45nm process readyのものなので,CPUとCPUクーラーのみの交換で済んだ.CPUクーラーは高さ制限があるためNINJAminiにした.フロッピードライブの故障によりBIOS updateに手間取ったが,USB-FDD買ってきたら上手くいった.

UbuntuでインターネットとOpenOfficeをする為のマシンにここまでのスペックが必要かは甚だ疑問だが,趣味だから仕方ない.異論は認める.

WordPressの自動アップデート

public_html 以下にwordpress を展開しただけだと

要求された操作を実行するためには、接続情報が必要です。

というエラーが出て自動アップデートが実行できない.

chmod -R 777 ./wordpress しても上記エラーが出るので諦めていたのだが,chown -R www-data ./wordpresswordpress の所有権をapacheにしたら自動アップグレードできるようになった.

参考URL:WordPressで「要求された操作を実行するためには、接続情報が必要です」と出る原因とその対処法メモ

追記@2011-02-26 うさぎ亭主さんのご指摘により一部訂正しました.