Landscape トップページ | < 前の月 2003-11 2003-12 次の月 2004-01 >

Landscape - エンジニアのメモ 2003-12

月ごとの記事一覧
2007年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2006年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2005年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2004年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2003年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2002年: 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
日ごとのページ
2003-12/ 1日 2日 3日 4日 5日 6日 7日 8日 9日 10日 11日 12日 13日 14日 15日 16日 17日 18日 19日 20日 21日 22日 23日 24日 25日 26日 27日 28日 29日 30日 31日

2003-12-29 (Mon)

* 過去記事をすべて載せた RSS で何をやってたか

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [RSS]

ここ数日の間、chalow による RSS 出力や、Bullkfeeds、RSS で遊んでいた。データが多いほうがやりやすかったので、巨大な RSS を作っていたというわけだ。今は年賀状を書きつつ、過去の記事を読み返して2003年を振り返ったり、ちょこちょこと過去の記事を直したりしている。

- glucose

いくつか RSS リーダを使用してみたのだが、一番使いやすかったのが glucose というツールだ。

glucose
http://glucose.dip.jp/Zope
・日本語完全対応で文字化けなし。
・無料で使用できる。RSS リーダにはなぜかシェアウェアが多い。
・エントリのソートができる。Mozilla + rssreader ではソートできなかった。

chalow でメモを取ると、「* RSS: RSS の使い道」のように、アイテムはカテゴリ名で始まる。で、これが 「* メモ: 」だったり「* memo: 」だったり 「* 雑記: 」だったりと表記揺れが起きる。表記揺れを少なくするには、全体を見渡して再分類するのが良い。しかし、それには全体を楽に見渡せるブラウザが必要だ。glucose ならできる。

- unix 環境にはいいブラウザやスクリプトがあるのに、と言われるかもしれないけど

仕事場では Linux を使えるが、家のメインマシンは windows だ。Debian woody もあるけど、常時立ち上げてる訳じゃない。こういう状況だと、Windows + 秀丸 + Cygwin + chalow という組み合わせになる。こんな環境でコマンドラインで grep したりすると、対象ファイルとコンソールの文字コードが一致しないときに文字化けしたりする。DOS プロンプトを無理矢理 bash 化しただけのコンソールだとどうも使いにくい。

- まだ RSS リーダよりも Web ブラウザでいい

RSS リーダを使ってみて感じたのは、ウェブサイトをブラウズするには、まだ RSS リーダよりもブラウザの方が便利と言うことだ。なんか当たり前のことを言ってるようだが、実際そう感じたんだから仕方がない。RSS ならではの便利な使い方が見いだせないのだ。たいていのニュースサイトでは直近の記事のヘッドラインを載せてる。はてなアンテナのような更新チェッカーがある。RSS リーダが提供する機能は、今の Web ブラウザ自体の機能、各種ツール、ウェブサイト作成側の配慮という要素の組み合わせでなんとか実現できてしまう。

2ちゃんねるブラウザを初めて使ったとき、メール欄表示やレスポップアップ、未読既読管理、画像ファイルへのリンクをインライン画像として展開するといった機能が便利で手放せなくなった。使い勝手が天と地ほどに違っていた。しかし、RSS にはそれがない。

RSS だと、ヘッドラインしか提供されてない場合が多いことも問題。記事を読みたいのに、見出ししか取得できないんでは魅力も半減する。かといって、過去記事全部を RSS 化すると、処理が重くなるというデメリットがある。

- その他現状の不満点を列挙

そのサイトが RSS を提供しているかどうかを探すのが大変
RSS をリーダーに登録するのが手間
記事を表示するときの見た目をユーザ側でカスタマイズしたい
見た目をカスタマイズしたいけど、スタイルシートを書いたりするのは面倒 <- 勝手だなあ
ブラウザとリーダを統合するか連携してほしい <- Mozilla + rssreader は良いアプローチだと思う

リーダ側の機能追加で対処できそうな問題ではあると思う。

* サイズの小さい RSS と大きい RSS を用意しました

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [RSS]

- ごめんなさい

http://nais.to/hiki/?Chalow%A5%B5%A5%DD%A1%BC%A5%C8%A5%DA%A1 ...
2003-12-29 (月) 02:05:12 yto : そういえば、Bulkfeedsの中の人が、Landscape の RSS がでかくて処理重め、と言ってました。RSS 1.0 はサイズ制限はないので、仕様上は問題ないのですが。

ごめんなさい。Lanscape の RSS は過去すべての記事を RSS 化していたため、250KB 弱という巨大なサイズになっていました。これが原因で処理が重くなってしまっていたようです。今後は トップページの記事の分だけを出力したものと、すべてを出力したものの両方を用意しました。Bullkfeeds には軽い方を登録します。

トップページの記事だけを載せた RSS
http://sonic64.hp.infoseek.co.jp/cl.xml

過去すべての記事を載せた RSS。
http://sonic64.hp.infoseek.co.jp/cl-full.xml

追記。
sonic64.com へのサイト移転に伴い、RSS の URL も変更になった。

直近7日分の記事全文の RSS
http://sonic64.com/cl.xml

過去の全記事全文の RSS
http://sonic64.com/cl-full.xml

2003-12-27 (Sat)

* 続・ブラウザに欲しい機能 RakuCopy

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

2003-12-20 の「ブラウザに欲しい機能」を見てくださった方から反応があったので試してみた。

読書記録ChangeLog
http://www.h6.dion.ne.jp/~osamu03/diary/2003-12.html#2003-12 ...
> メモ: ブラウザに欲しい機能
> ・タイトルと URL をコピー
> ・指定文字列をハイライト
> ・すでにハイライトしている文字列がある場合に、指定文字列を追加でハイライト

Donut RAPTの と
RakuCopyじゃまずいのかな?

ハイライトについては言葉足らずでした。右クリックメニューからハイライトしたかったんです。ちょうど文字列のコピーのような感じです。ハイライトしたい文字列を選択状態にして、右クリックして、ハイライト機能を呼び出すといった感じです。Donut や Sleipnir や Google Toolbar ではできませんでした。

RakuCopy は大当たりです。こんな機能が欲しかったんです。これで、ChangeLog 書くときやメールでサイトの URL を教えるときに2回コピーする手間が省けます。
RakuCopy
http://a-h.parfe.jp/rakucopy/rakucopy.html

* 年賀状書かなきゃ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

そろそろ年賀状書かなきゃね。仕事関係の方だけだけど。私的なつきあいのある人はみんな e-mail でいいから楽です。さて、仕事場からメールしておいた住所録を開いて・・・って、これ MS Excel じゃん。そんなツールは私のマシンには入ってません。29日の仕事納めで仕事場に行くから、そこでプレーンテキストにすればいいんだけど、この土日で書き上げたいからなあ。うーん、そういえば去年も同じことで悩んだ気がするな。
あ、OpenOffice.org 使えば良いのか。早速ダウンロードしよう。

