> メール見てもらえましたか? (僕にとっては)内容的に問題ないので、メールの続きはこちらでやります。 > その前に、田中 健という人物をご存知ですか? > 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の様な指定方法は、 掲示板等では話題としては知っていましたが、具体的な内容まではまだ 未解析でした、すいませんです。 |
> よかったやっと見れるようになった。(^^ゞ サーバの定期メンテがあって、落ちてたようです。 そもそもの > ところで、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に値が入る、っていうくらいです。 という解説でいいですか? どうもそういうことを聞きたいんじゃ ないような気もするんですが、聞きたいことと違っていたら 「何が知りたいか」を書いてください。 |
>そもそもの 大変申し訳有りませんでした。 言葉が足りませんでしたね。 今までの流れから、「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} と返り意味が分かりません。 と、こんなところです。 いろいろ他にもありますが、これから書込みの際は十分吟味した後 に書込みしたいと思います。 今後もよろしくお願いいたします。 |
> デバック目的だけの機能では無いだろうし、本来の目的は何だろう 「なぜその機能があるのか」と考えるのは、「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 というスクリプトを実行しているだけですね。 |
なるほど、やっと理解できました。 68Userさんがわからないと言っていた事や、自分の勘違いが。 理解したと思っていた事が、全然理解できていなかったのですね。 やはり他の仕事の片手間のように勉強しているのと、基礎からしっか り勉強している人にはかないませんネ。 ちょっとプログラミングに深入りしすぎたかも知れません、web上で よく見かけるプログラム程度なら書けるかもしれませんが、システム や応用した機能みたいな部分(少なくとも私から見ると)は、ちゃんと 勉強しないと難しすぎます。 最近、業界では有名(らしい)なプログラマー人とファイルロックの 事で話しをする機会がありましたが、私とは基礎概念が違いました。 もう少し、時間をかけて基礎的な部分から修行したいと思います。 wrapper.cgi、ありがとうございました。 |
UNIXは初心者です、ここで質問して良いかもわかりませんが、よろしければお教え下さい。 OSはだいぶ古いSONY製のNEWS−OSというのを使用しています。相当古いマシンなので、また UNIXなのでちょっと恐くてさわれないのですが、基本的なコマンドは少し勉強しました。 前置きが長くなってしまいましたが・・・ハードディスクの空き容量を調べたいと思うのですが、どの ようなコマンドを使えば良いのかよくわかりませんでした。どうぞ、お教え下さい。そういうコマンドとか は無いのでしょうか? |
NEWS-OSはよく知りませんが、df -kで Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/sd0s1a 118959 25837 83606 24% / などという表示が出るんじゃないでしょうか。これだと 118M中 25M(全体の24%)を使用中ってことです。 |
はじめまして。他にはない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ファイルが見れなくなります。 どうぞお試しくださいませ。(知ってたらごめんなさい。(汗)) |
ども、おひさしぶりです。 お元気でしょうか? 私は相変わらずです。(^_^; 何度もここで色々聞こうと思っては思いとどまり何とか自分で解決してきたんですが、 とうとういきずまりました...。 データのチェックで 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 '' ではないなら式はどうなるのでしょう? なんか解りにくくてすみません。 説明下手なんですが...そこを何とか...。(-_-; |
> とやるだけで全ての***.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++; } もアリかも。 |
なるほど(?)、ありがとうございます! Perl の専門書を買わないと駄目ですね...、コマンド(?)が全然解らない...。 唯一理解できたのが、 if ( $d ne "\n" ) { $dd++; } ですが...、そっか! 改行コードって \n でしたね...、普段使ってるのにすっかり忘れてました...。 また勉強してきます!! |
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 終了#### 外してたらごめんなさい。 |
> <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 |
すいませんまたまた教えて欲しいのです。 下のスクリプトでおかしい所は無いでしょうか。 #!/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も存在しますが、その記述内容は私には高度すぎて 全然分からずお手上げ状態です。 どうかご教授よろしくお願いします。 |
下には書き忘れましたが、$timeout=2;も指定してあります。 |
リャマ本って、「プログラミングPerl改訂版」ですよね? ラクダ本じゃなくてリャマ本が正式名(というか通称)なんですか? それとも「ラクダ本=旧版」「リャマ本=新版」? 何も試さずに書きますが、リャマ本にも書いてある通り、pingechoは 「TCPのechoプロトコル」を使って ホストが生きているかどうか調べます。 が、少くともFreeBSDのデフォルトでは echoポートは閉じられていますので、 一般的に「echoが通る=生きている」とは言えないでしょう。 echoプロトコルってのは http://X68000.startshop.co.jp/~68user/net/echo-1.html です。だから、telnet hostname echoでお話しできたら、pingechoでも 正しい答えが返ってくるはずです。 |
追加。これまた何も試さずに書きますが、さらっとNet.Pmを見た限りでは 適切な引数を渡せば ICMPのecho も使えるようです。これを使えば /sbin/ping と同じ挙動をさせられると思います。 |
> さらっと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 $>; を外せば、一般ユーザ権限でもいけるかも(試してません)。 |
>リャマ本って、「プログラミング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)詳しくなければ無視してください。 ありがとうございました。 |
> 一般ユーザ権限でもいけるかも(試してません)。 /sbin/ping もsuidされてるので、ICMPをしゃべるにはroot権限が 必要なんじゃないでしょうか。だから多分コメントアウトしても ダメだと思います(未確認ですけど)。 > つまりラベル等で復帰先の指定をするという事です。 んー、gotoとかですか? Perlでは、ほとんどgoto文を使う必要は ないと思うのですが。他の方法で代用できませんか? # alarmのシグナルハンドラからの復帰先を指定したいとか? |
>/sbin/ping もsuidされてるので 本当ですね。今まで気づかず使っていたみたいです... #mount等がそうなのは分かりますが。ICMPをしゃべる事自体 #root権限が必要なのだろうか?無駄なトラフィックを避ける為? > alarmのシグナルハンドラからの復帰先を指定したいとか? はい、まったくそのとおりです。 #やっぱ表現力足りないみたい>自分 gotoは68Userさんと同じ理由で使うつもりは有りません。 ラクダ本でのalarmの解説が、私にとっては不十分なので上記の 方法があるのかさえ分かりません。 #シェルスクリプトでも同様の方法があるのでしょうか? またこういう処理をする時に定石の様なものは有りますでしょうか。 あれば簡単でも教えてもらえれば助かります。 |
> またこういう処理をする時に定石の様なものは有りますでしょうか。 定石かどうかはわかりませんが、 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成功 } でもいいかも。 |
サンプルまで書いてもらってありがとうございます。 自分で書いたスクリプトも、ほとんど同じような事をして、 さらに引数で秒数を指定できる様にしてあります。 #もっともこんなスマートには書いてないですが(^^; >子プロセスの始末まで考えなくていいなら、 自分のスクリプトではこの部分の処理まではしていません。 試験時にスクリプト実行後(シェル、web経由)にpsで確認しても プロセスが残る事はなかったので。 シェルやアパッチがこの辺の処理はやってくれると思っています。 #そう思いたいってのが本音。 スマートなスクリプトの為の勉強になりました。 いつもありがとうございます。 |
初めまして。 HTTPについてのページを読ませていただきました。 telnetでHTTPに接続できるとは思いもよりませんでした。 そこで、質問があるのですが、cookieを送信するときは、 どのようにすればよいのでしょうか?おしえてください。 |
> 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(だったかな?)が送られますので、普通は特に後始末を する必要はないです。 もちろん子プロセスがシグナルをブロックしていたら その限りではありませんけど。 |
どうもありがとうございました。 netscapeはちょっと重いので、簡易ブラウザーを作ってみようかと 考えています。 |
端末のネットスケープで日本語入力をしたいのですが いつもemacsで書いてカットアンドペーストをしています。 ダイレクトに入力することはできないのですか? |
kinput2を立ち上げて、NN/NC上のテキスト入力エリアで、 Shift+Spaceで変換モードONだったような気がします。 kinput2 は .xsessionの中で起動すると楽です。 |
ども、こんばんわ。 今、初めて1から CGI を書いているのですが、 そこでちょっと質問が...。 JPERL でチェックした所、問題なく動いた(様に思う)のですが、 アップロードしてパーミッションを変更しても、お約束の 「Internal Server Error」がでます。 68user さんはエラーチェックなどはどうやってますか? |
> 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 に限ったことではないけどね。 |
当然のことですが、念のため補足を。 > それが嫌なら trouble@cs.gunma-u.ac.jp に質問して下さい。 trouble宛なら返事出さなくていい、ってわけじゃないです。 |
はい、わかりました。 「ありがとうございます、うまくいきました」と書けば良かったですね。 本を見ながら初めて頭から書いたので多分色々不都合やら効率が悪い所やら あるんでしょうが、これから一個一個潰していきます。 でわ、また御礼か泣きつきに来ます。(^_^; 毎度毎度、ありがとうございます。 |
はじめまして,こんにちは. つい1週間ほど前にFreeBSDに手を出した者です. さっぱり解らないので色々と探してここにたどり着きました. ”UNIXのお部屋”は大変参考になりますね.すごく重宝します. また何か解らないことがあったらこちらに伺おうと思っているので その時は何卒よろしくお願いします. |
どもども。今後ともよろしくです。 表現がわかりにくい/構成が悪い部分があったら教えて下さいね。 どうも肥大化しすぎて、どこをどうすれば利用しやすくなるのか わからなくなってしまいましたので。 |
たぶん完成しました。(^_^; http://www.raidway.ne.jp/~nouveau/dc/sh/ に置く、race.htmlとrrr.cgiです。(cgiはrrr.txtにしておいてあります) どんなもんでしょう? wrapperが非常に役に立ちました、ありがとうございます。 ところでハッシュというものは一時的にでも並べ替えは出来ないんですね。 代入した数値順での並べ替えでずっと詰まってました...。 |
> 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、などなど。 |
すみません、置く前に書いたんで...。 設置にも手間取ってたりしました、何故かエラーが...。 ハッシュの件は解決しなかったので処理が終わったら 別の変数に代入しちゃいました。 この辺はかなり無駄がありそうですし、エラーがあるなら この周辺でしょう...。 むぅ、foreach ( sort〜ですか...、組み込めるかな...。(-_-; お手数おかけしました。 |
あ、見れた。で、気づいた事。 - $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,...) の方がすっきりするかも。 全体的に特に問題はないんじゃないでしょうか。 |
後は > ($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のように。 渡された値が適切かどうかを調べるのは(僕は)必須だと思います。 |
あ、3月だ...、全然気付きませんでした。(-_-; 変な書き方してますね私、指摘されると自分でも思う...。 sprintfは便利ですね。でもなんで%02dの時だけ『0』が...。 私の持ってる本も%02dだけ0が付いてる...。 > FORMから渡される値をチェック... とりあえず$ENV{'HTTP_REFERER'}のチェックを入れてみます。 って、コレだと投票できないブラウザがあったか...。<SSとか 全部の値をチェックするんだったら投票フォーム部分も組み込んだ方が 楽そうだし、そうしようかな...。<いづれ(^_^; 勉強になりました! >変なのを入れられる可能性がありますね。旧SEGA BBSのように。 ギクッ! |
111111 |
2222222 |
こんばんは。 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"; |
> でもなんで%02dの時だけ『0』が...。 要は桁合わせですな。 Ex. printf("%d,%4d,%04d\n",10,10,10); > この配列の中に返される文字列の中に複数のバイナリが混じるというのは、 > ディレクトリエントリが壊れているのでしょうか。 うーん、どうなんでしょうねぇ。漢字のファイル名ってこともありますし、 バイナリが混じっているだけで壊れているとは言い切れないです。 > 特にヌル(\x00)が多量に含まれます。 ファイル名にヌルってありだったかなぁ…? 具体的な出力結果を見てみないことには、なんとも言いがたいです。 |
あ、しょうもないことかも知れませんが emiclock の costumes で Transparent dress (一番下のコスチューム) を、どうやったら拝めるのでしょうか? |
>漢字のファイル名 これは無いです。 本によると「システムによって保守されるディレクトリ構造の内容」 とあります。という事からエントリが壊れているのかと思った訳です。 しかし、意図的に壊してみることまではさすがにできないので、 困ってしまいました。 もう少し調べてみます。ありがとうございました。 |
> Transparent dress (一番下のコスチューム) > を、どうやったら拝めるのでしょうか? あはははは。誰もが一度は思った疑問ですね。 僕も知らなかったんで調べてみました。 1. 30分チャイムを鳴らす設定にする。 2. alarmを....年............に.....。 3. 30分チャイムが鳴るまで待つ(0分or30分) 4. Costumesに…なんとアレが! ちなみにオリジナルのMac版のドキュメントには以下の記述がありますなぁ。 > < ひとりごと > > ある日、もとそふと探検隊は某秘境の洞窟の壁に書かれた落書きを発見した。 > 壁には、「1958年10月24日06時33分」と落書きされていた。これ > が、いったい何を意味するのかはわからない。 > 洞窟は、さらに奥へと続いていた。仲間と30分に待ち合わせることにして、 > チャイムをセットし、隊長はさらに奥へと進んだ。 > 30分を知らせるチャイムが鳴った。そのとき、隊長の顔は、笑顔に変わって > いた。ついに秘宝を発見したのだ。 …で見れますか? うちのemiclockは30分チャイムがなぜか選べないようになってるんですが… なんでだろ。というわけでソースを1行書き換えて見てしまいました(^^; |
大変お久しぶりです。岩本です。 とは言っても覚えている人はいないでしょうけどね(笑) 実はUNIXでお伺いしたいことがあります。 crontabでシェルを動かしたいのですがうまくいきません。 以前Masudaさんに「実行時に有効になっている環境変数を 表示させてみて・・・」のアドバイスを頂き、その通りやって 見たところ、確かに環境変数がほとんど指定されていませんでした。 そこで環境変数をスクリプト内で追加設定させたいのですが どうすればよいのでしょうか。ちなみにスクリプトに envやsetenvを使って自ユーザログオン時の環境変数を 設定させてみたところ結局実行時に変数は変わってませんでした。 OSはソラリス2.5、マシンはsun7の300です。 ご存知の方、お詳しい方がいらっしゃいましたら よろしくお願いいたします。 |
> そこで環境変数をスクリプト内で追加設定させたいのですが > どうすればよいのでしょうか。 動かしたいものがshスクリプトなら、先頭付近に export HOGE=fuga 書くとか。cshスクリプトなら setenv HOGE fuga てな感じでしょうか。 |
68userさん、ありがとうございました。 無事問題が解決しました。 今後ともよろしくお願いします。 |
ども、はじめまして。パソコンスクランブルの方でこのページ をターゲットにしてしまったREMAHLと申します。EUCとリンクフリー という条件が重なったため、あちらの掲示板にてソースが化ける 例として取り上げさせていただきました。この度は大変失礼しました。 それからスクリプト2、3頂きました。CGI勉強中なので研究材料 として使わせていただきます。これからもよろしくお願いします。 |
どもども。ああいう場合に他サイトを例に出すのは 僕もよくやることなので、お気になさらぬよう。 |
>どもども。ああいう場合に他サイトを例に出すのは >僕もよくやることなので、お気になさらぬよう。 お気遣い、有り難うございます。 つい最近CGIを始めたばかりなので「CGIの小部屋」は 私のような素人には非常に参考になります。今は人様の 作られたスクリプトを改造している程度なので、まだまだ 分からないことだらけです。もし分からなければこの掲示板で 質問を、と思っていますので、その時はよろしくお願いします。 |
始めまして。 掲示板を発見したので、感謝の言葉でもと思い書き込みました。 仕事中に壁にぶつかるといつもこのサイトをみて解決の手助けにしてます。 とても助かってます。 これからも宜しくお願いします。 |
こんにちは。 ためになる、きれいでわかりやすいページなので大変よろこんでいます。 (色使いなんかも目に優しくていいですね、コードなんかを白バックで 読むのなんて耐えられませんです ^_^;) がんばって勉強させていただきます。 これからもがんばってください。 最高にクールです |
お褒めいただき、ありがとうございます>しょいちさん、pzさん ただ、ここの記述がわかりにくいとか、このコマンドの この機能が解説されていないなど、悪いところも書いて いただけると なおうれしく思います。何かお気づきに なりましたら、また書き込んでください。 |
はじめました、bsdのコマンドマニュアルとして重宝させてもらって ます。ところで hello worldと一行書いてccでコンパイルしたら a.outができましたが ./a.out と入力しないと動きません。 単純にa.outと入力して動かすにはどうしたらよいのですか? |
PATH に . を加えれば、カレントディレクトリのプログラムが実行されます。 しかし、セキュリティ上お勧めしません(共用のマシンなら特に)。例えば set path = ( . /bin /usr/bin /usr/local/bin ) とすれば a.out だけでも動きます。しかし、誰かが /tmp/ls に #!/bin/sh rm -rf ~ という内容のプログラムを置いていた場合、あなたが cd /tmp; ls としただけで、あなたのホームディレクトリ以下のファイルは 全て消えます。 ですから、PATHには . は含めない方が賢明です。どうしてもというなら、 set path = ( /bin /usr/bin /usr/local/bin . ) などと、最後に付け加えましょう(でもお勧めはしません)。 タイプがめんどくさいという理由なら、シェルの補完(Ctrl-DとかTAB)を 有効に使う方がいいと思います。 |
さっそくの解答thanksです とりあえずset pathの最後に.を追加致します。 シェルの補完はよくわからないので、もう少ししたら やってみます(^^ゞ |
お久しぶりです。(^^; やっぱ68Userさんは、プログラマー志望だったのですね。 #当り前と言えば当り前なのかもしれないですが... ところで、BSDIというOSを知っていますか? 実はうちの環境にソレが入ったのですが、BSD系らしく作法が 少々異なっています。 なにか、知っていたら教えてください。 Linux系(SystmV系?)との操作上の違う所とか注意点とか。 #やっと日本語manを入れて少し分かりはじめたのにまた振り出し... もちろん漠然と聞いているので、思い付いたような事でいいです。 hoppyさんへ >シェルの補完はよくわからないので、 コマンドを途中までタイプして、タブキーを押すとうれしい事が 起こりますヨ! |
> やっぱ68Userさんは、プログラマー志望だったのですね。 いや、プログラマというわけでは…。どちらかと言えば、 プログラムを書けるSEかなぁ。 > ところで、BSDIというOSを知っていますか? 名前は知ってますが、使ったことはないです。 # 多分OS名はBSD/OSじゃないですかね。BSDIは会社名。 ## ちなみに BSDIのBSDとFreeBSDのBSDは、意味が違います。 ### ってことはどーでもいいですね(^^; > Linux系(SystmV系?)との操作上の違う所とか注意点とか。 うーん、ps の引数の違いくらいしかわからないなぁ (Linuxのpsって、BSDともSysVとも少し違ったんだっけ?)。 あとはカーネルが /vmunix か(SysV)、/kernel か(BSD) とか…(ほんとか?) あと、FreeBSDもLinuxもGNUのソフトをたくさん使ってますが、 BSD/OSがそこらへんを独自に作ってるなら、結構そこらへんで はまるかもしれません。 # http://www.gnu.org/software/software.html のfileutils、shellutils、 # diffutils、GNUtarあたり。 あと、パッケージ管理(pkg_add/pkgadd)とかユーザ管理(adduser/useradd) なんてのは各UNIXごとにバラバラなんで、ご注意を。 |
どもです(^^; >プログラムを書けるSEかなぁ。 なるほど、志が高い(^^; ただ、私の周りにはちょっと偏屈な技術者が多く、人間性は信じら れない人がおおいです。初心者を馬鹿にしきった口振りや態度など、 誰でも始めは初心者で、識者からの教えられかたでその人間がどの ように覚えてゆくかが決まると思うのですが... たとえば、とほほさんとは何度かメールのやり取りをしてますが、 プログラマーな人なのに、おおらかな人間性を感じました。 68Userさんは、くれぐれもそうならない様に期待します。 #これは本心です、いやみじゃ無いので誤解なさらぬように。 > # 多分OS名はBSD/OSじゃないですかね。BSDIは会社名。 > ## ちなみに BSDIのBSDとFreeBSDのBSDは、意味が違います。 > あと、FreeBSDもLinuxもGNUのソフトをたくさん使ってますが、 > BSD/OSがそこらへんを独自に作ってるなら、結構そこらへんで > はまるかもしれません。 > # http://www.gnu.org/software/software.html のfileutils、shellutils、 > # diffutils、GNUtarあたり。 > あと、パッケージ管理(pkg_add/pkgadd)とかユーザ管理(adduser/useradd) > なんてのは各UNIXごとにバラバラなんで、ご注意を。 ありがとうございます、ぜんぜんOKです。 こういう事を知りたかったのです。(^^)/ 最初に触れたUNIXがLinuxなので、その他のOSやその作法について はまだまだなんです。 #変更後まだ数日しか経ってないもので。 ただ私は、プログラマー志望では無いので余り深みにはまらぬよう に慎重にしないと、ついつい...(^^; ちなみにBSDIは、「Berkeley Software Design Inc」の略だそうです。 プロバイダの商用OSとしてかなり普及していると聞きました。 しかし、私が借りた無料レンタルWebスペースのOSは Linuxでした。 |
>プログラマーな人なのに ここ、訂正します。 これじゃ、偏見ですね。(^^; プログラマー方すいませんでした。 |
とほほさんとこの話題が出てますね(笑い) そのとほほさんのラウンジの質問を見ていて思い出したのですが、 (質問自体は、ホームぺージの作成には関係なさそう…) statが返す構造体のmodeの上位7ビットはどのような意味がある のでしょうか? 上位3ビットは、 0x8000 ブロックデバイス 0x4000 ディレクトリ 0x2000 キャラクタデバイス であることは分かったのですが、下位の 0x1000 0x0800 0x0400 0x0200 が分からないのです。 検索で探しても、ビットの意味まで記述した記事が見つけられなくて…(^^; ところで、perlのCGIで、 (stat(STDOUT))[2]&0x2000 (stat(STDOUT))[2]&0x8000 を調べて見ると、下の方が真となって、ブロックデバイスと 出たのですが(STDINも同じ)、これってウチのWebサーバーが CGIの標準出力を一旦ファイルにリダイレクトしている ということなのでしょうか? |
あれから、ls のソースを調べればいいと考えたのですが、 その中で、S_IFDIR とかを #defined した stat.h を探すのに 手間取ってしまいました。 (やはり、grep一発でカタが付く環境が羨ましい…(^^;) それはともかく、各ビットが意味を持つ訳ではなく、 0xF000 type of file mask でマスクした値が以下の意味を持つようです。 0x1000 named pipe (fifo) FIFO 0x2000 character special キャラクタ型スペシャルファイル 0x4000 directory ディレクトリ 0x6000 block special ブロック型スペシャルファイル 0x8000 regular 通常ファイル 0xA000 symbolic link シンボリックリンクファイル 0xC000 socket ソケットファイル 0xE000 whiteout 0x0200 save swapped text even after use ところで、最後の2つは何なんでしょうか? |
> ただ、私の周りにはちょっと偏屈な技術者が多く、人間性は信じら > れない人がおおいです。 ん〜、まぁ初心者の程度にもよるかと。僕の場合、自分で調べようと しない人、一度聞いたことを覚えようとしない(メモを取らない)人には、 教えたくないですね。 もちろん、 > 初心者を馬鹿にしきった口振りや態度 がよろしくないのは当然ですが、教えをられる側の程度にも よるのではないかと思います。 > たとえば、とほほさんとは何度かメールのやり取りをしてますが、 > プログラマーな人なのに、おおらかな人間性を感じました。 いや〜僕はあんなに心が広くないので(^^; ちなみに僕は他人に(直接面と向かって)教えてると、だんだん 不機嫌になってきますので、あまり教えないようにしてます(笑)。 |
> その中で、S_IFDIR とかを #defined した stat.h を探すのに > 手間取ってしまいました。 stat(2)を見るのが一番早いんじゃないでしょうか。 > 0x0200 save swapped text even after use sticky bitです。chmod 1755、chmod u+t などとすればこのビットを立てられます。 以下、知ってたらごめんなさいな説明。 昔のUNIXでは仮想記憶はなく、実メモリと HDD上のスワップ領域の 2本立てでした。で、sticky ビットが立っているファイル(実行ファイル?) のテキスト領域は、実行後もスワップ領域に保持され、再実行する際は 高速に実行できるようになっていました。つまり頻繁に使うプログラムの stickyを立てておけば高速に実行が可能だったわけです。 しかし、現在のコンピュータはキャッシュや仮想領域が進化したので、 stickyビットの重要性はなくなりました。FreeBSDではファイルに 対する stickyビットは無視されています。 # ここらへんは、正しいことを書いているかどうか自信がありません。 一方ディレクトリに対する stickyはちゃんと意味があって、 誰でもその下にファイルを作成することはできるけど、削除する際は ファイルのオーナーしか削除できないという意味があります。 /tmp がいい例ですね。 % ls -ld /tmp drwxrwxrwt 18 bin bin 1536 May 30 07:57 /tmp/ > 0xE000 whiteout うーん、ローカルの全ファイルに対して、このビットが立ってるか どうか調べてみたんですが、1つもありませんでした。なんでしょうね? > 下の方が真となって、ブロックデバイスと > 出たのですが(STDINも同じ) 僕のまわりのFreeBSD/Solarisでは、STDIN/STDOUTともに、普通の状態だと キャラクタデバイス(ttyですな)、ファイルにリダイレクトするとregular、 パイプならFIFOになりました。CGI上で実行すると、IN/OUTともFIFOでした。 # http://X68000.startshop.co.jp/~68user/tmp/mode.txt # http://X68000.startshop.co.jp/~68user/tmp/mode.cgi > これってウチのWebサーバーがCGIの標準出力を一旦ファイルに > リダイレクトしているということなのでしょうか? mmさんのところってHPですから(でしたよね?)、実装の違いがあるの かもしれないので、僕の知識では何とも言いがたいです。 |
>stat(2)を見るのが一番早いんじゃないでしょうか。 あっ、すいません、以前教えて頂いた、 http://www.jp.freebsd.org/man-jp/search.html で、stat を検索すると、 マニュアルがみつかりませんでした。"stat.[1-9n]" という警告が出たんで、こっちは諦めてたのですが、 ウチのサーバーの man にはありました…(^^; ただし、ビットの意味までは書いてないです…× ところで、この stat(2) の (2) とかの数字は、どういう 意味なのでしょうか? 以前から少し気にはなってたんですが、ついつい放ったらかし にしてました…(^o^;ゞ >sticky bitです。chmod 1755、chmod u+t などとすれば >このビットを立てられます。 あっ、sticky bitと聞いて思い出しました(^^; swapの話や/tempの例も読んでたのですが、 昨日は連想が全く働きませんでした…すいませんですm(__)m >以下、知ってたらごめんなさいな説明。 とんでもないです。知らない可能性の方が高いので、 お手数でなければ、ぜひ今後ともよろしくお願いしますm(_~_)m >どうか調べてみたんですが、1つもありませんでした。なんでしょうね? ls のソースを見てると、S_IFDIRに'/'、S_IFSOCKに'='という感じで、 S_IFWHTには、'%'を付けてるので、何か意味があるんでしょうね。 とにかく、下位9ビットの上の3ビットは 01000 sticky bit 02000 SGID 04000 SUID ということで、8進で書いたら、UIDとかとの関連で思い出しました(^^; (modeはやはり8進の方が分かり易い…) >CGI上で実行すると、IN/OUTともFIFOでした。 私もそれを期待してたのですが… それはともかく、先にウチで実行したCGIはマスクが 間違ってたので、mode.cgi を実行してみました。 環境は、HP-UX Netscape-Enterprise/2.01b です。 # http://www2s.biglobe.ne.jp/~cru/test/mode.cgi 1100000 000000000 is SOCKET 1100000 000000000 is SOCKET ウッソー? なんで、ソケット?? 実は、nph-cgiで実行されてて、WWWサーバーの代わりに ラッパーがヘッダを付加してるとか??? ちなみに、Windows95での実行結果です。 C>perl mode.cgi 0010000 000000000 is CHAR_DEV 0010000 000000000 is CHAR_DEV C>perl mode.cgi < file1 >file2 C>cat file1 | perl mode.cgi | more 1000000 110110110 is REG_FILE 1000000 110110110 is REG_FILE ついでに、Win95 のJava WWWサーバーでの実行結果 0001000 000000000 is FIFO 0001000 000000000 is FIFO あれ? is REG_FILE を予想したのですが…?? |
> http://www.jp.freebsd.org/man-jp/search.html > マニュアルがみつかりませんでした。"stat.[1-9n]" > という警告が出たんで、こっちは諦めてたのですが、 このページ、日本語版がなければ英語版を表示してくれればいいのに。 改善要求出しておきます。 > ところで、この stat(2) の (2) とかの数字は、どういう意味なのでしょうか? セクション番号です。 http://X68000.startshop.co.jp/~68user/unix/pickup?man 結構OSによって違っていて、SunOSなんかだと、1B,1C,1Fなどがあったり、 またあるOSではシステムコールだけど、別のOSではライブラリという ものもあるので、セクション番号はあまり絶対的なものではありません。 各セクションの詳しい説明は、man 1 intro とか man 2 intorでわかります。 > S_IFWHTには、'%'を付けてるので、何か意味があるんでしょうね。 どうやら、unionファイルシステムというものに関係があるようですね。 でも役割などはよくわかりません。 http://home.jp.freebsd.org/cgi-bin/namazu.cgi?key=whiteout&dbname=users-jp http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/miscfs/union/Attic/libc.fts.c?rev=1.1.1.1 http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&cmd=&man=mount_union&dir=jpman-3.2.0%2Fman > C>cat file1 | perl mode.cgi | more > is REG_FILE > is REG_FILE DOSのパイプは、一度ファイルに落としてから再度そのファイルを リダイレクトして実現しているんでしたっけ。 |