Linuxで七転八倒な記録


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

← 前 BBS 次 →

2002年6月30日
○ OpenSSH 3.2.3p1 → 3.4p1
OpenSSH の脆弱性の解消。RedHat からのエラータは 3.1p1 のフィックスなので、すでに 3.2.3p1 なうちの環境には向かない。OpenSSHオフィシャルに RH7.3 用 rpm があったのでそれを使ってアップグレード。

# rpm -Uvh --test openssh-*3.4p1-1.i386.rpm  # アップグレードに問題がないかチェック
# sudo /sbin/service sshd stop               # sshd を停止
# sudo rpm -Uvh openssh-*3.4p1-1.i386.rpm
# sudo /sbin/service sshd start              # sshd を再開。エラーを吐かなければOK


2002年6月20日
○ Apache 1.3.23 → 1.3.26
17日に発見された Apache の脆弱性、DoS 攻撃は受けても困るのは自分くらいだけどリモートから侵入されたり改ざんされたりは良くないのでここ数日ルータで外部からのアクセスは reject してた。RedHat からすぐにエラータでるかと思ったけど少し時間かかりそうだったので暫定措置をしておいた。この前の GD の時と同様の手法で RPMをビルドすることに。まず、1.3.23 のソースRPM と、1.3.26 の tar.gz を取得。そして、RPM をインストールし tar.gz を RPM の SOURCES にコピーする。なお、いつも通り RPM の BuildRoot を ~/RPMS/ とした内容なので、各自の環境にあわせて読み替えて下さいまし。

# rpm -ivh apache-1.3.23-11.src.rpm
# cp apache_1.3.26.tar.gz ~/RPMS/SOURCES/  # ~/RPMS/ を BuildRoot とした場合
次に SOURCES の中の apache_1.3.23-eapi-2.8.7.patch を 1.3.26 用にリネーム、もしくはコピーしておく。SPECS に移動して念のため spec ファイルもバックアップコピー。

# cp ~/RPMS/SOURCES/apache_1.3.23-eapi-2.8.7.patch ~/RPMS/SOURCES/apache_1.3.26-eapi-2.8.7.patch
# cd ~/RPMS/SPECS/
# cp apache.spec apache-1.3.23.spec
とりあえず、spec ファイルをバージョンとリリースだけ編集。

## apache.spec ##

%define contentdir /var/www
%define mod_ssl_ver 2.8.7
%define piranha62 0
%define suexec_caller apache

Summary: The most widely used Web server on the Internet.
Name: apache
Version: 1.3.26
Release: 1
 …(以下そのまま)…
試しにこの状態でビルドコンパイルしてみる。

# rpm -bc apache.spec
 …(中略)…
+ echo 'Patch #2 (apache_1.3.26-eapi-2.8.7.patch):'
Patch #2 (apache_1.3.26-eapi-2.8.7.patch):
+ patch -p1 -b --suffix .eapi-2.8.7 -s
1 out of 1 hunk FAILED -- saving rejects to file src/ApacheCore.def.rej
1 out of 1 hunk FAILED -- saving rejects to file src/ap/Makefile.tmpl.rej
1 out of 7 hunks FAILED -- saving rejects to file src/modules/proxy/mod_proxy.c.rej
2 out of 4 hunks FAILED -- saving rejects to file src/modules/proxy/proxy_http.c.rej
エラー: Bad exit status from /var/tmp/rpm-tmp.26247 (%prep)


RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.26247 (%prep)
パッチあてでこけたようだ。元のソースと比較しながら ~/RPMS/SOURCES/apache_1.3.26-eapi-2.8.7.patch の該当個所を修正。たいていは行がずれてたり、インデントがずれていたりする程度。ただ、この修正が本当に適切かどうかはソース全部を読んでいないので分からない・・・。修正後、再度コンパイルチェック。

# rpm -bc apache.spec
 …(中略)…
make[1]: 出ます ディレクトリ `~/RPMS/BUILD/apache_1.3.26'
<=== src
+ exit 0
上手く通ったようなので、バイナリRPM を作成。暫定措置のつもりなので、とりあえずソースRPM は作らない。その後、ビルドした rpm をインストールする。インストやサービスの停止・起動には sudo コマンドを使うことにしたので、あらかじめ設定はしておいた。

# rpm -bb apache.spec             # バイナリ rpm をビルド
# sudo /sbin/service httpd stop   # 念の為 Apache を停止
Stopping httpd:                                            [  OK  ]
# sudo rpm -Uvh ../RPMS/i386/apache*.rpm
# sudo /sbin/service httpd start  # Apache を起動し直す
Starting httpd:                                            [  OK  ]

後はお掃除をして、アップデート完了。

# rpm --rmsource --clean apache.spec
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.71118
+ umask 022
+ cd ~/RPMS/BUILD
+ rm -rf apache_1.3.26
+ exit 0
で、今日になって米国 RedHat のほうにはエラータがでてる(日本はまだ)んだけど、1.3.23 なんかの既存バージョンへのパッチでのフィックスなんで、1.3.26 にアップデートしたあとからだとややこしいかも。


2002年5月12日
○ メール受信確認 Ver.2 【関連】メール受信確認
これもずいぶん前の内容。以前設定してからしばらくは問題なかったのだが、やはり問題が発生。同じ内容のメールが大量に来ていた。過去の経験上これはスクリプトに問題があると確信がある。スクリプトでエラーが出ると配送失敗となるため何度も再送処理を繰り返し、同じメールが何度も送られてしまう。まず qmail の吐き出すログを見てみる。(再現してみたもののログなので日付は新しい)

May 12 15:16:22 server qmail: 1021184182.988131 delivery 10: deferral:
 problem_connecting_to_"192.168.1.1",_port_23:_Connection_refused_at_./scripts/msg_led_on.pl_line_11/ 
エラーの内容は telnet接続がルータに拒否されているというもの。テストでは正常に接続できたし、実運用でも正常に動作した場合もあるのである特定の条件でエラーが出るのだろう。原因を調査してみるとどうやら複数通同時に受信したときにエラーがでているようだ。試しに ルータに telnetで接続した状態で別のマシンから telnet 接続しようとしてみると接続できない。ルータのプログラム簡素化のためにコネクションはひとつしか受け入れないのだろう。これらのことを考慮してスクリプトを修正してみた。

## msg_le_on.pl ##

#!/usr/bin/perl

use Net::Telnet;

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

$rthost = '192.168.1.1';   # ルータのアドレス
$pass = 'pass';            # ログインパスワード
$adminpass = 'adminpass';  # 管理者パスワード
$lockfile = '/var/www/temp/led_on';  # ロックファイル

# ロックチェック
if (-s $lockfile) { exit; }

# ロック
open(LOCK, ">$lockfile");
print LOCK 1;
close(LOCK);

$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ランプが点滅している時に受信しても telnet接続しないなどよりスマートになったと思う。MSGランプの点滅解除を行うスクリプトのほうもあわせて修正しておく。

## msgled_off.php ##

<?php
 mb_http_output("SJIS");

 $ch = curl_init("http://192.168.1.1/kantan/add/mailchk");  # ルータの点滅クリアページの URL
 $lockfile = "/var/www/temp/led_on";  # ロックファイル

 // ロックのチェック
 if (is_file($lockfile)) {
   if (filesize($lockfile) > 0) {
     // ロックの解除
     $fp = fopen($lockfile, "w");
     fclose($fp);

     // MSGランプ消灯
     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> 

← 前 BBS 次 →

△戻る ▲トップに戻る