- OpenOffice.org のダウンロード とインストール。

Google で OpenOffice.org を検索したら、検索結果が一件。あ、ドメイン検索と解釈されちゃったのか。「OpenOffice.org を含むページを検索」して解決。ダウンロードは近くの RingServer から。
http://ring.pwd.ne.jp/pub/misc/openoffice/localized/ja/
おお、いつの間にか 1.1.0 が出てる。69.2MB か。1.5Mbps の ADSL だと10分以上かかるな。
インストーラは日本語で、非常にわかりやすい。1分ほどでインストールも完了。

- 起動してエクセルのファイルを読ませてみる

xls ファイルの関連づけも OpenOffice.org になっているため、ダブルクリックで開けた。さて、きちんと表示されるかな・・・。おおっ、バッチリだ。やったー。

- 宛名は手書き

あとはこれを元に、宛名を手書きすれば年賀状は完成だ。「そのまま宛名書きも PC にやらせればいいじゃん」という意見も聞こえてきそうだが、そこまでやるんだったら最初から e-mail にする。宛名とコメントくらいは丹誠込めて手で書くべきだと思う。年賀状をもらって最初に見るのは、裏面の手書きコメントとかプリクラの部分だ。要するに、大量生産されてる部分はあまり目を引かない。で、コメントを読み終わって何気なく表面を見る。すると自分の名前が書かれてるわけだが、それが手書きになってると、自分のために時間を割いて名前を書いてくれたんだなあ、とちょっとうれしくなる。そのために宛名を手書きするのだ。

2003-12-26 (Fri)

* 外向き SSL を dropしても SoftEther は止められない

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [セキュリティ]

stone や SoftEther をはじめとするトンネリングツールを使わせないために、外部への SSL を全部 drop しちゃえ、という書き込みをいろんなところで見かけた。多少は効果はあると思うが、デメリットが多すぎる。出張の切符手配サイトとか、財形預金サイトとか、少額備品購入とか、401K の運用指図サイトとか、SSL を使ってるサービスはいろいろ考えられるな。確認してないけど、Windows Update も SSL 使ってるそうな。デメリットを許容できるからといって drop したとしても、またすぐ他のトンネリング方法が出てきてイタチごっこになる。管理者側のとるべき対策は、組織内規定の強化、啓蒙と教育なんじゃないかな。

2003-12-25 (Thu)

* RSS の channel 要素の link 要素の末尾には / 不要?

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [RSS]

