>>2967 68user様 お返事ありがとうございます. >syslog(3)やlogger(1) を使えば誰でも su と同様にログに記録することはできます これはsuトロイを実行した時にも/var/log/messageに本物のsuの認証失敗のメッセージ を残せる,という事なんですよね.これは,suトロイ内でsyslog()関数などを使って, syslogdにメッセージを渡すという事なのでしょうか? P.S. システムコールで見分ける,ですね. 確かに,suトロイと本物のsuだとやっている事はちがうから 見分けられるかも知れませんね.アドバイスありがとうございます. |
>>2967 68user様 何回も申し訳ありません.kikiです. >exec(2)の実行直前にsuを実行しようとしているかどうか、というチェックをすればよいでしょう。 これは,システムコールのチェックを自動化させて行なえばよい, という事なのでしょうか? 基本的な事で申し訳ありません. |
いつもすいません、質問です。 以下のようなプログラムを Perl 5.8/FreeBSD 2.2.8 release で書きたいです。 カンタンにいうと、入れ子になったタグで囲まれた部分だけを 別ファイルに抜き出し、元ファイルからは削除する、です。 順序を保存して抜く方法と、 保存しないで抜く方法とあると思いますが、 どちらでもかまいません。 (前者の方がいいかなぁ、、) 入力ファイル: out1 <tag a> in1 <tag b> in2 <tag c> in3 </tag> in4 </tag> in5 </tag> out2 <tag d> in6 <tag e> in7 </tag> in8 </tag> out3 <tag f> in9 </tag> out4 出力ファイル例1:(順序を保存して抜く) ファイルA:(タグで囲まれた部分のみを抜いたもの) <tag a> in1 <tag b> in2 <tag c> in3 </tag> in4 </tag> in5 </tag> <tag d> in6 <tag e> in7 </tag> in8 </tag> <tag f> in9 </tag> ファイルB:(ファイルAで抜いた残り) out1 out2 out3 out4 出力ファイル例2:(順序を保存しないで抜く) ファイルA:(タグで囲まれた部分のみを抜いたもの) <tag c> in3 </tag> <tag b> in2 in4 </tag> <tag a> in1 in5 </tag> <tag e> in7 </tag> <tag d> in6 in8 </tag> <tag f> in9 </tag> ファイルB:(ファイルAで抜いた残り) out1 out2 out3 out4 よろしくお願いします。 |
補足です。 この tag というのは全部同じタグです。 ただオープンタグにかかれている a, b, ... という アトリビュートが全部違います。 |
さらに補足。(俺って説明下手だな、、;;; ファイルには <tag> 以外のタグも存在します。 <aaa ???>〜</aaa>、<bbb ???>〜</bbb> などです。 その中で下の処理の対象になるのが <tag> だけということです。 <tag ???>〜</tag> の中に <xxx ???>〜</xxx> がある場合は、 それも抜いて書き出します。 問題の定義もなかなか奥が深い。 |
>>2969 kiki シェルって何をしているか知っていますか? 簡単に言うと、ユーザが 入力した文字列を解析し、execve(2) を実行することです。 シェルのソースをいじっていいのならば、execve(2) を発行している 部分を探して、そこで su を実行しようとしているかどうかのチェックを 行えばよいのでは、という話です。 >>2970 ふくし 入力が XML なら、 http://member.nifty.ne.jp/hippo2000/perltips/xml/dom.htm#XML_DOM_NODE の removeChild で一発なような気がします。 XML でないなら構文解析してスタックに積んで…といきたいところですが、 僕は軟弱なので - s|<tag .*?>.*?</tag>|| - 削除したのが足りなかった (例えば <tag a>in1<tag b>in2<tag c>in3</tag> しか取れなかった) なら、追加であと 2個の </tag> をするため s|.*?</tag>.*?</tag>|| とする。 とします。 |
>>2967 68user > 別の解としては、システムコールの発行を hook して安全性をチェック、 > というのもありますが、UNIX でこういうのってできるのかなーと思って > 調べてみたら、なんかできるようですね。 > http://www.caj.co.jp/support/etrustac_faq.htm > Q6: eTrust Access ControlのSoft Hook技術とは何ですか? > カーネルを置き換えているのか、あるいは libc のシステムコール発行部分を > 置き換えているのか…(できるのかな?) 最近これに激しく惹かれているのですが、libc 置き換えで可能なんでしょうか。 詳しい人がいらっしゃったら教えてください。 全てのシステムコールは http://home.jp.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/i386/sys/syscall.S?rev=1.8 を経由するんじゃないかと思っているのですが、もしそれが正しいなら ここにチェック機能を入れた libc を用意して置き換えるか、あるいは LD_PRELOAD で既存 libc に置き換えることは可能なのかなぁ。 どちらにせよアセンブラができないので、 http://www.ascii.co.jp/books/detail/4-7561/4-7561-0213-1.html を買って勉強かな…。 |
>>2973 68user さん、ありがとうございます。 まさに xml で、そのパッケージすごく便利そうなんですが 使い方がよくわかりません ;;; でもべっかいの方でなんとなくできたのでもう少しまとめてから公開します。 |
>>2975 ふくし 別解でがんばるよりは、早めに XML::DOM の使い方を覚えた方が 幸せ度が高いかと。 # 僕は使ったことないですけど。 |
通りすがりのものですが・・・ システムコールをhookして安全性を云々というのは、 たとえば Systrace - Interactive Policy Generation for System Calls http://www.citi.umich.edu/u/provos/systrace/ こういったもののことでしょうか? (OpenBSD, NetBSD にはマージされています) |
X68000の、内臓フォントを利用するインターフェースを調べています。 フリーで有用な文書がありましたら教えていただけないでしょうか? >識者 なお当方X68000に関する知識は皆無でございます。 |
>>2960 68user様 報告が遅れまして申し訳ありません。 /usr/bin/time 実行コマンド >& 出力ファイル を実行した結果うまくいきました。ありがとうございました。 |
タグのパースの件です。 別解ですが、会社の若い者が作ったプログラムが無事動きました。 で、せっかくなので XML::DOM を入れようとしたら、 XML::Parser を入れよと言われたので、 XML::Parser を入れようとしたら、 expat を入れよと言われたので、 expat の tar.gz を解いて ./configure して Makefile を #prefix = /usr/local prefix = /henna_directory として make したら(ぼくは管理者でないので)、 gcc: unrecognized option `-R/henna_directory/lib' といわれました。ここで止まっています。 ちなみに /henna_directory/lib というディレクトリはあります。 (ついでにいうと、bin も include も man も) 待て次号。;;; |
>>2977 UMA > システムコールをhookして安全性を云々というのは、 はい、そういうものを念頭に置いていました (が、ユーザランドで できたらいいなと。無理なのかな)。 Systrace の存在は知りませんでしたが、これはとてもいいですねぇ。 素晴らしいです。 >>2978 UMA 68user's page で X68000 の疑問が解決したことは一度もなかったりします。 インタフェースって API ですか? (ではなさそうな気がしますが)。僕が記憶に 頼って書くと多分間違っているので、X68000 エミュレータ関係の掲示板で 聞くのが早いと思います。 >>2980 ふくし まーいろいろありますが、がんばってインストールしてください。 あと、libwww-perl あたりもいれなきゃいけないのが perl の XML モジュールのうざいところ。 |
>>2973 68user様 お返事ありがとうございます.kikiです. 丁寧なご説明ありがとうございました. おかげで理解できました.ありがとうございます. |
いつも忘れて調べなおすはめにおちいるのでここにメモメモ。 TeraTerm 経由の mule などで PageUp が効かない場合、 Windows\Program Files\TTERMPRO\KEYBOARD.CNF の Remove=329 を ; でコメントアウトし、その下に User1=329 を追加。さらにファイルの一番最後に User1=329,0,$1B[5~ を追加。 って、ちょっと検索してみたら、 http://phe.phyas.aichi-edu.ac.jp/~cyamauch/mule.html の対処と全然違ってますな。なんでアレで PageUp できるんだろう。 |
OS: Solaris 2.5.1 プロセスの通知にシグナルを使っています。 これまで、SIGUSR1とSIGUSR2で間に合っていたのですが、 今回もう一つパターンの追加(SIGUSR3?)を行いたいのです。 そこで、質問なのですが <signal.h>にシグナルを追加できるのでしょうか? また、出来るとしたら注意しないといけない点や 影響を及ぼす範囲を教えて下さい。 よろしくお願いします。 |
>>2984 SIGNAL シグナルの追加はカーネルを書き換えないと無理です。 シグナル以外の方法 (パイプ・共有メモリなど) で情報のやりとり をするのが正解でしょう。 と偉そうなことをいってますが、シグナルが足りず SIGXCPU を 使って逃げたことはあります。 |
親プロセスでforkした子プロセスの終了状態(終了コード)を、親プロセス が認識する方法があれば情報提供をお願いします。 ・親プロセスはwaitしません。 ・子プロセスは同じものが複数生成されます。(順次生成) ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、子プロセスにはできる限り修正を加えない方法を探しています。 理想は子プロセスの終了時にイベントが発生し、waitのように変数に結果 が格納されるようなものです。 |
>>2986 koko > ファイルへ子プロセスの結果を出力して親プロセスが参照したり、パイプ > や共有メモリを使用してのプロセス間通信などの方法があるかと思いますが、 の方法を取らないのであれば、無理なんじゃないでしょうか。 |
>>2986 koko > ・親プロセスはwaitしません。 親でSIGCHLDを拾ってwaitpid()のオプションWNOHANGで チェックするのもダメですか? --- snip --- #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/wait.h> void handler(int sig) { int pid,status,code; while((pid=waitpid(-1,&status,WNOHANG))>0) { if(WIFEXITED(status)) { code = WEXITSTATUS(status); printf("child process:[%d] was exited with code:[%d]\n",pid,code); } } } int main(int argc,char *argv[]) { int i,pid,code; char buf[16]; struct sigaction sa; if(argc>1) { code = atoi(argv[1]); srand(code+time(0)); sleep(rand()%10); return code; } memset(&sa,0,sizeof(sa)); sa.sa_flags = SA_NOCLDSTOP; sa.sa_handler = handler; sigaction(SIGCHLD,&sa,0); for(i=0;i<10;i++) { if((pid=fork())<0) { perror("fork"); return -1; } if(pid) continue; sprintf(buf,"%d",i); if(execl("./a.out","./a.out",buf,0)<0) { perror("execl"); return -2; } } for(;;) sleep(1); return 0; /* never reaches */ } --- snip --- かなり適当ですが。 |
>>2988 hsj 他のHPを調査をしている中で「waitpidで子プロセスの終了コードが取得できれば解決できそうだ。」というのは私も感じました。 試してみたいと思います。 >>2987 68user 今回は、既存の子プロセス側のソースコードにできるだけ手を入れないという条件があるのですが、良い案がない場合にはやはりパイプを使用する事に なるかと思います。 ご回答頂き、ありがとうございました。 |
>>2986 koko > ・親プロセスはwaitしません。 ってのは親プロセスにも手を入れたくないという意味かと思った のですが、wait でブロックさせたくないという意図だったのですね。 読み違えておりました。 |
こんにちは 質問があってきました Perlを使っていると system関数やexec関数を使うようになりました 便利でとてもよいのですが Root権限でコマンドが実行されているような気がします くわしくはまだ確認していません。 また、CGIでファイルマネージャーを使っていますが これも同じようにパスワードファイルなどを開かれるという欠点があります 全ディレクトリやファイルのパーミッションを000にすることはもちろんできませんし 一部だけのパーミッション設定もだめです 例)/homeを000にするが/home/userが777だとアクセスされてしまう これらのことからセキュリティーホールとなっていてとても不安です これらについての対処法はなにかないでしょうか? |
>>2991 Japper > Root権限でコマンドが実行されているような気がします perl スクリプト中で print "$<\n"; print "$>\n"; の結果のいずれかが 0 なら root 権限を得ています (が、おそらくは 勘違いではないかと思います)。 > これも同じようにパスワードファイルなどを開かれるという欠点があります 書きかけですが、 http://x68000.startshop.co.jp/~68user/webcgi/cryptogram.html が参考になるかもしれません。 |
初めまして!YAHOO!オークションのログインをプログラムで実行したいのですが、上手くいきません。ブラウザでの通信のlogをとり、プログラムを組んでいたのですが、どうしてもPOSTした後の3種類のクッキーがとれ ないのです。上手くいけば下のような3種類のクッキー(個人情報なので***になっています)が返されるのですが、 ・・・・・・・・・・ブラウザのlog・・・・・・・・・ <ブラウザのPOST> POST /config/login?5934sjuoe8ci4 HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: login.yahoo.co.jp Content-Length: 259 Pragma: no-cache Cookie: B=cv85agsv02md9&b=2 Connection: keep-alive Browser reload detected... Posting 259 bytes... .tries=1 .src=auc .last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc promo= .intl=jp .bypass= .partner= .u=cq4ce2ov02mdi .v=0 .fUpdate=Y hasMsgr=0 .chkP=Y .done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus login=******** passwd=*********** <レスポンス> HTTP/1.1 302 Found Date: Thu, 19 Dec 2002 05:31:58 GMT P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" Location: http://login.yahoo.co.jp/config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie:**** Set-Cookie:**** Set-Cookie:**** ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ このセッションがどうしても上手くいかず、3種のset-cookie が取得できないのです。大変お忙しい中恐縮ですが、もしよろしければ、アドバイスをよろしくお願いします。とても見せれるプログラムではありませ んが、下記に示します。 try{ URL u = new URL("http://login.yahoo.co.jp/config/login?5934sjuoe8ci4"); URLConnection uc = u.openConnection(); uc.setRequestProperty("Cookie:","B=cv85agsv02md9&b=2); uc.setDoOutput(true); uc.setDoInput(true); OutputStreamWriter out = new OutputStreamWriter(uc.getOutputStream(), "EUC_JP"); query.Encode3(".tries","1"); query.Encode1(".src","auc"); query.Encode1(".last","http://login.yahoo.co.jp/config/edit_auc"); query.Encode1("promo",""); *query.Encode()はクエリー文字列にするための関数です。 query.Encode1(".intl","jp"); query.Encode1(".bypass",""); query.Encode1(".partner",""); query.Encode1(".u",data2); query.Encode1(".v","0"); query.Encode1(".fUpdate","Y"); query.Encode1("hasMsgr","0"); query.Encode1(".chkP","Y"); query.Encode1(".done","http://user.auctions.yahoo.co.jp/jp/show/mystatus"); query.Encode1("login",ID); query.Encode1("passwd",PW); out.write(query.toString()); out.write("\r\n"); out.flush(); out.close(); /////////////(1)////////////////////////////// for (int j = 0; ; j++) { String header = uc.getHeaderField(j); if (header == null) break; System.out.println(uc.getHeaderFieldKey(j) + ": " + header); } } catch (Exception a) { System.err.println(a); } ちなみに(1)で出力されたヘッダ情報は null: HTTP/1.1 200 OK Date: Thu, 19 Dec 2002 07:16:58 GMT Refresh: 900; URL=http://www.yahoo.co.jp/ Cache-Control: private Pragma: no-cache Expires: Thu, 05 Jan 1995 22:00:00 GMT Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie: B=el2pemcv02sja&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/; domain=.yahoo.co.jp 上記のレスポンスを取得してしまい、クッキーが取得できずに先に進めないのです。長くなってしまい、大変ご迷惑をお掛けしますがよろしくお願い致します。 では、失礼します。 |
>>2993 ruku いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と .uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを POSTすれば行けるんじゃないでしょうか。 この手のwebアプリはログイン後の画面ではCookieだけでなく、 それ以外の手段でもユーザを一意に識別する何らかの値を持ちまわらせ、 Cookieの(そのものでなく大抵はセッションオブジェクトなりDBなりに 入れた)値とのクロスチェックでユーザを認証している場合があります。 YAHOO!オークションがどうなっているかは知りませんが、 その手の仕組みが組み込まれているんじゃないでしょうか。 |
>>2993 ruku うまくいかないときのアプローチとしては、まずはやっぱり telnet とか Socket で直接つなぐ方がいいんじゃないでしょうかね。 アクセスに成功する QUERY は知っているし、失敗する QUERY も 知っているわけで (よくわかってませんが、OutputStreamWriter に 細工をすればリクエストの生データが取れるんですよね? ) その 2つの内容をつきあわせて一つ一つチェックすると。ないとは 思いますが、もしかしたら USER_AGENT で制限かけてたりする かもしれませんし。 |
おひさしぶりです。kikiです。前回はお世話になりました。 今回もお聞きしたいことがあり、書き込ませていただきました。 今、私はbash(2.04)をいじって、以下のことが したいと思っているのです。それは 1.コマンドが実行された時間をそのコマンド履歴といっしょに 特定のファイルに出力する。(.bash_historyに タイムスタンプをつける感じです。 2.特定のファイルにコマンド履歴が追加されるタイミングを そのコマンドが打ち込まれた直後になるようにする。 このようなことはbashのソースを書き換えればできるのでしょうか? どうかご教授をよろしくお願い致します。 P.S. history -w の様なことを自動的にできればいいのですが、 historyコマンドは、シェル自身のコマンドなので無理でしょうし。 うーん。 |
>>2994 hsj 貴重なアドバイスありがとうございます。いちおう.uやcookieの値はお書きしたプログラムの前で取得しているので問題はないと思うのですが・・・。これがなかなか上手くいかないのです。 >>2995 68user ソケットで試してみます。貴重なアドバイスありがとうございました。 |
度々すみません。ブラウザの設定でcookieを無効にして再度logをとったら プログラムと同じになりました。次にlogを示します。 +++GET 457+++ POST /config/login?2v1pmh3i6v229 HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: login.yahoo.co.jp Content-Length: 259 Pragma: no-cache Connection: keep-alive Browser reload detected... Posting 259 bytes... .tries=1 .src=auc .last=http%3A%2F%2Flogin.yahoo.co.jp%2Fconfig%2Fedit_auc promo= .intl=jp .bypass= .partner= .u=5g07ercv0d4tr .v=0 .fUpdate=Y hasMsgr=0 .chkP=Y .done=http%3A%2F%2Fuser.auctions.yahoo.co.jp%2Fjp%2Fshow%2Fmystatus login=************* passwd=***************** +++RESP 457+++ HTTP/1.1 302 Found Date: Mon, 23 Dec 2002 04:40:38 GMT P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV" Location: http://login.yahoo.co.jp/config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie: ****** Set-Cookie: ****** Set-Cookie: ****** +++CLOSE 457+++ +++GET 458+++ GET /config/verify?.done=http%3a//user.auctions.yahoo.co.jp/jp/show/mystatus HTTP/1.0 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */* Referer: http://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.last=http:%2f%2flogin.yahoo.co.jp%2fconfig%2fedit_auc&.done=http:%2f%2fuser.auctions.yahoo.co.jp/jp/show/mystatus&reason=notloggedin Accept-Language: ja Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) Host: login.yahoo.co.jp Pragma: no-cache Connection: keep-alive Browser reload detected... +++RESP 458+++ HTTP/1.1 200 OK Date: Mon, 23 Dec 2002 04:40:38 GMT Refresh: 900; URL=http://www.yahoo.co.jp/ Cache-Control: private Pragma: no-cache Expires: Thu, 05 Jan 1995 22:00:00 GMT Connection: close Transfer-Encoding: chunked Content-Type: text/html; charset=euc-jp Set-Cookie: B=2m7te28v0d4u6&b=2; expires=Thu, 15 Apr 2010 20:00:00 GMT; path=/; domain=.yahoo.co.jp +++CLOSE 458+++ cookieを無効にしても3種のcookieはとれるようなのです。しかも最後の ヘッダの応答はプログラムでもとれているのです。ただ、POSTを送る処理 しかプログラムでは行っていないはずなのに最後のヘッダの応答を取得して しまうのはどうしてでしょうか?もしよろしければアドバイスよろしくお願いします。もしかしたら応答ヘッダの取得する場所が悪いのでしょうか? |
>>2998 ruku 先ほど試しにncで > いったん/cofig/loginをGETしてCookieと/cofig/login?以降の文字列と > .uの値を取得し、それらの値をセットしたうえでユーザIDとパスワードを > POSTすれば行けるんじゃないでしょうか。 をやってみたところ、問題なく3つのCookieが発行されました。 #ただし、最初のGETは/cofig/login?.src=aucに対して行いました。 なので、プログラムが正確に上記の事を行えば問題なく行けると思いますが・・・。 |
> 2996 > このようなことはbashのソースを書き換えればできるのでしょうか? 入力を解析し、プロセスを実行しているのは bash なので、ソースに手を いれれば何でも可能です。 |
>3000 68user様 お返事ありがとうございます.kikiです. やってみましたところ、なんとかできました。 ありがとうございました。 |
C言語で複数のプロセスが同一のファイルに対してログを出力する処理を作成したいのですが、このような共有書き込み用のファイルを設ける方法としてUNIXでよくやる方法というものはあるでしょうか。 もちろん、定石でなくても良いです。 できれば、書き込み時に自分でファイルをロック、アンロックしない、要するにできるだけ楽をしたいです。 ログの書き込みは同時に発生する可能性があります。 Windowsであれば、共有書き込みでファイルを開く関数があるのですが...。 ●処理イメージ 1.親プロセスでログファイルを開く。 2.複数の子プロセスを起動し、親が開いたログファイルにログを出力する。 3.全子プロセス終了後にログファイルを閉じる。 よろしくお願い致します。 |
はじまめして UNIXのファイルアクセスでつまづいています。 Aという、所有者がnobody のファイルがあるのですが、あるunixサーバでは webというユーザからアクセス(名前変更)ができます。 ところが、同じOSの別のサーバにあるBという、所有者がnobodyのファイル にはwebというユーザからアクセスできません。 nobodyのファイルはどのユーザでもアクセスできると認識しているのです が、ソフトのインストールやセキュリティの設定などでアクセスできないようにすることが可能なのでしょうか? どなたかご存知の方いらっしゃいましたら教えてください。 |
>>2992 68user ご回答ありがとうございます パスワード的なことはやはりcrypt関数を使うことで解決できそうな気がします >> Root権限でコマンドが実行されているような気がします >perl スクリプト中で > print "$<\n"; > print "$>\n"; >の結果のいずれかが 0 なら root 権限を得ています やはり両方とも 0 を返しました このことからRoot権限を得ているのでしょうか? Root権限を与えない方法はどのようにすればよいのでしょうか? よろしくお願いします |
> 3003 yuuji WebサーバがApacheならsuEXECを使えばいいと思いますよ。 http://httpd.apache.org/docs/suexec.html |
>>2999 hsj ありがとうございます。わかりました。頑張ってみます。 |
>>3002 koko > できれば、書き込み時に自分でファイルをロック、アンロックしない、 > 要するにできるだけ楽をしたいです。 これを第一に考えるなら syslog か、syslog-ng を使いましょう。 daemon を立ち上げておけないのなら、open で O_SHLOCK を使うとか (ま、結局ロックしているわけですが)。 また、 > 1.親プロセスでログファイルを開く。 > 2.複数の子プロセスを起動し、親が開いたログファイルにログを出力する。 という形態であれば、普通は pipe(2) して、fork(2) して、子が親にデータを 渡し、親がログに書く、というふうになるでしょう。 http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/links/link-check.pl?rev=HEAD&content-type=text/x-cvsweb-markup は子が親に 1行だけデータを渡す例です。 あるいは親が名前付きパイプを作成し、子がそこに書き込むとか。 いずれにせよ、syslog が使えないなら、syslog 相当のものを 自作する必要はあります。 |
>>3003 yuuji > nobodyのファイルはどのユーザでもアクセスできると認識して > いるのですが 誤りです。nobody はただの一ユーザであって、所有者が nobody の ファイルを扱えるかどうかは そのファイルのパーミッションと、ファイルが 置かれているディレクトリのパーミッションによります。 UNIX においては、誰よりも権限が高いユーザは存在しますが (root)、 誰よりも権限が低いユーザというのは存在しません。 >>3004 Japper > このことからRoot権限を得ているのでしょうか? そうです。 > Root権限を与えない方法はどのようにすればよいのでしょうか? suExec の前に、設定を見直した方がよいでしょう。 もし apache ならば、あえてそういうふうに設定しない限り root 権限は得られません。そういう web サーバを使い続けることは 非常に恐いので、まっとうなインストール方法を勉強するか、 web サーバをインストールした人に何をしたのか聞いてみる ことをお勧めします。 # 「デフォルトが root 権限で動く web サーバ」なら正常動作 # なんでしょうが、そんな web サーバは嫌だ。 |
こんにちは もうすぐ2003年ですね 仕事でSolaris8をいじるようになって早くも4年目に突入です まだまだ未熟者ですがよろしくお願いします 自宅では2001/01版のSolaris8を「WS440BX」で使ってるのですが 最近I845系のマシン(ペンティアム4系)にUPしようと考えるようになりました 当然ながらチップセットやディスクコントローラ、システムコントローラ等の ドライバを入手する必要があるのですが、苦慮しています 新型機の候補としては「D845GALLY」あたりを考えているのですが 情報等あればよろしくお願いします |
EWSのデバイス情報(CPUのクロック数、メインメモリ)を知ることができる UNIXコマンドがありましたら、教えて下さい。 |
perlでネットワークプログラムを試作してます。 echoをC/Sで動作する事は出来るようになりましたが、ファイルを ネットワーク越しに転送するにはどうすればいいのでしょうか? 同じくperlによるC/Sです。 |
はじめまして。 echoサーバーサンプルを参考にしてPerlでちょっとしたチャットサーバーなんかを作ってます。 そこでいきなり質問なんですが、PerlでBroken Pipeエラーを回避するようにできないでしょうか? Broken Pipeとは存在しないソケットに対して書き込んでしまったときにでるエラーのようで、クライアントが強制切断してしまったときなどは回避できません。 どうにか皆様のお知恵をお借りできませんでしょうか。 |
あけましておめでとうございます。kikiです。 本年もよろしくお願い致します。 >>68user様 ずいぶんと古い話で申し訳ありませんが、 >>2956 の解決策をためそうとしましたところ、 1. PATH=../../../../../../../home/foo/bar:$PATH とする。 カレントディレクトリの階層があまりに深くなければ、これでいける。 が、どういう事を意味するのかわかりませんでした。 そして、これはどこで行うのでしょうか? suトロイの実行前の準備としてでしょうか? ご教授よろしくお願いします。 P.S. PATH=.:$PATH にしておくき、suトロイがおいてある場所で、suコマンドを打ち込むと suトロイが実行され、もう一度suコマンドを打つと しっかり/bin/suが実行されますが、 suトロイがおいてある場所以外で同じことをしようとすると suトロイは実行されず、いきなり/bin/suが 実行されました。 コマンドを探す順番は、カレントディレクトリからということでしょうか。 うーん、調べてみます。 |
今年こそはちゃんと web を更新するぞ、と。 てなわけで、今年もよろしくお願いします。 >>3009 ELVIS >>3010 しましま 少なくとも僕はわかりません。申し訳ない。 >>3011 とむやむ > ファイルをネットワーク越しに転送するにはどうすればいいのでしょうか? 以下のやりとりが参考になるでしょうか。 >>2827 Tetsu >>2828 68user ftp クライアントと ftp サーバを作るもよし、自分でプロトコルを 決めるもよし、ということです。 >>3012 HIGE > PerlでBroken Pipeエラーを回避するようにできないでしょうか? SIGPIPE をキャッチしてください。使用例はこちら。 http://x68000.startshop.co.jp/~68user/net/http-proxy.html >>3013 kiki > PATH=../../../../../../../home/foo/bar:$PATH とする。 カレントディレクトリが /dir1/dir2/dir3 であるとき、 ../ は /dir1/dir2 です。 ../../ は /dir1 です。 ../../../ は / です。 ../../../../ は / です。 ../../../../../ は / です。 ../../../../../home は /home です。 ../../../../../home/foo は /home/foo です。 ../../../../../home/foo/bar は /home/foo/bar です。 ってことです。 > PATH=.:$PATH > コマンドを探す順番は、カレントディレクトリからということでしょうか。 . はカレントディレクトリですから。 |
>>3007 68user ご回答ありがとうございます。 やはり、ファイルに同時書き込みをするにはロック、もしくはそれに相当する制御は欠かせませんね。 素直にsyslogを使用すれば良いのですが都合でsyslogは使用できません。 頂いた参考URL等を参考にしながら対策を検討します。 |
★ \(^o^)v 大 発 見 !♪ 〜♪ とっても 参考にさせて頂いて ♪ ~~\(^o^)♪ 〜 夢 と 希望 が 叶いました〜♪ (^o^)/~~ ありがとう |
もし、ご存知であれば教えてください。 ファイルの日付を比較して新しいほうのファイルを表示したいです。 サーバが異なる場所(ネットワークには接続できる)に、 それぞれファイルが存在するします。 同じマシンであれば、>find file1 -newer file2 -print で表示されるのです。remshで実行しようとしてもうまくいきません。 ご教授お願いいたします。 |
AIX上でファイル内の先頭行と最終行を削除したいのですが UNIXコマンドで行を指定して削除することはできないのでしょうか? ※C言語の処理内で行いたいのでsystem関数で可能な方法 もしご存知であれば教えてください。 よろしくお願いします。 |
>>3017 ピョンタン remsh でリモートのファイルのタイムスタンプを表示して、ローカルの 方より若ければ rcp するか、とりあえず別のファイル名で rcp して、 ローカルで比較するか、てな感じで。 >>3018 kenken > AIX上でファイル内の先頭行と最終行を削除したいのですが % tail +2 < file | ??? | tail +2 | ??? でいけた記憶があります。??? はファイルの内容を逆順にする コマンドですが、なんだったっけなー。ど忘れしました。 % cat -n file | tail +2 | sort -r | tail +2 | sort | sed 's/^.......//' てな方法もあります。 まぁファイルサイズが大きいなら perl か awk でさくっと書いた方が よいでしょう。 |
ご回答ありがとうございます。 大変助かります。>No.3019(NO3017についての回答) もうひとつ教えてください。ファイルの タイムスタンプを取得するのに、 (1)Jan 9 2001 ← 2001/01/09 (2)Dec 10 13:56 ← 2002/12/10 (3)Jun 1 15:00 ← 2003/01/01 というふうに統一性がありません。 特に、(2),(3)だったらどうやって比べればいいのでしょうか? 申し訳ありませんが教えて下さい。 |
>>3020 ピョンタン % ls -lT % ls --fulltime -l % perl -e 'printf "%d\n", (stat("/foo/bar/baz"))[9]' などなど。 |
お返事ありがとうございました。>No.3021 大変助かりました。 もう少しだけ教えてください。 %ls -fulltime -l で確認することができましたが、 参考書や、Webで検索しても の「fulltime」の引数指定意味がよくわかりません。 しかも、私は ×"--fulltime" ○"-fulltime" で、なんとなくうまくいきました。 本当にお手数をおかけしますが、あともう少しなので 教えて下さい。どうかよろしくお願いします。 |
% ls --fulltime -l は % ls --full-time -l の間違いでした。 >>3022 ピョンタン > ○"-fulltime" お使いの OS に興味があります。OS の名前を教えてください (てゆーか 質問する際に OS や環境を明示してくださいね)。 意味については % man ls に説明があるはずです。 |
初めまして、お世話になります。 68userさんのページのhttp-proxy http://x68000.startshop.co.jp/~68user/net/http-proxy.html をhttpポートフォワーダーに改造して使わせてもらっている物です。 Linuxですが、、連続して稼動させているとTOP表示でMEM使用率が上がって行きます(50%超え)、いろいろ手を加えてみましたが、未だにこのMEM増加を改善できませんでした。 そこでこれをforkを使ったechoサーバを参考にfork版に修正しました。 while (my $sock = $sock_waiting->accept){ my $pid = fork(); my $cpid = $pid ; if ($pid!=0) { close($sock) ; next ;#parlent process } print " FROM Browser. Accept $sock.\n"; #Child process my ($buf,$request); while (1){ my $brs = sysread($sock, $buf, 10000); $request .= $buf; if ($brs) { last ; } } print " FROM Browser. Read OK.\n"; ここに転送先サーバ側とのソケット作成と受信&ブラウザへの返信を記述 print " FROM Browser. Finished.\n"; close($sock); print " FROM Browser. process End \n"; exit ; } の様に子プロセスのexit文もいれました。なのにpsで見ると、、 hoge 19438 12855 0 14:55 pts/21 00:00:00 perl http-proxy2.pl hoge 19578 19438 0 14:55 pts/21 00:00:00 [perl <defunct>] hoge 19579 19438 0 14:55 pts/21 00:00:00 [perl <defunct>] hoge 19580 19438 0 14:55 pts/21 00:00:00 [perl <defunct>] hoge 19581 19438 0 14:55 pts/21 00:00:00 [perl <defunct>] アクセスした分この様なプロセスが残りっぱなしになります。 当然大元スクリプトを停止すればプロセスは消えます。 どうか宜しくご意見ください。 |
>>3024 テクノソルジャー > hoge 19578 19438 0 14:55 pts/21 00:00:00 [perl <defunct>] > アクセスした分この様なプロセスが残りっぱなしになります。 wait していないからです。以前指摘をいただいたのですが、時間が とれず手付かずになっています (申し訳ない)。 >>2584 persianopeh をどうぞ。 > 連続して稼動させているとTOP表示でMEM使用率が上がって行きます(50%超え) どうもオリジナル版のバグっぽいですね。久々に使ってみましたが、 確かにメモリ使用量がだんだん増えていきました。調べておきます。 # と言っても暇がない〜。 |
>>3024 テクノソルジャー > 連続して稼動させているとTOP表示でMEM使用率が上がって行きます(50%超え) コネクションを切断しても %conn_table_rev が IO::Socket::INET の オブジェクトを指しているみたいです。 あと、%conn_table もキーが増えつづけるようです (値は undef かな?) %conn_table_rev ほどではありませんが (一回あたり数十バイトくらい でしょうか)、メモリリークなのは確かですね。 なので、remove_contable で適切にハッシュを delete してやればよい のかもしれませんが、明日も仕事なのでこの辺で… (´・ω・`) |
お忙しいところ調査並びご返事ありがとうございます! >>3025 68user なるほど、、その仕組みが理解できませんが、、 連休明けには会社で早速処置してみます! >>3026 68user こちらはclose漏れかといじって見ましたが、、ハッシュにバインドされているから生成オブジェクトが開放されなかったのですね〜 ハッシュにdefunで増加など考えもしませんでした。 私的に貴重な知識を得ましたです! |
久々にこのサーバのメンテナンスしようとしたら、cron (デーモン) は 2001/11 から止まってるわ、間違って ~/bin/ は消してしまうわで もう散々。 いろいろ動かなくなっていると思いますが、なるべく早く直したいと思います。 |
はじめまして、こんにちは。 いつも参考にさせていただいております。 sedコマンドを使用して文字列の置換をする処理をしたいのですが、 エラーになってしまいます。 やりたいことは、 「aa aaa aaab aac bbb」から『aaa』だけを消したいのです。 --------------------------------------------------- Sample)aaa.sh #!/bin/sh testA=`echo aa aaa aaab aac bbb | sed s/aaa\\\b//g` --------------------------------------------------- としたとき、「//g」が見つかりませんとなります。 ※ただし「testA」は、「aa aaab aac bbb」となっていますが、、。 ちなみにシェルではなく単純に実行するとエラーはでません。 > echo aa aaa aaab aac bbb | sed s/aaa\b//g > aa aaab aac bbb ※シェル内では\bは「\\」をつけています。 どなたかお力を貸していただけないでしょうか。 また、「sed」以外の方法でもよいです。 -環境:Linux(RedHat 7.2) 宜しくお願いいたします。 |
>>3029 VTOK 手元の FreeBSD の sh や bash ではエラーにならなかったので よくわかりませんが、そもそも % echo aa aaa aaab aac bbb | sed s/aaa\b//g この aaa\b はシェルが解釈すると aaab になるので、 % echo aa aaa aaab aac bbb | sed s/aaa\b//g は % echo aa aaa aaab aac bbb | sed s/aaab//g と等価だと思います。 ただしスクリプト中の testA=`echo aa aaa aaab aac bbb | sed s/aaa\\\b//g` は正しいと思います。なんでエラーになるんだろう。 |
あけましておめでとうございます。 いつもお世話になりっぱなしですが、今年もよろしくお願いします。 68user さん Perl 5.8 入れてみましたか ;;; いぜん jperl5.5 でファイルテスト演算子 -T を使っていたんですが、 EUC-JP モードであれば EUC-JP の、 Shift_JIS モードであれば Shift_JIS の漢字を真にしてくれて 便利だったんですが、Perl 5.8 に変えたので 使えなくなってしまいました。 encoding で切り替えられるかと思ったんですがダメでした。 あくまで -T を使いたいとしたらどうすればいいか、 どなたかお分かりであればご教示ください。 |
初めましてakuroと申します。 最近、ここを知り色々と勉強させて頂いています。 「HTTP クライアントを作ってみよう(4)」にてお聞きしたい事があるのですが。 HTTP CLIENTを実際に作成して動かしてみたのですが、 「さらなる改善点・URL エンコード」の中で、~(チルタ゛)のついた 場合、変換しなければならないとあるのですが、処理を記述しないで 試しに http://x68000.startshop.co.jp/~68user/ と入力してみたのですが、問題なく表示されました。 これはどういう事なのでしょうか? それと、次の項目の「301 Moved Permanently」なのですが、 これも/(スラッシ)無しでも表示されました。 (HEADの場合HTTP/1.1 301 Moved Permanentlyと出ましたが、 BODYもちゃんと表示されました) これもなぜ表示されるかわかりません。 質問が長くなってしまいましたが、よろしくお願いします。 (HTTP_CLIENTは少し変更して、CGI版にしていますが、処理自体は 変更していません。) |
また長ったらしい文章を書いてしまった…。 >>3031 ふくし > 68user さん Perl 5.8 入れてみましたか ;;; 5.8 どころか最近は 5.004_04 を使ってますよ。退化してます。 > いぜん jperl5.5 でファイルテスト演算子 -T を使っていたんですが、 > EUC-JP モードであれば EUC-JP の、Shift_JIS モードであれば Shift_JIS の > 漢字を真にしてくれて便利だったんですが、Perl 5.8 に変えたので perl-5.8.0/pp_sys.c には PP(pp_fttext) { for (i = 0; i < len; i++, s++) { if (!*s) { /* null never allowed in text */ odd += len; break; } #ifdef USE_LOCALE if (IN_LOCALE_RUNTIME && isALPHA_LC(*s)) continue; #endif /* utf8 characters don't count as odd */ if (UTF8_IS_START(*s)) { ... } ... } else if (*s < 32 && *s != '\n' && *s != '\r' && *s != '\b' && *s != '\t' && *s != '\f' && *s != 27) odd++; } とかなんとか書いてあったりします (UTF8 は OK のような雰囲気ですね)。 USE_LOCALE で IN_LOCALE_RUNTIME ならもしかして! …というわけでさらにおっかけていくと % find . -type f | xargs grep isALPHA_LC ./handy.h:# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) % find . -type f | xargs grep NXIsAlpha ./handy.h: (NXIsAlpha((unsigned int)(c)) || (char)(c) == '_') ./handy.h:# define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) てなわけで NXIsAlpha とやらが定義されていません。isALPHA_LC を よく見てみると #ifdef USE_NEXT_CTYPE # define isALPHA_LC(c) NXIsAlpha((unsigned int)(c)) #else # define isALPHA_LC(c) isalpha((unsigned char)(c)) #endif てな感じなので、将来は実装するぞ、てなところでしょうか。 >>3032 akuro > 「さらなる改善点・URL エンコード」の中で、~(チルタ゛)のついた > 場合、変換しなければならないとあるのですが URI を定義しているのは RFC1738 です。 http://www.ietf.org/rfc/rfc1738.txt?number=1738 そこには httpurl = "http://" hostport [ "/" hpath [ "?" search ]] とあります。/~68user/ や /%7E68user/ という部分は hpath に相当します。 hpath = hsegment *[ "/" hsegment ] → hpath は hsegment を / で結合したもの。 hsegment = *[ uchar | ";" | ":" | "@" | "&" | "=" ] → hsegment は uchar か上記記号の 0 個以上の繰返し。 uchar = unreserved | escape → uchar は unreserved か escape。 unreserved = alpha | digit | safe | extra escape = "%" hex hex → unreserved は alpha, digit, safe, extra のいずれか。escape は %XX 形式。 alpha = lowalpha | hialpha digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" safe = "$" | "-" | "_" | "." | "+" extra = "!" | "*" | "'" | "(" | ")" | "," → alpha, digit, safe, extra は上記の文字 (lowalpha は英小文字、hialpha は英大文字)。 上記のどこにも ~ は含まれていません。よって、hpath には ~ を 含めてはならず、/~68user/ は間違いで /%7E68user/ は正しいのです。 …というのはその文書を書いた当時の話。今 URI を規定しているのは RFC2396 です。 http://member.nifty.ne.jp/moha/rfc/rfc2396j.txt /~68user/ に相当するのは abs_path です (*1)。 abs_path = "/" path_segments path_segments = segment *( "/" segment ) segment = *pchar *( ";" param ) param = *pchar pchar = unreserved | escaped | ":" | "@" | "&" | "=" | "+" | "$" | "," reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," unreserved = alphanum | mark mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")" mark に ~ が含まれているため、URI として ~ を記述することが認められています。 また、上記ページの「G.2. RFC 1738及びRFC 1808からの修正点」には > チルダ文字"~"を"unreserved"集合に追加した。ある種のキーボードではこの文字の > 入力に困難を伴うが、インターネットにおいて広く用いられているためである。 とあります。 よって、現在では /~68user/ というリクエストを送っても問題ありません。ただし /%7E68user/ という表記も間違いではありません。/~68user/ と /%7E68user/ は 等価です。 # …という解釈でいいのかなぁ。自信がないなぁ。 じゃー昔は /%7E68user/ と書かずに /~68user/ とするとエラーになったのか というと、そんなことはありませんでした。その理由は 「~ を ~ として解釈しても誰も (web サーバも web クライアントも) 困らないので (むしろ便利)、web サーバが気をきかせてくれたから」 だと思います。 (*1) なぜ /~68user/ が abs_path なのかというと、 RFC2616 (http://www.studyinghttp.net/rfc_ja/2616/sec3.html#sec3.2.1) に http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] と定義してあり、さらに URL 構文やセマンティクスの定義についての情報については、(RFC 1738 [4] と RFC 1808 [11] を置き換えた) "Uniform Resource Identifiers (URI): Generic Syntax and Semantics," RFC 2396 参照。 この規格書では、その規格書にある、"URI-reference", "absoluteURI", "relativeURI", "port", "host", "abs_path", "rel_path", "authority" の定義を採用する。 とあるからです。 > それと、次の項目の「301 Moved Permanently」なのですが、 > これも/(スラッシ)無しでも表示されました。 こちらで試してみたところ、 GET /~68user HTTP/1.0 HTTP/1.1 301 Moved Permanently (略) Location: http://jfx.startshop.co.jp/~68user/ (略) <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> (略) </BODY></HTML> となりました。ここで BODY 部に表示されているのは、 「あなたが要求したドキュメントはここにあるのでクリックしてね」 という web サーバが生成した文章ですので、正しい挙動だと思います。 |
あっそうそう、utf8 は実装してるんですよ、言い忘れました。 ソースを追ってくれてありがとうございます。 そうやって見るんですね〜 5.004_04 って for (0..100000) でメモリはじけませんか。 ぼくは例の BigInt の件もあるし、encoding の件もあるしで、 無批判に最新版を使うようにしています。 |
68userさん詳しい解説ありがとうございました。 正直、自分はネットワークに関する知識が低く、100%解説を 理解できたわけではないのですが、大雑把にですが理解しました。 (RFCも始めて閲覧しました) これからも色々と勉強させていただきたいと思います。 |
教えてください。 メモリ使用率が知りたいのです。Linuxではsysinfoというシステムコールを使って出せましたが、SolarisとHP-UXで出せません。 知ってる方がいましたら教えてください。 |