• 締切済み

KENTWEBのBASIC認証について

現在LINUXで自宅サーバーを立ち上げていて 今回KENTWEBさんのBASIC認証を導入することになり設定はすべて終り動作も 問題なく動いています。 しかし、少し強化したいと思い書き込んだしだいです。 SSIログのところに外部でも見れるようにしたいのです。 見れるようにすると言っても、HOSTやIPの表示は抜きで表示したいのです。 例えば、 member.datとpwlog.datをオープンして ID名を名前に変更し、 名前+アクセス時間をSSIで表示できたらと思います。 色々試してますが、中々うまくいきません 一応書いてみたソース乗せておきます。 自分でも見る限り足りなかったりおかしいと思います。 アドバイスよろしくお願いします。 動作結果は、pwlog.datを30行表示しています。 以下ソース # 会員ファイル # → 正確にフルパスを記述すること $memfile = '/member.dat'; # アクセスログファイル # → 正確にフルパスを記述すること $axsfile = '/pwlog.dat'; # アクセスログの最大数 $log_max = 300; open(IN,"$memfile") || &error("Open Error: $memfile"); while (<IN>) { ($id,$nam,$eml,$memo) = split(/<>/); if ($ENV{'REMOTE_USER'} eq $id) { $my_name = $nam; } } close(IN); # ログファイルの読み込み open(IN2,"$axsfile") || &error("Open Error: $axsfile"); @data = <IN2>; close(IN2); # ブラウザ情報 $agent = $ENV{'HTTP_USER_AGENT'}; $agent =~ s/&/&amp;/g; $agent =~ s/</&lt;/g; $agent =~ s/>/&gt;/g; $agent =~ s/"/&quot;/g; # ログ調整 while ($log_max <= @data) { pop(@data); } unshift(@data); print "Content-type: text/plain\n\n"; print " @data";

  • NOTOR
  • お礼率33% (4/12)
  • CGI
  • 回答数2
  • ありがとう数1

みんなの回答

noname#60065
noname#60065
回答No.2

#1です。 文中「Pearl」とあるのは、「Perl」の誤記です。 失礼しました。

NOTOR
質問者

補足

すみません 下で書き忘れたCGIです。 #!/usr/bin/perl # アクセスログの最大数 $log_max = 8; # 時間取得 $date = &get_time; # 外部用アクセスログファイル # → 正確にフルパスを記述すること $axsfile2 = '/home/httpd/user/pwlog2.dat'; # 会員ファイル # → 正確にフルパスを記述すること $memfile = '/home/httpd/user/member.dat'; sub get_time { # タイムゾーン設定 $ENV{'TZ'} = "JST-9"; local($min,$hour,$mday,$mon,$year) = (localtime(time))[1..5]; sprintf("%d/%d-%02d:%02d", $mon+1,$mday,$hour,$min); } open(IN,"$memfile") || &error("Open Error: $memfile"); while (<IN>) { ($id,$nam,$eml,$memo) = split(/<>/); if ($ENV{'REMOTE_USER'} eq $id) { $my_name = $nam; } } close(IN); # ログファイルの読み込み open(IN,"$axsfile2") || &error("Open Error: $axsfile2"); @data = <IN>; close(IN); # ログ調整 while ($log_max <= @data) { pop(@data); } unshift(@data,"$my_name<>$date<br>\n"); # 更新 open(OUT,">$axsfile2") || &error("Write Error: $axsfile2"); print OUT @data; close(OUT); print "Content-type: text/plain\n\n"; print "@data";

noname#60065
noname#60065
回答No.1

スクリプトをみると、$my_name に名前を代入しているようですが、その後 $my_name は使用されていないので、出力には影響がないと思います。とりあえずスクリプトの最後に、 print $my_name; と、一行付け加えて確認して見てはどうでしょうか。 参考サイトに、Pearl全般について参考になりそうなサイトを入れますので、良かったらご覧になってください。

参考URL:
http://www.tohoho-web.com/wwwperl.htm
NOTOR
質問者

補足