chalow.0.22 には RSS 出力がある。設定ファイルの cl.conf で channel 要素の子要素の link 要素に設定する値を決められるが、なぜか末尾の / は不要とされている。
# ChangeLog を公開する URL (相対 URL 不可) - RSS に必要
# 末尾の "/" は不要
$clog_url = q(http://sonic64.hp.infoseek.co.jp);
現時点では上記記述に従って / を省いた URL を書いているが、Blukfeeds に登録されているサイトの RSS を見ると、ファイルを指定しているサイトを除き、ほとんどのサイトで / を付けている。Google で rss 1.0 link channel 末尾 スラッシュ を検索したが、とくに根拠を見つけられなかった。何でだろう?

RSS -- サイト情報の要約と公開
http://www.kanzaki.com/docs/sw/rss.html

- もしかして単に実装を簡潔にするため?

$clog_url = q(http://sonic64.hp.infoseek.co.jp/);
と試しに / を付けてみたところ、出力された RSS が以下のようになってしまった。
<rdf:li resource="http://sonic64.hp.infoseek.co.jp//2003-12.html#2003-12-25-4" />
write_rss() で定義している RSS のテンプレートを見てみると、$clog_url を直に埋め込んでいる。
<channel rdf:about="$clog_url/cl.rdf">
<title>$changelog_name</title>
<link>$clog_url/</link>
$clog_url/cl.rdf と書いた場合、/ は変数名として使えないので、perl は / より前を変数名、/ より後を文字列として解釈してくれる。つまり、文字列中に直で変数の中身を埋め込める訳だ。sprintf() を使ったり、文字列と変数を . で連結したりといった手間を省けるので、/を付けているのではないだろうか? 楽をするための道具として perl を使うなら、これは十分許容範囲だと思う。http アクセスが増えてしまうといったデメリットはあるが、致命的ではない。

* chalow を Bulkfeeds 対応にする

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [chalow]

Bulkfeeds で *** を検索 と書いたときに、自動的にリンクする機能を chalow に追加するとしよう。2003-08-28 で作った Google リンク作成機能の bulkfeeds 版だな。

- テスト

bulkfeeds で linux を検索
Bulkfeeds で 日本語 を検索

おや、日本語検索がうまくいかないな。Server is busy が返ってくる。クエリが euc だからダメなのかな。
euc で「日本語」を検索
http://bulkfeeds.net/app/search2?sort=score&amp;q=%c6%fc ...
じゃあ Jcode で utf-8 に変換してみよう。・・・よし、うまく動いた。

s!(bulkfeeds\s*で\s*(.+?)\s*(を|で)検索)!"<a href=\"http://bulkfeeds.net/app/search2?sort=score&amp;q=" . url_encode(Jcode->new($2)->utf8) . "\" title=\"Bulkfeeds 検索: $2\">$1</a>"!eig;

* RSS 収集・検索サイト Bulkfeeds

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

Bulkfeeds
http://bulkfeeds.net/
登録件数がすごい。登録サイト数26000件以上。記事数は20万越え。ただ、RSS ならではのサービスがある訳ではない。Namazu を使った全文検索も最近始めたようだが、Google があればいい。もっとも、情報の鮮度が高いということと、データが RSS なので記事一覧や広告などのノイズが混じらないという利点はある。今後、なにか面白いサービスが出てきそうな予感がする。
そういえば、Namazu は utf-8 の文書をうまく扱えなかった気がする。bulkfeeds の内部では euc に変換してるのかな。

Bulkfeeds は RSS Feed のディレクトリサービスです。日本国内で Syndicate されている RSS を検索できます。2003/12/25 09:15 現在 26,251 件の RSS が登録され、208,508 件の item がインデクスされています。

* 仕事場の ChangeLog メモもヘッドラインを追加して模様替え

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

昨日家で書いたコードを仕事場の chalow にも反映させた。やっぱり記事一覧があると便利。つらつらと眺めて、何かおもしろそうな記事を見つける楽しみがある。まあ自分の書いたメモなんだけどね。次はカテゴリ別一覧でも作ろうかな。Perl: とか Linux: とか、カテゴリ毎に記事を一覧表示するページ。ちょっと欲しい。

2003-12-24 (Wed)

* 命名 Landscape

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

このメモの名前を決めた。Landscape という名前にした。Robert Miles の アルバム DreamLand に収録されてる名曲 Landscape から名前をもらった。

DreamlandDreamland

Robert Miles
発売日: 1996/07/30


amazon で詳しく見る

* Chalow にヘッドライン出力機能を追加

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

ヘッドライン出力機能を Chalow に追加してみた。ヘッドラインとは、最新の記事の見出しを段組で表示するもの。古くは「事件簿テーマ」で実装され、今ではほとんどの日記ツール・Weblogツールが装備している。Chalow でも「くっつきRSS」などを使えば同様のことはできるが、ChangeLog メモ変換ツールとしては静的な html を出力してくれた方が使いやすいし、ユーザのアクセス環境に左右されにくいと思う。

ということでヘッドラインを生成する関数を作成した。インデックスぺージ生成関数と月別ページ作成関数に、作成したヘッドラインと各ページのテンプレートに仕込んでおいたマーカーを置換するロジックを追加して一丁上がり。

本当は 自分好みの ChangeLog メモ変換ツールを一から作ろうかと思った。でも、chalow を修正すればとりあえずやりたいことはできるようになったので、ここで切り上げることにした。chalow は関数化とモジュール化を進めればコードの見通しがかなり良くなると思うんだけどなあ。いずれ ruby か何かで書いてみようかな。

# ヘッドラインを生成する
sub make_headline {
    my $MAX_DATE = 90;
    my $tmplt_item_header = qq(<li class="headline_li"><a href="%s.html#%s-%d">%s</a></li>\n);
    my $tmplt_item_list = qq(<dd class="headline_dd">\n<ul class="headline_ul">\n%s</ul>\n</dd>\n);
    my $tmplt_item_dt = qq(<dt class="headline_dt"><a href="%s.html#%s">%s</a></dt>\n);
    my $tmplt_item_dl = qq(<dl class="headline_dl">%s</dl>\n);

    my $headline = '';
        my $cnt = $MAX_DATE;
    foreach my $ymd (sort {$b cmp $a} keys %all_entries) {
        last if (! $cnt);
        my $lists = '';
        my ($ym) = ($ymd =~ /^(\d{4}-\d\d)-\d\d/);
        foreach my $i (sort {$b <=> $a} keys %{$all_entries{$ymd}}) {
            next if ($i !~ /^\d/);
            my $c = $all_entries{$ymd}{$i}{h};
            $c =~ s/[\n\t]+//g; # 改行消し
            $c =~ s/\s\s+/ /g;
            $c =~ s|<img.+?alt="(.*?)".*?>|[$1]|gosm;
            $c =~ s/<.+?>//g; # タグ抜き
            $c =~ s/\* //;
            $c =~ s/\s+$//;
            $lists .= sprintf($tmplt_item_header, $ym, $ymd, $i, $c);
        }
        $headline .= sprintf($tmplt_item_dt, $ym, $ymd, $ymd);
        $headline .= sprintf($tmplt_item_list, $lists);
        --$cnt;
    }
    return sprintf($tmplt_item_dl, $headline);
}

* 自分好みの ChangeLog メモ変換ツール

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ChangeLog メモ]

過去に何度か考えたことだが、自分好みの ChangeLog 変換ツールを作りたくなってきた。せっかくゼロから作るんだったら、思いっきり趣味に走ってもいいかと思う。
cygwin で動けばいいから、Ruby で書こうかな。

* プログラマのためのSQL 第2版

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [] [SQL]

プログラマのためのSQL 第2版プログラマのためのSQL 第2版

ジョー セルコ / Joe Celko / 秋田 昌幸
発売日: 2001/04


amazon で詳しく見る   bk1で詳しく見る

SQL 利用経験が一年以上の初級者から中級者向けの本とのこと。

2003-12-23 (Tue)

* Bulkfeeds に登録してみた

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [RSS]

bulkfeeds は RSS を登録したり、検索したりできるサイト。

Landscape を登録すると、Bulkfeeds から25995という番号をもらった。登録すると以下のようにしてサイトの情報を確認できる。

Bulkfeeds: Landscape - RSS Directory & Search
http://bulkfeeds.net/app/view/25995.html (直近7日分の全文)
http://bulkfeeds.net/app/view/544703.html (全記事全文)

sonic64.com に移転してからは http://bulkfeeds.net/app/view/1444933.htmlhttp://bulkfeeds.net/app/view?u=http%3A%2F%2Fsonic64.com%2Fc ... および http://bulkfeeds.net/app/view/1767907.htmlhttp://bulkfeeds.net/app/view?u=http%3A%2F%2Fsonic64.com%2Fc ... になった。

- サイトの登録と更新通知

Bulkfeeds: Developer's API - RSS Directory & Search
http://bulkfeeds.net/app/developer.html

Bulkfeeds への登録・更新通知は、
XML-RPC weblogUpdates.ping で通知する方法と、単なる HTTP で通知する方法がある。
HTTP で通知する方だと、 http://bulkfeeds.net/app/add.xml?url=http://sonic64.com/cl.x ...
に HTTP GET するだけなので楽。ブラウザでリンクをクリックしても良いし、http リクエストを投げるスクリプトを作っても良い。この方針で行こう。

- wget で更新通知 URL をアクセスする

以下を、Landscape 更新用シェルスクリプトに組み込んだ。
$ wget -q -O - http://bulkfeeds.net/app/add.xml?url=http://sonic64.com/cl.xml

上記リクエストを送ったとき、 bulkfeeds から返ってくるレスポンス。
<?xml version="1.0" encoding="UTF-8" ?>
<result>

<successes>

<success about="http://bulkfeeds.net/app/view/25995.html">
http://sonic64.com/cl.xml</success>

</successes>

</result>

* Debian GNU/Linux スレッドテンプレ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

http://debian.fam.cx/

FAQ の「インストールについて」が乱雑になっていたので、インストールメディア別に整理してみた。Wiki って簡単でいいなあ。
http://debian.fam.cx/index.php?FAQ

2003-12-22 (Mon)

* infoseekにインストールされてるPerlモジュール一覧

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

2003-12-21 (Sun)

* SoftEhterをガードしたいならば…

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

http://on-o.com/page/diary/20031223.html#p05
「over httpsだと、ブロックできないので管理者大変」と各地で騒がれているけど、仮想Hubは接続したときに、「SoftEther Protocol」って答えるから、これを見て落とせばOKなのにね。

2003-12-20 (Sat)

* ブラウザに欲しい機能

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

・タイトルと URL をコピー
・指定文字列をハイライト
・すでにハイライトしている文字列がある場合に、指定文字列を追加でハイライト

2003-12-19 (Fri)

* SoftEther

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ソフトウェア]

