Linuxで七転八倒な記録


まず一言。Linux の HowTo に関するページは世の中たくさんあるから、ここを見るよりはそっちを見るのが賢明かと。まだまだ Linux を完全に理解してるわけじゃないから(^^;
それに「前あれってどうやったんだっけ?」とすぐ忘れる自分のための覚え書き的存在なので(笑)

← 前 BBS 次 →

2002年03月07日
○ mod_ssl → 2.8.7
アップ情報は散発的だな。リモートから攻略可能なバッファオーバーフローの脆弱性がある(Apache SSLも同様)ので、オープンなサーバで利用中なら早急に 2.8.7 にしましょう。


2002年2月22日
○ メール受信確認
今使っているルータにはメール確認機能があって、メールの着信があると LEDが点滅するので便利なんだけど、今まではスケジュール機能で 1時間に 1回チェックするようになってた。これはこれで良いけど、メール受信から LED点滅開始まで最大 1時間ずれてしまう。受信したと同時に点滅するように出来ないかな、と思い修正してみました。
まず、ルータのスケジュールからメール確認の部分を削る。これはすぐ出来る。で、新しい仕組みを作るわけだけどそれほど難しくはないさね。うちのサーバは qmail で運営しているので、受信したときに参照される .qmail を編集するだけ。

## .qmail ##

./Maildir/                 # これはメールを保存しておくために元からある
| ./scripts/msgled_on.pl   # 点滅させるためのスクリプトを実行
スクリプトは telnetでルータにログインし、メールチェックコマンドを実行するようになってる。エラーハンドルなんかは一切していないけど…。ルータには Web機能もあるのでそちらでも可能なんだけど、10分に一度しかチェックできない制限があるので telnetのほうに決定。

## msgled_on.pl ##

#!/usr/bin/perl

use Net::Telnet;

my($lines, $t, $pass, $adminpass, $rthost);

$rthost = '192.168.1.1';   # ルータのアドレス
$pass = 'pass';            # ログインパスワード
$adminpass = 'adminpass';  # 管理者パスワード

$t = new Net::Telnet (-host => "$rthost");

## Wait for first prompt 
$t->waitfor('/Password:.*$/');
$t->print("$pass");
$t->waitfor('/>.*$/');
$t->print("administrator");
$t->waitfor('/Password:.*$/');
$t->print("$adminpass");
$t->waitfor('/#.*$/');
$t->print("mail-check go 1");   # メールチェック実行

$t->waitfor('/#.*$/');
$t->print("exit");    # exit せずにクローズしても問題ない
$t->waitfor('/>.*$/');
$t->print("exit");

$t->close;

exit;
これで受信と同時に MSGランプが点滅するようになりました。でも、このままだとずっと点滅したまま。理想としては POPで取り出した時に自動クリアされるような設定なんだけど、なんとなく出来なさそう。本体のスイッチで解除出来たら便利だと思うのだがそれは出来ないので、telnet か Webかのどちらかでクリアをしないといけない。普段はブラウザで操作しているのだけど、それも面倒くさく感じる(笑)メール機能のトップを表示、この時に認証パスを入力、続いて点滅クリアボタンを押す、という3ステップかかるからね。なんとか手間を省けないか、ということで、これまたスクリプトで処理してくれるようにして1ステップで済むようにしてみた。

## msgled_off.php ##

<?php
 mb_http_output("SJIS");

 $ch = curl_init("http://192.168.1.1/kantan/add/mailchk");    # ルータの点滅クリアページの URL
 curl_setopt($ch, CURLOPT_USERPWD, "user:pass");    # 認証のユーザ名、パスワード
 curl_setopt($ch, CURLOPT_POST, 1);                 # POSTする
 curl_setopt($ch, CURLOPT_POSTFIELDS, "MAIL_SERVER=1&ARRIVE_OK=OK");    # POSTするデータ
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);        # 受信データを変数に
 $result = curl_exec($ch);    # 実行。受信データを $result に。今回は使用せず
 curl_close($ch);
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="Refresh" content="2;URL=./">
<title>MSGランプをオフ</title>
</head>
<body>
<b>MSGランプの点滅を解除しました</b><p>
<a href="./">戻る</a>
</body>
</html>
しかし、自分でやっといていうのもなんだけどこういうことは極力しないほうが良いね。セキュリティ的に弱くなる要素だからさ。取扱いに十分気をつけないと。


