68user's page 掲示板

Prev< No. 195〜291> Next  [最新発言に戻る] [過去ログ一覧]
No. 195 # 68user 1999/03/18 (木) 21:42
やはりみなさん知ってますか。僕は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になるんですが…。

No. 196 # 68user 1999/03/18 (木) 22:03
> ところでbcで割り算の結果を小数点の精度で得る方法をご存知ですか?
man読んでたら書いてありました。scale=3などとして、有効桁数を
指定すればいいんですね。デフォルトはscale=0だから、小数点以下は
表示されない、と。

あと、ご存知かもしれませんが、bc(GNU bc)の日本語マニュアルは
    http://www.jp.freebsd.org/man-jp/search.html
で見られます。

No. 197 # M.Masuda 1999/03/18 (木) 22:27
>> それでは、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シリーズ
用のソフトは便利でした。
メモリチェックをすっ飛ばしてくれるので、環境の切り替え時にバッチ
組んでメニューで再起動なんてよくやっていました。

No. 198 # 68user 1999/03/18 (木) 23:32
> これは、最近小耳に挟んだ事なのですが、一部のサーバー(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だけを
特別扱いしてることになるんですが…。

No. 199 # mm 1999/03/18 (木) 23:34
> http://X68000.startshop.co.jp/~68user/tmp/.completerc
ガ〜ン!
やはり、ご本家は、スゴーイ!!

DOSの貧弱な環境を何とかunixに近づけたいと思っていたのですが、
やはり所詮、マネはマネに過ぎなかったみたいですね(^^;
(でも、プリミティブなDOSは、やはり問題外…)


M.Masuda さん
>メモリチェックをすっ飛ばしてくれるので、環境の切り替え時にバッチ
>組んでメニューで再起動なんてよくやっていました。
えー、一体どのような環境を切り替えられたのでしょうか?
キャラクタデバイスやTSRなら、リセットしなくても変更可能だし、
それ以上の環境の切り替えはウチでは必要なかったので、
そういうのは使ったことないです(^^;

No. 200 # mm 1999/03/19 (金) 00:04
>えー、一体どのような環境を切り替えられたのでしょうか?
すいません。ついオンラインで読んで疑問に思って書き込んでしまいましたが、
このボードとは無関係の話題でした(^^;
この質問は、なかったことにして下さいませm(_o_)m
(それに、RAMディスクやディスクキャッシュの構成を変える場合にも、
リセットは必要ですね(^^;)

No. 201 # mm 1999/03/19 (金) 00:04
>えー、一体どのような環境を切り替えられたのでしょうか?
すいません。ついオンラインで読んで疑問に思って書き込んでしまいましたが、
このボードとは無関係の話題でした(^^;
この質問は、なかったことにして下さいませm(_o_)m
(それに、RAMディスクやディスクキャッシュの構成を変える場合にも、
リセットは必要ですね(^^;)

No. 202 # M.Masuda 1999/03/19 (金) 00:29
>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
> ガ〜ン!
> やはり、ご本家は、スゴーイ!!
全く同感です。

No. 203 # M.Masuda 1999/03/19 (金) 16:09
結果の報告です。

>え、ほんとですか? それだと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
と言われるようになってしまいました。
ロックファイルにアクセス権が無いって事でしょうが、それが
どこに有るのか解からない。(>_<)
どうすればいいでしょう。とほほ。

No. 204 # いわもと 1999/03/19 (金) 21:05
こんばんは。いわもとと申します。
今日1日散々悩んでいたんですが、crontabコマンドから
シェルファイルを呼び出し、そのシェルファイルの中で
SQL*PLUSを呼び出してPL/SQLプロシージャを実行させようと
していたのですが、TNSサービス名が認識できないと
エラーを返されてしまいました。
直接シェルファイルを実行させるとちゃんとサーバを
認識してプロシージャを実行してくれるのですが、
crontabコマンドから呼び出すとうまく行きません。
tnsnames.oraファイルも正しく入力されていましたし、
まったく原因がつかめません。
どなたかこういうエラーに詳しい方、解決方法を
教えていただけないでしょうか。

No. 205 # M.Masuda 1999/03/19 (金) 21:41
こんばんは岩本さん。
http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#crontab
上のページでcron実行時の注意として、
「なお、crontabで実行されるときには、ほとんどの環境変数が指定
されていないので注意が必要。」と有りますが、試しに簡単なスク
リプトで、実行時に有効になっている環境変数を表示させてみて
必要な変数をスクリプトに追加してみたらどうでしょうか?
多分この辺のような気が...
#またぜんぜん違ったりして。(^^;

No. 206 # 68user 1999/03/20 (土) 07:02
M.Masudaさんへ。
    % grep -i procmail /etc/sendmail.cf
の結果を教えていただけますか。

> crontabコマンドからシェルファイルを呼び出し…
SQL*PLUSなるものも、TNSなるものも知らないので、あくまで一般論
ですが、確かに環境変数が原因であることが多いと思います。

csh/shスクリプトなら、-xや-vオプションを付けることで、
どこで止まっているかわかります。また、
    % env - sh
とすると、環境変数を完全にクリアした状態のshが立ち上がるので、
その状態でスクリプトを動くような状態にしてみてはいかがでしょう。
# ただし、cronでは設定されているはずのPATH、HOME、USERなども
# クリアされてしまいます。

No. 207 # M.Masuda 1999/03/20 (土) 11:55
> % 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
と出ました。
これは吉か、はたまた大凶か?
出来れば意味を教えて下さい。(^^;

No. 208 # M.Masuda 1999/03/20 (土) 22:52
こちらは 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接続時でのアクセス制限です。

No. 209 # 68user 1999/03/21 (日) 00:40
へぇぇぇぇ、ほんとにprocmailを特別扱いしてるんですね。

> 出来れば意味を教えて下さい。(^^;
きついことをおっしゃる(笑)

Mで始まる行は、配信エージェントの定義を表します。
P=はプログラムのパス、S=とP=はエンベロープ/ヘッダの書き換え、
10/30、20/40ってのは書き換え規則(どこか別の場所で定義されている)、
F=はこの行の(他の行から参照する際の)設定の名前を決めてるのかな?
それとも他での定義を参照してるのかな?
T=は、メールヘッダに追加される? A=... はわかりません。

sednmail.cfを理解できるほどの知識があるわけではないので
(コウモリ本も持ってない)、こんなもんでご勘弁を(^^;

Slackwareの配布サイトを見てみましたが、やはり標準で
procmailを特別扱いしているようです。Linux界では
普通なのでしょうか(僕からするとちょっと気持ち悪いですが)。

> それから、WU-FTPDでの/etc/ftpaccessの設定について
> もし分かるのならメールで直接聞いてもいいでしょうか。
すいません、wu-ftpdは使ったことがないのです。

No. 210 # ぬいぐるみバンザイ [URL] 1999/03/22 (月) 02:56
はじめまして、こんばんわ。ぬいぐるみバンザイと言います。

CGIについてですが、少し質問があります。
それは、ホームページの更新状況を(自分や他人のサイトも含めて)自動で
(そのCGIを実行すれば)検知するようなものを作りたいor探しているのですが
お心当たりはないでしょうか?

初心者の自分ではソケットを使ってターゲットとなるサイトに接続して、index.htmlあたりの
ファイルの月日を取得できたらいいなと思うのですが、こういうことは可能なのでしょうか?
初心者ゆえ、何をいってんだ?的なところがあるかも知れませんが、よろしくお願いします。m(__)m


ではでは

No. 211 # mm [URL] 1999/03/22 (月) 03:26
自分のサイトならば、上のURLのスクリプトではいかがでしょう…
他人のサイトの場合は、仰るようにソケットを使って HEAD メソッドかな…

M.Masuda さん
>4M積んだノートでは、620kbのfreeは確保出来たのですがそれで
>限界でした。
そう言えば、そんなことが流行ったことも…、でも620はスゴイ…(笑い)

No. 212 # 68user 1999/03/22 (月) 05:47
> それは、ホームページの更新状況を検知するようなもの
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にそういう機能が付属しているのでは
ないでしょうか。

No. 213 # takashi 1999/03/23 (火) 17:13
はじめまして。

UNIX初心者なので、いろいろ分からない事があり、
いきなりですが、みなさんに教えて頂きたいことがあります。

シェルスクリプト内にてスーパーユーザーになりあるコマンドを
発行したいのですが、スーパーユーザーになったところで
プロンプトが帰ってきてしまい、以降の処理に行きません。

どの様にすれば、シェルスクリプト内にてスーパーユーザーになって
コマンドを発行できるのでしょうか?

よろしくお願い致します。
できれば、シェルのサンプルを見せていただければと思っております。

No. 214 # M.Masuda 1999/03/23 (火) 18:42
>へぇぇぇぇ、ほんとにprocmailを特別扱いしてるんですね。
ありゃりゃ、ほんとにそうだったんですか、私の勘違いなのかなぁ
なんて思って、「違いますよぉ」なんてレスが返って来るかと思っ
てました。(^^;;;;

一番難しいと言われるsendmailに関しては、既に私の理解を超えてる
ので、今は逃げます...(爆)
将来の、目標としておきます。(^^ゞ

>きついことをおっしゃる(笑)
そんなそんな、コウモリ本もなくてあれだけ理解してればぜんぜん
○では?...。
でも本当にシステムによってかなり設定が違うんですね。
勉強になります。

>すいません、wu-ftpdは使ったことがないのです。
残念です。一応目的の事は達成出来たのですが、その手順での
他の部分への影響が知りたかったのです。
この辺は、いくら1ソフトの設定が出来ても、システムそのものに
詳しくないと、分かりませんからね。

プログラマーの弟は、free630kbと私に自慢してました。(^^ゞ>mmさん
#すいません、違う話題で...>68Userさん

こんにちはtakashiさん
シェルスクリプト内でrootになる?
それってどうやるのですか?
普通suコマンドやpasswdコマンドでは、わざとユーザーに入力要求
を出して、システムを保護するようになっているという話を聞いた
事が有ります。
それに、スクリプト内にrootのパスワードを記述しなければいけな
いのでは?
もしそうなら、それはセキュリティー的に辞めた方がいいと思いま
すよ。
何をしたいのかが分かりませんが、root権限でログイン中以外の時
に、何かをさせたいのであればcrontabなどで実現させるのがいいと
思いますヨ。
#外しているかなぁ(^^ゞ

No. 215 # takashi 1999/03/23 (火) 20:11
M.Masudaさん、ありがとうございます。

Masudaさんと言う通り、セキュリティの問題のあるやり方なので、
他の方法を考えたいと思います。

また、お世話になると思いますが、その時にもよろしくお願い致します。

No. 216 # M.Masuda 1999/03/23 (火) 23:51
>他の方法を考えたいと思います。
どんな事をしたいのかを書くと、きっと有効な情報が得られると
思いますヨ。

またまた、御世話になります。m(_ _)m
シェルスクリプトのif文で、前のコマンドの終了結果を知りたい場
合はどうすればいいのでしょうか?
具体的にはこうです。
/#!usr/bin/sh
vi text.txt
if [ 条件(text.txtを更新したら) ];then
        date>>text.txt
fi

条件のところでの指定法方が解からないのです。(^^ゞ
#すげー初心者ですね←私

No. 217 # ぬいぐるみバンザイ 1999/03/24 (水) 00:38
ありがとうございます。m(__)m>mmさん、68userさん

やっぱり、CGIで全部自動というのは、難しそうですね。
教えて貰ったことを参考に作ってみます。また来ることがあるかも知れませんが
その時はよろしくお願いします。m(__)m


ではでは

No. 218 # 68user 1999/03/24 (水) 01:23
> 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番目の方法のソースは、よろしければお見せしましょうか?

No. 219 # 68user 1999/03/24 (水) 01:47
ん〜、コマンドの status は $? を見ればいいですけど、
今試してみたところでは、更新してもしなくても、どちらも
0 を返してきました。正常終了は正常終了なので更新の有無は
関係ないのでしょう。

で、この場合は最終更新時刻が更新されたかを調べるとか、
/tmpにコピーして、それを編集させ、元のファイルとdiffする
などするのがいいんじゃないでしょうか。

No. 220 # M.Masuda 1999/03/24 (水) 12:46
>ん〜、コマンドの status は $? を見ればいいですけど、
あれま、やっぱ甘かった!。
viの終了コードで判別しようと思ったんですが...、そうですね
よく考えたら、保存しようがしまいが一応正常終了だから、それ
では判別できませんね。(^^ゞ
わざわざ試してもらってすいません。
#でも「$?」の方法が知らなかった...
#ホント初心者です。(*^_^*)

DOSの場合、終了コードはかなりいい加減だっただった記憶が
有ります。UNIXの各コマンドの場合正確にコードを返してくるの
ですか?、それからどんな時にどんな終了コードが返るかは、man
で調べる以外に基準の様なものはあるのでしょうか?。
#例えば正常終了だと0が返る等

/tmp/の方法でやってみます、もっと単純に出来ないかと思った
のですが。(^^ゞ


>2番目の方法のソースは、よろしければお見せしましょうか?
この方法は、私も非常に興味があります是非お願いします。m(_ _)m

No. 221 # H.SAWA 1999/03/24 (水) 20:07
gettimeofdayについて

No. 222 # H.SAWA 1999/03/24 (水) 20:08
gettimeofday

No. 223 # M.Masuda 1999/03/25 (木) 00:30
>2番目の方法のソースは、よろしければお見せしましょうか?
  この方法は、私も非常に興味があります是非お願いします。
すいません。これって「wrapperを使う」方ですね。
勘違いしてました。

興味があるのは、perlでの方です。
「suidperlを使う」ってのは、やってみましたが動きませんでした。
なぜなんだろう?

No. 224 # 68user 1999/03/25 (木) 17:04
> 「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
するだけです。

No. 225 # mm 1999/03/25 (木) 23:55
先日某所で尋ねられた件について、ちょっと分からなかったので、
質問させて下さい。

尋ねられた内容は、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ヒープの場合のように、メモリ上に
ゴミとして残るのでしょうか?
それとも、プロセスの終了を見て、システムが自動的に解放
してくれるのでしょうか?

No. 226 # M.Masuda 1999/03/26 (金) 00:00
>「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

No. 227 # 68user 1999/03/26 (金) 00:30
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の件は少し調べてから…。

No. 228 # ROL 1999/03/26 (金) 00:51
LinuxWorldでredhatを入手して一週間!
ついにLinux起動いたしました(笑)
さぁ、次はインターネットに接続だ。

しかし、ここの話題についていけるようになるのに、どれだけの時間がかかるやら…(笑)

No. 229 # M.Masuda 1999/03/26 (金) 01:33
なぜじゃ〜どうしてじゃ〜←狭間かんぺい調(爆)
>一般ユーザで...

これもだめです。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)

No. 230 # 68user 1999/03/26 (金) 02:20
うちでは #!/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じゃないんですねぇ(^^;

> しかし、ここの話題についていけるようになるのに、どれだけの時間がかかるやら…(笑)
やる気があればすぐですよん。

No. 231 # 68user 1999/03/26 (金) 03:12
え〜、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);
エラーチェックもしています。

> 先日某所で尋ねられた件について、ちょっと分からなかったので、
> 質問させて下さい。
もしよろしければ、その話題が出たのはどこなのか教えていただけますか?
こういう楽しい話題が出るところに参加したいもので。

No. 232 # 68user 1999/03/26 (金) 13:03
> いきますが、それを担当するのは
>  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];
っぽいですね。

No. 233 # mm 1999/03/26 (金) 22:06
>はい、勝手に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って言ってたので、
向こうからこっちにリンクを張っておきますんで、
覗いてみて下さい(笑い)

No. 234 # M.Masuda 1999/03/27 (土) 16:35
ふぅ、この前はつかれてたのでなかば強制的に自分なりの解答と
してしまいましたが、引き続き調べてみました。
#くっそー、グヤジイ!!!(怒笑)

>/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が開けないと言っているらしい。

#英語圏で生まれていれば、こんな苦労は無かったのに(; ;)

No. 235 # M.Masuda 1999/03/27 (土) 16:37
追加ですが。
> perl -c とすると、Args must match #! line at su.cgi line 1.
これは、スクリプトのパーミッションを4755とした時にでます。
0755にすると出ません。
なにか関係があるのでしょうか?

No. 236 # 68user 1999/03/27 (土) 20:45
> ちなみに、一般権限でコマンド上の実行は、スクリプトの内容通り
> 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)あたりに書いて
ありませんか?

バイト行くんで、この辺で。では〜。

No. 237 # M.Masuda 1999/03/28 (日) 00:25
バイトお疲れ様でした。

いや〜ハマリまくりです。(^^;
結果から言えば動きました。ありがとうございました。
#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
私の隠しブックマーク見ましたね(^^;

No. 238 # 68user 1999/03/28 (日) 09:03
> メール見てもらえましたか?
(僕にとっては)内容的に問題ないので、メールの続きはこちらでやります。

> その前に、田中 健という人物をご存知ですか?
> http://www.club.kyutech.ac.jp/~hermit/
いやぁ、知らないです。イントラネット内(インターネットとは繋がって
いない)で うちのページをコピーして社員向けに公開してもいいか、という
メールは頂いたことがありますけど、それとは多分違う人だと思います。

ま、別にいいですけどね。どうせ間違いだらけ/役に立たないコンテンツ
なので気にしません。おもしろいものを教えてくださって どうも
ありがとうございました(笑)

> forkされたプロセスでは、再びnobodyに戻ってしまう事です。
ん〜どうかなぁ? もしそうだとすると suidperl 内では、system や `` などで
サブプロセスを(所有者権限で)使えないことになりますが、だとしたら suidperl
の意味は半減しますよね。今 実行環境がないので、後からもう少し調べてみます。

> 私の隠しブックマーク見ましたね(^^;
ははは、見たかもしれません。

カウンタのあるページは referer 取ってますので、ご注意を>All
たまに、どんな風に紹介されてるか見に行ったりします。一度referer
たどって行ったらボロクソにけなされてて、喜んでそこの人にメール
書いたこともあります。
# だって、「いいページだ」と書かれるより、「ひどいページだ」と
# 書いてある方がうれしいから。悔しいので、ページを よりよいものに
# しよう、という気が起こりますよね。

このBBSは referer 取ってませんでしたが、mmさんに
> 向こうからこっちにリンクを張っておきますんで、
> 覗いてみて下さい(笑い)
と言われたので、昨日から取り始めました(^^; でも、それらしいものが
見付からないなぁ。

> あっ、すいません。先に教えて頂いたときに、いろいろあるなー
> と感心してたのですが、ライブラリのソースがあることまでは、
> 考えが及びませんでした(^^;;;
まぁ僕はローカルにソースを展開しているので、grep 一発で探せますが、
ネット上で公開されてても探すのはつらいですね。

No. 239 # 68user 1999/03/29 (月) 13:46
> 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が使われるのかも
しれません。

No. 240 # M.Masuda 1999/03/29 (月) 15:19
えぇぇぇぇぇぇぇぇ!!!!!!???????
なんでぇ???
#すいません無駄な行を書いてしましました。(^^ゞ

なんか、うちの環境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を有効にすると、サーバーエラー
になります。
コマンドラインから実行すると、正常なんですが...。
#なぜ????

No. 241 # 68user 1999/03/29 (月) 15:39
うちでも同じです。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:
と吐いてくれるはずです。

No. 242 # M.Masuda 1999/03/29 (月) 15:59
>先頭で $|=1 とすればいいでしょう。
なるほど、これ($|=1)も関係あったんですね。
う〜ん、もっと詳しく検証せねば。

もうちょっと探ってみます。

No. 243 # 68user 1999/03/29 (月) 16:11
一般的には、以下のの方法でデバッグすると、大抵の場合解決すると思います。
    #!/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になりました。

No. 244 # M.Masuda 1999/03/29 (月) 18:09
大変お騒がせしている、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型?

No. 245 # 68user 1999/03/29 (月) 20:44
> ファイルハンドルを指定しなくとも最後に openしたハンドルのみ
> クローズされると、思っていたのですが。suidな時、STDOUTまで
> クローズされませんか?
suidかどうか/httpd経由かコマンドラインか に関わらず、STDOUTが
クローズされました。そもそもcloseってファイルハンドルを省略
すべきでないし、仮に省略した場合はselectで指定されたファイル
ハンドル(デフォルトはSTDOUT)がクローズされるんじゃないですかね?
# perl4、perl5.004で試しました。

> ところで、wrapper.cgiでのurl指定方法のwrapper.cgi/hoge.cgi
> は、知ってはいたのですがどういう動作になるのですか?
print文を埋め込んで試してみませう ;-)

No. 246 # M.Masuda 1999/03/29 (月) 23:01
>suidな時、STDOUTまでクローズされませんか?
ホントだぁ...これまた私の勘違い。
いままで作ったスクリプトを見直したら、ちゃんとやってました。
意識していたわけではなく、性格的な問題?からそうしていたの
ですが、これって案外重要だったのですね。
この件でのスクリプトでの試験では、安易にそうしていただけでし
た。#お恥ずかしい。(*^_^*;;;

closeのみだとSTDOUTまでクローズされ、結果スクリプトが終了して
しまうのですね。

>パスが通って無いのが原因と判明しました。
よく考えたら、スクリプト内で$ENV{PATH}=''としてるのに、何を
言ってるんでしょう私は。(; ;)
でもなんで、$ENV{PATH}=''としなければいけないのでしょうか。
新たな疑問!
#まるで小学生のガキが、なぜなぜ攻撃してるみたいですが..(^^ゞ
#最近、私を含め周りにUNIX信者が増えている模様です。
#だって面白いんだもん。

>print文を埋め込んで試してみませう ;-)
すいません、オバカでよく分からないのですが具体的にどうすれば
私にも理解できるでしょうか。
↑完全に開きなおってるかもしれない(^_^)V

これだけいろいろ御世話になっているので、何かお礼がしたいとこ
ろですが、なにか出来る事が有れば言って下さい。
と、いっても何が出来るわけでは無いし....でも気持ちだけは有り
ます。(本気度=120%)

No. 247 # 68user 1999/03/30 (火) 04:14
> すいません、オバカでよく分からないのですが具体的にどうすれば
> 私にも理解できるでしょうか。
何を知りたいのかわからないので、全部は説明したくないです(結構な量になるので)。
何を知りたいのでしょうか? できれば
    open(EXEC,"| .$ENV{PATH_INFO} 2>&1");
というのを書いたのだから、「とりあえずPATH_INFOの値を見てみる」
くらいは試してください。

> でもなんで、$ENV{PATH}=''としなければいけないのでしょうか。
一言で言えば「汚れている」からです。消す必要はなくて、PATHを
再設定すればよかったですね。長くなるので青ラクダ本 P.409 参照。

別に質問するなってわけじゃないですけど、自分で調べる努力は必要です。
それでもわからなかったらどんどん質問すればいいですけど、その際でも
極限まで発生条件を切り詰めた上で、
    「何がわからないか」「どのような状況で調べたのか」
などを書かないと、結局 回答者側が苦労するハメになります。

No. 248 # M.Masuda 1999/03/30 (火) 18:31
よかったやっと見れるようになった。(^^ゞ

う〜んすいませんです。
>> すいません、オバカでよく分からないのですが具体的にどうすれば
>> 私にも理解できるでしょうか。
> 何を知りたいのかわからないので、全部は説明したくないです(結構な量になるので)。

>「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の様な指定方法は、
掲示板等では話題としては知っていましたが、具体的な内容まではまだ
未解析でした、すいませんです。

No. 249 # 68user 1999/03/31 (水) 00:00
> よかったやっと見れるようになった。(^^ゞ
サーバの定期メンテがあって、落ちてたようです。

そもそもの
> ところで、wrapper.cgiでのurl指定方法のwrapper.cgi/hoge.cgi
> は、知ってはいたのですがどういう動作になるのですか?
からは、「何をわかっていて、何がわからないのか」が伝わって
こないのですよ。

> 私なりに理解できた部分は open(EXEC,"| .$ENV{PATH_INFO} 2>&1");
> .$ENV{PATH_INFO} の実行結果の標準&エラーを、openして標準入力
> から読込み、表示させているという事位ですが
でしょ? こちらもそれくらいはわかっているだろう、とは思うわけで、
一体何を説明すればいいのかわからんのです。ですが、例えば
    「PATH_INFOというのはいつどこで誰が設定してくれるのか」
という質問なら答えられるわけです。

wrapper.cgi/hoge.cgi にアクセスすると、
    ・apache が PATH_INFO に /hoge.cgi を設定する
    ・apache が wrapper.cgiを実行する
です。それだけ。

別に特別な動作をするわけでなく、wrapper.cgi?hoge.cgi と
似たようなものだと思ってください。?を/に変えると
QUERY_STRINGでなくPATH_INFOに値が入る、っていうくらいです。

という解説でいいですか? どうもそういうことを聞きたいんじゃ
ないような気もするんですが、聞きたいことと違っていたら
「何が知りたいか」を書いてください。

No. 250 # M.Masuda 1999/03/31 (水) 15:12
>そもそもの
大変申し訳有りませんでした。
言葉が足りませんでしたね。

今までの流れから、「print文を埋め込んで試してみませう」
の所に何らかの意味合いが有ると思い、その意味合いを聴く為
あのような表現となりました。

それとは別に、最近の私の書込みも自分の中での疑問が次々に
解けていく快感に、つい調子に乗ってしまいフリートークBB
Sの様な書込みをしてしまったことを、少々反省しています。

今回の場合は、解からないところ(自分の中での疑問点だった複
数箇所)が、同時に提示されたので私もどう理解を進めていけば
いいのかが解かりませんでした。

>極限まで発生条件を切り詰めた上で
そうですね、これはデバックやコーディングの上で大事な事で
すね。
自分で解決する努力がすこし足りなかったですね。
というより本業の作業の間に行っている事なので、手抜きして
いたのは事実ですね、反省してます。

>「何が知りたいか」を書いてください。
そうですね、デバック用に教えて下さったwrapper.cgiのコード
の中には、解からない事が沢山ありますが、本来はオライリーの
動物シリーズを揃えて自分で調べればすむ事かも知れませんが、

>wrapper.cgi/hoge.cgi にアクセスすると、
> ・apache が PATH_INFO に /hoge.cgi を設定する
> ・apache が wrapper.cgiを実行する
という機能が何の目的でapacheに実装されているのか?
デバック目的だけの機能では無いだろうし、本来の目的は何だろ
う、というのがあります。

それから、基本的な動作を完全に理解しているわけでは無いので、
open(EXEC,"| .$ENV{PATH_INFO} での .$ENV{PATH_INFO}の記述が
よく分かりません。
open(HANDLER,"shellcommand")とした時は""で囲まれた部分は、
シェルでの動作と、全く同じと考えていいのでしょうか。

そうするとPerlだと変数を結合するためのピリオドが、シェルの
場合頭にピリオドが付くと何を表すのか。
ちなみにecho `.$ENV{PATH}` としましたが、
./home/masuda/.bashrc{PATH}
と返り意味が分かりません。
と、こんなところです。

いろいろ他にもありますが、これから書込みの際は十分吟味した後
に書込みしたいと思います。
今後もよろしくお願いいたします。

No. 251 # 68user 1999/04/01 (木) 20:52
> デバック目的だけの機能では無いだろうし、本来の目的は何だろう
「なぜその機能があるのか」と考えるのは、「C言語にはなぜ構造体があるのか」
というのと同じで、結局想像するしかないと思います。

でも、なぜ僕が wrapper.cgi?file=hoge.cgi(A) でなく wrapper.cgi/hoge.cgi(B)
という引数の取り方をしたのかは説明できます。

hoge.cgiが ?data=content などと、GET方式でデータを取得する
CGIだった場合、(A)より(B)の方が hoge.cgiに与える影響が少なく、
さらに wrapper.cgi 自体のコードも短くなるからです。

あと推測するに、ユーザにCGIであることを意識させない、という
のもあるでしょう。例えばcgiwrapは
    /cgi-bin/cgiwrap/~username/hoge.cgi
というURLでアクセスすることで、所有者権限でCGIを実行できます。
    /cgi-bin/cgiwrap?user=username&cgi=hoge.cgi
だったとしたら…思いつく限りではSave Asでファイルをセーブした際、
全てのCGIプログラムはcgiwrapというファイル名で保存されるでしょう。

ついでに言えばディレクトリのような階層構造を、素直な形で表現できます。
例えば http://www.freebsd.org/cgi/cvsweb.cgi など。

> そうするとPerlだと変数を結合するためのピリオドが、シェルの
> 場合頭にピリオドが付くと何を表すのか。
そういう場合にprint文で値を表示してみてほしいわけです。例えば
    > open(EXEC,"| .$ENV{PATH_INFO} 2>&1");
の前に
    print "PATH_INFO = $ENV{PATH_INFO}\n";
と書いたとすれば、$ENV{PATH_INFO} eq "/hoge.cgi"であることが
わかるでしょう。ならば、".$ENV{PATH_INFO}" eq "./hoge.cgi" と
なります(これに確信がもてなければ print ".$ENV{PATH_INFO}\n";
を挿入してください)。で、「./hoge.cgi」とは何かと言うと、カレント
ディレクトリにある hoge.cgi というスクリプトを実行しているだけですね。

No. 252 # M.Masuda 1999/04/01 (木) 23:53
なるほど、やっと理解できました。
68Userさんがわからないと言っていた事や、自分の勘違いが。

理解したと思っていた事が、全然理解できていなかったのですね。
やはり他の仕事の片手間のように勉強しているのと、基礎からしっか
り勉強している人にはかないませんネ。

ちょっとプログラミングに深入りしすぎたかも知れません、web上で
よく見かけるプログラム程度なら書けるかもしれませんが、システム
や応用した機能みたいな部分(少なくとも私から見ると)は、ちゃんと
勉強しないと難しすぎます。

最近、業界では有名(らしい)なプログラマー人とファイルロックの
事で話しをする機会がありましたが、私とは基礎概念が違いました。

もう少し、時間をかけて基礎的な部分から修行したいと思います。
wrapper.cgi、ありがとうございました。

No. 253 # Tetsu [E-mail] 1999/04/07 (水) 15:31
    UNIXは初心者です、ここで質問して良いかもわかりませんが、よろしければお教え下さい。
OSはだいぶ古いSONY製のNEWS−OSというのを使用しています。相当古いマシンなので、また
UNIXなのでちょっと恐くてさわれないのですが、基本的なコマンドは少し勉強しました。

  前置きが長くなってしまいましたが・・・ハードディスクの空き容量を調べたいと思うのですが、どの
ようなコマンドを使えば良いのかよくわかりませんでした。どうぞ、お教え下さい。そういうコマンドとか
は無いのでしょうか?

No. 254 # 68user 1999/04/07 (水) 17:58
NEWS-OSはよく知りませんが、df -kで
    Filesystem 1K-blocks Used Avail Capacity Mounted on
    /dev/sd0s1a 118959 25837 83606 24% /
などという表示が出るんじゃないでしょうか。これだと
118M中 25M(全体の24%)を使用中ってことです。

No. 255 # チャパ王 1999/04/09 (金) 19:20
はじめまして。他にはないCGIスクリプトばかりで大変助かっています。
それでですが、.htaccessで
<files browser.log>
deny from all
</files>
<files referer.log>
deny from all
</files>
    :
    :
というような設定がありますが、
<files *.log>
deny from all
</files>
<files *.dat>
deny from all
</files>
とやるだけで全ての***.log、***.datファイルが見れなくなります。
どうぞお試しくださいませ。(知ってたらごめんなさい。(汗))

No. 256 # R-N 1999/04/11 (日) 02:30
ども、おひさしぶりです。
お元気でしょうか? 私は相変わらずです。(^_^;
何度もここで色々聞こうと思っては思いとどまり何とか自分で解決してきたんですが、
とうとういきずまりました...。
データのチェックで
foreach $line (@lines) {
($a,$b,$c,$d) = split(/\,/,$line);
if ($d ne '') { $dd++; }
}
とした時の @line の値(?)が
22,,55,
23,1,25,
というような時、$dd に+1されてしまいます。
本当は何か値が入っていたら+1したいのです。
なんとなく「22,,55,(改行)」となっていて $d ne '' で改行が判断できないからかなと思うのですが...。
そんなモノなんでしょうか?
$d ne '' ではないなら式はどうなるのでしょう?

なんか解りにくくてすみません。
説明下手なんですが...そこを何とか...。(-_-;

No. 257 # 68user 1999/04/11 (日) 07:11
> とやるだけで全ての***.log、***.datファイルが見れなくなります。
どうもです。本当は *.log というファイルだけではなく、
/~j5306050/log/ 以下を見られないようにしたいんです。
    <directory /home/95s/j5306050/public_html/log/>
        deny from all
    </directory>
とか
    <location /~j5306050/log/>
        deny from all
    </location>
などと書いても、
    500 Internal Server Error
    The server encountered an internal error or misconfiguration and
    was unable to complete your request.
になっちゃうんで、仕方なくああいう風にしました。
これって書き方間違ってるんでしょうか?

あと、試しているうちに、
    <files browser.log>
        deny from all
    </files>
と書いても、/~j5306050/log/browser.log は見ることができるのに気がつきました。
ずっと誰かに見られてたかも…(^^;
    <files log/browser.log>
だとうまくいきましたけど。

> というような時、$dd に+1されてしまいます。
おそらく$lineの最後に改行コードが付いているからだと思いますので、
    foreach $line (@lines) {
        chop $line;
とするか、
    if ( $d =~ m/\d/) { $dd++; }
と、$dに数字が入っているかどうかを調べてはどうでしょう。ちょっと変ですけど、
    if ( $d ne "\n" ) { $dd++; }
もアリかも。

No. 258 # R-N 1999/04/12 (月) 05:14
なるほど(?)、ありがとうございます!
Perl の専門書を買わないと駄目ですね...、コマンド(?)が全然解らない...。
唯一理解できたのが、
if ( $d ne "\n" ) { $dd++; }
ですが...、そっか!
改行コードって \n でしたね...、普段使ってるのにすっかり忘れてました...。
また勉強してきます!!

No. 259 # M.Masuda 1999/04/12 (月) 12:52
68Userさん、皆さんこんにちは。
横やりですが...

>/~j5306050/log/ 以下を見られないようにしたいんです。
www.cs.gunma-u.ac.jp は Apache1.2.6ですよね。
<Directory>ディレクティブは.htaccess では使えません。
この場合<Limit>を使ってこんな感じでできると思います。

##### .htaccess内 ######
<Limit POST GET>
order deny,allow
deny from all
allow from HOSTNAME
</Limit>
### .htaccess 終了####

外してたらごめんなさい。

No. 260 # 68user 1999/04/12 (月) 17:02
> <Directory>ディレクティブは.htaccess では使えません。
なるほどなるほど、確かにdirectoryやlocationは、server configだけ
でしか使えないみたいですね。それは知りませんでした。というわけで、
    <files log/*>
        deny from all
    </files>
にしました。public_html/log/.htaccessに deny from allと書いても
いいんでしょうけど、設定ファイルが分散するのが嫌だったので
一つにまとめました。

> Perl の専門書を買わないと駄目ですね...、コマンド(?)が全然解らない...。
前にROLさんにも同じような事を書きましたが、はっきり言って 本を買わずに
プログラミング言語を理解しようとするのは時間の無駄です。数千円の金を
惜しむあまり、結果的に数十/数百時間の貴重な時間を無駄にしています。

手元に本があれば数分でわかるのに、BBSで丸1日かけて質問するのは
とても非効率的ですよね。

悪いことは言いませんから、早く本を買いましょう。オンライン版がいいなら
    http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/index.html
    ftp://ftp.mei.co.jp/free/others/Languages/perl/perl5/perl5.000/perljref-5.000.0.tar.gz

No. 261 # M.Masuda 1999/04/13 (火) 19:59
すいませんまたまた教えて欲しいのです。
下のスクリプトでおかしい所は無いでしょうか。

#!/usr/bin/perl -w

use Net::Ping;
print "Content-type: text/plain\n\n";

$hostname = 'pingコマンドの返らないホスト';
print "Checking $hostname\n";
if (pingecho($hostname,$timeout)){print "Echo on\n"}
else{print "Echo off\n"}

$hostname = 'pingの返るホスト';
print "Checking $hostname\n";
if (pingecho($hostname,$timeout)){print "Echo on\n"}
else{print "Echo off\n"}
exit;
リャマ本のP531でのNet::Pingを試しているのですが、
上記の試験結果は両方ともEcho offです。
もちろんホストの指定の間違いもありません。

初めて use コマンドを使うので、何か他に間違いがあるのかと
use行をコメントアウトしたり、他のコマンドを使ってみましたが
(use Cwdの結果は正常に表示)原因が不明です。
最初このコマンドを知らずに、自分で`ping -c1`とararmを使って
コーディングしましたが、シグナルを受け取った後の制御がうまく
できずにリャマ本を調べていたら、「なんだこんな便利なものがあ
るじゃないの!」と思い使ってみましたがこれもまたうまく行かず
原因が分かりません。

Net/Ping.pmも存在しますが、その記述内容は私には高度すぎて
全然分からずお手上げ状態です。

どうかご教授よろしくお願いします。

No. 262 # M.Masuda 1999/04/13 (火) 20:02
下には書き忘れましたが、$timeout=2;も指定してあります。

No. 263 # 68user 1999/04/13 (火) 23:59
リャマ本って、「プログラミングPerl改訂版」ですよね?
ラクダ本じゃなくてリャマ本が正式名(というか通称)なんですか?
それとも「ラクダ本=旧版」「リャマ本=新版」?

何も試さずに書きますが、リャマ本にも書いてある通り、pingechoは
「TCPのechoプロトコル」を使って ホストが生きているかどうか調べます。
が、少くともFreeBSDのデフォルトでは echoポートは閉じられていますので、
一般的に「echoが通る=生きている」とは言えないでしょう。

echoプロトコルってのは
    http://X68000.startshop.co.jp/~68user/net/echo-1.html
です。だから、telnet hostname echoでお話しできたら、pingechoでも
正しい答えが返ってくるはずです。

No. 264 # 68user 1999/04/14 (水) 00:08
追加。これまた何も試さずに書きますが、さらっとNet.Pmを見た限りでは
適切な引数を渡せば ICMPのecho も使えるようです。これを使えば
/sbin/ping と同じ挙動をさせられると思います。

No. 265 # 68user 1999/04/14 (水) 01:38
> さらっとNet.Pmを見た限りでは
Net/Ping.Pm の間違いですね。で、ちーと試してみました。結論から言うと、
    use Net::Ping;
    $p = Net::Ping->new("icmp",$timeout);
    $p->ping($hostname);
ですかね。でも、root権限が必要です。Ping.Pm の
    croak("icmp ping requires root privilege") if $>;
を外せば、一般ユーザ権限でもいけるかも(試してません)。

No. 266 # M.Masuda 1999/04/14 (水) 14:34
>リャマ本って、「プログラミングPerl改訂版」ですよね?
すいません誤解を招くような書き方をして(^^;
そうです「プログラミングPerl改訂版」を指しています。
他でそのような表現があったので、安易に使ってしまいましたが
>ラクダ本じゃなくてリャマ本が正式名(というか通称)なんですか?
私も正式には不明です。
#ラウンジで聞いてみようかな...

> croak("icmp ping requires root privilege") if $>;
> を外せば、一般ユーザ権限でもいけるかも(試してません)。
そうですか、確かに icmp ping requires root privilege
と言われました。
suidや、Ping.pmを編集する事まではしたくないのです。

やはり「なんだこんな便利なものがあるじゃないの!」の認識は
ちょっと甘かった様ですね。

一発での`ping -c1 $hostname`とararmの方法はわかりますので、CGI単体
で行おうとせず他の方法を組み合わせて試してみます。

ちなみにあのスクリプトの目的は、普通のサーバーではなくダイアルアップ
サーバー?(プロバイダーでユーザーの電話回線経由の接続を受け取るヤツです)
が生きてるかどうか、つまり一般的にいうPPPxxx.domain.ne.jpとかが
接続状態かどうかを調べるツールを作ろうとして、そのための動作確認
用の試験スクリプトでした。

>http://X68000.startshop.co.jp/~68user/net/echo-1.html
これからの課題なので勉強します。

それから、ちょっと違うとは思いますがBASICの場合でいう割り込み処理から
復帰する際のリジュームコマンドの様な事はできないのでしょうか。
つまりラベル等で復帰先の指定をするという事です。
最初がBASICだったものでこういう表現しかできませんが、68Userさんがその
辺(BASIC)詳しくなければ無視してください。

ありがとうございました。

No. 267 # 68user 1999/04/14 (水) 23:38
> 一般ユーザ権限でもいけるかも(試してません)。
/sbin/ping もsuidされてるので、ICMPをしゃべるにはroot権限が
必要なんじゃないでしょうか。だから多分コメントアウトしても
ダメだと思います(未確認ですけど)。

> つまりラベル等で復帰先の指定をするという事です。
んー、gotoとかですか? Perlでは、ほとんどgoto文を使う必要は
ないと思うのですが。他の方法で代用できませんか?
# alarmのシグナルハンドラからの復帰先を指定したいとか?

No. 268 # M.Masuda 1999/04/15 (木) 15:31
>/sbin/ping もsuidされてるので
本当ですね。今まで気づかず使っていたみたいです...
#mount等がそうなのは分かりますが。ICMPをしゃべる事自体
#root権限が必要なのだろうか?無駄なトラフィックを避ける為?

> alarmのシグナルハンドラからの復帰先を指定したいとか?
はい、まったくそのとおりです。
#やっぱ表現力足りないみたい>自分
gotoは68Userさんと同じ理由で使うつもりは有りません。

ラクダ本でのalarmの解説が、私にとっては不十分なので上記の
方法があるのかさえ分かりません。
#シェルスクリプトでも同様の方法があるのでしょうか?

またこういう処理をする時に定石の様なものは有りますでしょうか。
あれば簡単でも教えてもらえれば助かります。

No. 269 # 68user 1999/04/16 (金) 03:05
> またこういう処理をする時に定石の様なものは有りますでしょうか。
定石かどうかはわかりませんが、
    sub alarm_handler {
        # ここに処理がきたということは、2秒以内にpingが終了しなかったということ
        # なので子プロセスを殺す。
        kill 1,$child_pid;
        $flg = 0;
    }
    $SIG{ALRM}=\&alarm_handler;
    $flg = 1;
    if ( $child_pid = fork ){ # 親
        alarm 2; # 2秒後にalarmセット
        wait;  # 子プロセスの終了を待つ
        alarm 0; # 2秒以内に終ったら、alarm解除
    } else {  # 子
        exec "ping -c 1 host";
    }
    if ( $flg == 1 ){ ping成功 }

とか。本来はもっと賢い方法があるのかもしれませんね。
子プロセスの始末まで考えなくていいなら、
    sub alarm_handler { $flg = 0; }
    $flg = 1;
    if ( fork ){
        alarm 2; sleep 4;
    } else {
        exec "ping -c 1 host";
    }
    if ( $flg == 1 ){ ping成功 }
でもいいかも。

No. 270 # M.Masuda 1999/04/16 (金) 15:31
サンプルまで書いてもらってありがとうございます。
自分で書いたスクリプトも、ほとんど同じような事をして、
さらに引数で秒数を指定できる様にしてあります。
#もっともこんなスマートには書いてないですが(^^;

>子プロセスの始末まで考えなくていいなら、
自分のスクリプトではこの部分の処理まではしていません。
試験時にスクリプト実行後(シェル、web経由)にpsで確認しても
プロセスが残る事はなかったので。
シェルやアパッチがこの辺の処理はやってくれると思っています。
#そう思いたいってのが本音。

スマートなスクリプトの為の勉強になりました。
いつもありがとうございます。

No. 271 # ono hirosi [E-mail] 1999/04/16 (金) 16:37
初めまして。
HTTPについてのページを読ませていただきました。
telnetでHTTPに接続できるとは思いもよりませんでした。
そこで、質問があるのですが、cookieを送信するときは、
どのようにすればよいのでしょうか?おしえてください。

No. 272 # 68user 1999/04/17 (土) 12:27
> cookieを送信するときは どのようにすればよいのでしょうか?
送信するだけなら、
    Cookie: hoge=fuga
などとします。
    % telnet www.cs.gunma-u.ac.jp 80
    GET /~j5306050/cgi-bin/printenv.cgi HTTP/1.0
    host: www.cs.gunma-u.ac.jp
    Cookie: hoge=fuga
てな感じ。そしたら printenv.cgi の中では
    $ENV{HTTP_COOKIE} eq 'hoge=fuga'
となります。

> 試験時にスクリプト実行後(シェル、web経由)にpsで確認しても
> プロセスが残る事はなかったので。
たしかに、親プロセスが死ぬ(終了も含む)と子プロセスには
SIGTERM(だったかな?)が送られますので、普通は特に後始末を
する必要はないです。

もちろん子プロセスがシグナルをブロックしていたら
その限りではありませんけど。

No. 273 # ono hirosi 1999/04/19 (月) 10:06
どうもありがとうございました。
netscapeはちょっと重いので、簡易ブラウザーを作ってみようかと
考えています。

No. 274 # 3年@群大情報 1999/04/21 (水) 13:55
端末のネットスケープで日本語入力をしたいのですが
いつもemacsで書いてカットアンドペーストをしています。
ダイレクトに入力することはできないのですか?

No. 275 # 68user 1999/04/21 (水) 17:17
kinput2を立ち上げて、NN/NC上のテキスト入力エリアで、
Shift+Spaceで変換モードONだったような気がします。

kinput2 は .xsessionの中で起動すると楽です。

No. 276 # R-N [URL] 1999/04/24 (土) 03:05
ども、こんばんわ。
今、初めて1から CGI を書いているのですが、
そこでちょっと質問が...。

JPERL でチェックした所、問題なく動いた(様に思う)のですが、
アップロードしてパーミッションを変更しても、お約束の
「Internal Server Error」がでます。

68user さんはエラーチェックなどはどうやってますか?

No. 277 # 68user 1999/04/24 (土) 07:03
> 68user さんはエラーチェックなどはどうやってますか?
    1. サーバのログ(/var/log/httpd-error.logなど)を見る。
    2. コマンドラインで実行。
    3. 思い当ったところをいろいろ変えてみる。
            3-1. 環境変数(PATHなど)
            3-2. スクリプトの文字コード(EUC or SJIS)
            3-3. 実行権限(nobody権限で動くかどうか)
    4. http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1999-03-26
                68user 1999/03/29(月) 16:11
                一般的には、以下のの方法でデバッグすると、大抵の場合解決すると思います。
         で説明したスクリプトをかまして実行。
    5. 怪しいところから順にコメントアウト。もし動いたら、直前にコメントアウトした
         部分がおかしい。

てな感じでしょうか。実際にやったことがあるのは1〜3くらいです。


あとさ gunma-u の方、質問して回答をもらったら、それに対する
返事くらい書いてね。「わかりました」「やってみたけどうまく
いきませんでした」くらいでいいから。それが最低限の礼儀だと
思います。それが嫌なら trouble@cs.gunma-u.ac.jp に質問して下さい。
# 別に gunma-u に限ったことではないけどね。

No. 278 # 68user 1999/04/24 (土) 07:12
当然のことですが、念のため補足を。
> それが嫌なら trouble@cs.gunma-u.ac.jp に質問して下さい。
trouble宛なら返事出さなくていい、ってわけじゃないです。

No. 279 # R-N 1999/04/26 (月) 02:02
はい、わかりました。
「ありがとうございます、うまくいきました」と書けば良かったですね。
本を見ながら初めて頭から書いたので多分色々不都合やら効率が悪い所やら
あるんでしょうが、これから一個一個潰していきます。
でわ、また御礼か泣きつきに来ます。(^_^;
毎度毎度、ありがとうございます。

No. 280 # 氷聖 1999/04/26 (月) 15:32
はじめまして,こんにちは.
つい1週間ほど前にFreeBSDに手を出した者です.
さっぱり解らないので色々と探してここにたどり着きました.
”UNIXのお部屋”は大変参考になりますね.すごく重宝します.
また何か解らないことがあったらこちらに伺おうと思っているので
その時は何卒よろしくお願いします.

No. 281 # 68user 1999/04/26 (月) 23:03
どもども。今後ともよろしくです。

表現がわかりにくい/構成が悪い部分があったら教えて下さいね。
どうも肥大化しすぎて、どこをどうすれば利用しやすくなるのか
わからなくなってしまいましたので。

No. 282 # R-N 1999/04/30 (金) 00:35
たぶん完成しました。(^_^;
http://www.raidway.ne.jp/~nouveau/dc/sh/
に置く、race.htmlとrrr.cgiです。(cgiはrrr.txtにしておいてあります)
どんなもんでしょう?
wrapperが非常に役に立ちました、ありがとうございます。

ところでハッシュというものは一時的にでも並べ替えは出来ないんですね。
代入した数値順での並べ替えでずっと詰まってました...。

No. 283 # 68user 1999/04/30 (金) 01:20
> http://www.raidway.ne.jp/~nouveau/dc/sh/
> に置く、race.htmlとrrr.cgiです。(cgiはrrr.txtにしておいてあります)

では拝見…と思ったら not found。
どこにあるんでせう?

> 代入した数値順での並べ替えでずっと詰まってました...。
毎回ソートする必要がありますね。解決されたようですが、
一応書いておくと、キーを数字順でソートしたいなら
    foreach ( sort {$a<=>$b} keys %hash ){ print "$_ $hash{$_}\n"; }
値を数字順でソートなら
    foreach ( sort {$hash{$a} <=> $hash{$b}} keys %hash ){ print "$_ $hash{$_}\n"; }
文字としてソートなら <=> ではなく cmp、などなど。

No. 284 # R-N 1999/04/30 (金) 01:59
すみません、置く前に書いたんで...。
設置にも手間取ってたりしました、何故かエラーが...。

ハッシュの件は解決しなかったので処理が終わったら
別の変数に代入しちゃいました。
この辺はかなり無駄がありそうですし、エラーがあるなら
この周辺でしょう...。
むぅ、foreach ( sort〜ですか...、組み込めるかな...。(-_-;
お手数おかけしました。

No. 285 # 68user 1999/04/30 (金) 02:03
あ、見れた。で、気づいた事。

    - $monが0月〜11月になっちゃいませんか。

うーん、これくらいかなぁ。後はどーでもいいというか、些細な事というか、
好みの問題というか。

    - EOF は End Of File の略なので、EOTが適当…なんでしたっけ?
        (EOT=End Of Textのつもり)。
    - if ($... <10) { $... = "0..." } の羅列より、
            $now = sprintf("%4d/%02d/%02d ...",$year+1900,$mon+1,$mday,...)
        の方がすっきりするかも。

全体的に特に問題はないんじゃないでしょうか。

No. 286 # 68user 1999/04/30 (金) 02:16
後は
> ($dtm,$soft,$point,$reho) = split(/\,/, $data[0]);
($dtm,$soft,$point,$reho) = split(/,/, $data[0]);
> $temp = $now."\,".$FORM{'soft'}."\,".$FORM{'point'}."\,".$ureho."\n";
$temp = "$now,$FORM{'soft'},$FORM{'point'},$ureho\n";

くらいかなぁ。ほんとに細かいことですけど。

それからこれは根本的な問題ですが、FORMから渡される値をチェックして
ないので、変なのを入れられる可能性がありますね。旧SEGA BBSのように。

渡された値が適切かどうかを調べるのは(僕は)必須だと思います。

No. 287 # R-N 1999/04/30 (金) 03:46
あ、3月だ...、全然気付きませんでした。(-_-;
変な書き方してますね私、指摘されると自分でも思う...。
sprintfは便利ですね。でもなんで%02dの時だけ『0』が...。
私の持ってる本も%02dだけ0が付いてる...。

> FORMから渡される値をチェック...
とりあえず$ENV{'HTTP_REFERER'}のチェックを入れてみます。
って、コレだと投票できないブラウザがあったか...。<SSとか

全部の値をチェックするんだったら投票フォーム部分も組み込んだ方が
楽そうだし、そうしようかな...。<いづれ(^_^;

勉強になりました!

>変なのを入れられる可能性がありますね。旧SEGA BBSのように。
ギクッ!

No. 288 # 1111 1999/04/30 (金) 16:07
111111

No. 289 # 1111 1999/04/30 (金) 16:07
2222222

No. 290 # M.Masuda 1999/04/30 (金) 23:26
こんばんは。

Perlのreaddirでの現象でお聞きしたいのですが。
普通、以下の様な記述で@filesには、ディレクトリ内のファイル&
ディレクトリが入りますが、この配列の中に返される文字列の中に
複数のバイナリが混じるというのは、ディレクトリエントリが壊れ
ているのでしょうか。

opendir(DIR, "./");
@files = readdir(DIR);
closedir(DIR);

特にヌル(\x00)が多量に含まれます。
さらにこの状態のディレクトリを、他のディレクトリにコピー
した時に症状が引き継がれるのは、壊れていると仮定すると
親ディレクトリからの影響が出ているのでしょうか。

またこの症状が出るのは、nfs等で共有しているディレクトリです。
何か分かる事が有りましたら、よろしくお願いします。
ちなみに以下のスクリプトでは問題無く表示されます。
#!/usr/local/bin/perl
$|=1;
print "Content-type: text/plain\n\n";
$_ = system("ls -l ./ 2>&1");
print "$_\n";

No. 291 # 68user 1999/05/01 (土) 07:48
> でもなんで%02dの時だけ『0』が...。
要は桁合わせですな。
Ex. printf("%d,%4d,%04d\n",10,10,10);

> この配列の中に返される文字列の中に複数のバイナリが混じるというのは、
> ディレクトリエントリが壊れているのでしょうか。
うーん、どうなんでしょうねぇ。漢字のファイル名ってこともありますし、
バイナリが混じっているだけで壊れているとは言い切れないです。

> 特にヌル(\x00)が多量に含まれます。
ファイル名にヌルってありだったかなぁ…?

具体的な出力結果を見てみないことには、なんとも言いがたいです。

Prev< No. 195〜291> Next  [最新発言に戻る] [過去ログ一覧]