http://tmp2.2ch.net/test/read.cgi/download/1071460423/529-
このツール、「別のプロバイダの友達と Windows のファイル共有
やりたいんだけど、どうすればいいの?」とか聞いてくる素人には
良いツールなんだろうな。
ただ、download 板的なファイル共有だけを考えると、あまり便利じゃない。

MX とかのファイル交換ツールを使った方が機能の面で有利。
共有への追加や削除、検索、IM、帯域制限、接続数制限など、
共有・交換ツールは統一的なインターフェイスを提供している。

もっとも、SoftEther と何かのツールを組み合わせれば実現できるけどね。
ファイル共有は Windows のファイル共有
IM は IP messanger
帯域制限は SafeNy
接続数制限は・・・ Windows のファイル共有の設定にあったっけ?
検索は面倒だけど エクスプローラでやる。

2003-12-18 (Thu)

* せんべい食べ比べ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [] [お菓子]

- お醤油屋さんのつけやき

茨城県関口醸造。一袋10枚入り。カワチ三の沢店で188円。
「生醤油を二度づけしている」とのこと。確かに醤油の強い風味を感じる。口に入れて舌にせんべいが触れると、それだけで醤油味が口中にわっと広がる。旨い。味が濃いので、お茶と一緒に食べたいところ。

- 新潟仕込み

カワチ三の沢店で188円。わずかに甘みを感じる。かなり薄い。

- うまい煎餅

大きめの堅焼き。食べ応えがあり、香ばしくて旨い。

2003-12-17 (Wed)

* [PRB] HtmlInputFile サーバー コントロールを使用するとサイズの大きなファイルをアップロードできない

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [.net]

http://support.microsoft.com/default.aspx?scid=http://www.mi ...
デフォルトでは 4MB まで。aspx でファイルアップロードするコードを書いてうまく動かないので調べたらこの問題だった。

2003-12-16 (Tue)

* Delphi の Indy で HTTP の拡張ヘッダを扱う

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Delphi]

- 拡張レスポンスヘッダの取得

拡張レスポンスヘッダは RawHeaders オブジェクトから取得する。
str := IdHTTP1.Response.RawHeaders.Values['X-SpecialResponse'];

- 拡張リクエストヘッダの設定

拡張リクエストヘッダは CustomHeaders.Add() を利用して設定する。
IdHTTP1.Request.CustomHeaders.Add('X-SpecialRequest: F-ZERO GX');

- CustomHeaders からは取得できない

レスポンスヘッダの取得は CustomHeaders オブジェクトでもできるかなと思ってアクセスしたが、Indy ver 9.0.0.10 では取得できなかった。IdHTTP1.Response.CustomHeaders.Count も 0 だった。マニュアルを読み試行錯誤した結果、RawHeaders でないとダメと言うことがわかった。RawHeaders だけでなく CustomHeaders でも取得できても良いと思うんだけどなあ。

以下の方法では取得できない。
// NG
str := IdHTTP1.Response.CustomHeaders.Values['X-SpecialResponse'];

* procmail Insufficient privileges エラー

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

procmail がエラーを出している。

/var/tmp/dead.letter にエラーが記録されていた。
Dec 16 16:01:03 pro procmail[15195]: Insufficient privileges to deliver to "root"
Dec 16 16:01:03 pro sendmail[15194]: QAA15185: QAA15194: DSN: Insufficient permission

Google で Insufficient privileges to deliver to で検索するとヒット。
[linux-users:82563] Re: sendmail and procmail help me
http://search.luky.org/linux-users.8/msg02563.html
要するに procmail は root 権限がないと正常に動作しないよ、ということか。

root 権限で動作させるためには、setuid などの仕組みを使う。sticky bit や setuid などは普段意識していないため調べてみた。

UNIXの部屋 検索結果 chmod
http://x68000.startshop.co.jp/~68user/unix/pickup?keyword=ch ...
4000 user s-bit を立てる (setuid・suid)
2000 group s-bitを立てる (setgid・sgid)
1000 sticky bit を立てる

というものがある。

% chmod 4755 file

あるいは

% chmod u+sx file

で setuid を立てることができ、

% chmod 2755 file

あるいは

% chmod g+sx file

で setgid を立てられる。setuid・setgid の意味については setuid の項を参照してほしい。
(用語集 setuid *)

sticky bit というのは、ディレクトリの下にあるファイルの削除に関する設定である。例えば /tmp ディレクトリを考えてみよう。/tmp は一時ファイルを作成するためのディレクトリで、誰でもファイル・ディレクトリを作成できる。しかし /tmp のパーミッションを 777 にすると、あるユーザが作ったファイルを他のユーザが消すことができてしまう。そこで /tmp のパーミッションを 777 にし、さらに sticky bit を立てる。すると、

誰でもそのディレクトリの下にファイル・ディレクトリを新規作成できる
しかし、それを消せるのは作成したユーザ (ファイル・ディレクトリのオーナー) のみ
となる。実際、/tmp は sticky bit が立っている。

% ls -ld /tmp
drwxrwxrwt 7 bin bin 1024 Oct 10 10:24 /tmp

最後の「rwt」の「t」が sticky bit を表している。

% chmod 1777 dir
% chmod a+rwxt dir

などで sticky bit を ON にできる。

setuid 特定の権限でコマンドを実行する仕組み (suid・s-bit・sbit)
http://x68000.q-e-d.net/~68user/unix/pickup?setuid

* SoftEther

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [メモ]

SoftEther.com - よくある質問と回答
http://www.softether.com/jp/qanda/
を読んでみたが、結局 HTTPS で CONNECT メソッド使ってトンネリングしてるだけ。
似たようなことは stone とかで可能。
http://www.gcd.org/sengoku/stone/Welcome.ja.html

ただ、レイヤ2をトンネリングしてるというところは新しい。
パフォーマンス的・セキュリティ的には心配だけど。

2003-12-15 (Mon)

* procmail が sendmail にメールを渡すときにエラー

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

procmail が sendmail にメールを渡すときに、
procmail: Error while writing to "/usr/sbin/sendmail"
というエラーが出ることがある。
エラーになるメールを調べてみると、以下の共通点があることがわかった。To: には数百人の名前が指定されており、サイズも 50KB を超える。また、E-Mail アドレスにマルチバイト文字列を使っているユーザがいる。どちらが原因になっているかはわからないので、まずはマルチバイト文字を削除してから sendmail に渡すようフィルタを書いてみることにする。