2001年10月24日
こちらもだいぶサボったのでまとめて。

○ Linux kernel 2.4.10 → 2.4.12
○ vgetty 撃沈
前々からインストはしてあったけどまともにセッティングせず。使えるといろいろ便利だな〜、と思い腰を上げた。とりあえずバージョンをあげようと、1.1.26-6 の RPM を拾ってきてアップグレード。コンフィグを自分の環境に合った内容に変えてまずmgetty の動作確認。うん、問題無し。次が本命のvoice 部分。設定はそれほど難しく無いのでさくっと設定。vgetty を立ち上げる。む〜、モデムにアクセスはしてるが起動にこける。ログを追うとモデムの自動判定に失敗してるらしい。詳細なログを取り確認してみるといくつかの ATコマンドに対しモデムがエラーを返している。そのコマンド自体に対応してない模様。仕方ないのでコンフィグなんかでモデムを固定にしようとしたのだが、そんな設定がないようだ。探し方が悪かったのかな?じゃあ、ってことでソースを拾い認識部分をパスカットしてRockwell モデムと強制的に認識するように変更。こういう芸当は Windows ではなかなか難しい(^^;
ソースを書き換え、バイナリパッケージを作成、問題なくビルド。そいつをインストして動かして見るが、やはりダメ。今度は着信もないのにぴぃーとか鳴ったりしてる…。ログを追う気力も尽きたんで、今回は完敗のまま終了。

○ xntp のインストール
時刻修正といえばやはり NTP。今までもルータと Windowsマシンは NTPクライアントを使って時刻修正はしてたん。一番最初ルータ導入時に、ルータがネット上のサーバにアクセスして、PCからはルータを参照すればいいかな、と思っていたんだけど、ルータに NTPサーバ/フォワード機能がないことが発覚(T_T)。仕方ないのでそれぞれ個別にせざるを得なかったのだ。その後、サーバが常時稼動になったわけだけど、最初は完全自分専用だったので時刻修正に関してはしていなかった。最近はいろいろな使われ方をしてるし、ワーム侵入や不正アクセスなんかといういざという時にログの時間がズレていては何の役にも立たない。そんなわけで ntp をきちんと導入して時刻修正を行い、さらに LAN内のローカル NTPサーバとしても使おう、というわけなん。
まず、パッケージを拾ってきてインストール。ntp でも出来なくはないのけど面倒なので xntp にする。

# rpm -ivh xntp3-5.93-15.i386.rpm
次にネット上の NTPサーバと同期を行う設定。今回参照するのは高精度な JSTを取得できる 共同試行サービス のサーバ。利用できるサーバは3台あるので、その中から ntp3.jst.mfeed.ad.jp(210.173.160.87)を選ぶ。一番使われてなさそう(=遅延、ばらつきが小さくなる)という根拠の無い理由(笑)もちろん複数台のサーバを指定して精度を高めることも出来るけど、そこまでは拘らないしトラフィックを最小限に、ということで。
ルータのフィルタをサーバ間の NTP通信を許可するようにしておく。サーバでは /etc/ntp.conf で公開サーバを参照するように設定。

----- FileName ntp.conf -----
…
#server 127.127.1.0     # local clock   # コメントアウトしておく
server  210.173.160.87
…
------ end of ntp.conf ------
サービスを起動。

# /sbin/service xntpd start
無事起動。ntpq コマンドを使って同期が行われているかを確認してみよう。

# /usr/sbin/ntpq -p
     remote           refid      st t when poll reach   delay   offset    disp
==============================================================================
*ntp3.jst.mfeed. nttpf-isdn0.crl  2 u  247  256  377    76.42   -0.464    4.03
うんうん、OK。行の先頭にアスタリスク(*)が付いていれば同期状態ということらしい。起動してから同期完了までは数分〜10分程度はかかるよん。続いて Winマシンとルータのクライアント設定を変更してちゃんと取得できるか確認。うん、きちんと取得できた。最後に起動時に立ちあがるようにしておかないとね。

# /sbin/chkconfig --level 345 xntpd on
よし、これで完了!あと、マシンをリブートした時なんかはハードウェアクロックに合わせた時間に戻ってしまうんで、root になり /sbin/clock -w としとけばハードウェアの方も書き換わるので誤差が小さくなるっと。

○ PHP 4.0.6 → 4.0.8
前回はバイナリパッケージのビルドに失敗したので今回は頑張ってみた。まず、ログを調べて見れば何か分かるかもと思い、調べて見ると単にメッセージだけでは分からなかったきちんとした原因が分かったのだ。コンパイルオプションの -lfreetype でエラーつまり、freetype ライブラリが見つからないと怒られていたん。ん〜、freetype はきちんとインストールしたのになぁ、と思ったが現にエラーになってるから仕方ないか…。freetype、freetype と関係がありげっぽい gd、あと一応 Cライブラリの新しい RPM を拾ってきてアップグレード。再度試してみる。上手くいってくれ…、おぉ、通ったぞ!その後ついでに日本語ドキュメントをパッケージに加えてみたりして何度か SPECファイルを書きなおして念願の自前バイナリパッケージがビルドされた♪これだけ大きなパッケージを自前でビルドしたのは初めてなんできちんと出来ているのかがすごく心配。インストしてみる。インストも OK。PHP をロードし直すために Apache を再起動…。おぉ、上がったぞ。念の為にログを見てみよう。

PHP Warning:  Function registration failed - duplicate name - pg_connect in Unknown on line 0
こんなのが何行か吐かれてる。ん〜、名前の重複、ってことはどこかが何度もロードされてるのかな?とりあえずエラーの吐かれる pgモジュールを使ってるスクリプトを表示して見る。問題ないらしい。それならとりえず良しとするか。原因解明はまた今度(笑)
んで、ようやく mbstringモジュールが使えるってわけだ♪さっそく試してみよう。こんな感じのスクリプトを EUCで保存して表示してみる。

<?php
mb_http_output("SJIS");   # 以降出力をシフトJISにする

…

?>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">   # シフトJISで表示させる
ブラウザから見ると…化けた!EUC のままだ…。う〜む。調べてみると php.ini をきちんと設定しておかないとダメっぽい。なんで設定しておく。

----- FileName /etc/php.ini -----
…
default_charset                         =       EUC-JP   # デフォルトの文字コードは EUC
mbstring.internal_encoding              =       EUC-JP   # スクリプトは EUC で設置
mbstring.http_input                     =       auto   # フォームからの送信データなどの入力は自動判定
mbstring.http_output                    =       pass   # ブラウザへ渡す出力はそのまま
mbstring.detect_order                   =       auto   # 文字コードを判定する順番は自動
mbstring.substitute_character           =       none   # 適用されている文字コードに無い文字は表示しない
output_handler                          =       mb_output_handler   # エンコードに使うハンドラを設定
------ end of php.ini ------
mbstring.internal_encoding に指定できるコードは数種類に限られるので注意。シフトJIS等その他の文字コードの場合スクリプトが正しく実行できない可能性があるんで要注意。Linux の場合、内部の文字コードは EUCに統一して(DB連携の場合特に)出力するときに必要があればシフトJISにエンコードする、という手法が一番効率、保守性がいいん。さて、変更を保存して Apache を再起動。スクリプトをリロードしてみると、今度はちゃんとエンコードされた♪やっと WebDBをメインにした DBシステムを本格的に設計、運用することが出来るよ!


2001年09月28日
○ Linux kernel 2.4.8 → 2.4.10


← 前 BBS 次 →

△戻る ▲トップに戻る