|
>openで読めるのは、そのサーバ上にあるファイルだけですから、 >こうやって一度ファイルを落とした後にopenして読み込むわけです。 あ、やっぱり。 openって他のサーバーのファイルは開けないのか。 おかげで、httpdownの役割というか重要性も理解できました。 あとは各ディレクトリの設定をやり直すだけで取りあえず動くはず… でも、この脱力感はなんでしょうね? 過去ログをとるスクリプトを理解することが目的になってしまってるような気がする。 っていうか、あそこの現状を見るに、過去ログそのものの 存在の意義を見出せなくなってきている自分に気がついた… |
|
お師さん、こんにちは。 「その他」での書きこみを見て、ふと気がつくと… 何故か手元にFreeBSD 2.2.Jの箱が… と、いうわけで、性懲りも無くまた手をだしてしまい ました。まあ、ゆっくりとやっていきますです。 で、さっそく質問ですが…(^^; Xの画面(解像度)の事なんですが、僕の設定では 1280*1024でちょうどXの画面がディスプレイのワクに ばちっとはまるようになっているのですが、解像度を 変えると(800*600等)画面がディスプレイのワクから はみでてしまいます。ただ、カーソルを画面のワクの ほうへ動かせばスクロールするので使用するのには 別に問題はありませんが、「解像度が変わっても ディスプレイのワクにばちっとはまんねーかなぁ」 とふと思ったので、ちょっとお聞きしたかっただけです。 お師さんの画面ではそういう問題はありませんでしたか? |
|
あ…2.2.6Jだった。6を落としてしまった。 失礼しました。 それでは。 |
|
> 解像度を変えると(800*600等) これは、Ctrl-Alt-`+'などで解像度を変更した場合ですか? もしそうなら、ルートウィンドウサイズはそのままで、画面の 一部分を拡大しているだけなので、無理なんじゃないかなぁ。 あるいはウィンドウマネージャの再起動でなんとかなるかも しれませんが…。 後から試してみます。 > あ…2.2.6Jだった。6を落としてしまった。 高級なパッケージをお持ちで(笑) > でも、この脱力感はなんでしょうね? 興味のないことを無理にやってても つらいだけなのは 十分理解できますので、やめちゃってもいいですよ。 こんなの義務でも何でもないんだし。 どーでもいいことやってても、それはただの時間の浪費です。 どうなさるかは おまかせします。 |
|
なるへそ。なんとなくわかった(ような)気がします。 >これは、Ctrl-Alt-`+'などで解像度を変更した場合ですか? そうです。だって、設定ファイル(でしたっけ)等の いじりかたがまだよくわからないので、お手軽にでき る方法しかやってませんのですよ。 でも後は自分でなんとかなると思います。 (でもいつになることやら。過去ログのリジェクトログ 付きの文を無理やり見る方法を教えてもらった時は 教えてもらってからできるまで○ヵ月かかってたしなぁ… あ、やべっ!また怒られちゃう(^^;) ご教授どうもでした。 |
|
>どーでもいいことやってても、それはただの時間の浪費です。 >どうなさるかは おまかせします。 ん〜、取りあえずスクリプトが動くようになるまで、 がんばってみるつもりです。 ただ、スクリプトがマトモに動いたからといって、 ログをとるかどうかはそのときの気分次第っていうことで(笑) だってすでに目的と手段が入れ代わってるんだもん(爆) |
|
> だってすでに目的と手段が入れ代わってるんだもん(爆) A4集計を始めた理由 1. httpクライアントが書けたから。 2. POST形式のデータ送信方法がわかったから。 3. こんなことができるんだぞ〜と自慢したかったから。 最初から動機が不純でした(笑) |
|
UNIXでの日本語環境のことしりたいです! |
|
どもども、ROLっす。 g2のその後ですが、スクリプト自身は動いてるようなんですが test-logディレクトリに1998-12-19.tgzと testbbs-log.htmlの2ファイルはできてます。 でも、できてるだけ。 容量がそれぞれ1kと0K。 どうやらhttpdownでうまく落とせてない模様。 おっかしいなぁ??? プロキシがおかしいのかな??? プロキシってどこのでも問題ないですよね? |
|
$base_dir = "$home/test00"; # 作業用ディレクトリ が存在しないのではないでしょうか。別のディレクトリ名に していただいてもOKです。 $home/test00/sega2.def にhttpdown用の設定ファイルを作って、httpdownは $home/test00/www2.sega.co.jp $home/test00/www2.sega.co.jp/bbs $home/test00/www2.sega.co.jp/bbs/t $home/test00/www2.sega.co.jp/bbs/t/test と再帰的にディレクトリを掘っていきます。 ぱかぽこさん: > UNIXでの日本語環境のことしりたいです! 「UNIXでの日本語環境」と言っても ・FreeBSDかLinuxか、あるいは その他のUNIX系OSか、 ・Linuxなら、どのディストリビューションか などで結構違いますので、これだけではなんとも… |
|
User Agent統計を見て… HI-UXは、僕です(^^;。 なんでも日立のHI…なのかどうかは知りませんが、 とにかく日立が関係してるようです。 そんだけしか知らない…(汗) また、ブラウザのchimeraも僕です(たぶん) なんかいろいろ試したかったもんで。 いや、だからなんだってわけじゃあないんですが。 |
|
&init_work; # ディレクトリ作成 & tarball展開 exit; としてテストを実行してみたところ、サーバーからエラーがかえってきています。 その状態では確かにtest00はできてます。 なので&init_work;の後半部分 if ( -f "$log_dir/$date.tgz" ){ system("mkdir -p $main_dir/"); # print "extract $log_dir/$date.tgz\n"; # system("$tar zxf $log_dir/$date.tgz -C $main_dir"); } が問題なんでしょうね…多分。 で、ここの if ( -f "$log_dir/$date.tgz" ){ の-fが何なのかが全然分かってないので、手がつけられないんですが… |
|
> とにかく日立が関係してるようです。 どうもです。早速更新しました。 > が問題なんでしょうね…多分。 事前に ~/test00 と ~/public_html/test-log をmkdirして おけば大丈夫だとは思うんですが、どうでしょう。 > の-fが何なのかが全然分かってないので 本買いましょ〜。 ファイルが存在するかどうかのチェックです。/hoge/file というファイルが存在すれば、-f "/hoge/file" は真に なります。 # 他には # -f ファイルがあるか # -d ディレクトリがあるか # -r 読み込み権限があるか # てな感じです。あと20個くらいはあったはず。 既にその日のアーカイブが存在する →少し前にg2を実行した →いちいち全部落とすのは時間がかかる →事前に展開しておけば、時間の節約 というわけで、動作チェックをしている場合は # if ( -f "$main_dir/$1" ){ next; } の行のコメントをはずすと、既にあるファイルは落とさなく なるはずです。 今日の分をもちまして過去ログ作成は終了しますので、 あとはROLさんにまかせたっ。ではではでは。 |
|
すんません、お師さん。原因はそれじゃないみたいです。 ちょこちょこかえて、「$base_dir/www2.sega.co.jp/bbs/t/test/」ディレクトリが出来るとこまでは確認しましたが、 「test00」内に「sega2.def」と「sega2.def~」が出来てます。 で、$base_dir/www2.sega.co.jp/bbs/t/test/内に何もダウンロードされてません。 「sega2.def」の中身を見ると 「reportlevel 2 start http://www2.sega.co.jp/bbs/t/test/1_index.shtml >following lines are automatically generated by httpdown E http://www2.sega.co.jp/bbs/t/test/1_index.shtml」 ってなってます。 これはつまりHTTPDOWNが巧く働いてないって事ですよね? これはなんでなのかわかんないっす。 もういいかげん、いやになられたとは思いますが、すみませんが ご教授くださいませ。 |
|
sega2.defの内容を level 1 start http://www2.sega.co.jp/bbs/t/test/1_index.shtml にして試してみてください。 # コマンドラインから % httpdown sega2.def それでもダメなら level 1 httpproxy http://hoge.fuga:8080/ start http://www2.sega.co.jp/bbs/t/test/1_index.shtml と、適切なproxyを設定してやるとどうなりますか? |
|
追加 それぞれ出来たsega.defの内容です。 sega2.def~ 「level 1 httpproxy http://www.cs.gunma-u.ac.jp:8080/ reportlevel 2 start http://www2.sega.co.jp/bbs/t/test/1_index.shtml」 sega2.def 「level 1 httpproxy http://www.cs.gunma-u.ac.jp:8080/ reportlevel 2 start http://www2.sega.co.jp/bbs/t/test/1_index.shtml >following lines are automatically generated by httpdown E http://www2.sega.co.jp/bbs/t/test/1_index.shtml」 実はproxyを2、3変えて実験してみたんですが、 同じ内容しか出来ないのでオリジナルの g2の「httpproxy http://www.cs.gunma-u.ac.jp:8080/」に してみた結果がこれです。 やっぱり、CGIを動かすサーバーのPROXYを設定したほうがよいのでしょうか?HTTPDOWNには…? |
|
えっと、www.cs.gunma-uのproxyには、外部の人は接続できないはずです。 いつも使っているproxyを設定してください。 もしサーバ上から % telnet www.sega.co.jp 80 GET / HTTP/1.0(リターン) (もいっかいリターン) として、HTMLが出力されるならproxyは必要ないはずですが、 もしダメなら適切なproxyを設定する必要があります (外部のポート80宛のパケットは通さない設定なのでしょう) |
|
% telnet www.sega.co.jp 80 GET / HTTP/1.0(リターン) (もいっかいリターン) 実行したらHTMLが出力されました!!! ってことで、変数の定義の所の $proxy =以下と &download内の print OUT "level 1\n"; print OUT "httpproxy $proxy\n"; の2行を削除して、やってみます!!! |
|
はじめまして。 えっと、学校の端末でzipを解凍することはできないんですか? そもそもunixではzipはだめなのですか? おしえてください |
|
ROLさん: print OUT "level 1\n"; は削らない方がいいでしょう。これはリンクを1段階たどる、ということを 表しています。 ケースケさん: UNIXでZIPを扱えるアーカイバにはunzipというのがあります。 # ZIP形式は普段使わないのでよくわかりませんが、 # unzipは展開専用、zipは圧縮専用かなぁ? これはflute.cs.gunma-u.ac.jpで、ってことですよね? どうやらインストールされてないようですから、管理者にお願いしたり ソースからコンパイルする方がいいんでしょうけど、それがめんどくさいなら ( find / -name unzip >/dev/tty ) >& /dev/null などで探せます。数分待てばいくつか表示されるので、お好きな ものを使うといいでしょう。 |
|
やっと…、やっとDLまではこぎつけました、はぁ長かった… まぁまだまだ問題は山済み状態なんですが、一番大きな山はこえたのだと思ってます。 で、残された、私ではなんともならない問題… そう、自動化です。 以前、某氏から触りの部分だけ、聞いたはずなんですか さっぱり忘れてます。 なので、どういうファイル名のファイルか、 そしてそのファイルの中身でどういう指事をすれば 任意のCGIを任意の時間に自動的に動かすことができるのか… これを御教授ください。 |
|
まずは http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#crontab をどうぞ。 ~/.crontabにいつどんなプログラムを実行するか書いてください。 毎日6時30分に実行するなら、 30 6 * * * command です。g2をどこに置いたかは知りませんが、ホームディレクトリからの ディレクトリ相対指定で動くはずです。例えば 30 6 * * * bbs/g2 など。わからなければ 30 6 * * * /home/user/bbs/g2 とフルパスで書いてください。 ~/.crontabに書いたら、 % crontab ~/.crontab で登録されます。 % crontab -l として 30 6 * * * bbs/g2 と表示されればOKです。 しかしその前にきちんと動くかどうか、簡単なテストをしてください。 #!/usr/local/bin/perl print "test OK!\n"; というスクリプトを書いて、chmod +x して、そのとき22:55なら 数分後、例えば23:00に実行されるようにしてください。~/.crontabに 0 23 * * * script と書いて、 % crontab ~/.crontab とします。 % crontab -l 0 23 * * * script となれば登録は正常に行われています。で、23:00になったら、test OK! という内容のメールが送られてきたらいいわけです。 crontabについて さらに詳しいことは http://www.jp.freebsd.org/cgi-bin/yoyaku/mroff.cgi?sect=5&bgcolor=%23ffffff&cmd=&lc=1&subdir=man&dir=jpman-2.2.8%2Fman&subdir=man&man=crontab をどうぞ。 わからなければまた聞いてください。 > 任意のCGIを任意の時間に自動的に動かすことができるのか… 細かいことですが、webサーバ経由で実行されるプログラムを CGIと言います(ほんとは、その仕組み自体がCGIなんですけど)。 今回はwebサーバは関与しませんから、プログラムとか スクリプトと言った方がいいですね。 |
|
お師さん、いつもすみませんです。 お教えいただいた crontab とその説明ってFreeBSDのですよね。 BIGのサーバーは Linux 2.0.36で動いてるようで まず「~/.crontab」って名前でファイルがおけなかったので 適当に名前を変えて、% crontab script を実行してみましたが 「bash: /usr/bin/crontab: Permission denied」っていわれて、ダメです。 んで、「whitch crontab」で crontabコマンドを探すと 「whitch: command not found」っていわれちゃいます。 どないしたらよいのでしょうか? あぁ、もうまったく手が出ない世界にアシを突っ込んでるな… |
|
僕の場合.crontabというファイル名にしているだけで、 他のファイル名でも全く構いません。 > 「whitch crontab」で crontabコマンドを探すと whichですよね。whitchじゃなくて。 > bash: /usr/bin/crontab: Permission denied ん〜、とりあえず、 % ls -l `where crontab` (「'」ではなく「`」で囲んでください) と % ls -l `which crontab` の結果を教えてください。あと、 % id の結果も。もしかしたらbigではcronは使えないように なってるのかもしれません。その場合は、管理者に お願いするしかないです。 |
|
え、それぞれの結果です ls -l `where crontab` bash: where: command not found total 1 lrwxrwxrwx 1 root root 22 Oct 30 16:29 ftp -> /home/ftp/pub/usr8 /rol/ drwxr-xr-x 5 rol users8 1024 Jan 10 18:08 html/ ls -l `which crontab` /bin/ls: which:: No such file or directory /bin/ls: no: No such file or directory /bin/ls: crontab: No such file or directory /bin/ls: in: No such file or directory /bin/ls: (/bin:/usr/bin:/usr/local/bin:/usr/X11/bin:/usr/andrew/bin:/usr/openwin /bin:/usr/games:.): No such file or directory id uid=14127(rol) gid=107(users8) groups=107(users8) てな所ですが、どうなるでしょ? |
|
もいっかい。 % ls -l /usr/bin/crontab でお願いします。 |
|
ls -l /usr/bin/crontab -rwx------ 1 root bin 9008 Aug 24 1997 /usr/bin/crontab* って結果です。 ってこれって、オーナーしか動かせないって事…(涙) |
|
その通りです。管理者にお願いしてみましょう。その結果ダメだと 言われたら残念ながらcronは不可、ということになります。 # ソース持ってってコンパイルとか…したいですか? |
|
だ、だめです、お師さん >自動起動系のものはサーバーの保守の関係上、 >いかなる理由があろうとも一切禁止です。 だそうです(涙) MacでAppleScriptで毎日サーバーにTelnet接続して スクリプト起動させるようにする…しかないか? (出来るかどうかは解らんけど…) |
|
うーん、仕方がないと言えば仕方がないですね。管理者が そういう方針を取ることは理解できます。 結局は6:30に起動するプロセスがあれば、その中で g2を実行すればいいわけです。内部にきっかけとなる プロセスを用意することができないなら、外部から 呼ぶという手もあります。AppleScriptも一つの手ですね。 他には ・6:30に自動的にbigの中のあるwebを取得するように して、その中でCGIを動かしておく。そのCGIの中で g2を実行(CGIは普通nobody権限で動くので、そこら へんに問題あり)。 ・6:30に自動的にbigにメールを送る。.forwardに メールが届くとあるプログラムが起動するように しておいて、現在時刻が6:30付近ならg2を実行 とかとか。 |
|
こちらでは、はじめまして。 「ネットワークプログラミングの基礎知識」を読ませて頂きました。 で、本題の方は、向こうで話題にしてしまったので(^^; ちょっとズレた質問で申し訳ないのですが、「inetdの役割」で 「UNIXでは現在実行中のプログラムのことをプロセスといいます」 という定義がありますよね。 この「プロセス」というものがもう一つよく分からないのです (inetdの説明上では理解できるんですが…)。 「実行中」というのは、1つのプロセスのプログラムがexecで 切り替わった場合も、プロセスとしては同じだという意味で 受け取っていいのでしょうか? また、プロセスというのは、カーネルがスケジュールに従って 実行時間を割り当てる単位と考えてもいいのでしょうか? それから、UNIXではプロセスを生成できるのはforkだけだと聞きますが、 forkって親プロセスのメモリイメージとレジスタを丸ごとコピーする んですよね。この場合、子プロセスが直ぐにexecでプログラムを切り替えても、 メモリ上には親プロセスのコピーがそのまま残るんでしょうか? (execで切り替わったプログラムが終了しても、子プロセスがまだ 実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな 気がするのです…) それと、マルチプロセスと関連のありそうな言葉として、タスク、スレッド、 コンカレント、コルーチンなどとの相違も教えて頂ければうれしいです。 スレッドは、プロセス内プロセスみたいなもの…? コルーチンは、Windowsの3.1以前のアプリケーションみたいなもの…? なんか、ネットワークとぜんぜん関係ないなぁ…すいませんです(^^; |
|
mmさん、はじめまして(とか言ってみたりして(笑)) > execで切り替わった場合も、 > プロセスとしては同じだという意味で > 受け取っていいのでしょうか? #!/usr/local/bin/perl if ( $pid = fork ){ print "子プロセスは$pidです。\n"; sleep 2; system("ps aux|grep $ENV{USER}|grep perl"); print "\n"; sleep 4; system("ps aux|grep $ENV{USER}|grep -E '(perl|sleep)'"); wait; } else { sleep 4; exec("sleep 5"); } # fork、ps、子プロセスがexec(sleep)、psという順番で動くように、 # ところどころにsleepを入れてます。 を実行したところ、 子プロセスは714です。 zxr400 713 0.8 1.6 712 988 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404) zxr400 714 0.0 1.5 648 956 p2 S+ 7:25AM 0:00.00 perl fork (perl5.00404) zxr400 713 0.0 1.5 712 944 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404) zxr400 714 0.0 0.1 172 60 p2 S+ 7:25AM 0:00.00 sleep 5 となります。プロセス番号714の子プロセスが、exec sleep 5しても やはりプロセス番号は714のまま、ということだと思います。 > また、プロセスというのは、カーネルがスケジュールに従って > 実行時間を割り当てる単位と考えてもいいのでしょうか? 僕もそういうふうに理解しています。 > execで切り替わったプログラムが終了しても、子プロセスがまだ > 実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな > 気がするのです… execが戻ってくるのはexecに失敗したときだけで、execの実行に成功すると 絶対に戻って来ません。だから元のプロセスのイメージを保持しておく 必要はないですから、OSが掃除してくれるんじゃないでしょうか。 > タスク、スレッド、コンカレント、コルーチン うーん、僕もよく知らないんですが…。スレッドに関しては、 > スレッドは、プロセス内プロセスみたいなもの…? でいいのかなぁ。 Javaではスレッドを使うことでプロセスの中で並列実行ができます よね。一方「マルチスレッド版echoサーバ」というのは、ただ単に 「並列処理ができるよ」くらいの意味ですが、別にスレッドを 使っているわけではなく、forkで実現しています。 また、FreeBSDではスレッドへの対応が進み、スレッドセーフな OSになりつつあるようです。 というわけで、「スレッド」という言葉はどの環境を指して 使うかで結構意味に違いがあるんじゃないかと思うんですが…。 あと、「タスク」はUNIXの用語でしたっけ。多分Winの用語かな と思うんですが、結局ここらへんはプロセスと呼ぶかタスクと 呼ぶかの違い、単純に呼称の違いではないかと思ってるんですが…。 コンカレント・コルーチンは初めて聞きました(^^; |
|
68user さん、どもです(笑い) >となります。プロセス番号714の子プロセスが、exec sleep 5しても >やはりプロセス番号は714のまま、ということだと思います。 そそ、そんなイメージでした(^^; 先のpsの時点と後のpsの時点では実行されているプログラムはちゃうけど、 プロセスとしては同じなんだという意味ですね。 >僕もそういうふうに理解しています。 安心しました(^o^;ゞ >Javaではスレッドを使うことでプロセスの中で並列実行ができますよね。 そのヘンがプロセスとスレッドとの違いかなと思っていたのです。 >というわけで、「スレッド」という言葉はどの環境を指して >使うかで結構意味に違いがあるんじゃないかと思うんですが…。 このヘンの用語は仰る通りだと思います。 で、一応UNIXでのことを伺ったつもりだったのですが、書いてませんでしたね(^^; 私にとっては、「スレッド」という言葉は少なくともコンピュータの分野では Javaで始めて聞いたような気もするんで(スレッドタイプの掲示板というのも ありますが…(^^;)、一応Javaのスレッドを想定していたのですが、 >一方「マルチスレッド版echoサーバ」というのは、ただ単に >「並列処理ができるよ」くらいの意味ですが、別にスレッドを >使っているわけではなく、forkで実現しています。 >また、FreeBSDではスレッドへの対応が進み、スレッドセーフな >OSになりつつあるようです。 ということは、一般的にはもっと広い意味がありそうですね。 >あと、「タスク」はUNIXの用語でしたっけ。多分Winの用語かな >と思うんですが、結局ここらへんはプロセスと呼ぶかタスクと >呼ぶかの違い、単純に呼称の違いではないかと思ってるんですが…。 あっ、UNIXでは「タスク」は使わないんですね。 確かに岩波の情報科学辞典なんかでも、「プロセス=タスク」としています。 ただ、「タスク」はWinの用語(その場合の意味は?)だけでなく、 もっと古くから使われているようで、その頃、「マルチタスク」と 「マルチプロセス」とは違うんだよ、というような話を 聞いたような気もしたもので…(^^; >コンカレント・コルーチンは初めて聞きました(^^; concurrent は、どうも並行という一般的な意味みたいです。 concurrent Pascalとかconcurrent CP/M なんてのを聞いたことが あったのですが、どのように並行してたのかは知りませんです。 (この並行と多重(multi)の違いもよく分からない(^^;) coroutinは、原始的な並行プロセスかな… 確か、各ルーチンごとに専用のスタックを持って、自分の処理が 一段落すると、レジスタなどの環境をスタックにpushして、 別のルーチンを呼ぶ。 別のルーチンも自分のスタックから環境をpopして処理を行い、 これが一段落すると、また環境をスタックにpushして元のルーチンや 別のルーチンを呼ぶ、ということを繰り返して並列処理を 実現するものだったと思います。 で、どれかのルーチンがCPUを独占してしまうと、 もう並行プロセスにならないってものなのです。 >execが戻ってくるのはexecに失敗したときだけで、execの実行に成功すると >絶対に戻って来ません。だから元のプロセスのイメージを保持しておく >必要はないですから、OSが掃除してくれるんじゃないでしょうか。 ありゃ…すいません、完全に誤解してました(^o^;ゞ execは戻らないんですね(MS-DOSとごっちゃにしてたかな?) 実は、シェルが一旦forkしてからexecするのも疑問だったのです。 |
|
ちょっと間違いです(^^; >execは戻らないんですね(MS-DOSとごっちゃにしてたかな?) MS-DOS でも exec は戻りませんでした。 (いずれにしても、単一プロセスのMS-DOSの感覚が なかなか抜けないみたいです…(^^;) |
|
AppleScript対応したtelnetソフトがないぃぃぃぃ… ってわけで、ここ1週間ほど、朝6時頃おきて、サーバーに繋いで コマンド打ち込んで…をくり返す毎日でございます。 ブラウザ上からCGI直接指定して、うまく動かせるようにできんかな… だったら、毎朝自動的に立ち上げてほっぽっときゃいいし(笑) |
|
下、ワシの発言です。 つい、名前のとこに「タイトル」を入れてしまった(笑) |
|
tarでファイルを一つにまとめて出来るファイル(% tar xf〜で指定)を直接いじって大丈夫でしょうか? ファイルの書き換えが面倒なので「% tar xf〜」で複数のファイルを一つにまとめ、一括して特定の文字列を置換したあと、 元に戻す…ってのをやりたいんですけど? |
|
すんません、お師さん。 下の質問は無視ぶっこいてください。 実験の結果、だめな事が立証できましたわ。 |
|
file1 file2を % tar cf file.tar file1 file2 でfile.tarにアーカイブして、file.tar自体をいじる、ってことですか? tarファイルはヘッダが付いてますので、一般的には無理です。 が、絶対不可能ってことはないんじゃないかなぁ。 エディタなどでは無理でしょうし、aをbに変換、なんてのは ヘッダを書き換えてしまう可能性があるのでダメでしょうが、 hogehogehogehogeをfugafugafugafugaに変換、ってのは たぶんできるんじゃないでしょうか。 とはいえ opendir(DIR,"."); @files = grep(/file\d/,readdir(DIR)); closedir(DIR); foreach $file (@files){ open(IN,$file); @buf = <IN>; close(IN); open(OUT,">$file"); foreach (@buf){ s/a/b/g; print OUT $_; } close(OUT); } なんてやる方をお勧めします(バックアップを忘れずに)。 # perlにファイル自体を書き換えるオプションがあったかな? |
|
># perlにファイル自体を書き換えるオプションがあったかな? perl -pi.bak -e "s/a/b/g;" file[0-9] では? |
|
> perl -pi.bak -e "s/a/b/g;" file[0-9] うーん、簡単ですねぇ。ちなみに僕は最近までオプションは -wと-e しか知りませんでした。でも最近-cを覚えました(^^; 分厚いマニュアルをめくってオプション調べるより自分で書いた方が 早いんで、なかなか覚えられないんですが、長い目で見るとさっさと オプション覚えた方がいいんでしょうけどね…。 # 一番悪いのは、青ラクダ本の目次。「オプション一覧」とか # 「スイッチ一覧」なんて項がない。どこに書いてあるかと # 言えば「コマンドインタプリタとの協調」。毎回オプション解説を # 探すのに苦労してます。…ま、言い訳ですな(^^; > ブラウザ上からCGI直接指定して、うまく動かせるようにできんかな… CGIはnobody権限で動きますので、CGI経由で作られるファイルは 全て所有者がnobodyとなります。ファイル消せなくなってあわてない ように(笑) |
|
># 一番悪いのは、青ラクダ本の目次。 青いラクダは、確かに読みづらいですよね。 私の場合、普段は「日本語 perl texinfo バージョン 4.0.19.2」のプレーンテキ スト版をオンラインマニュアルとしてを使ってます。高尾直弥さんという方の訳 ですが、リファレンス部分は赤いラクダとほぼ同内容だと思います。 ただ、今使ってるものはいろいろイジってて配布条件(GNU)上問題があるのと、 手元にオリジナルが見当たらないので、ちょっと探してみましたが、根性がない ので↓のようなHTML版しか見つけられませんでした(^^; http://www.cec.co.jp/usr/hasegawa/Docs/perl-jman/index.html でも、どこかに必ずオリジナルのtexinfo やプレーンテキスト版もあると思いま す(^o^;ゞ WindowsのヘルプやHTMLよりも、やっぱりエディタで正規表現検索が可能な普通の テキストが使い易い… |
|
日本語 perl texinfo の1頁ものがありました。 http://main.ipc.fukushima-u.ac.jp/fdai/man/perl.html テキスト版の前後を<pre></pre>で括っただけなので、ブラウザではちょっとヘンになりますが、 直ぐにテキストに戻せると思います。 |
|
どうもです。早速GETさせていただきました。 これでちょっとは賢くなれる…かな?(^^; |
|
はじめまして(^^; Perl関係で質問なのですが良いでしょうか。 Perlのみで画像(画像ファイル)の生成って出来ないんでしょうか? いろいろ書けるほど情報が集まってないので、簡単ですがこれで。 よろしくおねがいします。 |
|
はじめまして、SRM2さん(笑) うっとこの http://X68000.startshop.co.jp/~68user/cgi-bin/view-count.cgi?log=sum0+sum1+sum2+sum3 は、flyというプログラムを利用していますが、perl単体で ということなら、GD.pmというライブラリを使うといいでしょう。 http://www.genome.wi.mit.edu/pub/software/WWW/GD.html をどうぞ。英語ですが使い方は簡単にわかるはずです。 |
|
はじめまして、山口といいます。 いきなりの質問で失礼ですが、.forwardの中にメールアドレスを書くと、届いたメールはその書き込んだメールアドレス当てに転送されますが、その時もとのメールアドレスでもみれるようにするにはどうすれば良いでしょうか。 要するに転送する時に自分のところにオリジナルは置いておいて、そのコピーを転送するというぅような形にしたのですが。 どなたかアドバイスを下さい。 |
|
はじめまして 68userさん M.Masudaです。 いや〜こちらのページにはじめてよらせていただきましたが ずいぶんと勉強になります。 先ほど、CGIスクリプト関連をDOWNしたのでこれからおいおい 解析して勉強させていただきます。 にしても、PerlだけでなくUNIXやプロトコル・ネットワーク 関連の情報量には驚くばかりです。 これからも、宜しくお願いします。 ところで本題ですが。 自分で実験してみればいいのでしょうが、ファイルロックの アルゴリズムには、一般的にflockを採用している物や、ロッ クファイルを作成してスクリプト自身がロックを管理してい る物が有りますが、今までの68userさんの経験上どういう手 法が一番効果が高いでしょうか。 あと、下の山口さんの質問は私も興味ありです(笑) 本屋さんでオライリーのsendmailかmailの本でも買って勉強 すればいいのでしょうが、それだけのためにはオライリーシ リーズは高すぎる!!! ここでうなずいた方は、沢山いるはず(爆笑) #68userさんはレスの書込みの時間が遅い(早い?)ですが何 #をしてる方なのでしょうか? そろそろ中級に足のかかってきた私ですが、宜しく御教授下 さい。 |
|
はじめまして>山口さん、M.Masudaさん 山口さんのユーザ名がhoge、転送したいところがfoo@bar.com だとしたら、.forwardに \hoge,foo@bar.com と書けばいいです。カンマで区切ることで、複数の転送先を 指定できますから。しかし hoge,foo@bar.com と書いてしまうと、hoge宛に(つまり自分自身)転送されますが、 再度 .forwardが参照されて、またhogeに送ろうとして…という ふうに、無限ループに陥ります。 つまり、「\」を付けると「.forward を参照するな」という意味に なりますので、無限ループが防げるわけです。 # ただ「\」を付けなくても、大抵のメールサーバだと数回ループ # したら止まるでしょうし、最近のsendmailは賢いので一度もループ # しないかもしれません。でも、念のため \ を付けておいた方が # いいでしょう。 > 今までの68userさんの経験上どういう手法が一番効果が高いでしょうか。 特に詳しいわけではないんですが、選択肢としては 1.flock 2.mkdir 3.シンボリックリンク あたりでしょうか。うちのカウンタは3ですし、このBBSは2です。 flockはNFS環境では動かないところもある(動くところもある) ということで、使ったことは一度もありません。 ただ2も3も、たま〜にロックが残ったままになることはあるんですよね。 でもOSレベルでは完璧に排他処理はできているはずです。 ですから、webサーバがシグナルを送って、CGIのプロセスを止めたとき にロックが残るのではないかと思うんですが、本当にそうなのか、 どういう状況で起こるのか、などの検証はできていません。 完璧な方法があれば僕も知りたいです(^^; > #68userさんはレスの書込みの時間が遅い(早い?)ですが何 > #をしてる方なのでしょうか? ははは、生活リズムが不規則な ただの学生です(^^; |
|
どうもありがレスとうございます。 .forwardの設定早速指定してみます。 >完璧な方法があれば僕も知りたいです(^^; そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ 今、flyを使ったカウンターを作ってるんですが、残ってしまった ロックファイルを削除する方法を考えてみます。 今までCUIはDOSしか触った事が無いのでUNIXのTABや矢印キーには 非常に驚き、非常によく作られたUNIXのシステムに感心しています。 おかげでキータッチがだいぶ早くなりました。(^_^)V この掲示板のタイトルに有る「UNIX,CGI,ネットワークの...」 は、今の私が求めているばかりで、ここは情報の宝庫です。 学生という事は、私よりだいぶ若いのにかなりの知識を持って いるようで恥ずかしいばかりですが、ぜひまた何かあったら教 えて下さい。m(_ _)m 宜しくお願いします。 |
|
訂正 誤:どうもありがレスとうございます。 正:どうもレスありがとうございます。 (^^ゞ |
|
68userさんご回答ありがとうございます。 68userさんの言う通りにやってみたところ、 ¥hoge,foo@bar.comのhogeにはメールが残らず、 すべてfooに転送されてしまいました。 何が行けないのでしょうか? hogeの前は「エンマーク」でいいのですよね。 |
|
僕が現時点で一番いいと思う方法は、シンボリックリンク自身に プロセス番号の情報を埋め込み、もしリンク作成できなかったら リンク先を調べて、さらに「/proc/プロセス番号」が存在するか どうかチェックする、ってのです。もし/proc/プロセス番号 が あれば、本当に実行中なわけですが、存在しなければ誤って ロック情報だけが残ってしまったわけで。 また、 $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; sub finish{ ロックファイルを削除;exit; } などと書くことで、誰か(WWWサーバなど)にシグナルを送られて プロセスを止められた場合にも、ロックファイルの後始末だけは 行って終了できます。 ただ、うちのカウンタはいろいろ試しているんですが、いまいち…です。 # CGIの場合、排他処理の失敗自体がたまにしか起きないので、 # 動作チェックしにくいですよね。 例えばこんな感じ。 BEGIN { &lock_on; } END { &lock_off; } sub lock_on { $SIG{TERM}=$SIG{INT}=$SIG{HUP}=$SIG{QUIT}=\&lock_off; my $lock_flg = 0; LOOP: foreach ( 1..3 ){ foreach ( 1..5 ){ $lock_flg = symlink("$$",$lockfile); if ( $lock_flg ){ last LOOP; } sleep 1; } if ( ! $lock_flg ){ if ( ! -f "/proc/".readlink($lockfile) ){ # なぜかロックファイルが残ってた 各種整合性のチェック; unlink($lockfile); } } } if ( ! $lock_flg ){ print "ロックファイルを作成できませんでした。\n"; exit; } } sub lock_off { unlink($lockfile); その他の後始末; exit; } > そうですか、まだ「これ!」ってセオリーは無いんですね(^^ゞ たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^; > hogeの前は「エンマーク」でいいのですよね。 全角の「¥」ではないですよ。半角の「\」です。 エンマークかバックスラッシュかは、表示される環境によります。 |
|
>たぶんセオリーはあるんでしょうけど、僕が知らないだけです(^^; いやいや、これだけ知ってれば十分じゃ....この概念は私的でした ね(^^ゞ 私のプログラミングは、BASICから入ってるのでいまだに構文の書 き方は、BASIC風です。(^^; しかも、Perlもフリーで配布しているCGIを解析して構文の記述を 勉強したりしてるので、Perl4やそれ以前の頃からプログラミング している人から比べたら、恥ずかしくって自分のプログラムなんて 公開できない。(T_T) まだまだ奥が深いPerlは、これだけを勉強して立派なPerl使いにな りたいんだけど、仕事柄これだけをやってるわけにいかないのが辛 いところです。(^^; 今同時進行で勉強してるのが、Perl,JavaScript,DHTNL,ネットワーク 関連、最近勉強を始めたDHTMLは、IEとネスケの互換性の無さにあき れています、ページを2重化したくないので同じページ内でIE・ネス ケそれぞれ3と4のバージョンで無難に表示させるのにてこずってま す。(^^; ところで以下の構文がまだよく分からないので、教えて下さい(T_T) 【1】 $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; ↑何をしているのか解からない(恥) シグナルハンドラをいじっているのは解かるんだけど、 hoge=foo=fuge=booの '=' の使い方の意味と、\&finishの'\'がリファ レンスを指す事は解かるんだけど、なぜ'\'そうするのかが解からない 【2】 my $lock_flg = 0; ←localとmyの使い分けがまだ理解できない アー恥ずかしかった。(^^ゞ この使い方は勉強になりました。 >$lock_flg = symlink("$$",$lockfile); >if ( $lock_flg ){ last LOOP; } こんなに簡単に書けるんですね!φ(._.) ># CGIの場合、排他処理の失敗自体がたまにしか起きないので、 ># 動作チェックしにくいですよね。 早いマシンより、遅いマシンに負荷が集中する時にエラーが出やす いんでしょうね。 ちなみに私の試験方法は、同じページ上に同じカウンタのURLを沢山 書いて、ブラウザのキャッシュを無効にしてリロードです。 #本当にこれでいいのか解からないけど、他に手段を知らない(^^ゞ ではまた。 |
|
>> $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; $a=$b=$c=100; print "$a,$b,$c\n"; の結果は100,100,100となります。つまり$a=100;$b=100;$c=100;と 等価なわけですね。そもそもperlの(Cもそうですが)代入文自体は 値を持っています。 print $a=100; の結果は100です。また=(イコール)演算子は右から順に 評価されますので、 $a=$b=$c=100; は $a=($b=($c=100)); と等価です。というわけで、 $a=($b=($c=100)); ↓$cに100を代入 $a=($b=100); ↓$bに100を代入 $a=100; という流れになっているはずです(たぶん)。 シグナルハンドラですが、perl4なら $SIG{HUP}="finish" ですけど、この書き方では 関数finishが別ファイルにあった 場合(それをrequireやuseで使っている場合)は呼べません。 というわけで、\&finishと書くわけです…と青ラクダ本に 書いてありました(^^; あとlocalとmyは local $local=1; my $my=2; &f; sub f { local $local=3; my $my=4; print "f: \$local=$local\n"; print "f: \$my=$my\n"; &g; } sub g { print "g: \$local=$local\n"; print "g: \$my=$my\n"; } 実行結果: f: $local=3 f: $my=4 g: $local=3 g: $my=2 ということでどうでしょう? > IEとネスケの互換性の無さにあきれています DHTMLはわかりませんが、Javascriptを使っていて、 Winでは動くのだろうけど FreeBSD+NetscapeNavigatorでは エラーが出まくるようなページが たくさんあるので、 こんな変なものには絶対手を付けまいと誓いました(笑) というわけで僕はJavascript、DHTMLに関しては全くの素人です(^^; |
|
詳しい解説ありがとうございます。 いまいちおバカな頭で理解できないけど、 local と my の違いは、 サブルーチンからさらにサブルーチンに呼ばれた時に。 local = 前のルーチンの値を保持する。 my = 最初のサブルーチンを呼ばれた時(定義した時)の値を示す。 と、解釈していいのかなぁ? もしそうなら、具体的に使う時は再帰呼び出しの様な使い方を した時に違いが出る。ということでしょうか? それならmainルーチンから普通にサブルーチンを呼び出した時 (初期化ルーチンの様な)さらにルーチンを呼び出さなければ、 同じ結果ですね。 #localやmyで指定されたサブルーチン内の変数に当てられた分の #メモリは、そのルーチンが終了すれば開放されるのだろうか? >$a=$b=$c=100; は理解できました。 やっぱBASICが最初だと、Perlの構文は簡単に記述できるけど、 理解に時間がかかる!、単におバカなだけだったりして((((^^; >というわけで、\&finishと書くわけです…と青ラクダ本に 何ページに載ってます? よく言う青ラクダ本は持ってますが、あんまり読んでると眠く なるので、必要な部分だけ拾い読みしてます。(^^; #にしてもラクダ本って、何が何処に書いてあるのか解かりづら #い...、しかもたまに書いてある英語のジョークが、真剣に読む #と腰を砕くし....(; ;) 私は、恥ずかしいけど請け負いでホームページ製作をしてるんで すが、製作作業と勉強に掛る時間が同じ位です。(>_<) >こんな変なものには絶対手を付けまいと誓いました(笑) すいませんこんな変なもの作ってます(爆) Javascriptは、クライアント側のプログラムなんで、アクセス環 境で動いたり動かなかったりなので、大手サイトやアメリカのH サイトで使用している物を、見ながら使ってます。 これは無断コピーの意味ではなく、「沢山のアクセスのあるサイ トで使われているコードはエラーが少ないだろう」を前提にして ます。もちろんそのまま使うのではなくコマンドの使われかたを 流用するだけだけど。 一応ネスケとIEは、3と4のバージョンで動作確認しながら作 ってますが、他のOSは環境が無いのでどうにもならないし..。 私のページも、68userさんの環境からアクセスすると、最悪かも しれない。(^^ゞ 暇なら来た時BBSに書込みでもしていって下さい。 |
|
ちょっと横ヤリです(^o^;ゞ local も my も、その宣言位置から、これを囲む最も内側のブロックの最後までが有 効範囲であるという点は同じです。ただし、この「ブロックの最後まで」というのが、 localの場合が時系列的に判断されるのに対して、my はスクリプトの見た目上のブロッ クの階層構造で判断されます。 つまり、my は、C言語などと同じで、ブロックの異なる階層に同じ名前の変数が my で宣言されている場合、その変数が現れた位置の最も内側のブロックで宣言されたも のが参照されます(ブロックスコープ)。 これに対して、local は、LISPなどと同じで(これはちょっと?)、系列や階層が異 なるブロックに同じ名前の変数が local で宣言されている場合、プログラムの実行に 伴って、この実行のステップがどのブロック内にあるか(また、どのブロック内から 呼び出されたか)ということによって有効範囲が判断され、既に有効範囲を外れたも のを除いて、現在有効である最も最近宣言されたものが参照されます(動的スコープ)。 なお、自分自身を呼ぶだけの単純な再帰呼び出しでは、myもlocalも変わりないと思い ます(たぶん)。 ただ、perl4の解説では、localをループ内で使うと、ループのたびにスタックが消費 されると書いてあったのですが、perl5ではこの説明がなくなってました。なんでかな ぁ…? a=b+c などは、一般のプログラム言語では文(代入文)となりますが、Cやperlなどで は単なる式となります( = は b+c の値を返すだけの演算子で、副作用としてこの値 を a に代入します)。で、どちらの場合も = の右側には式が書けるので、Cやperlな どの場合にのみ x=(a=b+c) というような記述が可能になります。また、= は右結合の 演算子なので、68userさんの仰るように ( ) が不要になります。 |
|
手元の青ラクダ本では、6.2.1 シグナル(P.389)に書いてありました。 あとmmさん、どうもです。 ああ、もうちょい長く書きたいけれど、風邪がつらいです。 時期が時期だけにインフルエンザかなぁ…。発熱・頭痛・ 体の節々の痛み・せき、などなどフルコースです。 というわけで、今日はこの辺で…。 |
|
あっ、おだいじに>68user さん …のいぬ間に、ちょっと訂正(^^; 副作用という用語は、単純な代入式では使わないようです。 また、「= は b+c の値を返す」と書きましたが、正確には a に代入した値を返すようです。 つまり、a と b+c の型が違う場合は、a の型になるそうです。 |
|
う〜ん.... やばい!あたまが... ばくはつしそうぅ... Perlだけでも、CぢゃなくてBASICから入ったので混乱してるのに、 やれJavaScriptだ、DHTMLだと私の頭はいま、知恵熱で300度位です。(笑) もう少し時間を掛けて、勉強してみます。(>_<) mmさんありがとう。 #名前が似てますねぇ(^_^)V ここの常連さんは、レベルが非常に高いのでお勉強には最適です。 言い訳だけど、青ラクダ本はホント辞書の様なので、初心者には 何かの事をさせたい時に、それがどこに書いてあるのか探すのが 一苦労です。(国外のジョークはそれを理解するのにエネルギーが 必要なので、訳者に削除して欲しいと思うのは私だけ?) やっぱ一度、全部を時間を掛けて読破しないと..... う〜ん時間が無い... 誰か一日を30時間にするライブラリ知りませんか?(爆) ちょっと忙しくなってきたのでしばらく来ないかもしれないけど しばらくしたら、またわからない所教えて下さい。>ALL それでは。 68userさんお大事に! |
|
ちょっと変な質問ですが、解かれば教えて下さい。 IE2(win)とApache/1.2.6なんですが。 サーバーネームは、www.web.domain.co.jp バーチャルでは、 www.damain.co.jpです。 サーバーの設定は、バーチャルをメインのwebとして使用していま す。つまり一つのIPで2つのwebを運営してます。 なにが起こるかというと、IE3,IE4,ネスケ3,ネスケ4で、 www.domain.co.jpにアクセスすると、コンテンツ内容は正常に www.domain.co.jpで設定した内容を返すのですが、IE2のアクセス の時だけ www.web.domain.co.jpに指定した内容を返します。 関係無いかもしれないですけど、hostコマンドで、2つのネームを 叩くと同じIPを返します。 今度は、そのIPを調べるとwww.web.domain.co.jpを返します。 ネーム解決は、ドメイン名→ネームサーバーにIPを問い合わす→ TCPの通信はそのIPで行なう。(解釈が違ってたらごめんなさい) この際に、もしかしてIE2は単純にIPの指すサーバーにリクエスト を発行してドキュメントを取得する。 推測ですがこういう手順なら納得いきます。 現にIPをhostコマンドで調べると、www.web.domain.co.jp を返し ます。 でもそんなことあるのでしょうか、もしそうならIE2はバーチャル サーバーのドキュメントを参照できない事になります。 サーバーの設定がが悪いのか、IEが悪いのか、それともネーム解決 が悪いのか私には解かりません。(^^ゞ もしこの現象が解かれば教えて下さい。 サーバー設定が原因でありませんように...アーメン(^^) |
|
>IE2のアクセスの時だけ www.web.domain.co.jpに指定した内容を返します。 私は、Apacheはよく知らないので、68userさんの方が専門だと思いますが…(^^; 寝込んでらっしゃるかも知れないので…、とりあえず、 ↓の「さらなる改善点・バーチャルホストに対応」が参考になるんじゃないでしょうか。 http://X68000.startshop.co.jp/~68user/net/http-5.html 原因は、IE2 だけが Host: ヘッダを送ってないということかな…? Apacheにとっては、ブラウザがwww.web.domain.co.jp と www.damain.co.jp の どちらで接続して来たかの区別はないハズです。ただ、ブラウザから送られて来る HTTPヘッダが Host: www.web.domain.co.jp Host: www.damain.co.jp のどちらになっているかで、送り返すページを区別しているのだと思います。 IE2が使えるのなら、一度送信ヘッダを調べてみてはいかがでしょう。 ↓で環境変数を調べて、HTTP_HOST がちゃんと設定されているかどうかを見てみて下さい。 http://X68000.startshop.co.jp/~68user/Cgi-room/printenv.cgi それから、my と local の件ですが、perl5 しか使わないというのであれば、 local は忘れてもいいんじゃないでしょうか( local は古いバージョンとの 互換性のために残ってるだけだと思います)。 ↓でブロックスコープの基本が理解できるんじゃないかなぁ…? Algol系の言語(Pascal,C,awk,perl,Java,JavaScript..)の有効範囲の基礎に なると思います(たぶん(^^;)。 $a = 0; { my $a = 1; { my $a =2; { my $a = 3; print "$a\n"; } print "$a\n"; } print "$a\n"; { my $a = 666; print "$a\n"; } print "$a\n"; } print "$a\n"; ↓実行結果です(なお、この場合は、myをlocalに替えても同じです)。 3 2 1 666 1 0 >やっぱ一度、全部を時間を掛けて読破しないと..... えっ? 私は、全然読破してませんです(^^; 参照用と、項目別にその部分だけを読んでます。 >#名前が似てますねぇ(^_^)V すいません、面倒なんでイニシャルの mm にしてしまってます(^^; ★再度訂正(^^; LISPが動的スコープと書きましたが、Common Lisp は動的はありませんでした。 でも、確か動的スコープの Lisp もあるハズです(^o^;ゞ |
|
★再再訂正(^^;;; JavaScript の var って、ブロックスコープじゃないんですね。 試してみたら、単に関数内でローカルなだけでした(^^; それと、awk も、仮引数リストの変数が関数内でローカルなだけで、 これも関係ありませんでした(^^;; マジメな話に慣れてないので、訂正が多くってスミマセンですm(_o_)m |
|
どもども。なんとか熱も下がったのですが、もうちょい安静にしときます。 > あとlocalとmyは > (snip!) > ということでどうでしょう? 実は言葉でうまく説明することができなかったので、 サンプルソースでごまかしたというのはナイショです(笑) M.Masudaさんからメールをいただきましたが(500エラーで 書き込みできなかったそうで)やはり >> IE2はバーチャルサーバーのドキュメントを参照できない事になります。 ということのようですね。 メールからの引用ですが、 > 「もうIE2なんて使ってる人いないよ」と言っても、それを実現して > くれなきゃ困るなんて言われるんで、とほほ状態です....。 社会とは理不尽なところですね(^^; ところでM.Masudaさんのwebですが、奥深くまで入っていったわけ ではないですけど、FreeBSD2.2.7+NC4.04で、Javascriptのエラーはでませんでした。 > 私のページも、68userさんの環境からアクセスすると、最悪かも > しれない。(^^ゞ というわけでご安心を。まぁ もしエラーになったとしても、minorityの 宿命ということであきらめてます。 # 別にわざとエラー起こしているわけではないですし。 |
|
500エラーで書けなかった内容です。 ====================================== どうもありがとう。影の68userさん(^^)/ ブロック...そう今日読んでたとこに有りました。 ああいった使い方は、Cとかに多いみたいですね。 なんかPerlて、底無し沼の様に奥が深くって、ちょっとビビッてま す。(笑) 個人的には、プログラミング好きなんでいろいろ試したいし、構文 の柔軟さは、すごくうれしい!\(^O^)/ だけど、ホント誰かrequireできる、一日を30時間いや48時間くら いにするルーチン書いてくれないかな(笑) 【86.9%本気】←どっかで見たなぁ Webで使うCGIでする事なんて割と簡単なので、今のレベルで良いか もしれないけど、この業界で生き残るにはちゃんと勉強せねば! と、最近つくづく感じてます。 #最終的にはDBとの絡みが有るだろうし IEの件はちょっと情報が入ったのですが、やはりだめブラウザのレ ッテルが張られているようですね。 まだ確認は取ってないですが、IE2はどうもバーチャルが見れない バグがあるらしいです。(未確認なので信用しないように!) サーバーを管理している人と連絡をとって、いくつか対応策を思案 中です。 「もうIE2なんて使ってる人いないよ」と言っても、それを実現して くれなきゃ困るなんて言われるんで、とほほ状態です....。 JavaScriptも結構面白いんだけど、環境によってブラウザの対応レ ベルが違うので、バージョンが違うとエラーが出たりはよくありま すね。 そろそろインターネット界も仕様をもっと統一してくれると、私み たいにこの世界で生きている人もやりやすいんだけどなぁ。 ブラウザ毎のルーチンって具合で、各ブラウザに合わせたスクリプ トを作ってると、たまに暴れたくなります。(^^ゞ でもこういう場所があって、私みたいな人間にはとても助かります。 なんか愚痴っぽくなってしまいましたがご勘弁を!(^^)/ ==================================================== なんで500エラーが出たんでしょうか? >というわけでご安心を。まぁ もしエラーになったとしても、minorityの >宿命ということであきらめてます。 私のページは、右側の部分(個人的な内容)でスクリプトを多用しています。 特にMusicとFavoriteのなかの部分で使ってますが、くだらないから見る 価値ないかも?(^^ゞ >原因は、IE2 だけが Host: ヘッダを送ってないということかな…? 通信パケットを見たら、全くそのとおりでした。 IE2のバカ! でもこれで、私の範疇では無い事が解かりましたので一安心です。 でわまた。 |
|
@68userさん >500エラーで 書き込みできなかったそうで あれま…そんなことが… >サンプルソースでごまかしたというのはナイショです(笑) ワタシの文章も分かりにくいとは思いますが、実は最初に書いた初版は もっとひどくて、自分で読んでもワケ分からんモノでした(^^; (一応、アレは改定第2版(^^;) JavaScript は、私も、IE/NN間の相違に加えてバージョン間の違いも多いので、 自分でちょっと使うとき以外は、あまり深入りしないようにしてます。 でも、M.Masudaさんの場合は、そんな悠長なコトも言ってられないのかな(^^; @M.Masudaさん >>原因は、IE2 だけが Host: ヘッダを送ってないということかな…? >通信パケットを見たら、全くそのとおりでした。 やはりそうでしたか… いや、もしそうだとすると、IE2ではバーチャルホストにアクセスできない ことになるので、まさかそんなことが?…って思ってたんです(^^; >ブロック...そう今日読んでたとこに有りました。 >ああいった使い方は、Cとかに多いみたいですね。 うーん、あまり積極的に使うことはないような気はしますが…? せいぜいループカウンタくらいかなぁ…、 カウンタは慣習的に i を使うので、不要な衝突を避けるために便利かな…とは思います。 perl の場合は、foreach $i (LIST) の $i がループ内でローカルになりますね。 C++ の for( int i = 0; ... でも、ループの直ぐ外のブロック内にローカルなので、 こういう場合には有用かもしれません。 ただ、Pascalは、Cとかと異なり、関数や手続きを入れ子にできるんで、 親のローカル変数との衝突を避けるために、もっと積極的に利用してるかも知れません。 |
|
>> 500エラーで 書き込みできなかったそうで > あれま…そんなことが… ログを見ると、ここのwwwboard.cgiは最近2ヵ月で20回くらい 500エラーが起こってます。ここは無改造なのですが、ロック用 ディレクトリが残ってしまうと500エラーになってしまうので、 はやいとこ改造せねばいかんなと思いつつ…めんどくさいし〜。 # ログがどんどん増えていくのもなんとかしないと。 > perl の場合は、foreach $i (LIST) の $i がループ内でローカルになりますね。 それは foreach my $i (LIST) とかの場合では?と思いつつ試してみたところ… foreach $i (LIST) でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 |
|
> 500エラーが起こってます。ここは無改造なのですが、ロック用 > ディレクトリが残ってしまうと500エラーになってしまうので、 他のスクリプトで、ロックファイルのタイムスタンプを調べて、 10分以上前なら削除、てな方法がありましたよ。 ># ログがどんどん増えていくのもなんとかしないと。 レスキューさん所みたくページ表示行数を決めて、[次ページ] なんてしたら? #言うだけは簡単なんだよな〜(^^; >でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 自分もさっき実験してはじめて知りました。(*_*) >JavaScript は、私も、IE/NN間の相違に加えてバージョン間の違いも多いので、 >自分でちょっと使うとき以外は、あまり深入りしないようにしてます。 >でも、M.Masudaさんの場合は、そんな悠長なコトも言ってられないのかな(^^; 本来ちゃんとした手続をすればある程度、エラーを減らしたり出来るらしいですが 、私もそこまで出来てませんし今のところクライアントにはわざといろいろと難し い説明で逃げ回ってます。(^^ゞ #でもDHTMLのスタイルシートやレイヤーの方がもっとたちが悪いですよ(互換性で) 厳密な処理を必要とする部分はCGIを利用して、それ以外の処理をJavaScript等に 行なわせる。といったところでしょうか。 ところでmmさんて何者?(^^ゞ >ワタシの文章も分かりにくいとは思いますが、実は最初に書いた初版は >もっとひどくて、自分で読んでもワケ分からんモノでした(^^; >(一応、アレは改定第2版(^^;) 何か執筆していらっしゃるんですか? |
|
BBSに関しては、本気でちゃんとしたシステム作るつもりは ないんで、まぁ…こんなもんで(笑) # 引用の色変えはmmさんとこのBBSのマネ(^^; あとは何かありますかねぇ…。タグの自動補完とか二度書き禁止とか… うーん、いまいちそそる機能がない。 |
|
もいっちょテスト! |
|
ああやっぱりやだなぁ。 メッセージ数はいつでも変更可能にしたいなぁ。 …よく考えずにいじると後悔するという、いい例でした(^^; |
|
>68user さん >はやいとこ改造せねばいかんなと思いつつ…めんどくさいし〜。 ワタシも、flockに書き換えるつもりで、ロック部分をコメントアウトしたんですが、 未だにそのままになってます…(^o^;ゞ > foreach $i (LIST) >でも $i はローカル変数扱いなんですねぇ。知らなかったっす。 こちらは、C++の場合もループ内ローカルだと思い込んでて、 perlの場合と並べて書いてたんですが、調べてみると違ってたので、 ちょっとヘンな文章になってしまいました(^^; >M.Masuda さん >他のスクリプトで、ロックファイルのタイムスタンプを調べて、 >10分以上前なら削除、てな方法がありましたよ。 とほほさんのコードも ($mtime) = (stat("lock/wwwboard.loc"))[9]; if ($mtime < time() - 600) { rmdir("lock/wwwboard.loc"); } となっていて、10分以上前なら削除されるハズなんだけど、 利いてないのかな? >本来ちゃんとした手続をすればある程度、エラーを減らしたり出来るらしいですが >、私もそこまで出来てませんし今のところクライアントにはわざといろいろと難し >い説明で逃げ回ってます。(^^ゞ ウチの場合は、手元にNN4とIE3しかないってのが一番問題になるようです。 でも、NN2,3やIE2,4があっても、やっぱり面倒そうではありますね(^^; >#でもDHTMLのスタイルシートやレイヤーの方がもっとたちが悪いですよ(互換性で) そのヘンは、もはや別物って気がします(^o^;ゞ もっとも、ウチでも簡単なスタイルシートは使ってますが… >何か執筆していらっしゃるんですか? ん? 「第何版」ってのは、単なる冗談です(^o^;ゞ ワタシは、単なるパソコン好きの素人にすぎません(^^; >68user さん ># 引用の色変えはmmさんとこのBBSのマネ(^^; ウチのも、他所のマネです(^^;;; でも、おかげで、空行を入れずに済みます。 >あとは何かありますかねぇ…。タグの自動補完とか二度書き禁止とか… >うーん、いまいちそそる機能がない。 タグの補完は、前にちょっと考えたことがありますが、面倒ですよね。 <TABLE>タグの<TR>とかが入れ子にならないし、引用符の中で ">" を使われると、 正規表現でのタグの切り出しができないし… |
|
> <TABLE>タグの<TR>とかが入れ子にならないし おろ、TABLEまで何とかしようという魂胆で? 志が高いですね(笑) 僕が昔に書いたのは http://X68000.startshop.co.jp/~68user/tmp/tag.txt です。今考えると、element(って言うのかな?)とか全く考えて ないんで、ヘボヘボですね。 うーん、でも真面目に実装したら、 TABLE-TAG := <TABLE> TR-TAG </TABLE> TR-TAG := <TR> [TD-TAG] [</TR>] TD-TAG := <TD> <chars> [</TD>] なんてBNF式に定義して、それに基づいてparseさせなきゃダメなのかしら。 # 昔 yaccとlexで組もうとした事があるけど、エラーから回復させる事が # できずに(=文法エラーにぶつかると止まってしまう)挫折しました(^^; |
|
ちょっと質問!です。 すいませんシェルコマンドのmailって有りますよね。 #みんな使ってます? 私が聞いたmailコマンドの使い方ですが、 ================= mail "送信先のメールアドレス" <ENTER> Subject: "メールタイトル" <ENTER> メール本文、etc. 最後に"."ピリオドのみで終了。 ================= ここまでを、聞きました。 #OSによっては違うかもしれないけど。 http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#sendmail を見ると、sendmailとほぼ同じ操作ですよね。 シェルの場合、sendmailとmailコマンドの違いは、自動的にSubject:等 の文字がエコーされる事ぐらいなのですか? CGIで直接メールを出す場合、レスキューさんのWebFromを参考にすると sendmailに直接書込んでいますが、CGIで直接sendmailに書込みした場合 のエラーメッセージを取得したい時は、sendmail実行時にどんなオプシ ョンを付ければいいんでしょうか? 前にsendmailに実際に転送された手順を表示する様なオプションが ある事を聞いたのですが忘れました。(^^ゞ #man sendmailで調べたら -N dns ってのが怪しいのですが意味が #よく解からん。(ToT) ##前から思っていたけど、英語圏で生まれていたらもっと詳しくなっ ##ていたろうな。だってマニュアルって英語だもん(^^ゞ |
|
>おろ、TABLEまで何とかしようという魂胆で? 志が高いですね(笑) いや、入れ子構造だと決め付けて、作ってみてから気が付きました(^^; >僕が昔に書いたのは http://X68000.startshop.co.jp/~68user/tmp/tag.txt おお、ちゃんと < や > の対応もチェックしてあるんだぁ… なるほど、スタックを使うので、入れ子にならない例外的な処理も やりやすそうですね。 ウチのは、再帰を使ったので、スタックを直接操作できないんです(^^; 以前「とほほ」さんとこに書き込んだんですが、一応 http://www2s.biglobe.ne.jp/~cru/library/junk/tag.txt に置いときます。 例示した文字列では、</hr>の処理が 68user さんのとは違ってます。 ># 昔 yaccとlexで組もうとした事があるけど、エラーから回復させる事が ># できずに(=文法エラーにぶつかると止まってしまう)挫折しました(^^; yacc は私も挫折しました…ただし、68user さんよりはもっと手前でですが(^^; ところで、HTMLみたいなものも、yaccで解析できるんでしょうか? BNFで定義できれば問題ないのかな…? lexの方を独自の切り出しルーチンに替えればいいのかな…? |
|
crontabコマンドについて質問させてください。 あるプログラムAをcrontabで自動起動させたいのですが、 そのプログラムAはCシェルでしか動きません。 そこでcrontabで呼出すシェルスクリプトBを作成し、Bの先頭で Cシェルを指定し、次に必要な環境変数を設定し、 次にAを実行するようにしたのですが、 うまくいきませんでした。 Bにenvをいれて、環境変数を出力するようにしたら、 path等がshのデフォルトのままでした。 ちなみにAはオラクルに接続しSQL処理をおこないます。 どなたかご存知の方がいらっしゃいましたら、お知恵をお貸しください。 |
|
> http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#sendmail > を見ると、sendmailとほぼ同じ操作ですよね。 うーん、mailコマンドっていうのはメーラーなんですよ。メールも 読めるし返事も書ける。低機能ながら立派なメーラーです。一方、 sendmailというのはSMTPサーバ兼(低レベルなら)SMTPクライアントって 感じでしょうか。 # しかし上のリンク先の「SMTPポートに繋げてメールを送る方法」って # のは大嘘ですね。誰だ、こんなの書いたのは。…俺か(^^; > CGIで直接sendmailに書込みした場合のエラーメッセージを取得したい時は、 宛先がなかった場合などに返ってくるメールを指して「エラーメッセージ」と 言ってらっしゃるなら、 http://www2e.biglobe.ne.jp/%7es-hasei/cgi-bin/wwwlng.cgi?print+99020031.txt など。 > #man sendmailで調べたら -N dns ってのが怪しいのですが意味が > #よく解からん。(ToT) -Nは-N failure,successなどと指定できます。manを読むときは、 日本語マニュアルを使って楽をしましょう。 http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=sendmail&dir=jpman-3.0.0%2Fman > あるプログラムAをcrontabで自動起動させたいのですが、 > そのプログラムAはCシェルでしか動きません。 状況がよくわかりませんが、プログラムAがCシェルスクリプトなら プログラムAの1行目に #!/bin/csh -f などと書いてあるでしょうから、crontabにプログラムAのスクリプト名を フルパスで書いておけばいいです。PATHは、プログラムAの先頭で set path=(/bin /usr/local/bin /usr/sbin ....) と書いてもいいですし、crontabの設定ファイルの先頭に PATH=/bin:/usr/local/bin:/usr/sbin:... と書いてもいいです。例えば PATH=/bin:/usr/local/bin:/usr/sbin:... 0 * * * * /home/user/bin/hogehoge とか。 |
|
> yacc は私も挫折しました…ただし、68user さんよりはもっと手前でですが(^ こっちも挫折は早かったですよ〜。 http://X68000.startshop.co.jp/~68user/tmp/html.l http://X68000.startshop.co.jp/~68user/tmp/html.y うーん、短いなぁ。今見ると、どこがどういう意味なのかさっぱり(笑) |
|
どうもありがとう68userさん。(^^)/ > > CGIで直接sendmailに書込みした場合のエラーメッセージを取得したい時は、 > 宛先がなかった場合などに返ってくるメールを指して「エラーメッセージ」と > 言ってらっしゃるなら、 > http://www2e.biglobe.ne.jp/%7es-hasei/cgi-bin/wwwlng.cgi?print+99020031.txt > など。 直接行ってみたら、なんとよく行くページの中。 ここの所忙しく、あまり見に行って無かったらなんとリアルタイムな! 灯台下暗しとは、この事? > -Nは-N failure,successなどと指定できます。manを読むときは、 > 日本語マニュアルを使って楽をしましょう。 > http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&man=sendmail&dir=jpman-3.0.0%2Fman こんな便利があるとは!なんともうれしい限りです。(^^ゞ でもうちの環境ではLinuxなので適当に、コンバート?しながら見てみます。 だけど、また暫く睡眠時間が少なくなりそう....(T_T) ちなみですが。 http://X68000.startshop.co.jp/~68user/Cgi-room/printenv.cgi で書いてあるなかで REMOTE_PORT を、「ポート番号とは全く関係なくて、httpdをforkした回数じ ゃないかなぁと思ったらこれも違うみたい。よくわからん。」と書いてありましたが、そのまんま です。(^^) つまりクライアント側が、webサーバーの80ポートにアクセスする際に使用する、クライアント側の ポートの番号です。 私の使用しているパケットモニターで確認しました。 クライアント側アプリケーションが、通信の際にソケットを生成するとその時に自動的に割り当て られるみたいです、アプリの処理方法はそれぞれでなんでしょうが、通信セッション(っていうのかな) が終わる毎にクライアント側のポートが変わりました。 #まじめに勉強した訳でなくパケットモニターでの通信内容をみて書いてます。(^^ゞ |
|
>http://X68000.startshop.co.jp/~68user/tmp/html.l >http://X68000.startshop.co.jp/~68user/tmp/html.y ありがとうございます。なんとなく雰囲気はわかるような気がします(^o^;ゞ ただ、lexでは"<BODY>"とかをトークンとして扱ってますよね。 こういう方法で <BODY GBCOLOR="#ffffff"> のような属性を持ったものも 扱えるのでしょうか? よくは分かってないんですが、lexではトークンを正規表現で切り出しますよね。 だから、<>内をまとめて切り出すのは難しいような気がするのです。 それとも、<>内はまた別のルールでトークンに切り分けるのかな…? |
|
> REMOTE_PORT どうもです。これを設置したのは去年の6月ですから、その当時はよく わかってなかったようですね。ちなみに当時は、 「サーバ側はポート80で待っているが、一旦コネクションが確立されると、 次のクライアントのために一刻も早くポート80を開けなければならないので、 新しいポートが(CGIに)割り当てられる。CGI側はそのポートを通じて クライアントと通信しなければならない」 のではないかなぁ…と思っていた記憶があるような ないような。 > でもうちの環境ではLinuxなので適当に、コンバート?しながら見てみます。 いや〜、おそらくLinuxにもjmanはありますよ。僕はLinux知らないけど、 ないはずがないと思います。 > ただ、lexでは"<BODY>"とかをトークンとして扱ってますよね。 どうなんでしょう? 僕は挫折した人間なのでよくわかりませんが(^^; weblintなどもperlでやってるんで、HTMLチェッカはyacc&lex向きじゃ ないのかもしれませんね。 |
|
>weblintなどもperlでやってるんで、HTMLチェッカはyacc&lex向きじゃ >ないのかもしれませんね。 なるほどー 文脈自由文法とかがちゃんと分かってないので、まだ?なんですが…(^^; Cで言語処理系のプログラムを書く機会があったら、またちゃんと勉強しようと 思いつつ、そのままになってるんですが、Windowsなんかを使ってるとどんどん 遠ざかって行くような気がします(^^;;; 日本語マニュアルもありがとうございました。 とりあえず、ウチのサーバーのmanの出力は読みやすくはなったのですが、 やっぱ日本語だと助かります(^^; |
|
68userさんへ ありがとうございます。 参考にさせて頂き、もうちょっとやってみます。 |
|
こんにちは。 CGI実行中のバッファのフラッシュについてなんですが。 具体的には、あるサーバーのログ20Mb以上を圧縮して取り出すのに、 CGIで圧縮ファイルを生成→生成されたファイルをDownLoadする。 というCGIで、全ての処理にかなり時間が掛るのと、ブラウザの TimeOutをさける為に、処理過程を画面に出力しながら処理を続け る動作のスクリプトです。 $|=1でバッファのフラッシュを指定できますよね。 確かに、シェル上で直接実行すると動作の確認が出来ましたが、 ブラウザ上から実行すると、スクリプトが全て終わってからでない と画面に出力されません。 他で聞いたところによるとサーバー(Apacheです)が、CGIの処理が 終わらないとダメみたいです。 ただ、その際STDOUTをクローズすると出力されると言っていたので 、実験しましたがダメでした。 #close後は出力されない また、ある程度の出力(環境で違うらしい)が溜まるとWebサーバー がバッファをフラッシュするとも書いてありましたが(未確認)、 無駄な出力をさせたくありません。 なにか、いい方法は無いでしょうか? >いや〜、おそらくLinuxにもjmanはありますよ。僕はLinux知らないけど、 >ないはずがないと思います。 見つけたんですが、ローカルコンソール(本体)上でxの仮想コンソール? からなら表示できるんですが、telnetで指定するとmanを表示している? lessが2バイト文字に対応してないみたいで、読めません。(; ;) jmanってコマンドですよね、それも無いです。(T_T) #そもそもtelnet上のmanで日本語表示はダメなんでしょうか? #ちなみにtelnetは Tra Termを使ってます。 >> REMOTE_PORT いやーパケットモニターで生の通信内容見てると、結構勉強になります セキュリティーとかいろんな事の考え方も変わりますね。 |
|
つまり、処理結果を小だしに表示させてタイムアウトを防ぎたいわけですね。 http://www2e.biglobe.ne.jp/%7es-hasei/cgi-bin/wwwlng.cgi などはそのように できていますね。僕も前に疑問に思って質問したのですが、結局ローカルでは うまくいきませんでした。 で、そういう場合はnphスクリプトを試してみてはいかがでしょうか。とほほさんの webに解説があったはずです。 > #close後は出力されない そうですね。closeするとコネクションは切れます。 > lessが2バイト文字に対応してないみたいで、読めません。(; ;) FreeBSDではjlessというのがあり、環境変数でLESSCHARSETなどを 設定する必要があります。Linuxもそういうのはないですか? > jmanってコマンドですよね、それも無いです。(T_T) んー、そのサーバを誰が管理しているのか知りませんが、 ただ単にインストールしてないだけ、ってことはありませんか? 誰かLinux使いの方いません?(^^; |
|
>http://www2e.biglobe.ne.jp/%7es-hasei/cgi-bin/wwwlng.cgi など >はそのようにできていますね。僕も前に疑問に思って質問したのです >が、結局ローカルでは うまくいきませんでした。 これって見てみたんですが、わかりませんでした。(T_T) #この行だけ見て、暫く解析してたり発言をみていたので時間食って #しまった! >で、そういう場合はnphスクリプトを試してみてはいかがでしょうか。 >とほほさんのwebに解説があったはずです。 この行を、後で見直して思い出しました。 これって解説ページを後で試そうとブックマークに入れっぱなしでし た。 後日試してみます。 #誰かホントに1日を30時間に....(エーかげんにしなさい!?) >> lessが2バイト文字に対応してないみたいで、読めません。(; ;) > FreeBSDではjlessというのがあり、環境変数でLESSCHARSETなどを > 設定する必要があります。Linuxもそういうのはないですか? j*シリーズは私の探したところ見つかりませんでした。(; ;)x2 #どうもJフレンドリーなのはFreeBSDの方が上手みたいですね。 でも日本語マニュアル >んー、そのサーバを誰が管理しているのか知りませんが だれも管理してなかったりして。(^^ゞ セキュリティーのため詳しくは書けませんが、非常に恐いサーバで す。 #いろ〜んな意味で。 >ただ単にインストールしてないだけ、ってことはありませんか? そうかもしれないけど、仮にパッケージには入っていてもインスト ールしてまでは弄れないだろうなぁ。 試験環境として自由に触らせてもらってはいるけど、これ以上私に は言えない...。 でもここ、 http://www.jp.freebsd.org/man-jp/search.html よく出来てるんで、利用させてもらいます。 どうもです。(^_^)V |
|
こん**は >>j*シリーズは私の探したところ見つかりませんでした。(; ;)x2 こちらかと http://www.linux.or.jp/jman/ LANGがja_JP.ujisなら /hoge/man/ja_JP.ujis以下検索しますよーん |
|
どうもです、68userさん。(^^ゞ >で、そういう場合はnphスクリプトを試してみてはいかがでしょうか。 >とほほさんのwebに解説があったはずです。 やってみました。おかげで思うとおりの結果が得られました。 ありがとうございました。 これで忘れられてたブックマークもうかばれるでしょう。笑 ちょっと試験でいろいろやってみましたが、これってhttpサーバーが リクエストに対して(GETやHEAD等)を判断して返す処理と同じ事を、 CGI側で行なうって事なんですね。 と言う事は、Apacheでサポートしていない(と思う)DELETEとかOPTIONS を指定するとnphのCGIでいろんな事出来そうですね。 #でもちゃんとセキュリティーを考えないと恐いけど(^^ゞ ありがとうございます。>ABCDEFGさん。 >>j*シリーズは私の探したところ見つかりませんでした。(; ;)x2 よく探したら有りました! #なんて探しかたの悪いやっちゃ(^^ゞ http://www.linux.or.jp/jman/ これってうれしすぎる!!! そのついでといっちゃなんですが、その環境を使えるようにする方法を 教えては頂けないでしょうか。 #調子よすぎかな!?(^^ゞ つまり、自分の環境でj*環境を使う方法です。 最初からの設定で、シェルはbashを使っています。 環境ファイルは ~/.bashrcデスよねぇ。 ここにどんな記述をすればいいのか教えてくれるとうれしいです! 今の設定はこうなっています。 $ more ~/.bashrc # .bashrc # User specific aliases and functions # Japanese environment setting. if [ $TERM = "kterm" ] || [ $TERM = "kon" ]; then LANG="ja_JP.ujis" else LANG="C" fi export LANG alias ls='ls -F --color=yes' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi ↑ここまでです。 シェルはあんまり勉強してないので、人に教わったlsのalias行を 追加したぐらいで、構文の意味はぜんぜん分かりません。 #多分jmanpath=hogehogeとかやるんでしょうね。 日本語のマニュアルが使えれば今までの苦労も少しは....(^_^)V |
|
すいません、今度は名前の書き忘れだ〜 下の書込みは私です。 m(_ _)m |
|
すいませんも一つ質問です。 /var/log/messagesに、 sun last message repeated 3 times というメッセージが5分置きくらいに出力されるんですが、 これって何か分かります? #質問2でした。(^^ゞ |
|
>>で、そういう場合はnphスクリプトを試してみてはいかがでしょうか。 > やってみました。おかげで思うとおりの結果が得られました。 おお、そうですか。僕はnphは一度も試したことはなかったりするんですが…(^^; > sun last message repeated 3 times 普通に英語を読めば「前回と同じメッセージが3回出力された」ということで、 /var/logl/messagesのその前の行を見ればいいと思います。 # と、ずっと思ってたんだけど違うかな? |
|
わたくしUNIX初心者も初心者というかwin95ユーザでありまして プロバにtelnetで繋いでUNIX気分を味わっているもんでございます。 まったくwin95とは違いまして「こんぴゅーたをさわっている」って いう気分を満喫している(だけ)ところでございます。 コマンドがいろいろ載っていて、たのしゅうございます。 これからも続けてくださいましね。たよりにしております。であ。 |
|
ネコミでの書き込みがなんかおかしい とほほ ブラウザかえようかな 68user(X68K?)さんはふだん何つかってます? >M.Masudaさん .profileか.bashrcに export MANPATH=/hoge/man:$MANPATH export JLESSCHARSET=japanese hogeはman-pages-ja-0.4.tar.gz をinstallした所です おそらくman less groffは日本語化されてるんじゃないかなー man manで日本語表示出来なければ管理者に頼むしかなさそう(笑) |
|
> コマンドがいろいろ載っていて、たのしゅうございます。 どもども。「ここがわかりにくい」などのご意見がありましたら ぜひ教えてください。 > ブラウザかえようかな > 68user(X68K?)さんはふだん何つかってます? 学校ではNN3.04、家ではNC4.04です。まぁ一長一短ですねぇ。 早くMozilla5でないかな…。 |
|
>だれも管理してなかったりして。 ありゃ・・そうだったんですか となるとログのメッセージは・・・ |
|
> となるとログのメッセージは・・・ 全ユーザがrootになることができて、みんなでよってたかって管理してるとか(^^; |
|
>全ユーザがrootになることができて、みんなでよってたかって管理してるとか(^^; むむむ・・何かトラブッてそうですね(^^;;; |
|
どうもです。68userさん、ABCDEFGさん。 あれっ遂にチャットになってしまったか?(^^ゞ ABCDEFGさんどうもです。 DOSの頃はコンソールと言うか、CUIにはなれずついFDとかのツール類を 使っていましたが、なんとUNIXのしぇるの使いやすい事! おまけに、DOSの頃はコマンド類の使い勝手が悪くツール同士も相性を 考えて使わないと...。 >>M.Masudaさん > .profileか.bashrcに > export MANPATH=/hoge/man:$MANPATH > export JLESSCHARSET=japanese > hogeはman-pages-ja-0.4.tar.gz をinstallした所です > おそらくman less groffは日本語化されてるんじゃないかなー > man manで日本語表示出来なければ管理者に頼むしかなさそう(笑) 試しました。 あんまり時間が無く全部はやってみてないですが、man manだけは ちゃんと日本語マニュアルが表示されました。 68userさん、ABCDEFGさんどうもありがとうございました。 #setコマンドでは、LANG=Cとなっているんだけどいいのかなぁ? >だれも管理してなかったりして。 そうなんです。私が一応rootにはなれるんですが、ここの環境は 前にクラックにあっているサーバーが直ぐ近くに(ネットワーク上) 在るのに、誰もログをチェックしないし、ログインすら月に1度 位なんです。 私は、httpdの再起動をやったりするためにrootになれるんですが、 恐いので一応secureとかmessagesとかを、たまに確認しています。 しかし、私にはUNIXのスキルが無いので何か有っても対処法を知り ません。(; ;) 最大の防御はイーサーのケーブルを抜くくらいだったりして。(^^ゞ #でもこのサーバーDHCP立ってるんだよなぁ。 例の sun last message repeated 3 times ですが、 このメッセージのみが5分おき位に続けて出ています。 >普通に英語を読めば「前回と同じメッセージが3回出力された」ということで、 > /var/logl/messagesのその前の行を見ればいいと思います。 本日は12:28〜20:08まで5分おきにあり、現在は止まっています。 だけど、これ以外はさっき言ったdhcpのログ位です。 もしかしてアタック?でもsecureには特にメッセージも出てないん ですよ。他にはチェックするところがわからなしい...。 ところで、前の話題のFileLockですが、私の入っているメーリングリ ストでこんな例がありました。いかがなもんでしょうかね? $file_lock = 'LOCK'; $file_seq = 'SEQ'; open(LOCK, ">> $file_lock") || die; alarm(60); flock(LOCK, 2) || die; if (open(SEQ, $file_seq)) { $seq = <SEQ> + 1; close(SEQ); } else { $seq = 1; } open(SEQ, "> $file_seq.new") || die; print SEQ $seq; close(SEQ); rename("$file_seq.new", $file_seq) || die; close(LOCK); alarm(0); alarmって使った事無いんだけど、この場合目覚まし時計がなると 制御はどうなるのだろう? サブルーチンとかに飛ばす場合は、シグナルハンドラの罠を仕掛け とくのですか? 前例のように $SIG{HUP}=$SIG{INT}=$SIG{QUIT}=\&finish; とか。 |
|
> そうなんです。私が一応rootにはなれるんですが いいじゃないですか。好き勝手にUNIXの勉強ができるし ;-) その代償として管理してると思えば安いものかと。 > だけど、これ以外はさっき言ったdhcpのログ位です。 ではそのDHCPのメッセージが数回繰り返されたものでしょう。 suでrootになるのを10回連続して繰り返してみてください。 /var/log/messegesには Feb 15 23:28:41 host su: user to root on /dev/ttyp1 という行が10行書かれることはなく、 Feb 15 23:28:41 host su: user to root on /dev/ttyp1 Feb 15 23:28:53 host last message repeated 9 times となるはずです。同じメッセージが短時間のうちに連続して syslog(かな?)に送られた場合は、syslogdが上のように 簡略化したログを残すはずです。 suでrootになるのを10回連続して、次に間違ったパスワードで suしてみると、最後のsuを実行した瞬間に Feb 15 23:28:41 host su: user to root on /dev/ttyp1 Feb 15 23:28:53 host last message repeated 9 times Feb 15 23:28:55 host su: BAD SU user to root on /dev/ttyp1 というログが残ると思います。 ちなみに、リアルタイムでログを監視するにはtail -fが便利です。 > サブルーチンとかに飛ばす場合は、シグナルハンドラの罠を仕掛け > とくのですか? alarmの場合はSIGALRMですね。kill -lを実行するとシグナル一覧が 表示されます。man alarmも参考にしてください。 この例ではいまいちalarmの必要性がないような気がするんですが、 何か理由があるのかなぁ。 |
|
>前にクラックにあっているサーバーが直ぐ近くに 物騒な話ですね。こうなると再インストールしかないです。 近くのサーバーもやられてる可能性が高いような気がします。 とりあえず/etc/inetd.confの不必要なエントリをコメントアウトして killall -HUP inetd あと/etc/hosts.allow、/etc/hosts.denyでtcpwrapper の設定をするのが吉かと telnetの代わりにsshを使ったほうが心臓に良いです。 たしかtera termを拡張したttsshってやつがあったと思いますが #もう対策されてたならすみません |
|
やですね〜。クラックされるのは。 ちょっと前に知り合いのLinuxがクラックされてました。 すぐに気づいて、そのとき作成されたらしいファイルを 消したんですが、数日後また同じようにクラックされて しまい、とうとうサーバをFreeBSDに代えてしまいましたとさ。 クラック自体より、どこの穴をつかれたのかがわからないのが 一番恐いですね。 |
|
どうもです。 いろいろ助言下さってありがとうございます。 >こうなると再インストールしかないです。 もちろん既に、マシンごと新しくなってます。 >クラック自体より、どこの穴をつかれたのかがわからないのが >一番恐いですね。 これが一番恐いのだけど、最近リモートIPもごまかしたり、たまにログでリモ ートのIPがunknownって出る奴が有るのですが、これってどうしてるのでしょ うか? #愚問でしたね。こんな公の場で書けるわけないですね。(^^ゞ >telnetの代わりにsshを使ったほうが心臓に良いです。 >たしかtera termを拡張したttsshってやつがあったと思いますが すいません未対策です。って言うかsshって知りません。(^^ゞ セキュリティー対策の物ですか? messagesの件ありがとうございます、多分LANの中で一台設定不良でネットワ ークを参照できないマシンが在ったので、そいつのDHCPリクエスト失敗が原因 だと思います。 #そういう事にしておこう。(^_^)V ところで、皆さんセキュリティーに関してはどう考えてます? うちのwebサーバーは去年クラックされました。 OSはRedHotの古いバージョン(4.1)で、name,www,smtp,popが実用デーモンで その他いくつかのデーモンが上がっていましたが、前例と同じように管理者が 居なくて、ほったらかし状態。 ログローテーションもしなかったので、97年5月からのmailログが98Mbも一つ のファイルで存在してました。 #その当時Apache1.1がインストールされていたので各種デーモン類のバージ #ョンもかなり古いものだと思います。 ちなみに前のHDの内容は保存してありますが、今の管理者には穴が見つけられ ず、いつか私が解析してやろうと気持ちだけはあります。(^^ゞ #時間がないもんで...と言っておこう。 ちなみにそのサーバーをクラックしたクラチャンが /etc/hosts.allowに開けていったホストIPです。 207.204.247.250 166.93.24.146 209.99.175.1 199.183.24.253 193.164.171.29 199.183.24.253って何処だか分かります? なんとwww.redhat,comですよ! #なさけねーな、RedHatも。(; ;) どうもクラチャンは、RedHatパッケージ関係ではかなりのスキルを持っていた と思っています。 何処かのアンダーグラウンド系掲示板にでも掲載されているらしく、今でもそ のサーバーは毎日のようにアタックされています。 もちろん管理者がラッパーやルータ等で2重3重の制限しているので、接続は されていませんが、前の穴が解からないだけに少し不安です。 webアタックの代表のphf系も独自のCGIでアタックログを取っていますが、こ れって変なんです。 具体的には、1〜2秒間に3回連続でアクセスして行きますが、アクセスホスト が毎回違うんです。 なんとなく何処かのパッケージに入っている、スクリプトか何かを実行すると その中で、ここを攻撃(試験)して、多分その結果をどこかに返すのでしょうね アクセスのタイミングを見るとそんな感じです。 http://ash.or.jp/~joe/hack/index.htm このページで起きたイスラエルからの侵入事件を元に、セキュリティー関係の レポートが載ってます。 ところで/etc/passwdのパーミッションて、root/700にしたら何か問題はあ りますか? |
|
> #愚問でしたね。こんな公の場で書けるわけないですね。(^^ゞ いや、僕は方法を知らないので…(笑) > セキュリティー対策の物ですか? telnetはタイプした文字がそのままネットワークを流れますが、 sshは暗号化したデータを送るので、パケットを覗かれても大丈夫なのです。 つまりssh=secureなtelnetです。ちなみにrcpのsecure版なども 一緒についてきます(scp)。 もちろんsshクライアント/sshサーバが必要です。FreeBSDなら portsで一発インストールできましたが、Linuxにもパッケージが 用意されてるんじゃないでしょうか。 sshをインストールできたら、telnetポートは閉じておきましょう。 > ところで/etc/passwdのパーミッションて、root/700にしたら何か問題は > ありますか? ls、finger、whoなどでユーザ名が表示されないことはありませんか? # OSにもよるでしょうが、/etc/pwd.dbなどが読めればOKかもしれません。 しかし、一般的には/etc/passwdを700にするのは変です。 パスワードエントリを隠したいということなら、shadow passwordを 導入しましょう。Linuxなら/etc/shadowだったかな? # Linuxはデフォルトでshadow化されていないのが不思議。 # ディストリビューションにもよるのかな? |
|
みなさんの話を聞いてるとびびってきました(苦笑) クラッカーに目つけられると安眠できなさそう インストールしたらすぐtripwireいれたほうがいいのかな Red Hatって見つかった穴を公開するらしいですよ たぶん新しいの買えや(笑)ということなんでしょうけど >Linuxはデフォルトでshadow化されていないのが不思議。 そう言えばIRIXは最近まで・・・ >IPがunknownって出る奴が有るのですが これ何なんでしょう 知りたい(爆) >管理者が居なくて、ほったらかし状態。 仕事やりながら管理するってきびしいと思いますよ |
|
こん**は。 >>管理者が居なくて、ほったらかし状態。 > 仕事やりながら管理するってきびしいと思いますよ 本来私の管轄では無いので最近本末転倒してますが、他に管理している 人間がいないので、勉強がてらにいろいろな情報を物色しています。 #アー目が痛い! >>IPがunknownって出る奴が有るのですが > これ何なんでしょう 知りたい(爆) ねらわれたサーバーのsecereに、 Feb 8 04:15:36 ns in.fingerd[2730]: refused connect from unknown こんな風に出ます。 ここ1ヶ月のfingerだけで66回もです。 #最近telnetのアタックは減りましたがいまだにphfアタックは...。 セキュリティー関係と、通信パケットについて詳しく解説指定ページが ありましたので紹介させていただきます。 http://www.3ware.co.jp/security/index.html ここで詳しく説明されてます。常時接続の方の参考までに。 このサイトにはLinuxについても詳しく書いてあり、前から疑問だった 起動時の設定ファイル(Winで言うところのAUTOEXEC.BATかな)も分かった し、ずいぶん勉強になりました。 >Linuxはデフォルトでshadow化されていないのが不思議。 近いうちに実験用サーバーに実装する予定です。 #できるかな〜、その時はまた教えて下さい。(^^ゞ >sshは暗号化したデータを送るので、パケットを覗かれても大丈夫なのです。 telnetの23はルーターで塞いであるし、LAN内でのアクセスなんであまり必 要性が無いですが、これも時間が出来たら試験的に導入してみたいですね。 |
|
>Feb 8 04:15:36 ns in.fingerd[2730]: refused connect from unknown 見たことないです。 #といってもアタック(スキャン)自体あまりないから知らないだけ パケット覗いてみては? >telnetの23はルーターで塞いであるし ・・・内部犯行・・なんて無いですよね(笑) |
|
どうもです。ABCDEFGさん。 >・・・内部犯行・・なんて無いですよね(笑) ははは、それは無いです。 mad.leenux.com ってとこと ugly.bastard.co.uk の2ヶ所から 進入してます。 そのクラチャンですが、ちょいと弄られた前のディスクの中を覗いて見たら、 隠しディレクトリに、いくつかのクラックソフトをお土産においっててくれ たみたい。(^^ゞ #俺ホントはこんなことやってる暇無いんだけどなぁ... #まいっか! 入られてた時、マシンに負荷が掛ってるので、おかしいなって皆で言って、何 度もリブートかけていたんです。 それでも重いので変だと思い、最近作られたファイルを探したところ発見し ました。 どうもそのマシンで、あちこちのネームサーバーを探してたみたいで、その 履歴が残っていました。 皆さんも気を付けて下さい、自分のマシンだけならフォーマットするとか出 来ますけど、踏み台されちゃ悔しいですからね。(^^ゞ でわでわ。 |
|
どうもごぶさたしてます>お師さん で、過去ログその後ですが…すみません、諦めました。 理由その壱 メインでNETに繋がってるのがMacなわけなんですが、 こいつのtelnetアプリケーションがAppleScript等に対応しない物ばかりで telnetでの自動化は不可能という結論に達しました。 理由その弐 ブラウザからの起動も考えたんですが、CPUをG3化してあるせいなのか、 2台繋いでいるHDDの片方を認識しないまま起動することが多く、 起動するHDDが特定できない、もしくは手動で再起動しないとOSが起動しないことすら ある状態です。 スクリプト自身はきちんとサーバー上で動いているんですが、 どうにも自動化のメドが立ちません。 いろいろご指導いただいた上になんなんですが、ここで正式に 過去ログ作成を断念したことをお伝えする次第です。 |
|
はじめまして。みなさん、UNIX超初心者の者ですがよろしくおねがいします。 実は今年からUNIXを習っているのですが、全然分かりません。特にShellの プロセスのあたりというか、スタンダードインプット、アウトプット、 エラーとの兼ね合いとか。。???? だれか、教えて頂けるか、良いウエブや本を紹介して頂けませんか? よろしくお願いします。 メールでもOKです。non100@excite.co.jpです。 |
|
> ここで正式に過去ログ作成を断念したことをお伝えする次第です。 それは残念。過去ログうんぬんより、いままでプログラムを書いたのに 結局うまくいかないとわかったときは がっくりきますね。 > Shellのプロセスのあたりというか、スタンダードインプット、アウトプット、 > エラーとの兼ね合いとか。。???? え〜、もうちょっと範囲をしぼっていただけると答えられるかもしれませんが、 範囲が曖昧なので…(さすがにそのあたりを全部説明するのはつらいです)。 「どこがわからないのか自分でもわからない」という状態なら、 The UNIX Super Text(上・下) 技術評論社 上下巻それぞれ3500円くらい がいいんじゃないでしょうか。 古いし(6年くらい前かな)、値段が高い、と評する人もいますが、 僕はお勧めします。ただし買うのは上巻だけでいいと思います。 |
|
はじめまして。 初歩的な質問なのですが、UNIXのコマンドで 現在のディレクトリ以下のファイル(下位ディレクトリ内のファイル含む)の中から ある特定の拡張子だけ、検索するというコマンドってありますか? ぜひご教授ください。 |
|
カレントディレクトリ以下から、拡張子が txtというファイルを 探したいなら、 % find . -name \*.txt カレントでなく、/hoge以下を探したいなら、 % find /hoge -name \*.txt などがあります。locateが使えるなら、 % locate .txt| grep .txt\$ | grep `pwd` ってのもアリかも。 # http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#find # http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#locate |
|
68userさんありがとうございました。 早速試してみます。 これからもなにかありましたらよろしくお願いします。 ではでは! |
|
はじめまして。 今回久しぶりにTELNETにログインしたら、 FreeBSD 2.2.7-RELEASE (BASE) #2: Wed Dec 23 11:45:56 JST 1998 というメッセージがでてきました。 超初心者のうえ、久しぶりなので、何がなんだか分かりません これは、そのままにしておいても大丈夫なものなんでしょうか? |
|
それは、「このOSはFreeBSDだよ」というただのメッセージです。 ついでに書いておくと、FreeBSD2.2.7Rで、カーネルコンフィグ ファイルはBASEで、これまで二回カーネルの再構築をして、 最後にカーネルを作り直したのは Dec 23 11:45:56 JST 1999 っつーことです。 さらに蛇足ですが、このメッセージは /etc/motd に 書かれており(ブート時に毎回作り直されるのかな)、 login(1)が /etc/motdを表示します。 # see login(1),motd(5) |
|
そうなんですか。 安心しました。どうもありがとうございました。 |
|
ご無沙汰です(^^; いま、BSD版 touch 互換?のWin32版 touch をDelphiで 作ってるんですが、BSD版の仕様がよくわからないので、 教えて頂けますでしょうか? BSD版 touchは、どのような場合に標準入力からファイル名を 読み込むのかがよく分からないのです(BSDじゃないけど、 ウチのHPのサーバーでも、CGIからじゃ確認できないのです…)。 % echo file | touch - とすれば、file が現在日時に設定されますよね…? それ以外に、引数にファイルを指定しなかった場合も 標準入力を読むのでしょうか? また、たとえば、 % touch とした場合に、キー入力待ち状態になるのか、それとも % echo file | touch などとした場合にのみ標準入力を読むのでしょうか? >最後にカーネルを作り直したのは Dec 23 11:45:56 JST 1999 >っつーことです。 なんか、はじめて訪問して来た客に、家の事情を何から何まで 事細かにおしゃべりするおばーちゃんみたいな…(笑い) |
|
> % echo file | touch - > とすれば、file が現在日時に設定されますよね…? いえ、そうはなりません。FreeBSDのtouchは、STDINを 全く読んでないようです。 % touch usage: touch [-acfm] [-r file] [-t time] file ... % touch - % ls -l - -rw-r--r-- 1 user user 0 Mar 11 07:40 - となります。 ちなみに最新のFreeBSDのtouchのソースは http://www.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/touch/touch.c?rev=1.8 にあります。大元はここ。 http://www.freebsd.org/cgi/cvsweb.cgi > なんか、はじめて訪問して来た客に、家の事情を何から何まで > 事細かにおしゃべりするおばーちゃんみたいな…(笑い) いや〜、fjをROMってると、こういうやりとりを見て知識を 得るってことが多いので、暇なときで疲れてなければ 「質問者が求めること+α」を書くようにしてます。 # fjの強者ほど知識はないし、ここを見てる人も少ないので # 自己満足かもしれませんが。 |
|
追加。SolarisでもFreeBSDと同じ挙動でした。 |
|
わー! ごめんなさい、書き方が悪かったです(^^; おばーちゃんの件は、68userさんのことではなく、 FreeBSDのメッセージのことなんです。 telnetで接続したら、いきなり、「うちはね、これまで2回改築してて、 最後に改築したのは〜で、基礎工事んときには…」みたいな メッセージが出るんで、これがオシャベリなおばーちゃんみたいだ っていう意味でした(^^; ややこしいコト書いてすいませんでしたm(_o_)m いま、Cソースを頂いてきたので、本編の方は後程… |
|
こんにちは。はじめまして。いわもとと申します。 UNIX超初心者の私ですが今回crontabコマンドの 使い方について調べるように仰せつかりました。 それでこちらのHPを参考にさせていただいたのですが うまくいきませんでした。とりあえずcrontabファイル (だと思う ユーザ名がファイル名になっていて 中身はHPに書いてあったのと同じようになっていた) は出来たんですが、そこから先がわからないんです。 どうやっても動いてくれません。 これって私が相当バカなんでしょうか?誰かご存知の方 教えて頂けると幸いです。 |
|
こん**は、いわもとさん。 私も初心者のなので申し訳ないのですが、cronはデーモン(常駐) プロセスなので設定ファイルを修正したら、変更した設定を再読 込させなければいけないですね。 osが解からないですが、私の環境(Linux)では/etc/rc.d/init.dに 再起動用のスクリプトがありますので、/etc/rc.d/init.d/cron.init に start、stopとすれば良いのではないでしょうか。 #ぜんぜんはずしてたらごめんなさい。 ところで何処かのページ上のcron設定解説ページを見て 操作したのでしたらそのURLを教えてもらえないでしょうか。 #68Userさん正解をお願いします。(^^ゞ |
|
hogeというファイルに、 * * * * * /bin/ls と書いて、crontab hogeとすればcronにデータが登録されます。 この時点で、crontab -l とすると * * * * * /bin/ls と表示されればOK。 で、上の記述だと、1分ごとにlsが実行され、その結果が メールで送られてきます。動作を確認したら、必ず crontab -rで解除することをお忘れなく。その場合も うまく解除できたかどうか crontab -lで確認してください。 > cronはデーモン(常駐)プロセスなので設定ファイルを修正したら、 > 変更した設定を再読込させなければいけないですね。 一般的にcronで実行されるのは、管理用のcron(/etc/crontabとか)と、 一般ユーザ用のcron(各ユーザが勝手に登録するもの)がありますが、 FreeBSDの場合は/etc/crontabを書き換えると自動的に反映されます (1分ごとに書き換えられたかどうかチェックされてる)。 とりあえずOS名と、何をしたらどういうふうに うまくいかないのかを 書くのが解決への早道かと。 > おばーちゃんの件は、68userさんのことではなく、 > FreeBSDのメッセージのことなんです。 あ、なるほろ。了解です。 |
|
touch の件、ありがとうございました。 FreeBSDのソースも、助かります。 これは、今後も大いに役に立ちそうです(多謝) >いえ、そうはなりません。FreeBSDのtouchは、STDINを >全く読んでないようです。 これは全く意外でした(^^; ソースも見ましたが、全く読む気はないみたいですね。 うーん…なんでだろう? ひょっとして、touch *.txt で該当ファイルがなかった場合に touch に argv[1] が渡らないのかな?…と思ったのですが、 ちゃんと *.txt が渡ってました…(^^; なぜ、標準入力にこだわるかというと、MS-DOSの場合、 ファイル指定のメタキャラクタに * と ? しか使えないので、 csh風の glob match をサポートした ls コマンドを利用して ls *.{c,h} | touch みたいな使い方をしようと思っていたのです。 とりあえずは、touch - で、ちゃんとファイル - を作成する ようにしました(笑い) でも、ファイルを指定しなかった場合は… もう少し考えてみます(^o^;ゞ |
|
> ひょっとして、touch *.txt で該当ファイルがなかった場合に > touch に argv[1] が渡らないのかな?…と思ったのですが、 > ちゃんと *.txt が渡ってました…(^^; えっと、これはUNIXの話ですか? UNIXの場合はgrobの展開はシェルが 担当します。*.txtがない場合、 % touch *.txt (touchに限らず全てのコマンド) touch: No match. となりますが、これはシェルがtouchを実行する前に はじいてます。csh/tcshの場合、シェル変数nonomatchを 設定すると、マッチするファイルがなくてもエラーにならなくなり、 touch に *.txtという文字列がそのまま渡されます。 普通、コマンドラインでnonomatchを設定することはまずないですが。 …と、mmさんなら知ってそうなことを書いてしまった。 > MS-DOSの場合、ファイル指定のメタキャラクタに * と ? しか使えないので DOSを離れて久しいのですが(使ってたのはHuman68kですけど)、 DOSってgrobの展開は各プログラムの担当ですよね。そういう ときに便利な関数ってライブラリで用意されてるんでしたっけ。 # char **files; # files = filelist("a:\dir\a*.txt"); # とか。 さて、FF8をやらねば。 |
|
そうそう、GNUのtouchを参考にするのもいいかも。 http://www.gnu.org/software/software.html TheFileutilsare:`chgrp',`chmod',`chown',`cp',`dd',`df',`dir',`dircolors',`du', `install',`ln',`ls',`mkdir',`mkfifo',`mknod',`mv',`rm',`rmdir',`sync',`touch',and`vdir'. ちょっと見てみた感じでは、こっちもstdinは見てなさげです。 > これは全く意外でした(^^; うーん、でもtouchというコマンドの性質から言って、 stdinを読まないのは自然ではないかと思います。 しかしこうして見ると、GNUってすごくたくさんのソフトを 保守してますねぇ。CVSもGNUだったのか。 |
|
はじめまして。Asanoと申します。 私のUNIX歴は1年ぐらいの初心者です。 UNIX Userの雑誌のバックナンバー(1995年12月号)を 探しています。お持ちの方で、譲ってもいいよいう人が おりましたら、下記アドレスまでご連絡お願いします。 付録のCD−ROMは無くてもかまいません。 よろしくお願い致します。 E-Mail asanonet@po.anoa.or.jp |
|
こんにちは。いわもとです。 68Userさん、M.Masudaさん、ありがとうございました。 おかげさまでうまく動かすことが出来ました。 UNIX歴わずか数日の私には本当にありがたい限りです。 今後ともよろしくお願いします。 |
|
>えっと、これはUNIXの話ですか? あっ、すいません、UNIXの話です。 MS-DOSでは、シェルが展開するようなことはなく、 常にそのままコマンドに引数として渡ります。 >…と、mmさんなら知ってそうなことを書いてしまった。 いえいえ、 >これはシェルがtouchを実行する前にはじいてます。 というのは、全く知りませんでした(^^; 昨日、 for ( i = 0; i < argc; i++ ) printf("%d: %s<BR>\n",i,argv[i]); というようなソースをウチのサーバーでccして test.cgi として、perl CGI内で open(FH,"./test.cgi *.txt 2>&1 |"); という感じで実行してみたら(*.txt は存在しない)、 0: ./test.cgi<BR> 1: *.txt<BR> となったので、以前に「シェルは、マッチしなかった場合に そのままコマンドに渡す」という話を聞いたことがあるのを 思い出して、あんな風に書いたのです。 (なお、ウチのHPのシェルは、sh のようです(^^;) ちなみに、この test.cgi をCGIとして実行すると、 0: wrapper_daigaku なんてのが返って来ました。daigakuってなんだぁ…? >DOSってgrobの展開は各プログラムの担当ですよね。 そうですが、MS-DOS流の * や ? は、そのままファイル検索 システムコール(FindFirst)に渡すことで、マッチする ファイル名を返してくれます(2番目以降はFindNextで順に 呼び出します)。 >そういうときに便利な関数ってライブラリで用意されてるんでしたっけ。 正式に用意されているって話は聞いたことありませんです。 フリーのライブラリを探せばあったのかな…、少なくとも 定番というのもなかったと思います。 ただ、私が昔パソコン通信(PC-VAN)で覗いてたSIG(フォーラム) では、みんな、ツールのソースをPDSとして公開してたので、 誰かがDOS版findを作ったら、この中のcsh風glob matchの Cソースを利用して、他の誰かが別のツールを作ったりとかは してました。 >files = filelist("a:\dir\a*.txt"); これは、上のFindFirstとFindNextを使って簡単に実現できるので、 ライブラリとしてあるかどうかは知りません。 でも、"a:\{dir,f*}\[ab]*.txt"を解釈するようなものは、 何かのソースから取ってきて自由に利用可能でした。 もっとも、MS-DOSの世界では、フリーウエアのソースは 普通未公開だし、NiftyではPDS自体が毛嫌いされてた みたいだから、こういうことは一般的ではなかったかも知れません。 んな訳で、Win32版でもそういうライブラリがあるのかどうか 知らないし、ましてDelphiのObjectPascalでそういうものが ある雰囲気もあまりしないので(regexpはあるみたいです)、 今回はgetoptから全部手作りでした(^^; >そうそう、GNUのtouchを参考にするのもいいかも。 覗いてみます。 FreeBSDのサイトもそうですが、ネット上で古いバージョンも 含めて全部公開されているんですね。やっぱ、こういう風に ソースに自由にアクセスできるUNIX環境は羨ましいです。 >うーん、でもtouchというコマンドの性質から言って、 >stdinを読まないのは自然ではないかと思います。 何か勘違いしてるのかなぁ(^^; 例えば、ファイル名を引数にとって、そのファイルを処理する コマンドcommand がある場合に、ls ... | command とか find ... | command で引数ファイルを渡すのは普通では ないのでしょうか? 確かに、ls * | cat だと、ファイル名が素通りするだけですね… |
|
>FreeBSDの場合は/etc/crontabを書き換えると自動的に反映されます >(1分ごとに書き換えられたかどうかチェックされてる)。 http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#crontab ここに書いてありましたね。(^^ゞ すいませんでした。 #確認せずに発言は止めましょうの見本みたいでしたm(_ _)m ところで、あるアカウントに来たメールをきっかけにスクリプト やCGIを実行させるってのはどうすれば実現できるのでしょう? forword辺りに仕掛けをするんでしょうか? #download.cgiの件は解決しましたでしょうか? |
|
> 以前に「シェルは、マッチしなかった場合に > そのままコマンドに渡す」という話を聞いたことがあるのを > 思い出して、あんな風に書いたのです。 おろ、確かにそうなりますね。以下は全て推測ですが、 shでもcshでもコマンドラインで % ls *nonexistent ls: No match. と表示するのはシェルの役目で、このときlsは実行されていないはずです。 しかしperlから、 open(IN,"ls *nonexistent 2>&1 |"); print <IN>; とすると、「No match」ではなく、 ls: *nonexistent: No such file or directory と表示されます。これはおそらくperlが sh -c 'ls *nonexistent 2>&1' を実行しているからです。shの仕様としては、-cに続いてコマンドを指定すると、 マッチしなかった場合でも、コマンドにワイルドカードをそのまま渡している ようです。 >>files = filelist("a:\dir\a*.txt"); > これは、上のFindFirstとFindNextを使って簡単に実現できるので、 調べてみたら、Human68kにもfilesとnfilesというライブラリがありました (機能は同じ)。そういえば昔ファイラーを作ったとき使った記憶があるなぁ… > ls ... | command とか find ... | command で引数ファイルを渡すのは > 普通ではないのでしょうか? ファイルの内容を標準入力から受けるのはよくありますが、 ファイル名を標準入力から受け取るのは普通ではないと思います。 なぜなら、 % find . -name \*hoge -exec touch {} \; で簡単に実現できるからです(他にはxargsを使うとか)。 > ところで、あるアカウントに来たメールをきっかけにスクリプト > やCGIを実行させるってのはどうすれば実現できるのでしょう? > forword辺りに仕掛けをするんでしょうか? procmailを使うことが多いようですね。 # http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#procmail これを見た人が理解できるかどうか知りたいので、詳しくは書きません。 これを読んでわからなかったら、どの辺がわかりにくいか教えてくださいね。 > #download.cgiの件は解決しましたでしょうか? ただ単にContent-Dispositionというものが使えるものかどうか 知りたかったので、特に困っていたわけではないのです(^^; > UNIX Userの雑誌のバックナンバー(1995年12月号)を > 探しています。 ありますけど、お譲りするのはちょっと…(他人のなんで)。 これこれの特集のこの点を知りたいということでしたら、簡単で いいなら抜粋してここに書いてもいいですが。 |
|
ありがとう68Userさん。\(^^)/ >procmailを使うことが多いようですね。 ># http://X68000.startshop.co.jp/~68user/unix/prgmemo.html#procmail このへんはカキコした後に見て、この辺の解説でできるかなぁと 思っていた所です。 ちょっと試してみましたが、私のしたいことはprocmailを使わなく ても .forwordに |exec command で出来そうです。 具体的には、あるアカウントにメールを出すと、現在のサーバー 状況を出力させる様な事をさせたかったのです。 .forwordだけで、procmailを使わずにそのままスクリプトが実行で きたのでその方向で試してみたいと思います。 その手順では、何か不具合が予想されますか? >これを見た人が理解できるかどうか知りたいので、詳しくは書きません。 私は、スクリプトで処理しようと思っていたので、procmailの解説 をよく見ていませんでした。(^^; 良く読めば解りますヨ。 環境のない人には全然解らないだろうけど、解説内容を自分で試す 事が出来れば、動作が解るでしょう。 一つ気づいたのですが、超大作のUNIX解説ですが一部だけを印刷し ようとすると、カット&ペーストしなければならないので、コマン ド別のページが在るといいかも... #贅沢言うなって....すいませんm(_ _)m あとメタキャラの解説なんて在るとうれしいかも ついでにもう一つ。 正規表現はperlから勉強した(進行形)のですが、シェルとはどのく らいの違いがあるのでしょうか? |
|
>と表示するのはシェルの役目で、このときlsは実行されていないはずです。 ふむふむ、勉強になりますですm(_o_)m >shの仕様としては、-cに続いてコマンドを指定すると、マッチしなかった >場合でも、コマンドにワイルドカードをそのまま渡しているようです。 なるほどー、生でunixに触れないので、このヘンの微妙なところが よく分からないのです(^^; >ファイルの内容を標準入力から受けるのはよくありますが、 >ファイル名を標準入力から受け取るのは普通ではないと思います。 そっかぁ…、filterという概念からは逸脱してるかも知れないですね。 確かに、findも-execで済みますし、ls(csh likeな指定)を使いたい ってのはMS-DOSでの事情でしょうし… MS-DOS版独自のオプション-S を追加して、その場合だけ標準入力を読む ことにします。 ありがとうございましたm(_o_)m ところで、Human68k って、モトローラのチップで動くOSですよね。 X68000でしたっけ? |
|
> 正規表現は(snip!)シェルとはどのくらいの違いがあるのでしょうか? シェルの ? や * (これらをglobとかワイルドカードと言います)は 正規表現とは大きく違います。が、機能は限られてるので、覚えるのは簡単です。 ワイルドカードの ? は正規表現の . に相当 (任意の一文字) ワイルドカードの * は正規表現の .* に相当 (任意の文字列) ワイルドカードの [ ] は正規表現の [ ] に相当 (任意の文字列) シェルによって少し違いはありますが(例えば csh では、[^a] は「a以外の1文字」 という意味を持たない。shは [!a] は [^a] と同じ意味)、基本的にこれだけです。 ただし、ワイルドカードはファイル/ディレクトリ名を扱うためのものなので、 * は、先頭が . で始まるファイルにはマッチしない (例えば ls * は、.cshrc などのドットから始まるファイルにはマッチしない) ? や * は、パスの区切りである / にはマッチしない ということになってます。 あと、~ や ~username をホームディレクトリへの置換するのも 一応ワイルドカードの機能らしいです。他には {} があるけど 省略(これはglobというより、ただの文字列処理機能かも)。 > その手順では、何か不具合が予想されますか? .forwardに書いただけではログ作成や排他処理をやってくれないです。 ですから、ログや排他処理が不必要だったり、そこらへんの処理を スクリプト側で行っているなら大丈夫じゃないでしょうか。 > コマンド別のページが在るといいかも... http://X68000.startshop.co.jp/~68user/unix/ の ソースを見てみると…検索用FORMが…。 設置しようと思ってるんですが、めんどくさくて進んでません(^^; > X68000でしたっけ? X680x0上で動くMS-DOSクローンなOSです。ハドソン謹製(笑) |
|
>X680x0上で動くMS-DOSクローンなOSです。ハドソン謹製(笑) コンベンショナルメモリ(640KB)の制限がないんで、 TSRが常駐し放題って噂は聞いてました(^^; しかし、ハドソン製ですか…シャープじゃないんだぁ(驚) >シェルの ? や * (これらをglobとかワイルドカードと言います)は >正規表現とは大きく違います。 シェルのglobも、広い意味では、正規表現と言っていいんじゃないで しょうか。 ドラゴンブックでも、正規表現によるパターン記述の例として、Lexや AWKと共に、シェルのファイル指定を挙げています。 ただ、一般的には、sed, grep, awk, perl等の正規表現とglobは 区別されるようですんで、表現だけの問題ではありますが… |
|
セガのシェンムーBBSで、ここを紹介しました。 過去ログが充実しているので、多くの人に知ってもらいたいと 思ったからです。勝手にすみません。以前も勝手に紹介したような。 |
|
UNIX User (1995年12月号)の 特集:UNIXはソースが決め手です。 PART 1:GNUツールで最新のデバッグ環境を整えよう●向川信一 PART 2:GDBを活用してデバッグを効率的に●向川信一 の内容を知りたくて、パックナンバーを探していました。 Solaris2.6のマシンですが、デバッグ環境構築のノウハウが なく、どこから手をつけていいのやら、わからない状況に あります。簡単な抜粋を書いていただけるだけでも、 助かります。お手数かと思いますが、お願いします。 |
|
シェルってあまり(globって言うんですか)ワイルドカードの種類が なかったんですね。 やっぱり複雑な事をさせようと思うと、Perlや他の言語で記述する んですね。 例えば日付が変わったら、cronでwebのアクセスログから自分のペー ジヘのアクセスを切り出して、その中の特定ページヘのアクセスの件 数をカウントして結果をメールで送る。 なんて複雑な物は、シェルだけでなく何らかのツールや他の言語を使 ったほうが簡単ってことですね。 #実際にシェルスクリプトでやろうとしたがうまく行かず...う〜ん。 >.forwardに書いただけではログ作成や排他処理をやってくれないです。 ログ作成ってのは説明でのリファイルの事ですか? それと補足質問?ですが、 ^hogeは先頭がhogeで始まる。 hoge$行末がhogeで終わる。 でいいんしょうか? もしそうならPerlの正規表現と同じですね。 #上記が正しいとするとprocmail解説文の hoge$は head_string_hoge #でも hoge でもマッチしませんか??? #ぜんぜんはずしてるかなぁ(汗) いろいろ解かってくると、何でも疑問になってきます。(ワクワク) 実験すればいいのでしょうが、他の方のためにも解説してもらえれば うれしいなっと。(^_^)V #そんなの解からないのはお前だけなんて言わないで〜(汗) >> コマンド別のページが在るといいかも... > http://X68000.startshop.co.jp/~68user/unix/ の 最近namazuっていう検索エンジンの名前をあちらこちらで聞きます。 これを使ってみたらどうでしょうか。 #最近本業よりシェルいぢってる方が面白くなっている自分が恐い... |
|
> ログ作成ってのは説明でのリファイルの事ですか? いえ、ただのログです。例えばこんなの。 From owner-xxx@xxx Fri Mar 12 01:56:59 1999 Subject: [xxx 1251] xxx 350 =?ISO-2022-JP?B?GyRCJFgkTkRJMkMbKEI=?= Folder: /home/xxx/script/deliv 2321 From all-request Mon Mar 15 23:18:17 1999 Subject: [xxx 377] xxx will be rebooted. Folder: /usr/sbin/sendmail -oi j5306050@cs.gunma-u.ac.jp 1520 From all-request Mon Mar 15 23:38:23 1999 Subject: [xxx 378] Re: xxx will be rebooted. Folder: /usr/sbin/sendmail -oi j5306050@cs.gunma-u.ac.jp 1691 > ^hogeは先頭がhogeで始まる。 hoge$行末がhogeで終わる。でいいんしょうか? あってます。 > procmail解説文の hoge$は head_string_hoge も hoge でもマッチしませんか? * ^Subject: hoge$ は、ヘッダに「(行頭)Subject: hoge(行末)」という行があれば commandに渡されるわけです。ヘッダ名(この場合はSubject)の 前に ^ がありますから。 # 本当は * ^Subject: *hoge$ にしなきゃいけないんだけど > 最近namazuっていう検索エンジンの名前をあちらこちらで聞きます。 namazuを使うなら、1つ1つのコマンドを別ファイルにしないと いけない(というか、そうしないと使う意味がない)んですよね〜。んが、 % quota Filesystem usage quota limit timeleft files quota limit timeleft /raid 14794 15000 20000 2529 3000 4000 ファイル数の余裕が…ない…(^^; > 例えば日付が変わったら、cronでwebのアクセスログから自分のペー > ジヘのアクセスを切り出して、その中の特定ページヘのアクセスの件 > 数をカウントして結果をメールで送る。 これくらいならシェルスクリプトでもできますよ。 日付が変わったら、という部分はcronにまかせるとして、 #!/bin/csh -f set log="/var/log/httpd-access.log"; # ログファイル名 set yeasterday_log="/tmp/yesterday_log.$$"; # テンポラリファイル grep `date -v-1d "+%d/%b/%Y"` $log > $yesterday_log # 前日の日付でgrep set top_count = `grep -E 'GET /~$USER/(index.html)? ' $yesterday_log | wc -l`; set unix_count = `grep -E 'GET /~$USER/unix/(index-unix.html)? ' $yesterday_log | wc -l`; echo "top page $top_count hit." echo "unix page $unix_count hit." rm $yesterday_log とか。stdoutへの出力はcronによってメールで送られてきます。 でもまぁ、さらに機能を付け加えていこうと思っているなら、 perlでやっちゃった方がいいんでしょうけど。 > セガのシェンムーBBSで、ここを紹介しました。 どもども。リンク・URL紹介・引用はご自由にどうぞ。 > コンベンショナルメモリ(640KB)の制限がないんで、 > TSRが常駐し放題って噂は聞いてました(^^; でも12MBの壁があって(アドレスレジスタが24bitだから)、それを 越えるのにはDOSと同じようなことをしてました。まぁ、全盛期には それが問題になるほどメモリを積めませんでしたが。 > シェルのglobも、広い意味では、正規表現と言っていいんじゃないでしょうか。 ん〜どうなんでしょうね。僕は目的の違い(globはファイルにマッチさせるもの) と、文法・機能の違いから、別物として説明するようにしてます。 でも同じものと言った方が初心者にわかりやすいなら、それはそれで いいと思います。 > Solaris2.6のマシンですが、デバッグ環境構築のノウハウがなく、 特集は、gdbのインストールと、gdbの使用法の2本立てですが どちらがお望みですか? すいませんがお返事は *メール*でお願いします。 |
|
>でも12MBの壁があって(アドレスレジスタが24bitだから)、 MS-DOSしか使ってなかった頃の最大実装は8MBだから、 私の場合、壁のうちに入らないなぁ…(^^; >でも同じものと言った方が初心者にわかりやすいなら、それはそれで >いいと思います。 私の経験なんですが、昔、正規表現といえばsedやgrep(その頃はawkも perlも知らなかった)で使うアレのことしかないと思い込んでたことが あって、誤解を招く文脈で「正規表現」という言葉を使って指摘された 覚えがあるんです。 難しい話でよく理解できなかったために、正確には覚えてないんですが、 文脈自由文法や正規文法とかの話に割り込んで、何か発言をしたのだと 思います(^^; だから、これらを区別して説明するのはいいと思うのですが、globも 正規表現の一種又はサブセット?だということも含めておいた方が、 初心者の方にも後々のためにはいいんじゃないかなと思ったのです。 とは言うものの、議論するほどの問題ではないので、この話題は以降 無視して頂いて結構です。 |
|
すいません... >いえ、ただのログです。例えばこんなの。 これなんですが、 >.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の様な指定方法は、 掲示板等では話題としては知っていましたが、具体的な内容まではまだ 未解析でした、すいませんです。 |
|
> よかったやっと見れるようになった。(^^ゞ サーバの定期メンテがあって、落ちてたようです。 そもそもの > ところで、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 に限ったことではないけどね。 |