- 対象となる文字列

<Unknown_Internet_Mail_Address@10.3.50.200>,
"=?ISO-2022-JP?B?GyRCQX4kJCQiJHMkQSQvJDckZyQmGyhC?="
<マルチバイトの文字列>,
これを以下のように置換する。
<Unknown_Internet_Mail_Address@10.3.50.200>,
"=?ISO-2022-JP?B?GyRCQX4kJCQiJHMkQSQvJDckZyQmGyhC?="
<NGSTRING_nn_NGSTRING>,

- スクリプトを書いて試してみる

久々の one liner だ。ちょっとマッチする範囲が大きすぎるかもしれない。
|perl -pe 's/<(\W+)>/"<NGSTRING_" . unpack("H2", $1) . "_NGSTRING>"/eg;'
上記フィルタを .procmailrc に入れて試してみたが効果がない。やはり To: の数が多すぎるのか。では、ヘッダが大きすぎるとき To: を削除するフィルタを書くとしよう。
|perl -0777 -pe 's/(To: .*?),.*?(?=^\w)/$1\n/sm;'
procmail は一通ごとにフィルタを起動するので、正規表現の g オプションは付けない。

上記フィルタを組み込んだところ、正常動作するようになった。フィルタ発動の閾値は、ヘッダが 8192 バイトを超えた場合とした。
PATH=/usr/bin:/usr/sbin:/usr/ucb:/usr/local/bin:/pub/bin:.
LOGFILE=$HOME/log/procmail.log

# ヘッダだけを対象にしたフィルタ
:0 fhH
* > 8192
|perl -0777 -pe 's/^(To: .*?),.*?(?=^\w)/$1\n/sm;'
# |perl -pe 's/<(\W+)>/"<NGSTRING_" . unpack("H2", $1) . "_NGSTRING>"/eg;'

:0
! saitou-hiroaki@example.co.jp

2003-12-14 (Sun)

* fetchmail がログを出力してくれない

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

fetchmail にログを出力させるために、.fetchmailrc に以下を記述したが、ログが出力されない。
set logfile "/home/hiroaki/log/fetchmail/fetchmail_setlogfile.log"

文法が間違ってるのかな、と思って Google で set logfile fetchmailrc を検索したところヒット。文法は正しかったが、fetchmail の仕様で出力されなかったようだ。

[debian-users:37402] Re: fetchmail の log機能
http://lists.debian.or.jp/debian-users/200306/msg00175.html
$ man -LC fetchmail
[...]
      The -L <filename> or --logfile <filename> option
      (keyword: set logfile) allows you to redirect status
      messages emitted while detached into a specified
                        ^^^^^^^^^^^^^^
      logfile (follow the option with the logfile name).
[...]

ということで detach、言い換えると background(あるいは
daemon) として動作しないとログをファイルに記録しないことが仕
様のようです。

松田陽一さんの ~/.fetchmailrc の内容は分かりませんが
"fetchmail --logfile ~/fetchmaillog -v -v" でデーモン動作し
ないならログファイルが存在しないときログをファイルに記録しな
いことになりそうです。

ちなみに私は fetchmail をデーモン動作させて使用していますが、
『ログファイルは「なければ自動的に作成」』しています。

ログファイルが存在するとデーモン動作させなくてもログをファイ
ルに記録しますよね? 一貫性がなくてなんだか良く分からない仕様・
動作ではあります。はい。

2003-12-13 (Sat)

* delegate / ftp server 間の接続方法を強制する

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [ftp]

以下の環境の時、delegate <-> ftp server の接続方法を強制する。
client <-> delegate <-> ftp server

- 何のためにこの設定をするのか?

たとえば、途中に ファイアウォールがあるため、pasv で接続しようとすると弾かれてしまう場合、この設定をすることで ftp 接続を確立できるようになる。

- 設定方法

delegate 起動時のオプションに、FTPCONF=nopasv を追加する。
/usr/local/bin/delegated SERVER=ftp VARDIR=/var/delegate ADMIN="admin@example.com" FTPCONF=nopasv

DeleGate version 8.7 リファレンスマニュアル の日本語訳
http://irish.ubiq.reset.jp/docs/Manual.htm#FTPCONF
FTPCONF parameter*  ==    FTPCONF=ftpControl[:{sv|cl}]
       ftpControl  ==  nopasv | noport | noxdc | rawxdc
           --    default: none

nopasv
データ接続の PASV コマンドを使用不可とする。
noport
データ接続の PORT コマンドを使用不可とする。
noxdc
制御接続で、データ伝送の XDC モードを使用不可にする。
rawxdc
XDC モードにおいて、伝送データをBASE64エンコードしない。
上で列挙された ftpControl は、"nopasv:sv" のように ":sv" または ":cl" がつづく場合、例えば、ftpControl は、それぞれ、サーバ側、または、クライアント側のみに適用されます。

2003-12-12 (Fri)

* 添付ファイル付きメールをコマンドラインから送信

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

cron で定期的に添付ファイル付きメールを送りたい。
添付ファイルは tar で生成する。さて、メールをどうやって生成しよう。普段ならスクリプトを書くところだが、今日はあり合わせのコマンド群でできるならそれを使いたい気分。
早速 Google で linux コマンドライン 添付ファイル メール 送信を検索。linux-users の記事などがヒット。いくつかスクリプトやコマンドが紹介されていたが、mpack というツールを使うことにした。

[linux-users:83133] Re: sendmailで添付ファイルをつけて送れるか?
http://search.luky.org/linux-users.8/msg03133.html

mpack
ftp://ftp.andrew.cmu.edu/pub/mpack/

メール本文を指定できないとか、いくつか不満はあるがとりあえずはこれでもいい。
#!/bin/sh
tar -C /home/hiroaki/ log.txt chalow-0.20 script public_html/log -Ivcf /home/hiroaki/changelog.tar.bz2 >/dev/null
mpack -s "[ChangeLog Pack] `date`" /home/hiroaki/changelog.tar.bz2 example@example.com

・・・と思ったが、from を指定できないのはダメだな。やはりスクリプトを書かなければならないか・・・。

- 2004-10-09 追記

Ruby 1.8 の標準ライブラリだけで動作する添付ファイル付きメール送信スクリプトを 2004-10-09 に書いた。

2003-12-11 (Thu)

* You have mail と表示してるのは誰かを調査

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

