すいません... >いえ、ただのログです。例えばこんなの。 これなんですが、 >.forwardに書いただけではログ作成や排他処理をやってくれないです。 procmailが勝手にログを作ってくれるのですか? もしそうなら、それは何処に出力されるのですか? と言う意味でした。 #日本語ヘタですいません...(^^ゞ > * ^Subject: hoge$ > は、ヘッダに「(行頭)Subject: hoge(行末)」という行があれば > commandに渡されるわけです。ヘッダ名(この場合はSubject)の > 前に ^ がありますから。 > # 本当は * ^Subject: *hoge$ にしなきゃいけないんだけど あっなるほど、よく見ると間にスペースが... これは、2つの条件([^hoge]、[hoge$])が指定されているのですね。 (↑ procmailの解説) #ネスケのデフォルトフォントをMS P明朝にしているのだけど #半角スペースが分かりづらいしアンダーバーが表示されないし、 #設定変更しようかな...気に入っているんだけど。←独り言 >namazuを使うなら... そうなんですか。最近よく見かけるのでもしかして、と思ったので すが。 #「ですよね〜。んが、」の行にはやられた... #思わず吹き出して周りの白い目が... >これくらいならシェルスクリプトでもできますよ。 う〜ん、シェル使い。というか、やっとPerlを使えるようになってき た私には、「さすが」以外言葉が出ない...(((((^^; >正規表現の一種又はサブセット?だということも含めておいた方が、 >初心者の方にも後々のためにはいいんじゃないかなと思ったのです。 初心者として、ありがたきお言葉。感謝感謝m(_ _)m >mmさん |
自己レスです。 偶然というか出来すぎ?でレスキューさんのページでprocmailの 解説を見つけました。 #しかも一昨日UPばかりの情報。もしかしてここでのやり取りを見 #ていた?! いやはや、だいぶ変な事を書いてますね(^^ゞ ログの件は環境変数に、 LOGFILE=$HOME/procmail.log の様な指定をしたときにprocmailによって作成される。 ですね。 >> # 本当は * ^Subject: *hoge$ にしなきゃいけないんだけど > あっなるほど、よく見ると間にスペースが... これは単純にメールのヘッダーの規則で、Subject:とその内容の 間には半角スペースが必要なんですね。 なんてオバカなんでしょう。 大変失礼をいたしました。(^^; 謎が解決しました。 |
> ログの件は環境変数に、 > LOGFILE=$HOME/procmail.log > の様な指定をしたときにprocmailによって作成される。 yes. 環境変数じゃなくてレシピに書くんですけどね。 > これは単純にメールのヘッダーの規則で、Subject:とその内容の > 間には半角スペースが必要なんですね。 Subject: hoge(スペース1つ) Subject: hoge(スペース2つ) Subject:hoge(スペースなし) のいずれにも対応できるようにするためです。調べてませんが、 どちらもメールヘッダとしてはアリなんじゃないでしょうか。 (RFC821あたりで決まってるかな?) ところで素朴な疑問ですが、補完って知ってます?>M.Masudaさん(や他の方) コマンドラインでTABやCtrl-Dを押すやつ。 知らない人が多いなら、軽く解説を書こうかなと思ってるんですが。 入門書でシェルの補完まで触れているのを見たことないんで、 もし補完を知らずに「UNIXのコマンド入力は めんどくさいものだ」 と思う方がいたらヤだなと思いまして。 |
初めてメールさせていただきます。 UNIX の bc コマンド/ dc コマンドの使い方を伝授していただけないでしょうか。 あるいは、このコマンドの解説本をご存知でしたら教えていただけないでしょうか。 お願いします。 |
先日はどうもでした。(^^ゞ >68Userさん 完成を期待しています。 >>ログの件... また変な事かいちゃった...(>_<) #RFCのどこに何がかいてあるかは、何で調べてるんですか? >ところで素朴な疑問ですが、補完って知ってます? もしこれが無ければ、あまりシェルを触らなかったでしょう。(^^) DOSの頃はこれが無かったので、長いコマンドでミスタイプすると 大変でした。 ついでにUPキー'↑'でのヒストリー機能もどうでしょう。 #bashだけ? 変な発見。 bashていうのはshの完全上位互換なんでしょうか? /bin/をみると、うちの環境では sh -> bash とリンクになってま した。(デフォルトシェルはbash)#OSはTorbo Linux 2.? #知らなかった。 それと、パーミッションについてちょっと聞きたいのですが。 #Groupはとりあえず無視。 chmod 700 hoge.cgi の場合、Otherに何も無いので、シェル上 からのみ実行可能。 chmod 705 hoge.cgi の場合、Otherに読込・実行共に有るので シェル上でもwebから(nobody権限)でも実行可能。 となりますよねぇ。 それでは、701の場合はどうなります? うちの環境では、webからでは動きません。 Other実行権が有れば(1が立っていれば)webからでも実行できる場 合はsuExecをインストールすれば可能なのでしょうか? それともう一つ。(^^ゞ .procmailで :0 * 条件 コマンド の「* 条件」行を書かなければ全ての場合に適応される。 で合ってますか? > UNIX の bc コマンド/ dc コマンドの使い方... bcならここにありますよぅ〜(浦部くみこ調) http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#bc |
> #RFCのどこに何がかいてあるかは、何で調べてるんですか? なんとなくです。僕が興味を持つ範囲は限られてるので、 FTPならRFC959、POP3は1939、SMTPは821、HTTPは1945/2068、 くらいを知っておけば、大抵調べることができます。 > もしこれが無ければ、あまりシェルを触らなかったでしょう。(^^) あ、ご存知でしたか。 > /bin/をみると、うちの環境では sh -> bash とリンクになってま Linixはsh->bashらしいですね。ただし現状ではshが使われるのは スクリプトくらいでしょうから、それなりの互換性があれば問題ない のでしょう。でもたまにshとbashで挙動の違いが原因で動かない、 なんて話は聞きます。 > それでは、701の場合はどうなります? 普通スクリプトはReadできないと実行できません。バイナリならeXecute だけでもいいですが。 #!/hoge で始まる scriptというスクリプトを、 script で実行した場合は、カーネル(かな?)が /hoge script を実行します。 #!/bin/sh sleep 10; を ./script で実行して、C-zでsuspendしてpsを実行すると、 322 p2 T 0:00.01 /bin/sh ./script などとなっているはずです。このとき scriptをReadできないと エラーになるわけですね。 > の「* 条件」行を書かなければ全ての場合に適応される。 たぶん…。試して見てください(^^; > UNIX の bc コマンド/ dc コマンドの使い方を伝授していただけないでしょうか。 実はbcやdcはかなり高機能なので、あの解説だけでは不十分かも しれませんが、どの程度の解説をお望みで?(でも僕はあれ以上の ことは知りません) dcは逆ポーランドで記述する計算機です。 % dc 2 3 + (2+3の結果をスタックにpush) p (スタックの先頭を表示) 5 (結果は5) 1 2 + 5 3 - * ( (1+2)*(5-3)の結果をスタックをpush) p (スタックの先頭を表示) 6 (結果は6) 計算式を逆ポーランドに変換すると、括弧の優先順位などを 気にせず、先頭から順番に処理していくことができます。 まぁ、コンピュータ向けの書き方で、人間向きではないですね。 |
>DOSの頃はこれが無かったので、長いコマンドでミスタイプすると >大変でした。 DOSでも、TSRを使えば、補完可能でした… というより、これがなければ、DOSのコマンドラインを使う気には なりませんでした。 私が使っていたのは、history.com というもので、コマンドライン 上での行編集機能、ヒストリー機能、補完機能、別名機能などが ありました。 ただ、unix上の補完機能の解説って読んだ覚えがないので、 本家のものがどういう仕様になっていたのか、できれば知りたいです。 DOSの場合、カレントに abc.exe というファイルがあって、 コマンドラインの先頭で a を入力して、補完機能を使うと、 abc というようなコマンド名(.exeがない)の補完が行われます。 でも、unixの場合は、補完は引数ファイルだけだという話を聞いた ような気もしたりしますんで…(違ったかも知れない(^^;) >dcは逆ポーランドで記述する計算機です。 少し前までなら、まだ逆ポーランド記法の電卓を使ってる人がいる って話を聞いたことがあるんですが、もう絶滅したかな…(笑い) 確か、FORTHも逆ポーランドだったような…? |
.>実はbcやdcはかなり高機能なので、あの解説だけでは不十分かも > しれませんが、どの程度の解説をお望みで?(でも僕はあれ以上の > ことは知りません) 実行させたいのは、プログラムが出力した(文字列)データを表計算のように 単純な合計や平均の演算を行いたいのです。 入力データは、いくつかの固定のデータ数を一つのグループとして(つまり行に相当) 扱いたいのです。 こんな具合です; " 10 22 110 20 30 200 5 25 300" この例では; 10 22 110 が一行目のデータ 20 30 200 が二行目 5 25 300 が三行目 として扱い、 一列目の合計を求める bc コマンド記述を実行すると 35 が求まり、 二列目の平均を求める bc コマンド記述を実行すると 25.6 が返ってくると いった使い方をしたいのですが。 そして、bcコマンドに実行させる処理内容は、C-shell でデータに合わせて Generate させようと考えています。 bc コマンドにこんなことを望めますか?コンパイルさせずに演算結果を 取り込みたいというのがこの目的です。 |
やはりみなさん知ってますか。僕はUNIXを使い初めて数か月 知りませんでした。僕のまわりでは補完を知らない人が かなりいます。 DOS時代は補完がないのが当り前、と思ってたので、別に面倒だとは 思いませんでした。 > unixの場合は、補完は引数ファイルだけ cshだと確かにそうですね。tcshは(多分bashも)コマンド/引数共に補完できます。 あと、completeという内部コマンドを使うと、どのコマンドが どういう引数を要求するのか、という情報を与えることができます。 例えば、cat (Ctrl-D)とすると ファイル/ディレクトリ名の一覧出てきますが、 man (Ctrl-D)ならマニュアルの一覧が出てくると便利ですよね。さらに man 3 (Ctrl-D) … マニュアルのセクション3 telnet (Ctrl-D) … ホスト名 rmdir (Ctrl-D) … ディレクトリ名 printenv (Ctrl-D) … 環境変数 gcc -f(Ctrl-D) … -fで始まる長い長いオプション名 と、状況に応じて補完対象を変えてほしいわけで。 というわけで、例えばこんな感じにするわけです。 http://X68000.startshop.co.jp/~68user/tmp/.completerc で、bashでは、tcshのcompleteに相当する機能はないのかなと思ってるんですが、 どなたかご存知ですか? > " 10 22 110 20 30 200 5 25 300" bcにこだわる理由がなければ、perlやawkを使った方がいいかもしれませんね。 #!/usr/local/bin/perl $raw = 3; # 一行あたりの項目数 $raw_num = shift || die; # 平均を得たい項目(1列目なら0) $sum = 0; @nums = split(/ /,<STDIN>); $i = 0; while ( defined $nums[$i*$raw+$raw_num] ){ $sum += $nums[$i*$raw+$raw_num]; $i++; } print "$raw_num列目の合計は $sumです。\n"; 実行例。 % echo '10 22 110 20 30 200 5 25 300' | ./b 1 1列目の合計は 77です。 bcでできるかどうかマニュアルを読んでみたのですが、よくわかりませんでした。 ところでbcで割り算の結果を小数点の精度で得る方法をご存知ですか? 3/4 も 3.0/4.0 も 3.1/4.1 も結果が0になるんですが…。 |
> ところでbcで割り算の結果を小数点の精度で得る方法をご存知ですか? man読んでたら書いてありました。scale=3などとして、有効桁数を 指定すればいいんですね。デフォルトはscale=0だから、小数点以下は 表示されない、と。 あと、ご存知かもしれませんが、bc(GNU bc)の日本語マニュアルは http://www.jp.freebsd.org/man-jp/search.html で見られます。 |
>> それでは、701の場合はどうなります? これは、最近小耳に挟んだ事なのですが、一部のサーバー(Apache1.3環境) での解説で、パーミッションを701でCGIが動くとの表記が有りました。 調べてみるとsuExecを使用していて、そのサーバー上ではファイルのオ ーナー権限で動くらしいのです、私の環境ではsuExecは使えないので、 状態が解からなく、疑問に思っていたので前回の質問となりました。 #それなら700でもweb経由のCGIが動くはずですよねぇ。 #これ出来ると、webから自分宛のメールを読んだり出来る。 >322 p2 T 0:00.01 /bin/sh ./script > などとなっているはずです。このとき scriptをReadできないと > エラーになるわけですね。 言い方を変えると、スクリプトを実行するためのインタープリタが そのファイルを読めないといけないと言うことですね。 suExecを使わない普通のCGIは、nobody権限で/bin/shとか /bin/perl が動くわけですね。 >でもたまにshとbashで挙動の違いが原因で動かない、 > なんて話は聞きます。 これは、頭に入れておかないと。φ(._.) sh と bashの違いを考慮しないとはまりそう...。 #滅多にそんな場面無いだろうけど。 > の「* 条件」行を書かなければ全ての場合に適応される。 「* 条件」の行を空行にすると、無視されました。 「*」のみだと全てのメールにマッチするようですね。 ちなみに、うちの環境だと .forwordに "| exec /path/procmail" としなくても、~/ に .procmailを置くだけでprocmailが動きました。 #Turbo Linuxだけなのかなぁ。 >FTPならRFC959、POP3は1939、SMTPは821、HTTPは1945/2068、 RFCのブックマークはとってあったのですが、よく見ると一部だけの ミラーサーバーでした。 自分でも探してみますが、早いサーバー(アクセスの少ない?)を 知っていたら教えて下さい。m(_ _)m >DOSでも、TSRを使えば、補完可能でした… 私もいくつかの常駐ソフトを知っていましたが、いずれも不安定な ものが多く、あまり使っていなかったのが現状でした。(^^ゞ >mmさん 関係無いけど、HSBというソフトリブートを可能にするNEC98シリーズ 用のソフトは便利でした。 メモリチェックをすっ飛ばしてくれるので、環境の切り替え時にバッチ 組んでメニューで再起動なんてよくやっていました。 |
> これは、最近小耳に挟んだ事なのですが、一部のサーバー(Apache1.3環境) > での解説で、パーミッションを701でCGIが動くとの表記が有りました。 700ではなくて701なら動く、ということはあり得ないはずです。 suExecを組み込んだapacheは、はある時点まではnobodyで動いていて SSI/CGIを動かす際に そのユーザ権限に変更するはずです。 ですので、そのCGIスクリプトを置いてあるディレクトリ(例えばcgi-bin) にはotherに対してxビットを立てる必要があるかもしれません。 # でも多分ファイルもディレクトリも700でOKだと思いますけど、 # suExecを使ったことがないのでちょっとわかりません。 > ちなみに、うちの環境だと .forwordに "| exec /path/procmail" > としなくても、~/ に .procmailを置くだけでprocmailが動きました。 え、ほんとですか? それだとsendmail(mail.local?)が、procmailだけを 特別扱いしてることになるんですが…。 |
> http://X68000.startshop.co.jp/~68user/tmp/.completerc ガ〜ン! やはり、ご本家は、スゴーイ!! DOSの貧弱な環境を何とかunixに近づけたいと思っていたのですが、 やはり所詮、マネはマネに過ぎなかったみたいですね(^^; (でも、プリミティブなDOSは、やはり問題外…) M.Masuda さん >メモリチェックをすっ飛ばしてくれるので、環境の切り替え時にバッチ >組んでメニューで再起動なんてよくやっていました。 えー、一体どのような環境を切り替えられたのでしょうか? キャラクタデバイスやTSRなら、リセットしなくても変更可能だし、 それ以上の環境の切り替えはウチでは必要なかったので、 そういうのは使ったことないです(^^; |
>えー、一体どのような環境を切り替えられたのでしょうか? すいません。ついオンラインで読んで疑問に思って書き込んでしまいましたが、 このボードとは無関係の話題でした(^^; この質問は、なかったことにして下さいませm(_o_)m (それに、RAMディスクやディスクキャッシュの構成を変える場合にも、 リセットは必要ですね(^^;) |
>えー、一体どのような環境を切り替えられたのでしょうか? すいません。ついオンラインで読んで疑問に思って書き込んでしまいましたが、 このボードとは無関係の話題でした(^^; この質問は、なかったことにして下さいませm(_o_)m (それに、RAMディスクやディスクキャッシュの構成を変える場合にも、 リセットは必要ですね(^^;) |
>700ではなくて701なら動く、ということはあり得ないはずです。 そのとおりです。suExec下ではユーザーの実行権が有効ですね。 #やっぱ日本語の書き方悪いかなぁ。(^^; 私の見たページです。 http://www.parkcity.ne.jp/~chaichan/bin/htmcount.cgi?name=howtocgi >え、ほんとですか? それだとsendmail(mail.local?)が、procmailだけを >特別扱いしてることになるんですが…。 今日は時間が無いので、後日試して結果を報告します。 >キャラクタデバイスやTSRなら、リセットしなくても変更可能だし、 最近触ってないし、DOS用マシンはご臨終なので忘れてしましまし たが。(^^ゞ ブロックデバイスです。その他ソフト同士の相性も有りました。 当時周りで、コンベンショナルを広げるのが流行っていたので、 必要最低限のデバイスを組込み直して使用してました。 あるマシンは拡張メモリが無かったりしたもんで...(^^; 4M積んだノートでは、620kbのfreeは確保出来たのですがそれで 限界でした。 #あの頃が懐かしいなぁ...(^^ゞ > http://X68000.startshop.co.jp/~68user/tmp/.completerc > ガ〜ン! > やはり、ご本家は、スゴーイ!! 全く同感です。 |
結果の報告です。 >え、ほんとですか? それだとsendmail(mail.local?)が、procmailだけを >特別扱いしてることになるんですが…。 おかしいな、やっぱ .forwardを設置しなくとも.procmailrcだけで いけてしまいます。 .forwardに転送先のアドレスとかが指定されていると.procmailrc は評価されないようです。つまり .forwardが無く.procmailrcがある 時にのみ.procmailrcが評価されるようです。 RedHat LinuxとTurbo Linuxの両方とも同じ動作でした。 レスキューさんとこも.forwardへの記述を指示してあったし? ん〜。 #sendmailの初期設定が違うとか... #このへんは初心者にはぜんぜん解からん(^^; ちなみにいろいろ試しているうちに、シェル上でmailを実行して メールを読み 'd'や 'q'で終了してもメールがスプールに残り mail終了時に、 Unable to lock mailbox: Permission denied と言われるようになってしまいました。 ロックファイルにアクセス権が無いって事でしょうが、それが どこに有るのか解からない。(>_<) どうすればいいでしょう。とほほ。 |
こんばんは。いわもとと申します。 今日1日散々悩んでいたんですが、crontabコマンドから シェルファイルを呼び出し、そのシェルファイルの中で SQL*PLUSを呼び出してPL/SQLプロシージャを実行させようと していたのですが、TNSサービス名が認識できないと エラーを返されてしまいました。 直接シェルファイルを実行させるとちゃんとサーバを 認識してプロシージャを実行してくれるのですが、 crontabコマンドから呼び出すとうまく行きません。 tnsnames.oraファイルも正しく入力されていましたし、 まったく原因がつかめません。 どなたかこういうエラーに詳しい方、解決方法を 教えていただけないでしょうか。 |
こんばんは岩本さん。 http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#crontab 上のページでcron実行時の注意として、 「なお、crontabで実行されるときには、ほとんどの環境変数が指定 されていないので注意が必要。」と有りますが、試しに簡単なスク リプトで、実行時に有効になっている環境変数を表示させてみて 必要な変数をスクリプトに追加してみたらどうでしょうか? 多分この辺のような気が... #またぜんぜん違ったりして。(^^; |
M.Masudaさんへ。 % grep -i procmail /etc/sendmail.cf の結果を教えていただけますか。 > crontabコマンドからシェルファイルを呼び出し… SQL*PLUSなるものも、TNSなるものも知らないので、あくまで一般論 ですが、確かに環境変数が原因であることが多いと思います。 csh/shスクリプトなら、-xや-vオプションを付けることで、 どこで止まっているかわかります。また、 % env - sh とすると、環境変数を完全にクリアした状態のshが立ち上がるので、 その状態でスクリプトを動くような状態にしてみてはいかがでしょう。 # ただし、cronでは設定されているはずのPATH、HOME、USERなども # クリアされてしまいます。 |
> % grep -i procmail /etc/sendmail.cf > の結果を教えていただけますか。 ##### @(#)local_procmail.m4 8.6 (Berkeley) 10/20/96 ##### ### PROCMAIL Mailer specification ### ##### @(#)procmail.m4 8.6 (Berkeley) 4/30/97 ##### Mprocmail, P=/usr/bin/procmail, F=DFMSPhnu9, S=11/31, R=21/31, T=DNS/RFC822 /X-Unix, A=procmail -Y -m $h $f $u Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30, R=20/40, A=procmail -Y -a $h -d $u と出ました。 これは吉か、はたまた大凶か? 出来れば意味を教えて下さい。(^^; |
こちらは RedHatの方です。 Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=10/30, R=20/40, A=procmail -Y -a $h -d $u それから、WU-FTPDでの/etc/ftpaccessの設定について もし分かるのならメールで直接聞いてもいいでしょうか。 内容を見てもらいたいのですが、内容的に公開してもいい ものか分からないもので...。 内容は一般ユーザーへの、ftp接続時でのアクセス制限です。 |
へぇぇぇぇ、ほんとにprocmailを特別扱いしてるんですね。 > 出来れば意味を教えて下さい。(^^; きついことをおっしゃる(笑) Mで始まる行は、配信エージェントの定義を表します。 P=はプログラムのパス、S=とP=はエンベロープ/ヘッダの書き換え、 10/30、20/40ってのは書き換え規則(どこか別の場所で定義されている)、 F=はこの行の(他の行から参照する際の)設定の名前を決めてるのかな? それとも他での定義を参照してるのかな? T=は、メールヘッダに追加される? A=... はわかりません。 sednmail.cfを理解できるほどの知識があるわけではないので (コウモリ本も持ってない)、こんなもんでご勘弁を(^^; Slackwareの配布サイトを見てみましたが、やはり標準で procmailを特別扱いしているようです。Linux界では 普通なのでしょうか(僕からするとちょっと気持ち悪いですが)。 > それから、WU-FTPDでの/etc/ftpaccessの設定について > もし分かるのならメールで直接聞いてもいいでしょうか。 すいません、wu-ftpdは使ったことがないのです。 |
はじめまして、こんばんわ。ぬいぐるみバンザイと言います。 CGIについてですが、少し質問があります。 それは、ホームページの更新状況を(自分や他人のサイトも含めて)自動で (そのCGIを実行すれば)検知するようなものを作りたいor探しているのですが お心当たりはないでしょうか? 初心者の自分ではソケットを使ってターゲットとなるサイトに接続して、index.htmlあたりの ファイルの月日を取得できたらいいなと思うのですが、こういうことは可能なのでしょうか? 初心者ゆえ、何をいってんだ?的なところがあるかも知れませんが、よろしくお願いします。m(__)m ではでは |
自分のサイトならば、上のURLのスクリプトではいかがでしょう… 他人のサイトの場合は、仰るようにソケットを使って HEAD メソッドかな… M.Masuda さん >4M積んだノートでは、620kbのfreeは確保出来たのですがそれで >限界でした。 そう言えば、そんなことが流行ったことも…、でも620はスゴイ…(笑い) |
> それは、ホームページの更新状況を検知するようなもの mmさんのおっしゃる通り、HTTPのHEADメソッドを使えばいいでしょう。 レスポンスのヘッダ部分から Last-Modified: Wed, 20 May 1998 14:59:42 GMT などという情報が得られます。ただし、(少くともapacheでは)SSIを 使っているページでは、Last-modifiedを返してくれません(例えば うちのトップページ)。また、Last-Modifiedを返さないサーバもあるでしょう。 ソケットの使い方については http://X68000.startshop.co.jp/~68user/net/ が参考になるかもしれません。 > CGIについてですが、少し質問があります。 ただし、CGIとして動作させるのは非現実的かと思います。 なぜなら、いろんなサーバに接続するのはそれなりに時間がかかります。 重い時間帯なら数分待たされることも珍しくありませんので、 その間にCGIのタイムアウトが発生するでしょう。 ですから、コマンドラインから動作させるか、あるいはCGIで動かすとしても、 - すぐにclose(STDOUT)してコネクション自体を切断 - その後 更新時刻のチェック - チェック結果をHTMLに吐き出す - (あなたが)すこし時間が経ったらそのHTMLにアクセス とした方がいいと思います。 > or探しているのですが プログラム自体は比較的簡単に作れますから、探せばあるのでしょうが、 残念ながら知りません。ただ、IEやNNにそういう機能が付属しているのでは ないでしょうか。 |
はじめまして。 UNIX初心者なので、いろいろ分からない事があり、 いきなりですが、みなさんに教えて頂きたいことがあります。 シェルスクリプト内にてスーパーユーザーになりあるコマンドを 発行したいのですが、スーパーユーザーになったところで プロンプトが帰ってきてしまい、以降の処理に行きません。 どの様にすれば、シェルスクリプト内にてスーパーユーザーになって コマンドを発行できるのでしょうか? よろしくお願い致します。 できれば、シェルのサンプルを見せていただければと思っております。 |
>へぇぇぇぇ、ほんとにprocmailを特別扱いしてるんですね。 ありゃりゃ、ほんとにそうだったんですか、私の勘違いなのかなぁ なんて思って、「違いますよぉ」なんてレスが返って来るかと思っ てました。(^^;;;; 一番難しいと言われるsendmailに関しては、既に私の理解を超えてる ので、今は逃げます...(爆) 将来の、目標としておきます。(^^ゞ >きついことをおっしゃる(笑) そんなそんな、コウモリ本もなくてあれだけ理解してればぜんぜん ○では?...。 でも本当にシステムによってかなり設定が違うんですね。 勉強になります。 >すいません、wu-ftpdは使ったことがないのです。 残念です。一応目的の事は達成出来たのですが、その手順での 他の部分への影響が知りたかったのです。 この辺は、いくら1ソフトの設定が出来ても、システムそのものに 詳しくないと、分かりませんからね。 プログラマーの弟は、free630kbと私に自慢してました。(^^ゞ>mmさん #すいません、違う話題で...>68Userさん こんにちはtakashiさん シェルスクリプト内でrootになる? それってどうやるのですか? 普通suコマンドやpasswdコマンドでは、わざとユーザーに入力要求 を出して、システムを保護するようになっているという話を聞いた 事が有ります。 それに、スクリプト内にrootのパスワードを記述しなければいけな いのでは? もしそうなら、それはセキュリティー的に辞めた方がいいと思いま すよ。 何をしたいのかが分かりませんが、root権限でログイン中以外の時 に、何かをさせたいのであればcrontabなどで実現させるのがいいと 思いますヨ。 #外しているかなぁ(^^ゞ |
M.Masudaさん、ありがとうございます。 Masudaさんと言う通り、セキュリティの問題のあるやり方なので、 他の方法を考えたいと思います。 また、お世話になると思いますが、その時にもよろしくお願い致します。 |
>他の方法を考えたいと思います。 どんな事をしたいのかを書くと、きっと有効な情報が得られると 思いますヨ。 またまた、御世話になります。m(_ _)m シェルスクリプトのif文で、前のコマンドの終了結果を知りたい場 合はどうすればいいのでしょうか? 具体的にはこうです。 /#!usr/bin/sh vi text.txt if [ 条件(text.txtを更新したら) ];then date>>text.txt fi 条件のところでの指定法方が解からないのです。(^^ゞ #すげー初心者ですね←私 |
ありがとうございます。m(__)m>mmさん、68userさん やっぱり、CGIで全部自動というのは、難しそうですね。 教えて貰ったことを参考に作ってみます。また来ることがあるかも知れませんが その時はよろしくお願いします。m(__)m ではでは |
> takasiさん 僕がやるとすれば… sudoを使う 特定のユーザに対して、特定の権限(この場合root)で、特定のコマンドだけ 実行を許可するコマンド。例えば hoge というユーザだけ cat /etc/master.passwd を実行できる、と設定すれば、 % cat /etc/master.passwd Password: ***(rootのパスワード) (/etc/master.passwdの内容が表示される) となります。その後5分間以内(多分設定で変更可能)なら、再度同じコマンドを 打っても rootのパスワード入力を省けます。 wrapperを使う 普通スクリプトにはsuidビットを立てられません。でもバイナリなら可能です。 そこで、Cでwrapperを書き、その中でスクリプトを実行させるようにします。 % chmod 4755 wrapper % chown root wrapper としてwrapperを実行すると、root権限でスクリプトが実行されます。 suidperlを使う 普通スクリプトにはsuidビットを立てられませんが、perlだけは例外です。 % chmod 4755 perl-script % chown root perl-script とすれば、root権限でperl-scriptが動きます。 くらいでしょうか。2番目の方法のソースは、よろしければお見せしましょうか? |
ん〜、コマンドの status は $? を見ればいいですけど、 今試してみたところでは、更新してもしなくても、どちらも 0 を返してきました。正常終了は正常終了なので更新の有無は 関係ないのでしょう。 で、この場合は最終更新時刻が更新されたかを調べるとか、 /tmpにコピーして、それを編集させ、元のファイルとdiffする などするのがいいんじゃないでしょうか。 |
>ん〜、コマンドの status は $? を見ればいいですけど、 あれま、やっぱ甘かった!。 viの終了コードで判別しようと思ったんですが...、そうですね よく考えたら、保存しようがしまいが一応正常終了だから、それ では判別できませんね。(^^ゞ わざわざ試してもらってすいません。 #でも「$?」の方法が知らなかった... #ホント初心者です。(*^_^*) DOSの場合、終了コードはかなりいい加減だっただった記憶が 有ります。UNIXの各コマンドの場合正確にコードを返してくるの ですか?、それからどんな時にどんな終了コードが返るかは、man で調べる以外に基準の様なものはあるのでしょうか?。 #例えば正常終了だと0が返る等 /tmp/の方法でやってみます、もっと単純に出来ないかと思った のですが。(^^ゞ >2番目の方法のソースは、よろしければお見せしましょうか? この方法は、私も非常に興味があります是非お願いします。m(_ _)m |
gettimeofdayについて |
gettimeofday |
>2番目の方法のソースは、よろしければお見せしましょうか? この方法は、私も非常に興味があります是非お願いします。 すいません。これって「wrapperを使う」方ですね。 勘違いしてました。 興味があるのは、perlでの方です。 「suidperlを使う」ってのは、やってみましたが動きませんでした。 なぜなんだろう? |
> 「suidperlを使う」ってのは、やってみましたが動きませんでした。 書き方が悪かったですが、普通にperlスクリプトを書いて、 chown root script;chmod 4755 script として scriptを実行すれば、scriptがsuidされているかどうかを perl(/usr/local/bin/perl)が調べくれて、もしsuidされていたら 勝手にsuidperlを実行してくれます。suidperlはrootにsuidされている プログラムなので、そこで実行権限をscriptのオーナー(この場合はroot) に変えて実行してくれるわけです。 # perl4はどうなるか知らない。 shやcshはそういうことはしてくれないので、suidスクリプトは 実行者の権限でしか動きません。 ちなみにCで書く方法も簡単で、特定のコマンドをexeclやexecvする プログラムをCで書いて、コンパイルして、 chown root program;chmod 4755 program するだけです。 |
先日某所で尋ねられた件について、ちょっと分からなかったので、 質問させて下さい。 尋ねられた内容は、C言語に関して、 if ( NULL != (hp = gethostbyaddr(...)) ) return hp->h_name; というコードで関数が返すポインタが指し示す 文字列の実体が何処に確保されているか? (実際は、これに似たコードで、コンパイラが 警告を出したことが発端なんですが…) ということなのですが、gethostbyaddr()がポインタで返す struct hostent の実体については、 >NOTES >A return value points to static data, >which is overwritten by any subsequently called functions >using the same structure. というのを見つけて、ライブラリ内で1個だけ静的に確保して いることは分かったのですが、この struct hostent のメンバー である char *h_name が指す文字列の実体が何処に確保されて いるのかまでは分からなかったのです。 struct hostent の他のメンバーには char **h_addr_list なんてのもあるんで、これらがすべて静的領域に確保され ているとは考え難いと思います。 でも、もしmalloc()などでヒープに確保されるのであれば、 文字列の利用後に free する必要はないのでしょうか? (必要があれば、どこかに書いてあると思うので、 その必要はないとは思うのですが、だとしたら何故不要なのか がよく分からないのです。gethostbyaddr()の内部で atexti() により free() する関数を登録してるとか…?) それと、unix では、一般にプログラム内部で malloc() などで 確保したメモリをプログラムの終了までに free() を使って 明示的に解放しなかった場合、どうなるのでしょうか? WindowやMS-DOSでのFARヒープの場合のように、メモリ上に ゴミとして残るのでしょうか? それとも、プロセスの終了を見て、システムが自動的に解放 してくれるのでしょうか? |
>「suidperlを使う」ってのは... やっぱだめです。なんでだろ? ls -lの結果は -rwsrwxr-x 1 root 501 342 Mar 25 23:41 su.cgi* で、 su.cgiの内容は、 #!/usr/bin/suidperl $|=1; print "Content-type: text/html\n\n"; print "<html>"; print "<H3>su test</H3>"; print "<pre>\n"; print "#############################\n"; print "<hr>\n"; $_=system("cat /etc/ftpaccess"); print "$_\n"; print system("date>testfile"); print "</pre>"; print "<hr>"; print "</html>"; です。 試しに適当につくってあるので、内容が恥ずかしいんですが #!/usr/bin/suidperl の行も最初は普通にperlを指定したんだけどダメなので、 試しに上記の様にしてもやはりだめでした。 rootでコマンドラインから実行するとOKです。 もちろん /etc/ftpaccessは、600のパーミッションです。 う〜ん、わからん。 変なところが在ったら教えて下さい。 #ちなみにperlは日本語パッチが当たってますけど関係有ります? それからもう一つお願いします。 aliasを使って、あるユーザに来たメールを転送させる設定は /etc/aliasesに記述しないとだめなんでしょうか? いつもいつも御世話になりっぱなしで申し訳ないですが、お師匠様 なにとぞ宜しくお願いします。m(_ _)m |
M.Masudaさん > rootでコマンドラインから実行するとOKです。 一般ユーザでコマンドラインから実行するとどうなります? > $_=system("cat /etc/ftpaccess"); > print system("date>testfile"); ここらへんがくさいです。httpdのエラーログに、PATHがどうこう、と出て ませんか? うちは #!/usr/local/bin/perl print "Content-type: text/plain\n\n"; open(IN,"/etc/ftepaccess"); print <IN>; でOKでした。CGIからでも うまくいきました。 open(IN,"/bin/cat /etc/ftepaccess |"); だと、 Insecure $ENV{PATH} while running setuid at ./a line 4. とエラーになりました。あと、perl4ではsuidスクリプトは動かない ようです。 > aliasを使って、あるユーザに来たメールを転送させる設定は > /etc/aliasesに記述しないとだめなんでしょうか? 質問の意図がよくわかりません。どこか別のところに書きたいのでしょうか? mmさん > それとも、プロセスの終了を見て、システムが自動的に解放 > してくれるのでしょうか? はい、勝手にfreeしてくれます。gethostbyaddrの件は少し調べてから…。 |
LinuxWorldでredhatを入手して一週間! ついにLinux起動いたしました(笑) さぁ、次はインターネットに接続だ。 しかし、ここの話題についていけるようになるのに、どれだけの時間がかかるやら…(笑) |
なぜじゃ〜どうしてじゃ〜←狭間かんぺい調(爆) >一般ユーザで... これもだめです。68Userさんが前に書いたとおりアクセス件が無いと 怒られます。 Insecure $ENV{PATH} while running setuid at ./su.cgi line 13. と出ました。 >httpdのエラーログに、PATHがどうこう、と... アパッチのerror_logは、だんまりです。(>_<) >ここらへんがくさいです。 これも68Userさんと同じコードで試しました、がダメ。 ひとつ不思議を見つけました。 perl -c とすると、Args must match #! line at su.cgi line 1. と出ます。 んっ! とここまで書いて、他の事をいろいろ調べたらどうもこれが 前に疑問だった、suExecの機能のようです。 http://japache.infoscience.co.jp/japanese/manual/suexec.html ってことは、68Userさんの環境はsuExecが実装された環境のようで すね。 #今夜はずっとこの問題で格闘していたのでつかれた....ふげっ! aliasの件は、ダミーユーザー(ログオンしない)宛のメールを管理 者に転送するという意味です。 #やってみれば分かりますね...(^^; .bashrc等の設定ファイルに記述するのは、普通コマンドのailas なのですか? #なんかドッとつかれた....(T_T) |
うちでは #!/usr/local/bin/suidperl でも動きました。 > perl -c とすると、Args must match #! line at su.cgi line 1. と出ます。 suidスクリプトの実行時には、perlに渡す引数と suidperlに渡す引数が同じでなくてはいけません。 # …と、青ラクダ本に書いてありました。 > これも68Userさんと同じコードで試しました、がダメ。 /usr/bin/perl は perl5 ですか? FreeBSDの場合、FreeBSD 3.0R から /usr/bin/perl が perl5 に なったのですが(それまではperl4)、その /usr/bin/perl は suidperl が起動しないようになっていると聞きます。Linuxでも OSの方針で、suidperlを実行しないようにコンパイルされている のかもしれません。 > 68Userさんの環境はsuExecが実装された環境のようですね。 いえ、うちにはSuExecは入れてません。 何か問題が発生すると原因を切りわけていく必要があります。 httpdが原因かもしれないので、CGI経由で実行するより コマンドラインで実行すべきかと思います。 > aliasの件は、ダミーユーザー(ログオンしない)宛のメールを管理 > 者に転送するという意味です。 ん〜、まだちょっと意味がわかりかねます。 > .bashrc等の設定ファイルに記述するのは、普通コマンドのailas > なのですか? そうです。コマンドの alias と /etc/aliases は全く別物です。 ROLさん > ついにLinux起動いたしました(笑) FreeBSDじゃないんですねぇ(^^; > しかし、ここの話題についていけるようになるのに、どれだけの時間がかかるやら…(笑) やる気があればすぐですよん。 |
え〜、FreeBSDでは、gethostby* は libc に入ってますので、 gethostbyaddr のソースは http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostnamadr.c?rev=1.10.2.1 ここらへんです。/etc/hostsなどを見て、見付からなかったらDNS引きに いきますが、それを担当するのは http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostnamadr.c?rev=1.10.2.1 の struct hostent * _gethostbydnsname(addr, len, af) あたりでしょうか。で、そこらへんの絡みで、 static struct hostent * gethostanswer(answer, anslen, qname, qtype) が呼ばれますが、そこで host.h_aliases = host_aliases; host.h_addr_list = h_addr_ptrs; といったことをしています。で、host_aliases や h_addr_ptrs は gethostnamaddr.cの先頭で static char *h_addr_ptrs[MAXADDRS + 1]; static struct hostent host; static char *host_aliases[MAXALIASES]; static char hostbuf[8*1024]; などと定義されいます。ちなみに #define MAXALIASES 35 #define MAXADDRS 35 です。 > これらがすべて静的領域に確保されているとは考え難いと思います。 というわけで、全て static で宣言されているようですね。当然ですが if (hap >= &h_addr_ptrs[MAXADDRS-1]) { if (!toobig++) dprintf("Too many addresses (%d)\n",MAXADDRS); エラーチェックもしています。 > 先日某所で尋ねられた件について、ちょっと分からなかったので、 > 質問させて下さい。 もしよろしければ、その話題が出たのはどこなのか教えていただけますか? こういう楽しい話題が出るところに参加したいもので。 |
> いきますが、それを担当するのは > http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostnamadr.c?rev=1.10.2.1 失礼、 http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostbydns.c?rev=1.23 こっちでした。 でも、char **である host_aliases や h_addr_ptrs が指している char * な領域ってのはどこかな? よく読んでませんが、 static char hostbuf[8*1024]; っぽいですね。 |
>はい、勝手にfreeしてくれます。 なるほどー! freeしなかったリスクは、ユーザーだけが引き受けて、 他人に迷惑を掛けるおそれはない訳ですね。 マルチユーザーのメモリ管理をちゃんと勉強しないといけないなぁ… >え〜、FreeBSDでは、gethostby* は libc に入ってますので、 >gethostbyaddr のソースは あっ、すいません。先に教えて頂いたときに、いろいろあるなー と感心してたのですが、ライブラリのソースがあることまでは、 考えが及びませんでした(^^;;; MS-DOSでも、入手可能な場合はありますが、有償だったり… うーん、やはり羨ましい世界だぁ… ともかく、詳細な解説ありがとうございましたm(_ _)m >というわけで、全て static で宣言されているようですね。 ガ〜ン! こういうコーディングもありなのかぁ… 16bitアドレス(MS-DOSのnearポインタ)でアクセスできる 最大64KBのデータ領域に慣れてしまうと、8KBもの静的領域 ってのが発想しづらい…(^^; >char * な領域ってのはどこかな? よく読んでませんが、 > static char hostbuf[8*1024]; >っぽいですね。 ですね。hostbufのh_nameの後に順に書き並べて、このアドレスを h_aliases[]にストアしてるみたいです。 >もしよろしければ、その話題が出たのはどこなのか教えていただけますか? 残念ながらプログラミング関連のボードではないので、 ご期待には沿えないかもしれません(^^; それと、一応隠しボードなので、ここには書けないです。 でも、リンクを逆に辿って来るのはOKって言ってたので、 向こうからこっちにリンクを張っておきますんで、 覗いてみて下さい(笑い) |
ふぅ、この前はつかれてたのでなかば強制的に自分なりの解答と してしまいましたが、引き続き調べてみました。 #くっそー、グヤジイ!!!(怒笑) >/usr/bin/perl は perl5 ですか? This is perl, version 5.004と(TurboLinix) This is perl, version 5.004_04 built for i386-linux(RedHat)です。 > perl -c とすると、Args must match #! line at su.cgi line 1. コマンドラインでいくつかのパターンを試しましたが、ラクダ本のP644では >あなたが指定したものは、あなたが考えたようには解釈されない可能性がある。 という意味らしいです。 #このシステムではサポートされないという意味なのかなぁ。 だけどrootのコマンドラインからでは全く問題無く動きます。 ちなみに、一般権限でコマンド上の実行は、スクリプトの内容通り cat /etc/ftpaccess でエラー終了します。 その際のメッセージです。 Insecure $ENV{PATH} while running setuid at ./su.cgi line 15. #当然の結果ですよね。 > suidスクリプトの実行時には、perlに渡す引数と > suidperlに渡す引数が同じでなくてはいけません。 「青ラクダ本に書いて...」すいませんページ教えてくれません か。m(_ _)m >何か問題が発生すると原因を切りわけていく必要があります。 > httpdが原因かもしれないので、CGI経由で実行するより > コマンドラインで実行すべきかと思います。 コマンドラインでは、68Userさんの言う通りの結果だったので やはりhttpdの方なんでしょうか。 >そうです。コマンドの alias と /etc/aliases は全く別物です。 アッそうか! 完全に勘違いしていました。(>_<) で、/etc/aliasesを修正し newaliasを実行したのですが... 反映されませんでした。 FreeBSDだと、/etc/aliasesを修正して、newalisasを実行するだけで 反映されるのでしょうか? 現在英語マニュアルと格闘中です。 ちなみにnewalias事項の際に、以下のようなメッセージが出ます。 Couldn't open /usr/lib/aliases.text for input! #どうも/usr/lib/aliases.textが開けないと言っているらしい。 #英語圏で生まれていれば、こんな苦労は無かったのに(; ;) |
追加ですが。 > perl -c とすると、Args must match #! line at su.cgi line 1. これは、スクリプトのパーミッションを4755とした時にでます。 0755にすると出ません。 なにか関係があるのでしょうか? |
> ちなみに、一般権限でコマンド上の実行は、スクリプトの内容通り > cat /etc/ftpaccess でエラー終了します。 #!/usr/local/bin/perl $ENV{PATH}=''; open(IN,"/etc/ftpaccess"); print <IN>; ではどうですか? これでダメなら、suidperlは使えない設定になっている んじゃないでしょうか。 > すいませんページ教えてくれませんか。 > ラクダ本のP644では >>あなたが指定したものは、あなたが考えたようには解釈されない可能性がある。 > という意味らしいです。 の6行下に書いてあります(^^; M.Masudaさんが見てるのは違うメッセージの 説明ですよね。 > FreeBSDだと、/etc/aliasesを修正して、newalisasを実行するだけで > 反映されるのでしょうか? はい、そうです。 > ちなみにnewalias事項の際に、以下のようなメッセージが出ます。 > Couldn't open /usr/lib/aliases.text for input! FreeBSDでは /usr/lib/aliases.txt というファイルはないので ちょっとわかりません。newaliases(1)、aliases(5)あたりに書いて ありませんか? バイト行くんで、この辺で。では〜。 |
バイトお疲れ様でした。 いや〜ハマリまくりです。(^^; 結果から言えば動きました。ありがとうございました。 #68Userさんの助言が無ければ、解明する前に諦めていました。 実験で分かった事です。 いくつかの要因が有りました、私のスクリプトがおかしかったの ですが一番まずかったのは、一番最初に68Userさんの提示されたコー ドの通りで動かなかったので、試験スクリプトはsystem()や`コマンド` としていたのがいけなかったです。 つまり68Userさんのいうとおり、suidビットを立てると、あくまで perlが行う操作(openとか)はsuid権限で動きますが、forkされた プロセスでは、再びnobodyに戻ってしまう事です。 てっきりsuidの権限が継承されると思ってました。 #ちなみに $ENV{PATH}='';は削除しても動きました。 以下は試験に使用したスクリプトです。 生成されたファイルのオーナーを見てfork時の権限が分かりました。 #!/usr/local/bin/perl -w $|=1; print "Content-type: text/html\n\n"; print "<html><H3>suid</H3><pre>"; print "<hr>\n"; #$ENV{PATH}=''; open(IN,"./himitu.txt") || die "error:$!"; print <IN>; close(IN); open(OUT,">./make_open") || die "error:OUT $!"; print OUT "Open Command\n" ; close(OUT); if (!system("ls>make_system")) { print "Not Exec System $!\n"; } print "Next Step OK!\n"; print "<hr>\n"; print "Script END\n"; print "</pre></hr></html>\n"; それと検証不足かも知れませんが、perlスクリプト内でsystemコマ ンドを使うと、スクリプトが終了します。 上記の例でいうと、最後の方のprintが実行されません。 ファイルオーナーを、nobodyの時webから実行すると最後まで表示され たので、もしかしたらセキュリティー面での仕様かも知れません。 #エラー位出してくれればいいのに。 それからどういう訳か、perlスクリプト内で closeとするとSTDOUT までcloseしてくれちゃいます。#これってバグ? おかげで勝手にスクリプトが終了するので、これが分かるまで苦労 しました。 #closeにハンドル名をちゃんと指定するとOKでした。 とりあえずこんなとこまで分かりました。 設定は面倒ですが、これでやりたかった事に見通しが出てきました。 ありがとうございます。 >の6行下に書いてあります(^^; M.Masudaさんが見てるのは違うメッセージの > 説明ですよね。 お恥ずかしいばかりです。(>_<) aliasesの方は、どこの解説も68Userさんと同じ説明でした。 他のパッケージのサーバーで試してみます。 PS メール見てもらえましたか? PS2 私の隠しブックマーク見ましたね(^^; |
> メール見てもらえましたか? (僕にとっては)内容的に問題ないので、メールの続きはこちらでやります。 > その前に、田中 健という人物をご存知ですか? > http://www.club.kyutech.ac.jp/~hermit/ いやぁ、知らないです。イントラネット内(インターネットとは繋がって いない)で うちのページをコピーして社員向けに公開してもいいか、という メールは頂いたことがありますけど、それとは多分違う人だと思います。 ま、別にいいですけどね。どうせ間違いだらけ/役に立たないコンテンツ なので気にしません。おもしろいものを教えてくださって どうも ありがとうございました(笑) > forkされたプロセスでは、再びnobodyに戻ってしまう事です。 ん〜どうかなぁ? もしそうだとすると suidperl 内では、system や `` などで サブプロセスを(所有者権限で)使えないことになりますが、だとしたら suidperl の意味は半減しますよね。今 実行環境がないので、後からもう少し調べてみます。 > 私の隠しブックマーク見ましたね(^^; ははは、見たかもしれません。 カウンタのあるページは referer 取ってますので、ご注意を>All たまに、どんな風に紹介されてるか見に行ったりします。一度referer たどって行ったらボロクソにけなされてて、喜んでそこの人にメール 書いたこともあります。 # だって、「いいページだ」と書かれるより、「ひどいページだ」と # 書いてある方がうれしいから。悔しいので、ページを よりよいものに # しよう、という気が起こりますよね。 このBBSは referer 取ってませんでしたが、mmさんに > 向こうからこっちにリンクを張っておきますんで、 > 覗いてみて下さい(笑い) と言われたので、昨日から取り始めました(^^; でも、それらしいものが 見付からないなぁ。 > あっ、すいません。先に教えて頂いたときに、いろいろあるなー > と感心してたのですが、ライブラリのソースがあることまでは、 > 考えが及びませんでした(^^;;; まぁ僕はローカルにソースを展開しているので、grep 一発で探せますが、 ネット上で公開されてても探すのはつらいですね。 |
> forkされたプロセスでは、再びnobodyに戻ってしまう事です。 やはりうちではそうはなりませんでした。 #!/usr/local/bin/perl $|=1; $ENV{PATH}=""; print "Content-type: text/plain\n\n"; open(IN,"/bin/cat /etc/master.passwd"); print <IN>; if ( fork ){ system("/usr/bin/id"); } else { system("/usr/bin/id"); } というスクリプトをowner=root、permission=4755にして、コマンドライン、 httpd 経由両方で動くことを確認しました。600な/etc/master.passwdの 中身は表示されましたし、idの結果は uid=65534(nobody) euid=0(root) となりました。forkしても実効ユーザはrootのままでした(まぁ system を 実行するってことは、fork/execしてるわけですが)。 なお、PATHをクリアしないと Insecure $ENV{PATH} while running setuid at ./hoge.cgi line xx. となりました。 あ、ファイルを作成してみるのを忘れてた。もしかしたらそのとき作成した ファイルのオーナーは実効ユーザIDでなく、実ユーザIDが使われるのかも しれません。 |
えぇぇぇぇぇぇぇぇ!!!!!!??????? なんでぇ??? #すいません無駄な行を書いてしましました。(^^ゞ なんか、うちの環境system関数が変です。 suidを立てずに、普通に755のパーミッションです。 #!/usr/bin/perl print "Content-type: text/plain\n\n"; print "Script Start\n"; if(system("")){ print "Done..\n"; }else{ print "NG! \n"; } #system("ls -l 2>&1"); print "End Script\n"; 2つめのsystem関数(system("ls -l 2>&1")の部分)を、コメントア ウトした時としない時の結果の結果を教えてくれませんか? うちの環境では、2つ目のsystemを有効にすると、サーバーエラー になります。 コマンドラインから実行すると、正常なんですが...。 #なぜ???? |
うちでも同じです。print文がバッファリングされた 状態でsystemの結果が先に表示されてるのでしょう。 先頭で $|=1 とすればいいでしょう。 httpdがログ(/var/log/httpd-error.logなど)に [Mon Mar 29 15:32:06 1999] [error] malformed header from script. Bad header=total 1406: と吐いてくれるはずです。 |
>先頭で $|=1 とすればいいでしょう。 なるほど、これ($|=1)も関係あったんですね。 う〜ん、もっと詳しく検証せねば。 もうちょっと探ってみます。 |
一般的には、以下のの方法でデバッグすると、大抵の場合解決すると思います。 #!/usr/local/bin/perl $|=1; print "Content-type: text/plain\n\n"; open(EXEC,"| .$ENV{PATH_INFO} 2>&1"); while (<STDIN>){ print EXEC; } という内容の wrapper.cgi を作ってください。hoge.cgiの動作チェックをしたいなら /~user/cgi-bin/wrapper.cgi/hoge.cgi や /~user/cgi-bin/wrapper.cgi/hoge.cgi?data などというURLで実行してください。そしたら、 - $|=1を付けないと Content-type より ls の結果が先に出力されてること - system や open(COMMAND,"command |") の中で cat: /etc/master.passwd: Permission denied などのエラーが起こっていること がわかるでしょう。一連の環境変数(QUERY_STRINGなど)は引き継がれますし、 POSTの場合のデータの受け渡しもできます。 というわけで、CGIが動かなかったら、まずはこれでチェックして みてください。 あと > もしかしたらそのとき作成したファイルのオーナーは実効ユーザIDでなく、 > 実ユーザIDが使われるのかもしれません。 は、suidなperlスクリプト中で新規ファイルを作成した場合は perlスクリプト所有者権限で動きました。つまり uid=65534(nobody) euid=0(root) の場合、新規ファイルのオーナーはrootになりました。 |
大変お騒がせしている、M.Masudadです。 こんどこそやっと解決マークがつけられそうです。(^^ゞ >なんか、うちの環境system関数が変です。 この件に関しては、原因はsystem関数実行時に、指定コマンドの パスが通って無いのが原因と判明しました。 フルパス指定するとsystem関数はちゃんと動きました。 今までsystemでコマンドを使ったサーバーのnobodyにはたまたま コマンドのパスが通っていただけみたいですね。 #いままでぜんぜん気が付かなかった....。 #なんか一人で大騒ぎしてますね。←私(>_<) まとめるとsuidスクリプトを、実行したい権限のオーナーにして chmod 4755 を設定。 $|=1; でバッファリングを止めて、systemで使うコマンドはフルパ スで指定するか、パスをあらかじめ指定しておく。 closeはどうですか?、ファイルハンドルを指定しなくとも最後に openしたハンドルのみクローズされると、思っていたのですが。 suidな時、STDOUTまでクローズされませんか? $|=1; は、保険と考えて全てのperlスクリプトに入れた方が、悩む 回数が減りそうですね。 やはりperlもosと密接に関係しているのが改めて分かりました。 こういうケースは、UNIXのシステムを十分理解していないとデバック しきれなかったかも知れないですね。 http://www.excel-net.co.jp/~masuda/su/ にある su.cgi に試験スクリプトを置きました。 これで見ると、だいぶ嘘ついてましたね。(^^ゞ 今までの件が判明しました。 実験に付き合ってもらってすいませんでした。 wrapper.cgiもありがとうございます。 非常に勉強になりました。m(_ _)m ところで、wrapper.cgiでのurl指定方法のwrapper.cgi/hoge.cgi は、知ってはいたのですがどういう動作になるのですか? ># だって、「いいページだ」と書かれるより、「ひどいページだ」と ># 書いてある方がうれしいから。悔しいので、ページを よりよいものに ># しよう、という気が起こりますよね。 いや〜こういう前向きな考え方をできる人って、今時なかなかいな いですよ。 #68UserさんってもしかしてA型? |
> ファイルハンドルを指定しなくとも最後に openしたハンドルのみ > クローズされると、思っていたのですが。suidな時、STDOUTまで > クローズされませんか? suidかどうか/httpd経由かコマンドラインか に関わらず、STDOUTが クローズされました。そもそもcloseってファイルハンドルを省略 すべきでないし、仮に省略した場合はselectで指定されたファイル ハンドル(デフォルトはSTDOUT)がクローズされるんじゃないですかね? # perl4、perl5.004で試しました。 > ところで、wrapper.cgiでのurl指定方法のwrapper.cgi/hoge.cgi > は、知ってはいたのですがどういう動作になるのですか? print文を埋め込んで試してみませう ;-) |
>suidな時、STDOUTまでクローズされませんか? ホントだぁ...これまた私の勘違い。 いままで作ったスクリプトを見直したら、ちゃんとやってました。 意識していたわけではなく、性格的な問題?からそうしていたの ですが、これって案外重要だったのですね。 この件でのスクリプトでの試験では、安易にそうしていただけでし た。#お恥ずかしい。(*^_^*;;; closeのみだとSTDOUTまでクローズされ、結果スクリプトが終了して しまうのですね。 >パスが通って無いのが原因と判明しました。 よく考えたら、スクリプト内で$ENV{PATH}=''としてるのに、何を 言ってるんでしょう私は。(; ;) でもなんで、$ENV{PATH}=''としなければいけないのでしょうか。 新たな疑問! #まるで小学生のガキが、なぜなぜ攻撃してるみたいですが..(^^ゞ #最近、私を含め周りにUNIX信者が増えている模様です。 #だって面白いんだもん。 >print文を埋め込んで試してみませう ;-) すいません、オバカでよく分からないのですが具体的にどうすれば 私にも理解できるでしょうか。 ↑完全に開きなおってるかもしれない(^_^)V これだけいろいろ御世話になっているので、何かお礼がしたいとこ ろですが、なにか出来る事が有れば言って下さい。 と、いっても何が出来るわけでは無いし....でも気持ちだけは有り ます。(本気度=120%) |
> すいません、オバカでよく分からないのですが具体的にどうすれば > 私にも理解できるでしょうか。 何を知りたいのかわからないので、全部は説明したくないです(結構な量になるので)。 何を知りたいのでしょうか? できれば open(EXEC,"| .$ENV{PATH_INFO} 2>&1"); というのを書いたのだから、「とりあえずPATH_INFOの値を見てみる」 くらいは試してください。 > でもなんで、$ENV{PATH}=''としなければいけないのでしょうか。 一言で言えば「汚れている」からです。消す必要はなくて、PATHを 再設定すればよかったですね。長くなるので青ラクダ本 P.409 参照。 別に質問するなってわけじゃないですけど、自分で調べる努力は必要です。 それでもわからなかったらどんどん質問すればいいですけど、その際でも 極限まで発生条件を切り詰めた上で、 「何がわからないか」「どのような状況で調べたのか」 などを書かないと、結局 回答者側が苦労するハメになります。 |
よかったやっと見れるようになった。(^^ゞ う〜んすいませんです。 >> すいません、オバカでよく分からないのですが具体的にどうすれば >> 私にも理解できるでしょうか。 > 何を知りたいのかわからないので、全部は説明したくないです(結構な量になるので)。 >「print文を埋め込んで試してみませう ;-)」 この意味そのものが分からなかったのです。m(_ _)m この文がどういう意味で書いたのか、何を言いたかったのか、 と言う意味で、単純に私の日本語理解度が足りないための質問でした。 > 何を知りたいのでしょうか? できれば > open(EXEC,"| .$ENV{PATH_INFO} 2>&1"); >「とりあえずPATH_INFOの値を見てみる」 > くらいは試してください。 setコマンドで環境変数を見てみましたが PATH_INFOは設定されてい ませんでした。 私なりに理解できた部分は open(EXEC,"| .$ENV{PATH_INFO} 2>&1"); .$ENV{PATH_INFO} の実行結果の標準&エラーを、openして標準入力 から読込み、表示させているという事位ですが。 前に使い方を、教えてもらい(wrapper.cgi/script.cgi)このような URL指定でscriptcgiを実行すると、コマンドラインでの結果の様な表示に なりました。 まず最初に、wrapper.cgi/script.cgi この様な指定をすると(URLで) httpdはどういう事を行うのでしょうか? 予想1: $ENV{PATH_INFO}には、コマンドでの引数に当たるものが代入される? 予想2: 最初に出現したwrapper.cgiの引数に、script.cgiを与えて実行する? $ENV{PATH_INFO}この環境変数自体が、いつどのように設定されるのかが 解からないので、動作の結果から推測だけですが.... スクリプトやコマンドの実行時に、コマンドラインでの引数を指定する のと同じような動作になるのでしょうか? 仮に上記の予想が合っているとして、「print文を埋め込んで試してみませう ;-)」 この文は、どこにprint文を入れろと言っているのかが、解からなかったのです。 私にとってまだ頭の中では、wrapper.cgi/script.cgiの様な指定方法は、 掲示板等では話題としては知っていましたが、具体的な内容まではまだ 未解析でした、すいませんです。 |