タイトル/名前 | 更新者 | 更新日 |
---|---|---|
日記/2004/10/03/sendmailがaliasesから起動するスクリプトのUID, GID | msakamoto-sf | 2009-04-12 17:25:26 |
日記/2004/10/03/sendmailエラー "stat=unknown mailer error 2" | msakamoto-sf | 2009-04-12 17:24:06 |
日記/2004/10/06/MTU値が原因で長いメールが送れない(タイムアウト) | msakamoto-sf | 2009-04-12 16:51:52 |
日記/2004/11/05/sendmailの"makemap hash"メモ | msakamoto-sf | 2009-04-12 16:40:49 |
Perl/ローカルで動かすPerlCGIをGUIデバッグメモ | msakamoto-sf | 2009-04-12 16:26:10 |
日記/2004/12/28/Nz関数とIIf関数 | msakamoto-sf | 2009-04-12 16:14:19 |
日記/2004/12/29/Environ関数 | msakamoto-sf | 2009-04-12 16:11:21 |
技術/Linux/iptablesメモ | msakamoto-sf | 2009-04-12 16:03:35 |
JavaScript/Bookmarklet/ブラウザで表示中のページタイトルを取得 | msakamoto-sf | 2009-04-12 15:31:33 |
技術/sendmailメモ | msakamoto-sf | 2009-04-11 01:09:43 |
システムやコンパイル時のオプションによるのでしょうが、TurboLinux 7 Server では
ユーザー:mail
グループ:mail
で起動されます。
逆に言えば、違うユーザー権限で起動させたいときは setuid などしておく必要があります。
aliasesファイルなどで
foo: "|/usr/local/bin/bar.pl"
と指定した場合や、あるいは:include:で指定した先でスクリプトを起動していた場合に題名のようなエラーが表示され場合、十中八九スクリプトの起動エラーです。
スクリプトをフルパスで起動するなどして、sendmail が起動するのと同じ条件で起動してみて、正常に動作するか確認します。
":include:"使用時の注意というかメモですが、aliasesの :include: は、「宛先転送リスト」であるため、スクリプトを起動する場合は「宛先リスト」を返す必要があります。
つまりメーリングリストのためにあるようなものです。
逆に言えばリストを返さないようなスクリプトを起動するために使うのは宜しくない。
リストなど返さず、「喰わせて」別のシステムを起動するなどの目的では、素直に冒頭のような
baz: "|/usr/local/bin/script.pl"
形式を利用すべきです。
MTU値が原因でトラブったのでメモ。
JPEGを添付した巨大なmultipartメールを送信した場合に限り、送信時にクライアント側でタイムアウトが発生した。
ウィルスゲートウェイを備えたメールサーバから、送信先ドメインのメールサーバに送れない。ちなみに、送信先ドメインのメールサーバのプロセスを見てみると、データ送信で止まってるプロセスが出現する。
# ps aux ...sendmail: server virusgwbr.sppd.jp [210.136.111.234] child wait ...sendmail: ./i96CqhT26555 virusgwbr.sppd.jp [210.136.111.234]: DATA
そのうち、タイムアウトでこれらのプロセスは消える。
以前、知人が同様に「画像が送信できない」と困っていて、いろいろ調査したところTCPパケットの1500バイト前後の境界で現象が発生していた。MTU値を自動設定か1500に固定したかしたら直ったことがあったので、今回もMTU値を疑った。
色々調べた結果、以下のHPの通りMTU値を1454にしたところ解決した。
http://www.fiberbit.net/member/router/barwl.html
関連:
http://www.sendmail.org/tips/pathmtu.html
http://www.linuxjournal.com/article.php?sid=5507
※2009年現在、こうした話は最近はとんと聞かなくなった・・・。
sendmailで良く使う"makemap"コマンドについてメモ。aliasとかvirtusertableとかで良く使います。
もともと、makemap は sendmail に含まれるプログラムみたいです。ヘルプを読むとこんな風に使うようです。
$ makemap type mapname
"type" には hash や b-tree という内部データ構造の名前を指定します。大抵は"hash"を指定します。
"mapname" ですが、これはファイル名ではない点に注意です。
# makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
virtusertableの操作では上記のようなコマンドを実行しますが、ぱっと見、「virtusertableに上書きしてるのかな?」と思ってしまいます。
実際は "mapname" が "/etc/mail/virtusertable" で、makemapの方でお尻に".db"を付けて実際のファイル名にしています。つまり"/etc/mail/virtusertable.db" が実際に書き込まれるファイルになります。
makemapは標準入力からキー値(スペース)対応値を一行ずつ読み込んでって、「(mapname).db」というファイルにtypeで指定された形式で出力するプログラムです。
試しにファイル入力無しで動かしてみると、「入力してね」という内容のプロンプトが表示されます。
ダンプも用意されてます。
$ makemap type -u mapname
これで、undump できます。
# makemap hash -u /etc/mail/virtusertable
"mapname"ですので、間違っても "-u /etc/mail/virtusertable.db" とはなりません。(".../virtusertable.db.db" を読みに行ってしまいます)
以上。
この記事を書いている時点ではLinux/UNIX専用の技です。(Tcl/TkがXWindowsと通信できる環境が必要)
ローカルマシンでWebサーバを立ち上げて、PerlのCGIをデバッグするときに Devel::ptkdb を使ってGUIデバッガを立ち上げる手法です。
Devel::ptkdbを入れると、通常のPerlスクリプトであれば
$ perl -d:ptkdb ./hoge.pl
でGUIデバッグを利用できます。
これをCGIでも利用するには、PerlCGIの先頭行、スクリプトファイルの指定部分を下記のように-dオプションを付けます。
#!/usr/bin/perl -d:ptkdb
但し、このままではTcl/TkのGUIライブラリがXWindowsSystemと通信できませんので
$ xhost +localhost
で、ローカルホスト。つまり、CGIを起動するWebサーバからのアクセスを許可します。
IIf関数はC言語系での "?" と ":" による三項演算子のVB版です。
Nz関数を使うと、Null式を適当に""とか0にして返してくれるみたいです。便利。
というわけで、Nzのヘルプにこんな感じで短縮できますよー、というのが載ってました。
varTemp = IIf(IsNull(varFoo), 0, varFoo) varResult = IIf(varTemp > 50, "High", "Low")
これが、
varResult = IIf(Nz(varFoo) > 50, "High", "Low")
になるので非常に便利そうです。
仕事でAccessVBAの既存アプリのVBコード読んでるといろいろと新しい関数とかクラスとか勉強できて楽しいです。
Environ関数もその一つで、システムに設定された環境変数を取得する関数です。
基本的な使い方は
Environ(envstring)
で、envstringで指定されてる環境変数を返してくれます。もし設定されていなければ、長さ0の文字列を返します。
(但し、そもそもエントリ自体が存在しないのか、それとも""として設定されているのかの判別はこれだけではできない。)
Linuxのカーネルモジュールとして実装され、動作する。
Linux 2.2 : ipchains
Linux 2.4, 2.6 : iptables
Netfilterという仕組みを使うと、ipchainseの設定ファイルや機能を2.4でも利用可能。
iptablesの構成例 (TurboLinux Server 7)
なお、iptablesコマンドのオプションや設定ファイルの位置などは CentOS5.2 でも同様である。
参考:
(IPマスカレードの説明は省略)
"-L" オプションでINPUT(侵入), FORWARD(通過), OUTPUT(送出)に対する各チェインの設定を表示する。
# iptables -L
個別のチェインに対する設定を表示するには "-L" に続けてチェイン名を指定する。
# iptables -L [チェイン]
INPUTチェインに対して192.168.0.0/24からのICMPパケットを全て破棄するルールを追加する :
# iptables -A INPUT -s 192.168.0.0/24 -p icmp -j DROP
このルールを削除する :
# iptables -D INPUT -s 192.168.0.0/24 -p icmp -j DROP
"-L" で表示されるルール番号を指定して削除する :
# iptables -D [チェイン] [ルール番号]
# iptables -[ADC] チェイン ルール [オプション] # iptables -[RI] チェイン ルール番号 ルール [オプション] # iptables -D チェイン ルール番号 [オプション] # iptables -[LFZ] チェイン [オプション] # iptables -[NX] チェイン # iptables -P チェイン ターゲット(DROPとか。) [オプション] # iptables -E 既存のチェイン名 新規チェイン名
チェイン操作のオプション
-A (Append) 指定したチェインに新しいルールを追加 -D (Delete) ルールを削除 -R (Replace) 指定したチェインのルール番号を、新しいルールで置換 -I (Insert) ルール番号を指定して置換 -L (List) 指定したチェインのルールを表示 -F (Flush) 指定したチェインのルールを全て削除 -Z (Zero) チェインのカウンタをリセット(後述) -N (New Chain) 新しいチェインを作成 -X (Delete Chain) ルールが空のチェインを削除 -P (Policy) 指定したチェインのポリシーを設定 -E (Rename Chain) ユーザー定義のチェインの名前を変更
-s !localhost → localhost以外のパケットとマッチ
!否定は他のほとんどのオプションでも使える。
OUTPUTチェインには指定できない。
FORWARDには-i, -o 両方指定できる。
例: -i eth0
PPP接続などで、ppp0かppp1か分からない場合 :
-i ppp+
INPUTチェインには指定できない。
FORWARDチェインには-i, -o 両方指定できる。
指定方法は -i と同じ。
指定できるプロトコルはtcp, udp, icmp のいずれか。
大文字小文字の区別はない。
例 : --sportオプション
# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
次の二つの拡張オプションはTCP, UDP用です。
/etc/servicesファイルに記述されたポート番号又はサービス名を指定可能。
範囲を指定するには":"で区切る。
ポート番号2000から3000番を指定
--sport 2000:3000
ポート番号0 から1024番までを指定
--sport :1024
ポート番号1025 から 65535 までを指定
--sport 1025:
TCP, UDP, ICMP拡張を調べる :
# iptables -p tcp --help # iptables -p udp --help # iptables -p icmp --help
その他の拡張(mac, limit, owner, state等)を調べる :
# iptables -m mac --help
など。
条件にマッチしたパケットを処理方法を指定する。"-j"オプションの後に指定する。
代表的なターゲットを以下に示す。
"-N" オプションを使うと、ユーザが新しくチェインを作れる。
# iptables -N userchain
これでuserchain と言う名前のチェインが新しく作られた。
ルールの操作などでこのチェインを対象とするには、 "-j userchain" と指定する。
あるルールによって処理されたパケットの数をカウントするルール。設定するにはターゲットの指定を省略する。
OUTPUTチェインを通過したtcp 80番ポート(http) のパケットをカウントするように指定する :
# iptables -A OUTPUT -p tcp --sport 80
カウンターのリセットには-Zオプションを使う。
# iptables -Z OUTPUT
iptablesコマンドによる設定は一時的なもので、マシンをリブートすると消えてしまう。
通常は、
# /sbin/service iptables save
として、現在設定されているルールを/etc/sysconfig/iptablesに上書き保存できる。
好きなファイルに保存するには"iptables-save"コマンドを使う。
# iptables-save > ファイル名
緊急停止用として、ルールを全てリセットし、ポリシーを全てDROPにする :
# /etc/rc.d/init.d/iptables panic
否定の指定で、
!xxx.xxx.xxx.xxx
とすると×。
! xxx.xxx...
と言う風に、半角空白をいれる。シェルの変数が混ざっちゃう?
IE7, FF3, Opera9で動作確認。
javascript:void(prompt('title',document.title))
コピペし易いよう、プロンプトで表示してます。
PostfixやQmailなどのMTAデーモンが使われるようになったとはいえ、依然としてデフォルトのSMTPデーモンとしてsendmailがインストールされる場面もある。また古いサーバのメンテナンス時にも、sendmailを操作する場合がある。
sendmailは設定ファイルが難解であるが、より注意が必要なのは設定ファイルをm4マクロで処理する段であり、ディストリビューションのRPMによって設定ファイルの位置やm4マクロ処理の手順が異なる。ディストリビューションのマニュアル、乃至はsendmailのパッケージ構成をよく確認した上で、調整を行うこと。
また、sendmailコマンド単体でも色々な機能を使える。
http://www.linux.or.jp/JM/html/sendmail/man8/sendmail.8.html
例1 : /etc/rc.d/init.d/sendmailを使わずにとりあえず直接起動する
# /usr/sbin/sendmail -bd -q15m
"-bd"はデーモンとして起動するオプション、"-q15m"はキューにたまっているメールの再送を15分ごとに試みる意味。
例2 : アドレス定義内容のデバッグダンプ
# sendmail -bt -d0
例3 : ベリファイモード(aliasesファイルの展開の詳細報告など)
# sendmail -v user1