2003-12-08 に fetchmail + procmail を導入して以来、ログイン時に You have mail と言われるようになった。pro は外部からの smtp を受け付けないし、メールを受け取るような cron も設定していない。いったいどこからメールが来てるんだろう、と不思議に思って調べると、.procmailrc に
:0 c
とルールを記述していたため、ローカルのメールボックスにメールを残しつつ転送するようになっていたことが原因だとわかった。どこかのウェブページにあった .procmailrc を、内容を吟味せずにほとんどそのまま使ってしまったので当然の結果だ。

- You have mail って誰が言ってるの?

ところで、You have mail って誰が出してるメッセージなんだろう、と思って調べてみた。
ログインしたときに出てる訳だから、ログイン時に実行されるスクリプトあたりだろうか、と推測し、/etc/profile, /etc/bashrc, $HOME/.login, $HOME/.bash_profile, $HOME/.bashrc を調べてみたが、どこにもそれらしきスクリプトは無かった。唯一 /etc/profile に
USER=`id -un`
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
というメールスプールのパスを設定している記述があるだけだ。

もうこうなったら Google に聞くしかない。Google で ログイン "you have mail" を検索すると、JM のページがトップでヒット。

Manpage of LOGIN
http://www.linux.or.jp/JM/html/shadow/man1/login.1.html
ログインに成功すると、システムメッセージやメールの有無が表示される。ログインディレクトリに長さ 0 のファイル .hushlogin を作っておけば、システムメッセージファイルである /etc/motd の表示を無効にできる。メールに関するメッセージは、メールボックスの状態によって "You have new mail.", "You have mail.", "No Mail." のいずれかになる。

なるほど、login コマンドそのものが出力していたのか。でも、「メールボックスの状態によって」というのが気になる。どんな状態だとどのメッセージが出るのかはわからなかった。login のソースを読むのが近道かなあ。

2003-12-10 (Wed)

* Perl の POSIX モジュールの strftime()

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Perl]

2003-10-29 に date コマンドって超便利というメモを書いたが、perl でも類似のことができることがわかった。
$ perl -MPOSIX -e 'print strftime "%Y-%m-%d %H:%M", localtime;'
2003-12-10 14:09
chalow で使っているやり方だ。

2003-12-09 (Tue)

* delegate 構築メモ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [ftp]

以前作ったメモを発掘。2002年6月11日の時点では ChangeLog メモを使ってなかったので未収録だった。
delegate 構築メモ

作成者 : 齋藤宏明 (example@example.com)
作成日 : 2002年06月11日

ダウンロードとインストール :
http://www.delegate.org/delegate/ から DeleGate/7.9.5 (May 22, 2002) 、
delegate7.9.5.tar.gz をダウンロードした。

tar ball を展開。
[hiroaki@sonic hiroaki]$ tar zxvf delegate7.9.5.tar.gz
[hiroaki@sonic hiroaki]$ cd delegate7.9.5

configure なしでいきなり make
[hiroaki@sonic delegate7.9.5]$ make

Enter your E-mail address [hiroaki@sonic]: example@example.com
で、メールアドレスを入力。

あとは自動的に make が進む。

src/delegated がバイナリ。これを /usr/local/bin にコピーする。

/var/delegate を作成。
/var/delegate/log を作成
/var/delegate/work を作成。

起動用スクリプト /etc/rc.d/init.d/delegated.rc を作成。
#!/bin/sh
/usr/local/bin/delegated SERVER=ftp VARDIR=/var/delegate ADMIN="example@example.com" MAXIMA=delegated:32

inetd と tcpwrapper の設定
/etc/inetd.conf に以下の記述を追加。
ftp-proxy stream tcp nowait root /usr/sbin/tcpd /etc/rc.d/init.d/delegated.rc

/etc/hosts.allow に以下の記述を追加。
# ftp-proxy
delegated.rc: 10.42.2., 10.31.3.

/etc/services に ftp-proxy を追加
ftp-proxy      8021/tcp        # ftp-proxy

上記設定を有効にするために、inetd を再起動。

ftp クライアントからの接続の仕方 :
ftp で 10.50.2.54 8021 へ接続。
ユーザ名@接続したいホスト名 を入力。
接続したいホストのパスワードを入力。

ex) ftp 10.50.2.54 8021
user hiroaki@10.24.3.1
Password:*********

これで接続完了。

以上

- logrotate の設定

/etc/logrotate.d/delegate に記述。
/var/delegate/log/8021 {
    monthly
    rotate 60
    create
}

/var/delegate/log/8021.ftp {
    monthly
    rotate 60
    create
}

2003-12-08 (Mon)

* fetchmail + procmail でメール転送

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [メール]

今使っている MUA は NetscapeMessanger 4.8 だ。大学の頃から使い続けている。振り分けや検索などの基本機能はきちんと押さえられており、非常に使いやすい。セキュリティ的にも OutlookExpress よりずっと安心。何より勝手にメールを開いたりしないし。欠点としては、POP アカウントは一つしか登録できないという点だろうか。

fetchmail + procmail を使えば複数サーバのメール一つのアカウントにをまとめられるので、欠点を解消できる。

- .fetchmailrc

POP ユーザ名が shift_jis のマルチバイト文字という凶悪なアカウントなので、.fetchmailrc は shift_jis で記述した。あんまり各行を精査してないので、冗長な記述があるかも。
set postmaster hiroaki
set nobouncemail
defaults
protocol pop3
keep
no mimedecode
smtphost localhost
poll 10.58.30.2
user "私の名前"
password PASSWORD
mda "/usr/bin/procmail"

- .procmailrc

procmail のレシピ。

PATH=/usr/bin:/usr/sbin:/usr/ucb:/usr/local/bin:/pub/bin:.
LOGFILE=$HOME/log/procmail.log

:0
* ! ^X-Loop: hiroaki@example.com
! hiroaki@example.com

- cron

# fetch mail
*/5 8-23 * * * /usr/bin/fetchmail -f $HOME/.fetchmailrc 2>&1 >>$HOME/log/fetchmail.log

9時5時ではなく8時から23時というところがエンジニアらしい。

2003-12-07 (Sun)

* ディレクトリのパーミッション

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

ファイルのパーミッションとディレクトリのパーミッションは意味合いが異なる。

UNIX のパーミッション
http://www.loveruby.net/ja/misc/perm.html
ディレクトリのパーミッション
r そのディレクトリを ls できる
w そのディレクトリの中でファイルを作成・消去できる
x そのディレクトリの中のファイルにアクセスできる

GNOME 1.4 ユーザガイド Appendix A. Linux/UNIX初心者のあなたへ パーミッション(アクセス権)
http://www.gnome.gr.jp/docs/gnome-users-guide/primer-permiss ...
ファイルと同じように、ディレクトリにもパーミッション(アクセス権)がある。ここでも、パーミッション(アクセス権)の種類は3つだ。読み、書き、実行。でも、ディレクトリの場合には意味がちがう。つまりディレクトリを "読む" パーミッションは、そのディレクトリの中身を見たり、中のファイルを検索する許可だ。 "書く" のは、そのディレクトリの中にファイルを作ったり、ディレクトリのファイルを削除したりするパーミッションだ。そして "実行" は、そのディレクトリのファイルをアクセスする権限のことだ。