回答ありがとうございます。 この書き込みをした後に、自分なりに書いてみたところ 上記でg-curryさんが述べてるように出力さえしてませんでした。^^; なので、以下のように書き換えたんですが、ひとつ問題が起こりました。 1、$ENV{'REMOTE_USER'}は、認証ページ以外では使えないって事と 2、$ENV{'REMOTE_USER'}で、認証IDが習得されない場合は$my_nameが 空だということです。 そこで、考えたところ変数で、トップページから認証ページに(送る?) あげてから、認証ページにアクセスできた場合は、$ENV{'REMOTE_USER'} 取れるので、$my_nameのところに表示できる。 できなかった場合は、ログインしてないか、登録者じゃないって事なんで ゲストと表示させる。 ゲストは、1時間に同じホストはひとつしかログを取らないようにするなど してあげようかと思います。 けど、以上のやり方で使用と思うと、ログインしてない登録者までも、 ゲストとしてログを取ってしまいますので・・・ やはり、ベーシック認証では、無理でしょうか。

関連するQ&A

  • 全行読み込むには

    open( IN, "pass.dat" ) or die "Can't open pass.dat: $!"; $f_data = <IN>; close( IN ) or die "Can't close pass.dat: $!"; $f_data1 = $f_data; $f_data2 = $f_data; $f_data1 =~ s/<br>//g; $f_data2 =~ s/\S//g; open( OUT, ">log.dat" ) or die "Can't open log.dat: $!"; select OUT; print "$f_data1"; print "$f_data2"; select STDOUT; close( OUT ) or die "Can't close word.js: $!"; 上記スクリプトでは、pass.datの一行目しか読み込まれません。全行を読み込むためにはどのように書き換えればいいのでしょうか?宜しくお願いします。

    • ベストアンサー
    • Perl
  • CGI Perlでの認証について

    CGIにてログイン認証の処理を使用してみたく勉強がてら Perlにて作成しているのですが、どうもうまくいかない ので質問させてもらいます。 ID・パスワード保存用ファイルfile.datにあらかじめ 100<>p34z7 500<>332bdz といった感じで入力してまして、 ログインボタンを押したときに &login_chk($post{'id'},$post{'pwd'}); (URIデコード処理して$post{'id'},$post{'pwd'}を取得します) を実行して下記サブルーチンを呼び出します。 sub login_chk { my ($in_id, $in_pass) = @_; my ($id, $pass); my $data; if (!open (IN, "./file.dat")) { &Error("ファイルが開けません"); } while ($data = <IN>) { ($id, $pass) = split(/<>/, $data); if ($in_id eq $id){ last; } } close(IN); unless ($in_pass eq $pass) { &Error("正しいID・パスワードを入力してください"); } } ※現状ファイルロックの処理はしてません。  パスワードの暗号化もしてません。 で、IDに100、パスワードにp34z7と入力してログインしようとするのですが 「正しいID・パスワードを入力してください」とエラーが出てきます。 当然500のときも同じくエラーでした。 どこが問題なのでしょうか?昨日から考えてずっとわからないのでご回答よろしくお願いします。

    • ベストアンサー
    • Perl
  • 二次元配列への格納

    ファイル名:log.dat は以下の構造をしています。 "Key-01"|"参照"|"P2"|"yamada" (\n\r)←改行 "Key-02"|"書込"|"P5"|"minami" (\n\r)←改行 "Key-03"|"参照"|"P3"|"yamada" (\n\r)←改行 open(IN,"log.dat") || die "log.dat",": $!"; @log=<IN>; close(IN); で@logにデータを読み込んだ後、 foreach(@log){ $data = $_; $data =~ s/ //g; $data =~ s/\n//g; $data =~ s/\r//g; $data =~ s/"//g; @second =split(/\|/ , $data); <---(1) で配列@secondに格納するのですが、 この時、@secondを(\n\r)=改行で区切るように二次元配列にしたい のです。 @second = ( [ Key-01 , 参照 , P2 , yamada ] [ Key-02 , 書込 , P5 , minami ] [ Key-03 , 参照 , P3 , yamada ] ) 上記<---(1) の部分をどのように変更すればいいでしょうか。

    • ベストアンサー
    • Perl
  • ApacheのBasic認証のログの取り方

    質問させて頂きます。 現在ホームページを作成しているのですが、 ホームページ内のあるページにアクセスする際にBasic認証をかけ、 こちらが発行するIDとパスワードを持っている人しかページを表示できないようにしたいと考えています。 そして、認証したときは時刻、ID、リモートアドレス等の情報のログを取りたいのですが、ログを取るには何が必要でしょうか? スクリプトとか必要なのでしょうか? はじめてBasic認証をやるので何もわからない状態です。 よろしくお願いします。

  • ログファイルの指定行に書込み

    open(IN,"$log") || &error("Open Error"); @data = <IN>; close(IN); while (100 <= @data) { pop(@data); } open(OUT,">$log") || &error("Write Error"); print OUT "$in{'id'}<>$in{'comment'}\n"; print OUT @data; close(OUT); ログにはID、時間、コメントが登録されています。 送信データの中に、ログに登録済みのIDがある場合には、そのIDのある行のみを書き換えたいのですが、方法がどうしてもわかりません。 $logに記録されるIDの順番は以下のようにランダムです。IDに登録される文字列は1からの数値のみです。 52<>コメント 120<>コメント 35<>コメント 8<>コメント 2<>コメント 19<>コメント 85<>コメント よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ディレクトリ全てのファイルを読み取るには?

    フリーのCGI掲示板を使ってます。ディレクトリ内に複数のログファイルがあるので、一括して編集・削除ができるように管理部分を改造したいのでアドバイスをお願いします。 一応、readdir関数でディレクトリ内にある全てのファイル名を取得でることは分かりましたが、open関数で全てのファイルを読み取らせる方法がわかりません。 open DIR "./log"; @files = readdir DIR; close DIR; #以下、オリジナルのソースです。 open(IN,"$logfile") || &error("Open Error: $logfile"); while (<IN>) { my ($no,$dat,$nam,$eml,$sub,$com,$url,$hos) = split(/<>/); #途中略 } close(IN);

    • ベストアンサー
    • Perl
  • Perlの省略可能な書き方

    open IN,'log.dat'; $_=<IN>; push(@a,$_); この3行を open IN,'log.dat'; push(@a,<IN>); このように2行に書き換えても文法上は問題ないですか?

    • ベストアンサー
    • CGI
  • python プログラミング vim

    #!/usr/bin/env python #vim: fileencoding=utf-8 from math import* import sys outfp=open('test.dat','w') outfq=open('ab.dat','w') for line in open('para.dat','r'): items=line.split('\t') s=2/float(items[0]) u=float(items[1])-5+log(s/100) outfp.write(str(s)) outfq.write(str(u)) outfp.close() outfq.close() ////para.dat//// 1 2 1 3 として、プログラムを実行したのですが、ファイルに出力した時に、 para.datの2列目(1 3)の計算した結果しか、ファイルに書き込まれてないのですが、 どうすれば、すべて反映されて、出力ファイルに結果が出せるのでしょうか。 よろしくお願いします。

  • Apache2.2.9でのBasic認証について

    当方Apache2.2.9にてWebサーバーを構築しております。 実験にてBasic認証を試してみたいのですが、どうしても うまくいきません。 /home/server/.htpasswdを作って /var/www/html/に.htaccessを設置しております。 .htaccessの内容は以下の通りです。 AuthType Basic AuthName "AUTHORIZED AREA" AuthUserFile /home/server/.htpasswd Require valid-user /var/www/html/以下のHTMLにブラウザからアクセスすると 認証プロンプトは表示されるのですが、認証されません。 USERとPASSは絶対に間違っておりません。 エラーログを見てみたところ下記のログがありました。 (13)Permission denied: Could not open password しかし、/home/server/.htpasswdのパーミッションは604に 設定してあります。 何かおかしい点はございますでしょうか? どうか教えてください。

  • 指定行に書込み

    open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">dat.cgi" ); select OUT; print "document.open();\n"; print "document.write('"; foreach( @f_data ){ if( $i > 5 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1"; $i++; } print "');\n"; print "document.close();\n"; select STDOUT; close( OUT ); 上記スクリプトで、指定された行数、又は指定された場所でdat.cgiに 書き出したいのですが、どのように書けばよろしいのでしょうか? 例えば、 ・100行目に書き出す。 または、 ・指定された文字列の間に書き出す。 (例)<!--開始-->ここに書き出す。<!--終了--> このどちらかが出来ればいいのですが、上記スクリプトをどのように変更すれば可能になるでしょうか?お手数ですが、どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう