テキストファイルにログを書き込む処理の問題

このQ&Aのポイント
  • テキストファイルにログを書き込む処理で、ファイルの所有者と実行者の違いにより書き込みができない問題が発生しています。
  • Web上から実行される場合と/etc/aliasesから実行される場合で、ログの書き込みについて異なる結果が生じています。
  • aliasesで実行されるアカウントはどのようなものであり、この問題を回避する方法について情報をお探しです。
回答を見る
  • ベストアンサー

テキストファイルに書き込めない(ファイルの所有者と実行者の違いか?)

テキストファイルにログを書き込む以下の処理があります。 aaa.pl -------------------- open Log,">>aaa.txt"; print Log 'test'; close Log; Web上(アパッチ)からこのaaa.plを実行すると 正常に処理されて、aaa.txtに書き込まれます。 (aaa.txtのオーナーはwww。属性は644) それとは別に、/etc/aliasesに 特定のメールアカウントにメールが送られた時に このaaa.plが実行されるように設定しているのですが mail_address: "|/ccc/aaa.pl" (パスは適当ですが、実際にはあっています) こちらからaaa.plが処理させても、 aaa.txtに文字列が書き込まれなくて困っています。 open Log,">>aaa.txt"; chmod 666,"aaa.txt"; ... とPerl側でパーミッションを変更させようとしても うまく変更されていません。処理もされません。 おそらくaliasesに設定したPerlの実行権限者が ファイルの所有者(この場合www)と異なる為 書き込みもchmodもうまくいかないと思うのです。 aliasesで実行させるアカウントは いったいどのようなアカウントなのでしょうか(binユーザーとか?) また、これを回避するにはどのようにすればよろしいでしょうか? どなたかご存知の方、どうぞよろしくお願い致します。

  • Perl
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.2

>読んでいるのはsendmailになります。 >となると、どのアカウントになるのでしょうか? 設定によっても変わりますが、おそらくbinだと思います。 (すいません。私はqmail派なのでsendmailはよくわかりません) >aaa.txtが格納してあるフォルダのパーミッションが >770になってます(これは訳ありで変更不可) このパーミッションだとperlの実行自体行われていないかもしれません。 perlの実行されているuidを調べる場合、$<でも良いですが、今回の場合実際にperlが起動されているかどうかも不明なので、sleep (180)とかして別プロセスからps -axすると良いと思います。 >ということは、Perlプログラムは「その他」扱い >になっているのでしょうか?(なぜ?) もしかしたらそうかも。 (ディレクトリの所有者でも所有者のグループにも属していない場合、「その他」扱いになります)

majikaru
質問者

お礼

ご回答ありがとうございます。 とても参考になりました。

その他の回答 (1)

  • zebedeer
  • ベストアンサー率66% (80/121)
回答No.1

>aliasesで実行させるアカウントは >いったいどのようなアカウントなのでしょうか(binユーザーとか?) /etc/aliasesを何が読んでいるかで実行uidは変わります。 (sendmailはもちろんのこと、qmailでも読むように設定できたはずだし、postfixでも使ったはず) >また、これを回避するにはどのようにすればよろしいでしょうか? aaa.txtのパーミッションを666にすれば良いのでは? もし、644で行いたい場合、/etc/aliases内でsu - www /ccc/aaa.plするとか。 (aliasesがrootで実行されてれば644でも問題ないはずだからこれはだめかも)

majikaru
質問者

補足

ご返答ありがとうございます。 >/etc/aliasesを何が読んでいるかで実行uidは変わります。 読んでいるのはsendmailになります。 となると、どのアカウントになるのでしょうか? >aaa.txtのパーミッションを666にすれば良いのでは? パーミッション666に変えて試してみましたがダメでした。 aaa.txtは666ですが、 aaa.txtが格納してあるフォルダのパーミッションが 770になってます(これは訳ありで変更不可) ということは、Perlプログラムは「その他」扱い になっているのでしょうか?(なぜ?) 重ねての質問で申し訳ございませんが、 どうぞよろしくお願い致します。