ちなみに、あるファイルのパーミッション(アクセス権)は、そのファイルが置かれているディレクトリのパーミッション(アクセス権)にも依存する。ファイルが読めるには、そのファイル自身の読み出し権限と、それが含まれるディレクトリの "実行" 権限が必要になる。だから sasha が、ほかのだれにも自分のファイルを見られたくなければ、ホームディレクトリの実行権限を、他のユーザには認めないようにすればいい。こうすれば sasha 自身(そしてもちろん root)以外は、だれもかれのファイルを読めなくなる。かれの個別ファイルのアクセス権はまったく影響しない。

以前メモしたような気もしたが、検索しても引っかかってこなかったので改めてメモ。

2003-12-06 (Sat)

* service possibly not wrapped の意味

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux]

tcpdmatch を使ったときに出ていた service possibly not wrapped という warning の意味がやっとわかった。読んだままの通り、tcpwapper でラップされてないという意味だ。原因は、/etc/inetd.conf の記述ミス。以下の NG の記述では、/usr/sbin/tcpd を呼んでいない。やれやれ。
# OK
ftp-proxy stream tcp nowait root /usr/sbin/tcpd /etc/rc.d/init.d/delegated.rc

# NG
ftp-proxy stream tcp nowait root /etc/rc.d/init.d/delegated.rc in.delegated

2003-12-05 (Fri)

* ftp でファイルを再帰的に取得

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [ftp]

mget でできるかな、と思ったら、うまくいかない。TurboLinux 6.5 Server 付属のバージョン・制作者不明の ftp クライアントでは、ローカルにディレクトリが存在していない場合、作製してくれない。ローカルにディレクトリを作成しないのに、get するときはリモートのファイルパスに従った位置にファイルを配置しようとするため、No such file or directory エラーが続出する。WindowsXP 付属のftp クライアントでもディレクトリは作ってくれない。ただし、カレントディレクトリに全部落としてくるという形での get はできた。ftp コマンドだけでは今回の目的は達成するのは難しそうだ。
Google で ftp 再帰的 で検索したところ、いくつかヒット。再帰的に取得したいなら、wget や ncftp を使うのが普通なようだ。

ncftp & wget を使う
http://libra.higashi.hit-u.ac.jp/~takaira/paradise/manual/nc ...
http,ftpプロトコルによるファイルのダウンロードによく使われるのが wget です。こちらは再帰的取得やレジュームの機能を備えた強力で、かつ使い勝手のいいソフトです。
wget -r 再帰的取得、mや kと組み合わせてウェブページをミラーすることも可能
-b バックグラウンドで勝手に落して来てくれます。
-c レジューム
-i ファイルからURL を読み込む
あたりはよく使います。

設定ファイルは、/etc/wgetrc や~/.wgetrc にて行います。プロキシの設定などは、いじっておいた方が良さそうです。デフォルトでプロキシの利用はオンです。

一時的にプロキシの ON/OFF をコントロールするには、例えばオフにするには、
$ wget -Y off http://hogehoge/hoge.html

どこぞのサイトにあるページ全体をローカルにミラーするのも、いとも簡単。それ以外のオプションも、あると便利なものばかり、ただし使い過ぎには注意。相手のサイトの迷惑にならない範囲でやりましょう。

ftp サイトをまるごとミラーするには、
$ wget -mck  ftp://ftp.jaist.ac.jp/pub/os/linux/kondara/Kondara/i586/
とか。

2003-12-02 (Tue)

* ab (apache bench) で multipart/form-data を POST

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Apache]

ab は複数ファイルを POST するよう設定するインターフェイスを持っていない。
ただ、Request Header の Content-Type の指定と、Content-Body をファイルから読み込ませて POST させることはできる。ということは、 Content-Type: を multipart/form-data にして、別のアプリケーションなどであらかじめ生成しておいた body を POST させればいいんじゃないかと思う。

- 例

/usr/local/apache/bin/ab -n 5 -c 10 http://10.3.31.90/cgi-bin/printstdin.pl -p mutipart_form_data.txt -T "Content-Type: form/multipart"

- 参考

連載:ApacheによるWebサーバ構築 Apacheパフォーマンス・チューニングのポイント(2/2)
http://www.atmarkit.co.jp/flinux/rensai/apache15/apache15b.h ...

2003-12-01 (Mon)

* ftp + tar + cron で自動ネットワーク・バックアップ

この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [ftp] [バックアップ]

ftp コマンドには、標準入力から読ませたデータに好きなファイル名を付けてアップロードする機能がある。これを利用してネットワークバックアップスクリプトを作成する。スクリプトを毎日 cron で回せば、リモートマシンに毎日バックアップを自動で ftp アップロードすることができる。

- ftp + tar によるバックアップの長所と短所

ftp + tar を使ったバックアップの長所は、どちらも unix システムなら標準でインストールされているコマンドなので、ツールのインストールが不要で設定が超簡単なことと、ネットワーク経由のバックアップなので外部マシンにデータを持っていくことが楽なことだ。短所は、ネットワーク経由のバックアップなので帯域が細い環境では使いにくいかもしれないこと、ftp アカウントが必要なこと、暗号化されないこと、ftp アカウントをシェルスクリプト中に埋め込まなければならないことだろうか。

暗号化については、tar の出力を gpg に通したり、scp や sftp を利用すれば解決できる。2004-03-19 に「ftp + tar + gpgで暗号化ネットワーク・バックアップ」という記事を書いた。 ftp + tar + gpg の利用について解説とサンプルスクリプトがある。

- バックアップで一番大切なこと

バックアップで一番大切なことは、バックアップすることだ。手間がかかるからといってやらないでいる時に限ってトラブルがやってくる。だから、とにかくまず手間がかからなくてシンプルな方法を考えよう。rsync や samba を使ったり、pdumpfs や afio や ArcServe などのバックアップツールを使った方法もある。tar + ftp よりも他の方法を使った方が楽にバックアップシステムを構築できるなら、迷わず楽な方を使った方が良い。とにかくまずバックアップすることが大切だ。

- ftp にコマンドの出力結果をアップロードさせる

冒頭にも書いたが、ftp コマンドには標準入力の内容をアップロードする機能がある。これを利用してバックアップスクリプトを作成する。以下、man ページから引用。