関連するQ&A

  • sendmail使用し、メールが送られた時にPerl実行するようにaliasesファイルを修正したが・・・

    こんにちは。 特定のアカウントにメールが送られた時に Perlが実行されるような実装をしていますが、うまく処理されていないようです。 aliases ファイルに、 aaa: "|/usr/local/bin/test.pl" と加えました。 test.plには、ファイルに文字列を記述するだけの処理になってます。 aaaにメールを送ったのですが、test.plが処理されてません。 perl test.pl とプロンプトで実行すると、正しく処理されているので test.plの記述が悪いわけではなさそうです。 aliasesファイルの記述が悪いのかと思いましたが、 仮に記述ミスしたtest.plにしてから aaaにメールを送ってみると メールデーモンが返ってきて、記述ミスした部分をエラー表示してくれます。 test.plは正しく呼び出されているようなのです。 これ以上、何が悪くて、どうすればこれ以上原因を判明することができるのか まったくわかりません。 どなたか心当たりのある方、ぜひともご教授ください。 よろしくお願い致します。

  • /etc/aliasesに設定した、sendmailからのプログラム処理はどのアカウントで行われる?

    こんにちは。 タイトルの通りですが、 /etc/aliasesに設定した、sendmailに登録されたメールアカウントに メールが届くと設定したPerlスクリプトが実行されるようにしました。 mail_address: "|/aaa/aaa.pl" (aaa.plはテキストファイルに文字列を記入するだけ。 パスは適当ですが、実際にはあっています) こちらからaaa.plが処理されても、 ある特定のフォルダ(/bbb/test.txt)のテキストファイルに対して 文字列が書き込まれなくて困っています。 そのプログラム自体は正しく動作しています。 ここで例をあげているtest.txtのパーミッションは777にしてあります。 しかし、そのフォルダ/bbbのパーミッションは770になってまして、 これが書込みをさせない原因なのかな?と。 別のフォルダにあるtest.txt(そのフォルダのパーミッションは775)は 正常に動作するので間違いないとは思います。 /etc/aliasesに設定した、sendmailから起動させる処理の アカウントがなんなのかよくわからないのです。 おそらくここでいう「その他」扱いになっているとは思うのですが、 それはそういうものなのでしょうか? /etc/aliasesはrootで設定するため、そこで設定した処理は rootに近いアカウントで起動されるものだと思っていたのですが…。 ちょっとわかりずらい文章で申し訳ないですが、 どなたかぜひともご教授ください。

  • chmod()で所有者が変わってしまう

    Perlでは新規ファイルを作成してchmod()で属性を変更しても所有者は変わりませんでした。 FFFTPでは、 □/public_html/testdir 名前      属性   所有者 logwrite.cgi  705   1234 log200402.log  700   1234 となるのですが、PHPではFFFTPが、 □/public_html/testdir 名前      属性   所有者 logwrite.php  705   1234 log200402.log  700   99 のように、所有者が変わってしまうのです。 PerlからPHPの移植がうまくいっていないのです。 logwrite.phpのその処理の部分は $fp = fopen($logfile, "w"); fwrite($fp, $logdata); fclose($fp); chmod($logfile, 0700); です。このあとPHPで所有者を99から1234に変更できれば よいのですが、方法が分かりません。 そうでなくとも、所有者が1234のままで chmod($logfile, 0700);が完了できれば問題ありません。 Perlではchmod()で所有者が変わらなかったのに、 PHPではchmod()によって所有者が変わってしまって 元の所有者に戻せなくて困っています。

    • 締切済み
    • PHP
  • なぜか実行されません

    Win2003サーバーに「test」フォルダがあり、その中に「test.pl」という Perlのファイルがあります。 (testフォルダのアクセス権設定は完了済み) WinXP pro2 のクライアントPCのCドライブ直下に(ActiveState ActivePerl5.6)がインストールされています。 バッチファイルを作成し、クライアントPCのPerlを使用してtest.plを動作させたいのですが、「cannot open」と表記されてしまいます。 作ったバッチファイルは以下のとおりです。 test1.bat------------------------------------------------- "C:\Perl\bin\perl.exe" "\\@@@.@@@.@@@.@@@\test\test.pl" (@には数字が入りサーバーのIPアドレスです) ---------------------------------------------------------- test2.bat------------------------------------------------- "C:\Perl\bin\perl.exe" "Z:\test\test.pl" (ネットワークドライブをZドライブとしてマウント状態で実行) ---------------------------------------------------------- 1と2両方とも同じエラーが表示され実行されません。 testフォルダにtest.textを作成しwordpadで、開くようにした ========================================================== "C:\Program Files\Windows NT\Accessories\wordpad.exe" "Z:\test\test.txt" ========================================================== は、問題なく実行できているため、アクセス権限ではじかれているとも思えないのです。 (test.txt)(test.pl)ともにまったく同じアクセス権限設定がされています。 いったい何が原因なのでしょうか? 解決方法がございましたらご教示ください。 よろしくお願いいたします

  • ファイル操作

    ファイル操作について、プログラムがうまくできないので教えていただきたいです。 作っているのは、txtファイルを読み込んで、置換の処理をした結果を、test.txtファイルに書き出したいのです。 質問なのですが、ここでtest.txtはあらかじめ作成しておかなければならないのでしょうか。自動で作成させる方法があれば、教えてください。 -----------------data.txt------------------------ rabbitうさぎappleりんごcoffeeコーヒー ------------------------------------------------ -----------------apple.pl----------------------- open(FILEHANDLE,"data.txt"); while($str=<FILEHANDLE>){ $str=~s/apple/青りんご/; } close(FILEHANDLE); open(FILEHANDLE,"test.txt"); print FILEHANDLE $str; close(FILEHANDLE); ------------------------------------------------- また、コマンドプロンプトの結果は次のとおりです。 C:\Perl>perl -cw apple.pl apple.pl syntax OK C:\Perl>perl apple.pl C:\Perl> Perl初心者なため、詳しく教えていただけると助かります。よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlでテキストファイル読み込み

    基本的な質問ですみません。 サーバ上のテキストファイルを読み込んで ローカルのテキストファイルに書き込むというだけなのですが 何度やってもできません。 以下プログラムですが #!usr/bin/perl open(IN,"http://*****/***/***.txt"); $file = <IN>; close(IN); open(OUT,"> a.txt"); print(OUT "$file"); close(OUT); サーバのアドレスは、URLうってみて見れたのでhttp://***(以下略)であってると思います。 サーバのテキストにはchmodで777と権限を与えました。 プログラムに問題あるのでしょうか。 この場合考えられる原因を教えてください。

    • ベストアンサー
    • Perl
  • .forwardで実行されない?

    届いたメールをテキストに書き出したいのですが、思うように動作せず、手詰まりになりました。 [環境] VineLinux 4.2 postfix perl5.8 [.forward] "|exec /home/test/test.pl" [test.pl] #!/usr/bin/perl open(OUT,"> test.txt"); while(<STDIN>){ print OUT $_; } close(OUT); exit; [パーミッション] .forward 644 test.pl 755 test.txt 666 testディレクトリ 755 postfixのログには delivered to command: exec /home/test/entry.pl となっており、動作してると思うのですが、test.txtには何も書き出されません。 考えられる原因は何でしょうか? 暇なときで構わないので、教えていただけたら幸いです。

    • ベストアンサー
    • Perl
  • javascriptでのファイル更新について

    prototype.jsのAjax.Updaterでファイルを閲覧することはできたのですが、 ファイルを更新する方法が分かりません。 javascriptでファイルを更新することは不可能なのでしょうか。 perlで言うところの ============================== require "./cgi-lib.pl"; &ReadParse(); open(FH, ">> aaa.txt"); print FH $in{'bbb'}; close(FH); ============================== みたいな処理がしたいです。 環境の制約によりcgiが使えないのでなんとかjavascriptで実現できないかと考えています。

  • テキストファイルクリア .net2005 VB

    VB初心者です。よろしくお願いたします。 現在 .net2005 VBでPL/SQLの処理結果を「log.txt」に出力しておりますが、処理をするたびに、テキストファイルの下へどんどん追加されます。 そこで、画面上からログクリアボタンを押下すると、「log.txt」の中身が初期化されるようにしたいと考えて降ります。 どうすればよいか、サンプルのロジックを教えて頂けませんでしょうか?

  • perl リモートでコマンド実行結果取得

    perl 初心者です。 Perlでリモートログイン後grep結果を取得する方法で分からないことがあり質問しました。 rootユーザで実行するPPP.plスクリプト内で、他のサーバにsshでログイン後grepの結果を取得しようと考えていますが、rootユーザでPPP.plを実行しスクリプト内でsshを実行するとパスワードを聞かれてしまいます。 そこで、他のユーザAAAでPPP.plを実行し、sshを実行するとパスワードは聞かれない設定になっているそうです。(詳細は分かりませんが) そこで、実現方法について下記のように考えていますが、他の方法、sshのオプション等他の考えが、あれば教えてください。確認する環境がなくて実行していませんのであっているかも分かりません。 PPP.pl実行サーバ:server1 ssh先のサーバ:server2 PPP.plの実行ユーザ:ROOT パスワードが聞かれないserver1のユーザ:AAA server2のログインユーザ:AAA ※PPP.plの実行ユーザはrootから変更はできません --------------------------------------- #ユーザAAAに変更 system("su - AAA"); #server2のgrep結果取得 my @rtn_grep = `ssh -l AAA server2 grep test /var/log/msg.log`; if($? != 0){ exit; } ## grep結果を参照 XXXX #rootユーザに戻る system("exit"); -------------------------------- 以上です。宜しくお願い致します。

    • ベストアンサー
    • Perl

専門家に質問してみよう