Manpage of FTP
http://www.linux.or.jp/JM/html/netkit/man1/ftp.1.html
ファイル名の変換
ftp の引き数として指定されたファイル名は、以下の規則に従って変更される。

1. ファイル名として `- ' が指定された場合、(読み込みとして) stdin が、(書き出しとして) stdout が使われる。
2. ファイル名の最初の文字が `|' の場合、残りの引き数はシェルコマンドとして解釈される。そして、 ftp は与えられた引き数を popen(3) に渡してシェルを fork し、stdout を読み込み、stdin に書き出す。シェルコマンドがスペースを含む場合、 " ls -lt" のように引き数をクォートしなければならない。この機構の特に役立つ例としては、dir more がある。

- バックアップスクリプトの例

tar から標準出力に出力した内容を ftp が標準入力で受けてアップロードする。ファイル名に曜日を使っているので、7世代までバックアップが残る。ファイル名に日付を使えば、一か月前まで残せる。
#!/bin/sh

# log setting
LOGDIR=/var/log
LOG=$LOGDIR/ftpbackup.log
LOG_TAR=$LOGDIR/ftpbackup_tar.log

echo `date` backup start >>$LOG
echo `date` backup start >>$LOG_TAR

# ftp and tar backup start
ftp -i -v -n 10.3.31.89 << END >>$LOG
user USER_ID PASSWORD
cd /d/backup
bin
put |"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR" "`hostname`_`date +%a`.tar.gz"
quit
END

echo `date` backup complete >>$LOG_TAR
echo `date` backup complete >>$LOG

- 解説

以下ではコマンドのオプションや使われ方を解説する。細かく書いたので長い。必要なところだけ読んでほしい。

ftp -i -v -n 10.3.31.89 << END >>$LOG
-i オプションはバッチ処理のために、-v はログに詳細を記録するために、-n は .netrc ファイルを使用せずに ftp サーバへのログインに使用するパスワードを指定するためにここで指定している。10.3.31.89 は今回使用した ftp サーバ名。

-i
複数のファイルの転送中に対話 (interactive) プロンプトを出さないようにする。

-v
詳細表示 (verbose) オプションを使うと、 ftp はデータ転送の結果だけでなく、リモートサーバからの全てのレスポンスを表示する。

-n
ftp が最初の接続で 自動ログイン (auto-login) しようとするのを抑制する。自動ログインが可能な場合、 ftp はユーザーのホームディレクトリにある .netrc ファイル ( netrc(5) を参照) でリモートマシンのアカウントが記述されているエントリをチェックする。エントリがない場合、 ftp はリモートマシンのログイン名 (デフォルトではローカルマシンでログイン名) を要求するプロンプトを出す。必要ならば、ログインに使うパスワードとアカウントを要求するプロンプトを出す。

<< END は、次に END が出てくるまでに記述された内容を、ftp コマンドに渡すためのリダイレクト。>>$LOG は ftp コマンドの結果を $LOG に追記する。

user USER_ID PASSWORD
cd /d/backup
bin
USER_ID に ftp サーバにログインするための ID を指定、PASSWORD にパスワードを指定。例を挙げておこう。ID が operator で パスワードが backup_command なら、
user operator backup_command
とすればよい。その後はログイン後に実行させるコマンドを列記する。私が使っているサーバではバックアップファイルをアップロードするディレクトリが /d/backup なので、cd コマンドでディレクトリを移動。その後転送モードをバイナリモードに明示的に変更。

put で始まる行がこのスクリプトの要となる部分。
put |"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR" "`hostname`_`date +%a`.tar.gz"
まず put コマンドでファイルをアップロードする。ただし、put の第一引数は | で始まっているので、アップロードする中身はファイルではなく "" で囲まれた tar コマンドが出力したものとなる。"" で囲まれた部分はパイプを使ったコマンドラインは記述できないようだ。パイプを使った複雑なコマンドラインを書きたい場合は、シェルスクリプトにすればいい。

tar の部分を解説しよう。
"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR"
まず -C で tar を実行するディレクトリを / に移動し、その中の etc ディレクトリと home ディレクトリをバックアップ対象としている。ただし、music または backup という名のファイルやディレクトリはバックアップ対象から除外する。-z が指定されているのでこれらを gzip で圧縮し、-f - が指定されているので圧縮結果を標準出力に出力している。2>>$LOG_TAR の部分は、tar コマンドの標準エラー出力への出力結果を $LOG_TAR に追記している。tar は標準エラー出力に詳細を出力するので、それを受けてログに書いているというわけだ。

以下の部分は put コマンドの第2引数として扱われる。
"`hostname`_`date +%a`.tar.gz"
put は第2引数でアップロード先にどんなファイル名で格納するかを指定できる。ここでは、 hostname コマンドの出力結果と date +%a コマンドの出力結果を利用している。date +%a は現在の曜日を返す。よって、マシン名が sonic で 今日が火曜日だとすると、最終的なファイル名は sonic_Tue.tar.gz となる。ehco で表示させるとわかりやすいかな。
[hiroaki@sonic ~]$ echo `hostname`_`date +%a`.tar.gz
sonic_Tue.tar.gz


すべての記事の見出し (全1029件)
全カテゴリの一覧と記事の数
カテゴリごとに記事をまとめ読みできます。記事の表題だけを見たい場合は、すべての記事の見出し (カテゴリ別表示) へ。

直近30日分の記事
2007-04-23 (Mon)
2007-03-07 (Wed)
2007-02-27 (Tue)
2007-01-17 (Wed)
2007-01-15 (Mon)
2007-01-14 (Sun)
2007-01-08 (Mon)
2006-12-01 (Fri)
2006-11-22 (Wed)
2006-11-20 (Mon)
2006-11-19 (Sun)
2006-09-30 (Sat)
2006-08-29 (Tue)
2006-08-04 (Fri)
2006-07-27 (Thu)
2006-07-23 (Sun)
2006-07-17 (Mon)
2006-07-10 (Mon)
2006-07-06 (Thu)
2006-07-03 (Mon)
2006-06-29 (Thu)
2006-06-28 (Wed)
2006-06-27 (Tue)
2006-06-25 (Sun)
2006-06-19 (Mon)
2006-06-18 (Sun)
2006-06-15 (Thu)
2006-06-11 (Sun)
2006-06-01 (Thu)
2006-05-30 (Tue)
プロファイル
斎藤 宏明。エンジニアです。宇都宮市に住んでいます。
リンク
RSS
スポンサードリンク
Powered by
さくらインターネット

© 斎藤 宏明 Saito Hiroaki Gmail Address
Landscape - エンジニアのメモ http://sonic64.com/
Landscape はランドスケープと読みます。
ひらがなだと らんどすけーぷ です。