>>2348 ふくし > とかいって、<iostream> だけの書き方もあるんですね。 C++ はよく知りませんが、namespace 対応の C++ コンパイラならば .h を省略できるはずです。 gcc は長らく namespace への対応がダメダメでしたが、少なくとも gcc-2.95.3 では OK です。 で、iostream はヘッダファイルです。libstdc++ はライブラリです。 ヘッダファイルがないと言われているのにライブラリのことを気に するのは間違っています。 >>2349 ゆき > これらは、usr/local/bin/libioというフォルダの中にありました。 それはライブラリのソースでしょう。それが /usr/local/bin/ に あるのはおかしいです。 > コンパイル時は gcc -lstdc++ -o hello hellocpp.cpp というふうに > しろと言っています -lstdc++ は不要です。C で -lc が不要なのと同じで、わざわざ指定 しなくても勝手に libstdc++ はリンクされます (指定してもいいですが)。 > -lstdc++は、どうやら/usr/local/bin/libstdc++を見に行くように > 指定しているようなのですが どうしてそのように判断しましたか? 普通 -lhoge とすると /usr/lib/libhoge* というファイルがリンクされます。 手もとの環境を見てみると、ヘッダファイルとライブラリは以下の 場所に置いてありますので、参考にしてみて下さい。 Solaris8 + gcc-2.95.2 /opt/sfw/include/g++-3/iostream /opt/sfw/include/g++-3/iostream.h /opt/sfw/lib/libstdc++.a.2.10.0 /opt/sfw/lib/libstdc++.so.2.10.0 FreeBSD + gcc-2.95.2 /usr/include/g++/iostream /usr/include/g++/iostream.h /usr/lib/libstdc++.a /usr/lib/libstdc++.so Linux + gcc-2.95.2 /usr/include/g++-3/iostream /usr/include/g++-3/iostream.h /usr/lib/libstdc++-libc6.1-2.a.3 /usr/lib/libstdc++-libc6.1-2.so.3 結局のところ、うまくインストールできていないのではないかと思います。 |
はじめまして。yamaと申します。 Perlで困っています。 STDOUTの初期化の方法がわかりません。 print文にてhtmlを出力していますが、途中でエラーが発生 した場合、出力済みの情報を初期化し、エラーメセージを出力したい と考えています。 *STDOUT=""; としましたが、エラー表示以前の分も出力されます。 このようなことは不可能なのでしょうか。 プロバイダ環境はUNIXでApacheのサーバです。 なお、UNIX、Apache、Perlのバージョン 等詳しくは聞いていません。 |
>>2351 yama > このようなことは不可能なのでしょうか。 不可能です。stdout に出力したものは既に出力済かもしれませんし、 まだバッファに溜っているかもしれませんが、それをクリアする 方法はありません。出力済かどうかを判断する方法もありません。 # Java Servlet だとできるんですけどね。 というわけで、自前でバッファリングしましょう。 |
>>2352 68userさんへ お返事ありがとうございます。 「不可能」ですか。 ロジックを変更し、必要なチェックを先にするようにします。 今後ともよろしくご指導ください。 |
いつも、お世話になっています。ダウンロードについてなんですが、 .lzhのファイルをコンパイルすることは、UNIXではできるのでしょうか。 もしできるようであれば、ダウンロードの仕方を教えてください。 ちなみに、僕は「Solaris2.6」を使っています。お返事お願いします。 |
>2354 ゆうすけさん、はじめまして。 「lzh のファイルを UNIX でコンパイルする」 と言われると複数に解釈できて、 1)UNIX 上にある複数のファイルを固めて lzh の圧縮書庫を作る 2)どっかから持ってきた lzh の圧縮書庫を展開して、 その中の C とかのソースツリーをコンパイルする のどっちでしょう。 で、どっちもできます。ただし条件があって、お使いの Solaris に lha というプログラムがあるかどうかです。 コマンドラインで「lha」と打ち込んでみてください。 ある場合は使い方が表示され、ない場合は「ない」と起こられます。 で、ある場合はそれを使い、ない場合はインストールします。 で、使い方/インストールの仕方ですが、 とりあえず「lha」というコマンドの名前までわかったので、 あとは検索するなりしてがんばってみて、 どうしてもダメだったらまた聞いてください。 そのとき上の1)なのか2)なのかそれ以外なのかも教えてください。 >2350 68userさん、フォローありがとうございます。 ていうかいつもご苦労様です。 ちょっとでも負担を軽減しようとがんばってみたんですが 役に立たず、申し訳ありません ;;; |
>>2350 68userさんへ お返事ありがとうございました。下記2349の中で、私は勘違いな発言を していたようです。 >-lstdc++は、どうやら/usr/local/bin/libstdc++を見に行くように >指定しているようなのですが とありますが、違いますよね。libstdc++の中の、libstdc++.aという ライブラリファイルを見に行ってるということですね。ということは、 ---------------------------------------------------- hellocpp.cpp:1: iostream: No such file or directory hellocpp.cpp:2: string: No such file or directory ---------------------------------------------------- と言うエラーで見に行っているインクルードファイルは、自動的にリンク されなければならないということでしょうか。私の行ったインストールは どうもおかしいような気がしてきました。 ちなみに、こちらの環境は以下のようになっていました。 /usr/local/bin/libstdc++/iostream /usr/local/bin/libio/iostream.h /usr/local/bin/libstdc++/libstdc++.a libstdc++.so*は検索しても無いような状況でした。やはり再インストール をしてみようと思いますが、上記フォルダ階層はそもそも間違いで、 正しいインストール先というのは、インストール時に指定できるように なっているものなのでしょうか?何度も申し訳ありませんが、よければ その辺りのことを詳しくお教え願えませんでしょうか? よろしくお願い致します。 |
>>2356 ゆき > libstdc++の中の、libstdc++.aというライブラリファイルを見に行ってる > ということですね。 インクルードとリンクは全く別物です。インクルードファイルと ライブラリには何の関係もありません。 > 自動的にリンクされなければならないということでしょうか。 インクルードファイルはリンクするものではなく、インクルードする ものです。 -v を付けてコンパイルすると以下のようになります。 % g++ -v a.cpp Using builtin specs. gcc version 2.95.2 19991024 (release) /usr/libexec/cpp -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -Di386 -Dunix -D__FreeBSD__=4 -D__FreeBSD_cc_version=420000 -D__i386__ -D__unix__ -D__FreeBSD__=4 -D__FreeBSD_cc_version=420000 -D__i386 -D__unix -Acpu(i386) -Amachine(i386) -Asystem(unix) -Asystem(FreeBSD) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__ELF__ a.cpp /tmp/ccFhD943.ii GNU CPP version 2.95.2 19991024 (release) (i386 FreeBSD/ELF) #include "..." search starts here: #include <...> search starts here: ← ここ★ /usr/include/g++ ← ここ★ /usr/include ← ここ★ /usr/include ← ここ★ End of search list. The following default directories have been omitted from the search path: End of omitted list. /usr/libexec/cc1plus /tmp/ccFhD943.ii -quiet -dumpbase a.cc -version -o /tmp/cctFu943.s GNU C++ version 2.95.2 19991024 (release) (i386-unknown-freebsd) compiled by GNU C version 2.95.2 19991024 (release). /usr/libexec/elf/as -v -o /tmp/ccvXl943.o /tmp/cctFu943.s GNU assembler version 2.10.0 (i386-unknown-freebsd4) using BFD version 2.10.0 /usr/libexec/elf/ld -m elf_i386 -dynamic-linker /usr/libexec/ld-elf.so.1 /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtbegin.o -L/usr/libexec/elf -L/usr/libexec -L/usr/lib /tmp/ccvXl943.o -lstdc++ -lm /usr/lib/libgcc.a -lc /usr/lib/libgcc.a /usr/lib/crtend.o /usr/lib/crtn.o ★を付けた部分でインクルードファイルの取り込みが行われます。 この環境では、標準のインクルードファイルは /usr/include/g++、 /usr/include である、ということがわかります。そこにインクルード ファイルが置いてあれば何もエラーは起こらないはずです。 で、★の部分が終わったら初めてライブラリが出てくるわけで (ld がライブラリをリンクする)、★がうまくいかないのに ライブラリが云々と悩むのはおかしいです。 > /usr/local/bin/libstdc++/iostream > /usr/local/bin/libio/iostream.h > /usr/local/bin/libstdc++/libstdc++.a これはソースで、本来不要なファイルではないですか? /usr/local/bin/ に ファイルを展開して、そこで make したんじゃないかと想像しますが。 > 上記フォルダ階層はそもそも間違いで、 おそらく間違いでしょう。 > 正しいインストール先というのは、インストール時に指定できる > ようになっているものなのでしょうか? ソースからコンパイルしたなら、make 時に指定することもできますが、 普通はデフォルトのディレクトリにインストールします。 とりあえず package を利用してはどうですか? ftp://SunSITE.sut.ac.jp/pub/sun-info/Solaris/sparc/2.5/gcc-2.95.3-sol25-sparc-local.gz |
>>2337 aki おっと、見逃していました。 > /etc/groupのファイルのrootグループに追加するだけで > はいけないのでしょうか。 root グループにはなれますが、root にはなれません。 sudo など、setuid などで検索してみてください。 |
はじめましてkanjiと申します。コマンドのページを良く利用させて頂いています。感謝です。 UNIXの掲示板で、Linuxの質問をよろしいでしょうか。 本題の質問なのですが、初めてRedHat Linux7Jをインストールし、Webサーバの構築を考えています。 ですがPCMCIAのNWカードを認識してくれません。(3com 3c589Dを使用) そこでPCMCIAのドライバをインストールしようとpcmciacs.3.1.30.tar.gz を入手し、 #zcat pcmciacs.3.1.30.tar.gz | tar xvf - #cd pcmciacs.3.1.30.tar.gz #make config を行なうと、configエラーが出ます。ソースツリーが無いと言われます。 ソースツリーとはどのようなもので、どうやってインストールすれば良いのでしょうか。 よろしくお願い致します。 |
>>2359 kanji pcmciacs.3.1.30.tar.gz を展開した pcmciacs.3.1.30 以下のディレクトリ構造がソースツリーでは。 % cd pcmciacs.3.1.30.tar.gz ではなくて、 % cd pcmciacs.3.1.30 では? 〜.tar.gz は圧縮ファイルです。 cd は Change Directory です。 |
>>2360 ふくし > pcmciacs.3.1.30 以下のディレクトリ構造がソースツリーでは。 Linux も pcmcia も全然知りませんけど、 http://www.linux.or.jp/JF/JFdocs/PCMCIA-HOWTO-2.html などを見るに、カーネルソースを展開して、そこに pcmciacs*.tar.gz を 展開して、make config && make all && make install してモジュールを インストールすべきなのに、カーネルソースツリーが存在していないので エラーになってるんじゃないでしょうか。 >>2359 kanji > configエラーが出ます。 具体的にどういうエラーが出るかをちゃんと書けば、何が問題か わかる人にはわかるでしょう。 # 僕は残念ながら わからない人です。 |
>>2360 ふくし >>2361 68user すみません、わかりました。 ありがとうございました。 カーネルソースの展開が抜けているのでしょう。 早速やってみます。 |
初めまして、inabaと申します。 >>2359 kanji 3com だったら、ディフォルトで認識してくれると思いますが…。 ただ、network と pcmcia の起動順が逆なので失敗しているのかも。 # cd /etc/init.d # ./pcmcia restart # ./network restart と入力してみてください。 # ifconfig で、eth0 が認識されていませんか? 見当違いだったらすみません。 |
はじめまして、渡邊と申します。 ネットワークプログラムに興味があり、POP3 クライアントを作ってみよう(2)の POP3 クライアントサンプルを動作させてみました。 お聞きしたいのは、このままでちゃんとメールが表示されるプロバイダーと表示されないプロバイダーがあり、ニフティでは途中で固まってしまいます。認証までは動いているようで、LISTので止まっているようです。 どうすれば、いいか教えていただけませんか? |
>>2364 わたなべ > LISTので止まっているようです。 http://x68000.startshop.co.jp/~68user/net/sample/pop3-client.pl ですね? telnet で pop3 サーバと話してみるとどうなりますか? LIST 送信の後の while (<SOCKET>){ m/^\.\r\n$/ && last; を while (<SOCKET>){ print "[$_]"; m/^\.\r\n$/ && last; として実行すると何が表示されますか? Windows マシンで動かしていますか? (環境はちゃんと書きましょう) もしそうなら socket(SOCKET,PF_INET,SOCK_STREAM,0)|| die ... の後に binmode(SOCKET); という行を追加するとどうなりますか? |
はじめまして。いつも勉強させてもらっています。 >>2364 わたなべ > LISTので止まっているようです。 私も、pop3 クライアントを自作したときに、同じことを経験しました。 そのときは、pop3 サーバが NT で、 > +OK IMS POP3 Server 0.87 Ready というものだったのですが、 LIST の返事に、"." のみの行がなかったのです。 > +OK 0 message (0 octets) > 0 messages (0 octets) こんな感じでした。 |
>>2366 kuw >LIST の返事に、"." のみの行がなかったのです。 補足です。 その時は、LIST のかわりに STAT を使うようにして回避しました。 |
>>2365わたなべ 早速ありがとうございます。 試してみましたが、状況は変わりません。 環境は、Windows2000のクライアントで、サーバーはFreeBSDです。 telnet pop.nifty.com 110 USER ****** PASS ****** LIST とやる分には、NIFTYでもちゃんとリストされます。 print "[$_]";を追加してみると [+OK <**********> ][+OK ][+OK と表示されます。 print $_; にしてみると、 +OK <**********> +OK +OK で止まってしまいます。 いづれも、Ctrl+Cで終了しないと終わりません。 ところがiij4uでは、 +OK IIJ ************ +OK ************ +OK ************ +OK 5 messages**** と言う感じで正常に動いています。 尚、binmode(SOCKET);を追加してみても状況に変化はありません。 iij4uとNIFTYの差は、+OKの後にiij4uの方は文字があるのですが、NIFTYは何も無いことぐらいです。 att.ne.jpでも動きませんでした。 もちろんtelnetで直接タイプすればリストも問題ありません。 よろしくお願いします。 |
>>2364わたなべ kuwさんありがとうございます。 STATを使う件、本日世が明けたら試してみます。 ありがとうございます。 |
>>2366 kuw > LIST の返事に、"." のみの行がなかったのです。 >> +OK 0 message (0 octets) >> 0 messages (0 octets) なるほど。もう少し詳しくお聞かせ下さい。 それは mail box にメールがたまっていなかったときのみ . が ないのでしょうか? あるいはメールがたまっていても . がない のでしょうか? また、その POP3 サーバアプリケーションの名前は 何かわかりますか? ちなみに . をもってレスポンスの終了と見なしている根拠は http://ring.ip-kyoto.ad.jp/pub/doc/RFC/rfc1939.txt > When all lines of the response have been sent, a > final line is sent, consisting of a termination octet (decimal code > 046, ".") and a CRLF pair. > Examples: > C: LIST > S: +OK 2 messages (320 octets) > S: 1 120 > S: 2 200 > S: . です。 |
>>2370 68user >それは mail box にメールがたまっていなかったときのみ . が >ないのでしょうか? あるいはメールがたまっていても . がない >のでしょうか? メールがたまっていなかったときのみです。 メールがたまっているときは、 > +OK 1 messages (1146 octets) > 1 1146 > . となります。 >また、その POP3 サーバアプリケーションの名前は >何かわかりますか? EMWAC の IMS POP3 Server 0.87 です。 5, 6 年前に NT にインストールして以来、そのまま使っているので、 かなり古いものだと思います。 # この数年、NT を全くいじっていないので、最近の事情はわかりませんが・・・ >ちなみに . をもってレスポンスの終了と見なしている もちろん、これは正しい仕様だと思いますし、 同じ仕様の MUA やメールチェッカーも多いと思います。 |
>>2364わたなべ おはようございます。 昨日の続きですが、下記のようシンプルにしてテストしてみましたが、状況に変化はありませんでした。 よろしく御願いします。 --------------------------------------------- print SOCKET "USER $username\r\n"; print SOCKET "PASS $passwd\r\n"; print SOCKET "LIST\r\n"; while (<SOCKET>){ m/^\.\r\n$/ && last; print $_; } print SOCKET "QUIT\r\n"; --------------------------------------------- 上記の結果 ■AT&Tに接続した場合 +OK <283**.10082***86@mail.att.ne.jp> +OK +OK (ここで止まってしまうので Ctrl+C) ^C % ■iij4uに接続した場合 +OK IIJ POP3 Server (**.iij4u.or.jp) starting. <128**.1008***94@**.iij4u.or.jp> +OK Password required: ******@**.iij4u.or.jp +OK ******@**.iij4u.or.jp has 2 messages (2182 octets) +OK 2 messages (2182 octets) % ------------------------------------------------------------------------------- ■telnetでAT&Tに接続した場合 telnet ***.att.ne.jp 110 +OK <283**.10082***86@mail.att.ne.jp> USER ******** +OK PASS ******** +OK LIST +OK 1 958 2 960 . QUIT +OK ■telnetでiij4uに接続した場合 telnet **.iij4u.or.jp 110 +OK IIJ POP3 Server (**.iij4u.or.jp) starting. <128**.1008***94@**.iij4u.or.jp> USER ******** +OK Password required: ******@**.iij4u.or.jp PASS ******** +OK ******@**.iij4u.or.jp has 2 messages (2182 octets) LIST +OK 2 messages (2182 octets) 1 1090 2 1092 . QUIT +OK IIJ POP3 Server (w/mdir) (m-**.iij4u.or.jp) signing off |
>>2371 kuw ありがとうございます。ということは、その POP3 サーバのバグと 判断してもよいようですね。 >>2372 わたなべ では、残るは改行コードくらいですかね。 select(SOCKET); $|=1; select(STDOUT); $|=1; # 標準出力のバッファリングも OFF print SOCKET "USER $username\r\n"; print SOCKET "PASS $passwd\r\n"; print SOCKET "LIST\r\n"; while (sysread(SOCKET, $_, 1) ){ # read(2) を使って読む。 printf("$_ [%02X] ", unpack('c',$_)); } print SOCKET "QUIT\r\n"; を試して下さい。 |
>>2373わたなべ 試してみました。 +[2B] O [4F] K [20] ・・・・・・ [3E] [0D] + [2B] 0 [4F] K [4B] [20] [0D] + [2B] 0 [4F] K [4B] [20] [OA] で止まります。 NIFTYもAT&Tもこうした現象なのですが解決方法は無いものでしょうか? |
>>2374 わたなべ 接続時のリプライは +OK....\r USER に対するリプライは +OK \r PASS に対するリプライは +OK \n という変なサーバであることがわかります。 # このサーバは RFC1939 に準拠していないと思います。このサーバ # アプリの名前を教えていただけますか。 で、\r や \n だけでも行末と見なすように、 m/^\.\r\n$/ && last; を m/^\.(\r\n|\r|\n)$/ && last; として下さい (*A)。 で、これだけの対処では多分挙動は変わらないでしょう。 > [OA] で止まります。 ということは、相手が LIST に対するリプライをしていない、 つまり「LIST を受け取ったと解釈していない」ということなので、 やはり SOCKET がテキストモードになっており、 print SOCKET "LIST\r\n"; が print SOCKET "LIST\r\r\n"; となって送信されているのではないかと推測します。 *A の変更を行った上で、再度 binmode(SOCKET) を挿入してみて下さい。 # Windows には詳しくないのですが、これでよいんでしたっけ?>どなたか |
>>2375わたなべ 試してみましたが、状況は変わりませんでした。 AT&TにPOP3のアプリケーションを確認したところ、qmailだそうです。 サーバーのOSは、教えてくれませんでした。 よろしく御願いします。 |
初めまして。初めてなのに、こんな事を書くのはあつかましいとも思うんですけど、どうにもならないのでフ゜ロク゛ラムを教えて欲しいんです。 実は、課題がでたんですけど分からないので。 内容ですが Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、他のファイル(trans.c)に書き出す。 と言う物です。 それで、 #include <stdio.h> #include <stdlib.h> main(int argc, chr*argv[]) { int i; FILE *fin; char ss[256]; if(fin=fopen("sourse","r") == NULL){ printf("オーフ゜ン出来ない.\n"); exit(1); } char( までは出来ました。それから先が全くわかりませんので、宜しくお願いします! |
>>2373 68user >その POP3 サーバのバグ その通りです。 しかも、今回の件には、まるで関係ない話みたいですね。失礼しました。 >>2377 ARGUN >Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、他のファイル(trans.c)に書き出す。 ならば、 cat sourse.c | tr a-z A-Z > trans.c で良いのでは? |
>>2376 わたなべ > 試してみましたが、状況は変わりませんでした。 ほほぅ、そうですか。それは困りましたね。 > qmailだそうです。 qmail 付属の qmail-pop3d かな? djb モノがそんな挙動を するのはあまり考えにくいですが、telnet ではできている のですから、怪しいのは改行コードです。 現在は sysread で読んでいるのですから、受け取ったデータは 即座に表示されるはずです。ということは、何も表示されない= 送ったリクエストが正しく解釈されていないということなので、 print SOCKET "LIST\r\n"; を print SOCKET "LIST\n"; にしてみたり、いろいろ試してみて下さい。 どうにもならなかったら、試したスクリプトを見せて下さい。 >>2377 ARGUN > Cのフ゜ロク゛ラムファイル(sourse.c)の英小文字をすべて英大文字に変換し、 > 他のファイル(trans.c)に書き出す。 まずは、sourse.c の内容を trans.c にコピーするところから やってみては。 |
>>2364 わたなべ > LISTので止まっているようです。 うちのサーバが qmail + vpopmail だったのでテストしてみたところ 同様の現象が再現しました。 うちの場合 print SOCKET "LIST\r\n"; の直前の行に sleep 1; を挿入したらうまく動きましたので 試してみてはいかかでしょう。 |
>>2380わたなべ /tkさんのアドバイスどおりに sleep 1; を入れたら無事に動きました。 本当に有り難うございました。 大変お騒がせしましたが、これで落ち着いて眠れます。 今後ともよろしく御願いします。 |
68userさん。Kuwさん。有難うございます。 でも、長く入院してたせいで冗談抜きで全く分からないんです。 コピーってどうやるんですか? 甘えだとは思うのですが、迷惑でしょうがプログラム載せて貰いたいのですがおねがいします。聞けるような仲間がいないので。 |
>>2382 ARGUN > プログラム載せて貰いたい --- a2A.c ここから --- main () { system("tr a-z A-Z < sourse.c > trans.c"); } --- a2A.c ここまで --- a2A.c をコンパイルしてできた実行ファイルを、 sourse.c と同じディレクトリにコピーして実行してみてください。 運が良ければ、お望みの trans.c が作成されます。 とりあえず、課題はこれで良いとして、本気でプログラムの勉強を したいのならば、68user さんのアドバイスを参考にがんばってください。 あとは、 >>2230 68user > - 課題だからといって、問題をそのまま掲示板に書き込んでも反感を買うだけ、 > ということを書き込む前に推測できるようになる。 > - 仮に課題だとしても、そうは見えないようにうまくカムフラージュ > できるような文章力を身につける。努力しているという姿勢を > アピールする。 という金言も参考にされると良いでしょう。 |
>>2382 ARGUN google で「C言語 ファイル コピー」などと検索すれば、 サンプルプログラムなんてたくさん見付かります。 「C言語 小文字」だってたくさん見付かります。 http://pc.2ch.net/test/read.cgi/tech/1007902384/l50 で質問するのもよいでしょう。 ここで回答をもらえることを期待するよりもそっちの方が早いです。 >>2380 /tk > sleep 1; うーむ、改行コードは大外しでしたか。ということはその POP サーバは リクエストを 1行だけ読んでいるのではなく、select か何かでバッファに たまっているリクエストを全て解釈しようとしていた、ということですかね? 本来 USER 送って +OK を受け取って、PASS 送って +OK を受け取って、その後 LIST を送らねばならないところを、一気に USER、PASS、LIST を送って、その後 リプライを受け取るという手抜きをしていたからまずかった…と。 |
こんにちは。 環境は OSはSolaris 2.6、printerはEPSON LP8200PS2(PSプリンタ)です。 質問は、 lpコマンドで印刷用紙のサイズを指定したいのです。 HELPなどを見てもそれらしきoptionがないのですが、用紙サイズを A4とかB4とかに任意に設定するoptionはありませんか? よろしくおねがいします |
はじめまして。最近cgiの勉強をはじめたんですが、なかなかうまくいきま せん。 さっそく質問ですがローカルでcgiの動かし方がわからないんです。一通り 関連サイトを回ってみたのですがどうしても駄目なんです。例えば hello-worldを実行すると #!C:/Perl/bin/perl print "Content-type: text/html\n\n; print ""; print "Hello world.; print "; こうなってしまうんです。プロバイダがcgiの使用を許可してないので それが原因なのでしょうか?もしそうならなにか方法を教えてください。 よろしくお願いします。 |
ちなみに環境は windows98,internetexplorer5,プロバイダはocnです。 よろしくお願いします |
>>2386 cgi超初心者 >プロバイダがcgiの使用を許可してない のは全く関係ありませんので安心してください。 ローカルでCGIの動作確認をする方法を初心者向けに説明したサイトを紹介しておきます。 http://members.tripod.com/~tyanko/s_mokuji.html |
>>2385 hiro lp -f で できませんでしたっけ。 |
つかぬ事をお伺いしますが、perlで <+ でファイルオープン時に、開こうとする ファイルが存在しないとエラーとなりますが、以下の様な処理をしました。 が、どう見てもカッコ悪い(笑)のでこんなケースにはどんな処理をしているか お聞きしたいのですが・・・ if(!-e $dat_file){# 存在しない時に作成 if(!open(DAT, ">$dat_file")) { &error('オープンエラー', "データファイルの生成に失敗しました。[$dat_file]");} close(DAT); } #改めて開きなおし if(!open(DAT, "+<$dat_file")) { &error('オープンエラー', "データファイルのオープンに失敗しました。(1)");} while(<DAT>){ chomp; push(@record, $_); } |
>>2390 スナフキン open(DAT, "+<$dat_file") || open(DAT "+>$dat_file") || &error('..'); while(<DAT>){ .. } ってのはどうでしょうね。 あと、perlopentut(1) に参考になることが書いてあるかも (書いてないかも) しれません。 |
ウチのマシンの perl はバージョンが古く(5.004_04)なので perlopentut の情報は見つけられませんでした。 しかしキーワードを検索するといろいろと情報を得る事が出来ました。 if(!open〜 は自分なりの書式なので良く使っていましたが、perlで 杓子定規に覚える事にはあまり意味が無いですね(笑) いままで使った事の無い sysopen もいろいろ試してみます。 的確なキーワードありがとうございます。 参考になったURL http://www.wingworld.co.jp/forum/cgi/messages/1931.html う〜んバージョンを新しくしなければ・・・ |
>>2384 68user > select か何かでバッファに たまっているリクエストを > 全て解釈しようとしていた、ということですかね? この辺の仕様(というか実態)は知りませんが サーバにどのようなリクエストが実際に渡ったのかを 調べるのが、原因究明の早道となるような気がします。 # 実際どのようにすれば, それを調べられるかは分かっていません。 今回の件に関しては, なんとなく > 一気に USER、PASS、LIST を送って、その後 リプライを受け取る のが原因かな。 と特に根拠も無くアタリをつけてテストをしました。 別に sleep である必要は全然無いのですが 個別にリプライを受けて -ERR だったら再入力な スクリプトを書くの面倒だったので… (あと環境が Windows でしたので) >>2390 スナフキン > こんなケースにはどんな処理をしているか 実際にファイルが存在していないのですから オープンエラーで困る事は無いのだし むしろエラーになってくれなくては困るという 考え方をしています。 …↑ゴミレスですね。すみません。 |
UNIX プログラミング FAQが以下に移転しています。 http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_toc.html http://www.adl.nii.ac.jp/~moro/ 暫定っぽいですが(^^; |
Cクラス(HP UNIX版)ハードDiskをBクラス使用するとき何か 設定必要でしょうか ? 教えって下さい。 |
access.logは下記のようなもの。$1はエポックタイム (1970/1/1 00:00:00からの経過秒数)で$3はアクセスした端末のIP。 1009379443.542 20 192.168.16.17 TCP_HIT/200 1694 GET http://www.al4a.com/images/911.gif - NONE/- image/gif 1009379443.604 24 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif 1009379444.170 11683 192.168.16.17 TCP_REFRESH_HIT/200 59687 GET http://www.al4a.com/links.html - DIRECT/www.al4a.com text/html 1009379446.523 2979 192.168.16.17 TCP_HIT/000 11027 GET http://www.al4a.com/images/al4av2.jpg - NONE/- - 1009379446.526 1472 192.168.16.17 TCP_MISS/000 0 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com - 1009379447.026 63 192.168.16.17 TCP_HIT/200 15976 GET http://www.al4a.com/banners/gf1.gif - NONE/- image/gif 1009379447.364 16 192.168.16.17 TCP_HIT/200 10159 GET http://www.al4a.com/honor.gif - NONE/- image/gif 1009379448.331 967 192.168.16.17 TCP_MISS/200 9626 GET http://counter7.tracker.com/c5/id/0/104406 - DIRECT/counter7.tracker.com image/gif 1009379449.997 1504 192.168.16.17 TCP_HIT/200 20456 GET http://www.pornleo.com/banner/pussy10-29.gif - NONE/- image/gif 1009379450.256 3056 192.168.16.17 TCP_HIT/200 15679 GET http://www.al4a.com/images/al4av2.jpg - NONE/- image/jpeg 1009379453.262 148 192.168.16.17 TCP_HIT/200 7049 GET http://www.al4a.com/banners/fc1.jpg - NONE/- image/jpeg 1009379453.301 38 192.168.16.17 TCP_HIT/200 9328 GET http://www.al4a.com/banners/am1.gif - NONE/- image/gif 1009379454.056 1963 192.168.16.17 TCP_HIT/200 21921 GET http://al4a.free6.com/free6.gif - NONE/- image/gif これを集計して date time user数 ---------------------- 2001/12/28 00:00 0 2001/12/28 00:30 0 2001/12/28 01:00 5 2001/12/28 01:30 6 のようにしたいのです。awkファイルは3つあり、それをshellに記述して 一括処理しようとしています。 #syukei.sh #!/bin/sh ./syukei1.awk access.log|./syukei2.awk|./syukei3.awk > file #syukei1.awk #!/bin/gawk -f { hour=strftime("%H",$1);minute=strftime("%M",$1);second=strftime("%S",$1) base=$1-(hour*3600+minute*60+second) for(i=1;i<=48;i++){ if((base+1800*(i-1) <= $1) && ($1 < base+1800*i)){ print strftime("%Y/%m/%d %H:%M",base+1800*(i-1)),$3,1 } } } #syukei2.awk #!/bin/gawk -f { sum[$2,$3] += $4 } END { for(item in sum){ split(item, t, SUBSEP ); printf("%s %s %s %d\n",$1,t[1],t[2],sum[item]); } } #suykei3.awk #!/bin/gawk -f { if(length($2) > 0){ kazu[$2] ++; } } END{ for(i in kazu){ print $1,i,kazu[i] } } といった感じです。syukei1.awkで 2001/12/28 00:00 192.168.1.2 1 2001/12/28 00:00 192.168.1.1 1(とりあえずエポックタイムを現在時刻に変換し、秒の項はprintしない。あとはIPaddressを取る) のように加工します。(最後の1は捏造したもの。後々この数をカウントするので) syukei2.awkで↑の$4を集計。 2001/12/28 00:00 192.168.1.2 5 2001/12/28 00:00 192.168.1.1 6 : 2001/12/28 00:30 192.168.1.1 2 2001/12/28 00:30 192.168.1.2 4 のように加工します。(userごとに30分刻みで何回アクセスしたか) 最後にsyukei3.awkで↑の$3を集計。 2001/12/28 00:00 2 2001/12/28 00:30 3 のようにdate time user数という形で出力したいんです。 ただ、ここで今問題になっているのが、例えば2001/12/28 01:00〜2001/12/28 01:30の間に一度もアクセスがなかった場合、 その行が表示されません。アクセスがない場合は2001/12/28 01:00 0 0のように表示したいのですが、 どのようにすればいいでしょうか。また、3つファイルがあるんですが、これを一まとめにすることって可能なんでしょうか。 長くなりましたが、ご教授宜しくお願いします。 |
あけましておめでとうございます。 今年もよろしくお願いします。 >>2396 hogehoge さん:はじめまして cronで30分に1回httpを叩くクライアントを作っておいて、 そいつ1回しかアクセスしなかったら0アクセス、 そいつも含めてn回アクセスがあったらn-1アクセスではだめですかねー。 |
あ…、明けましておめでとうございます。 ふくしさんはじめましてです。 今まではcronを使って30分ごとに集計をとる方法でした。 でも、処理に時間がやたらとかかってしまいまして。 それが1日48回もあるかと思ったら…。 それでプログラムの改善と一括処理に切り替えることにしたんですが。 どうにかならないもんですかね…。ふぅ。 |
>>2398 hogehoge さん:Perl ですいません。こんなんでできそうです。 要は、 ファイルの各レコードについて、 0:00〜0:30、0:30〜1:00、1:00〜1:30、、の各ゾーンに入っているか調べ、 そのゾーンに入っていたら ゾーン、IP アドレスをキーに持つ2次元ハッシュの値を1にし、 全件調べた後に各ゾーンごとにいくつ IP がたまっているかを出力しています。 ろくにテストしていませんがバグっていたらすみません。 #! perl -w use Time::Local; # timelocal 関数を使うために必要なモジュールの宣言 (undef,undef, undef, $mday, $mon, $year, undef, undef, undef) = localtime(time); # 今日が何日か $step = 30 * 60; # 30分刻み $next = timelocal(0, 0, 0, $mday, $mon, $year); # 今日の0時0分0秒の時刻(epoch からの秒数) $start = $next - 60 * 60 * 24; # 昨日の0時0分0秒の時刻 %result = (); while(<DATA>) { ($now, undef, $ip) = split; for ($from = $start; $from < $next; $from += $step) { # $from は計算開始の時刻 $to = $from + $step; # $to は計算終了の時刻 if ($from <= $now and $now < $to) { $result{$from}{$ip} = 1; } } } for ($from = $start; $from < $next; $from += $step) { $num = keys %{$result{$from}}; ($sec, $min, $hour, $mday, $mon, $year) = localtime($from); $year += 1900; $mon++; print "$year/$mon/$mday $hour:$min:$sec $num\n"; } |
すいません、<DATA> でなくて <STDIN> にして標準入力を渡すか、 ファイルハンドルをオープンしてつかってください。 テスト用のコードを修正しわすれました。 |
ふくしさんありがとうございます。 Perlをそのまま使うことができないのがとても残念ですが、 まだawkも始めたばっかりで、アルゴリズムの解釈なんかが 多々間違っていると思われ、とても参考にさせて頂きたいと思います。 なんとか、awkに変換、反映させてみたいと思います。 とりあえず、このスクリプトがうまくいったら、次は Perlをやってみたいと思っています。ありがとうございました。 また何かあったら教えて下さいね。 |
>>2401 hogehoge see http://pc.2ch.net/test/read.cgi/unix/1000303370/130-132n and http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse |
いつもお世話になります。 CGI.pm でファイルのアップロードをするときの質問です。 html で <html> <body> <pre> アップロードするファイルを指定してください。 ファイル名は半角英数字で、空白を含まないでください。 </pre> <form action="fileup.cgi" method="POST" ENCTYPE="multipart/form-data"> ファイル名:<input type="file" name="fname"><br> <hr> <input type="submit" value="OK"> </form> </body> </html> というフォームを作って、 #! perl -w # fileup.cgi use CGI; my($form) = new CGI; print $form->header("text/html"); my($filename) = $form->param('fname'); $filename =~ m|([^\\]+)$|; # Windows のフルパスから基底ファイル名を取り出す $newfile = "./gooddir/$1"; # gooddir の下に入れる。 open (OUTFILE,">$newfile") or die "Can't make serverside file because $!\n"; while ($bytesread = read($filename,$buffer,1024)) { print OUTFILE $buffer; } print <<EOD; <pre> アップロードが終了しました。ファイル「$filename」は $newfile としてアップロードされました。 </pre> EOD という CGI を呼び出すとうまくいくのですが、 同じ CGI を、呼び出し側のフォームも CGI.pm で作って #! perl -w use CGI; use strict; my $title = 'ファイルをアップロードしてください'; my $q = new CGI; print $q->header(); print $q->start_html(); print $q->start_form(-method=>'form', -action=>'./fileup2.cgi', -enqtype=>'multipart/form-data'); print $q->h2($title); print '変換するファイルを指定し、[実行] をクリックしてください。<br>', '(空白のあるファイル名、日本語のファイル名は避けてください)<br>', $q->filefield(-name=>"fname"), '<br>'x3; print $q->submit(-name=>'submit',-value=>'実行'); print $q->endform; print $q->end_html(); とやると、空ファイルが作成されるだけでうまくアップロードできません。 エラーログには何も出ません。 なにがおかしいのでしょうか? 何かおわかりでしたらご教示願います。 |
ん〜、 >>2403 ふくし > -method=>'form' post? > -enqtype=>'multipart/form-data' enctype? とか? |
>>2404 68user さん、本年もよろしくお願いします。 ん〜、ほんとにそれだけのことでした。;;; 恥の掻き初め(寒)ですね。 最初、-enctype を指定していなかったんです。 そうすると start_form がデフォルトで application/x-www-form-urlencoded を取るので 失敗していたようです。 (その場合 start_multipart_form を使えばデフォルトが multipart/form-data になるようですね) method も post がデフォルトなので書いていなかったのですが、 html と最大限あわせようと思って質問の直前に書いて、 それで失敗していたのでした。 ハッシュによる名前付け編集の渡しは、 存在しないキーを渡しても無視されるのはなんかわかりますけど、 存在するキーに定義されてない値を渡しても怒られないのは ちょっと CGI.pm が不便だなあと思いました。 いずれにしても、これらのケースでエラーを出して欲しいです。 (出す方法あったりして、、) とまれ、ありがとうございました&すいませんでした。 本年もよろしくです。 |
proxy サーバに接続後、 strcpy(request, "CONNECT www2.ggn.net:443 HTTP/1.1\r\n" "Host: www2.ggn.net\r\n" "\r\n"); write(s, request, strlen(request)); とする。そしたら proxy サーバが HTTP/1.0 200 Connection established(CRLF) (CRLF) などと返してくるので、 read_size = read(s, buf, BUF_LEN); write(1, buf, read_size); でレスポンスを読み取る (↑これは手抜き)。その後は SSL_load_error_strings(); して、普通におはなし。 >>2160 Nira では ERR_load_crypto_strings(); ERR_load_SSL_strings(); OpenSSL_add_all_algorithms(); を追加する必要がある、ということでしたが、FreeBSD 4.4-RELEASE では 付けても付けなくてもうまくいきました。 お仕事では、Windows+Borland C++ Builder 5.0 でやらなきゃ いけないのが欝です (C++ 知らんし、Windows でプログラムを 組んだことがないし)。HTTP 用モジュールは用意してあるみたい だけれど、使い方がさっぱりわからんなぁ。 >>2405 ふくし > 存在するキーに定義されてない値を渡しても怒られないのは > ちょっと CGI.pm が不便だなあと思いました。 perl 5.005_03 付属の CGI.pm を見る限りでは、エラー検出する 方法はないようですね。 > 本年もよろしくです。 こちらこそよろしくお願いします。 |
>>2406 68user う、一行目が欠けてしまって意味不明に。 一行目は 「お仕事で proxy サーバ経由の SSL 通信を行う必要があったので、メモメモ。」 でした。 |
UNIXを勉強したい人ってはじめは何をすれば良いか教えてください! ほんとにくだらない質問をしてすいませんが、おねがいします!! |
>>2394 Ka23 > UNIX プログラミング FAQが以下に移転しています。 遅くなりましたが反映しました。ありがとうございました。 >>2408 ぶちお > UNIXを勉強したい人ってはじめは何をすれば良いか教えてください! 本屋に行ってインストール記事の載っている雑誌か、 インストール本を買うか、あるいは Turbo Linux とかの 商品 (1万程度) を買うのがいいんじゃないですかね。 その後はネット環境を整えたり、プログラミングしたり 好きなことをすると。 |
68userさんありがとうございました!!助かりました!また質問するときがあると思いますがそのときはよろしくおねがいします!! |
こんにちは。 私はWindowsにActivePerlを入れてCGIやっています。 今回、PPMを使おうと思って、DOS窓でppmと入力したら、 下のようなメッセージが出てきました。 Failed to load PPM_DAT file Can't use an undefined value as a SCALAR reference at C:/Perl/site/lib/PPM.pm line 1586, <DATA> line 36. なんかエラーが出てるようなのですが、PPM.pmというのはいじった 覚えがないし、他のファイルもいじった覚えはなし、上のエラーが 何を意味するのかよく分からないし、Googleなどで検索かけてもみ たのですが、同じ様な事例は見つからず困っています。 どなたか分かる方いましたら、どうすればいいのか教えてください。 お願いします。 Win98,ActivePerl5.6.0(Binary build 623) |
>>2411 ぶぶ さん、こんばんは。 めったに ActivePerl は使わないのですぐにはわからないんですが 手もとの環境では C:/Perl/site/lib/PPM.pm の 1586 行目近傍は以下のようになっていました。 1584:if (defined($location)) { 1585: if ($location =~ /[^\/]$/) { $location .= "/"; } 1586: $package = $location . $package . ".ppd"; 1587:} もしぶぶさんの環境でも同じであれば、 とりあえず 1586 行目の直前に warn "location: $location package: $package\n"; とでも入れてみて、 $location と $package の値を見てみたらいかがでしょうか。 でも、うちの環境(同じ Windows98)で ppm と入れたら その現象が再現できなかったので、 再インストールでもいいかなという気もしますが。 |
>>2412 ふくし 自己レスれす。(寒 >とりあえず 1586 行目の直前に >warn "location: $location package: $package\n"; これ、自分でもやってみましたけど、 C:\> ppm と打っただけではココは通らないみたいでした。 ぶぶさん、 PPM.pm の 1586 行目はぼくと同じですか? (バージョン、レベルは同じなんだけどなァ) あと、ほんとに C:\> ppm と打っただけで怒られます? それともなんか実のあること(パッケージのインストールとか)を やろうとしてます? 後者の場合は入れたコマンドを教えてください。 |
たびたびすいません!!今学校でパソコン同士のデータのやり取りを、Cプログラムでなんとかやろうとしているのですがわからんのですー!先生はfopenとか使えばできるだろー!!というのですが本を見てもかいてないようなかんじで(_m_!)なにしろ未熟者でわからんのですー!よろしければおしえてもらえますか? |
>>2414 ぶちお > 今学校でパソコン同士のデータのやり取りを、Cプログラムで > なんとかやろうとしているのですがわからんのですー! さて困ったものですね。あまりにもひどい質問の仕方です。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse は読んでいただけましたか? パソコンって何ですか? UNIX ですか? Windows ですか? それ以外ですか? 具体的な OS 名とそのバージョンは? データのやり取りって具体的に何をしようとしていますか? フロッピーからデータを読み込むことですか? LAN 経由で ファイルを読むことですか? RS-232C 経由でデータを やりとりすることですか? 今後、こういう調子の質問を続けるつもりでしたら、僕は お相手を致しかねますのでよろしく。 |
ふくしさん、お返事ありがとうございます。 PPM.pmの1586行目付近は、下のようになっていました。 1577:unless ($PPDfile && $$PPDfile) { 1578: foreach (keys %repositories) { 1579: my $location = $repositories{$_}{'LOCATION'}; 1580: if ($location =~ /[^\/]$/) { $location .= "/"; } 1581: $$PPDfile = $location . $package . ".ppd"; 1582: return %PPD if (%PPD = getPPDfile('package' => $$PPDfile, 1583: 'parsertype' => $parsertype, 'PPDfile' => \$$PPDfile)); 1584: undef $$PPDfile; 1585: } 1586: return unless $$PPDfile; 1587:} ちょっと違うみたいですよね。こちらの方が行が短いのでしょうか。 ちなみにDOS窓に入力したのは、 C:\>ppm これだけです。 PPM のシェルでパッケージのinstallをしようと思っているのですが、 とりあえずPPMを起動するため、入力しているのはppmという文字だけ です。そして、ppmとだけ入力すると、例のエラーが出るのです。 少ない情報ですが、何か分かりますでしょうか? やはりActivePerlを入れ直してみた方が良いのでしょうか? よろしくお願いします。 |
>>2416 ぶぶ 先ほど、Windows2000 に ActivePerl を入れる必要が あったので試してみたのですが、ppm とだけ 打つと PPM interactive shell ... と出てエラーは出ませんでした。 インストールしたのは最新の build 631 (perl-5.6.1) です。 再インストールは悪くない選択肢ではないかと思います。 |
>>2416 ぶぶ さん: いま会社で ActivePerl の環境がないのでテストできませんが、 >return unless $$PPDfile; ここで >>Can't use an undefined value as a SCALAR reference (スカラーの参照として、未定義値は使えません) ですよね。 $$PPDFile というのは、 $PPDFile というスカラー変数に スカラーへの参照(別のモノを指し示すもの)が入っていると考えて、 そのスカラーの値を返そうとしているわけですが、 そのとき $$PPDFile に undef が入っているのでくだんのエラーが 出ています。 たぶん $PPDFile という変数にもっと上の方でスカラーへの参照を セットすることを期待して動いていたのですが、 その期待が裏切られているようです。 (その上でいろいろしているのも、$$PPDFiles つまり $PPDFiles が指し示すスカラーメモリに対してで、 $PPDFiles にどのような論理で何が入っているかは 下のコードからは不明です) ・・・という風にさかのぼって研究しても勉強になると思いますが、 (意外ともうちょっとでパキッとわかったりして) いずれにせよこんなアンフレンドリーなメッセージが出て中断するのは 作者の意図と違う動作なので、再インストールでもいいと思います。 |
ふくしさん、68userさん、お返事ありがとうございます。 build631をインストールしてみましたら、何の問題もなくPPMの シェルが起動しました。 インストールしてから、PPM.pmを覗いてみると、1586付近は、 ふくしさんが書かれたものと同じになっていました。 前に入れていたものがおかしかったのでしょうか。入っている pmファイルがおかしいとは夢にも思わなかったので再インスト ールを試さずに質問してしまってごめんなさい。 これでやっとパッケージのinstallができます。ありがとうご ざいました。 PS. ふくしさん、エラーに関する説明ありがとうございます。 エラーの出る仕組みがよく分かりました。 |
ボーランドC++コンパイラーでC言語のCGIを作ろうと思っているのですがどうしたら良いのでしょうか? bcc32 -o CGI名 ソース名 でいけるのでしょうか? よろしくお願いします |
>>2420 初心者 > …でいけるのでしょうか? 試してみた結果どうなりましたか? |
メール受信時に"newaliases"コマンドを実行したいのですが、上手くいきません。 方法としては、特定のアドレスにメールが届いた時点でシェルスクリプトを実行するようエイリアスファイルにて設定しており、シェルスクリプトにはsudoで"newaliases"を実行するよう書いています。 また、sudoersにて"newaliases"コマンドをroot権限で実行できるようにも 設定しています。 "newaliases"コマンドではなく、他のコピーコマンド(cp)などは動作するのですが、"newaliases"コマンドは動作しません。 同じような方法を取られている方がいらっしゃいましたら 設定方法を教えていただけませんでしょうか。 宜しくお願いいたします。 |
申し訳ありません。環境を全く書いていませんでした。 RedHat Linux7.1.J、Sendmail8.11.5 です。 宜しくお願いします。 本文↓ メール受信時に"newaliases"コマンドを実行したいのですが、上手くいきません。 方法としては、特定のアドレスにメールが届いた時点でシェルスクリプトを実行するようエイリアスファイルにて設定しており、シェルスクリプトにはsudoで"newaliases"を実行するよう書いています。 また、sudoersにて"newaliases"コマンドをroot権限で実行できるようにも 設定しています。 "newaliases"コマンドではなく、他のコピーコマンド(cp)などは動作するのですが、"newaliases"コマンドは動作しません。 |
>>2423 橋本 どのユーザが「newaliases を root 権限で実行できる」ような 設定になっていますか? また、sudo のログには何と記録されていますか? |
>>2424 68user だけでは情報が不十分かな…。 sudoers に書いた内容と、「特定のメールアドレスにメールが 届いたらコマンドを実行する」というのをどうやって実現して いるか (/etc/aliases とか /home/foo/.forward とか) も 書いてください。 |
>>2424 68user newaliasesをroot権限で実行できるユーザは"deamon"に設定しています。 理由は、メール受信時に実行されるシェルスクリプトが一体どのユーザで 実行されるか分からなかったため、シェルスクリプト内にメールを送信 するコマンドも記述したところ、"deamon"という送信者名でメールを送信 したため、deamonでシェルスクリプトは実行されると思い設定しました。 ですが、実際はdeamonが実行しているようではないようです。 >>2423 にてcpコマンドなど他のコマンドは動作する。 と記述しましたが、私の勘違いで動作していませんでした。 申し訳ありません。 また全てのユーザに"newaliases"、"cp"コマンドをroot権限で 実行できるよう設定したところ、正常に動作しました。 ですが、全てのユーザに許可してしまうわけにはいかないので、 どうにかして特定のユーザにのみ許可して動作するようにしたいのですが ・・・。 以下設定ログ・設定内容です。 ●メール受信時のログ↓ Jan 21 18:20:16 test sudo(pam_unix)[19079]: authentication failure; logname= uid=0 euid=0 tty= ruse r= rhost= user=daemon Jan 21 18:20:23 test sudo(pam_unix)[19079]: 2 more authentication failures; logname= uid=0 euid=0 t ty= ruser= rhost= user=daemon Jan 21 18:20:23 test sudo[19079]: daemon : 3 incorrect password attempts ; TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/bin/newaliases ●sudoersに追加↓ deamon ALL= NOPASSWD: /usr/bin/newaliases deamon ALL= NOPASSWD: /bin/cp ●メール受信時に動作するシェルスクリプト↓ #!/bin/sh sudo cp /etc/mail/123.txt /etc/mail/456.txt sudo newaliases mail -s test mailuser@****.co.jp < /etc/mail/456.txt exit 長文で申し訳ありませんが宜しくお願いします。 |
>>2425 68user 「特定のメールアドレスにメールが届いたらコマンドを実行する」は、 (/etc/mail/aliases)に mailuser :"|/etc/mail/mail-program" と記述しています。 よろしくお願いします。 |
>>2427 橋本 > ●メール受信時に動作するシェルスクリプト で /usr/bin/id > /tmp/id.result などとすれば、どの権限で 動いているのかがわかります。 一般的には、/etc/mail/aliases に mailuser :"|/etc/mail/mail-program" とあるなら、/etc/mail/mail-program というファイルの権限で動きます。 例えば % ls -l /etc/mail/mail-program -rw-r--r-- 1 hoge wheel 46632 Sep 19 02:30 /etc/mail/mail-program ならば hoge 権限で動く、ということです。 |
>>2428 ですが、 mail-programの権限は以下のようになっています。↓ -rwxr-xr-x 1 root root 165 1・21 19:55 mail-program また /usr/bin/id > /tmp/id.resutl の結果は以下になりました。↓ uid=2(daemon) gid=2(daemon) groups=2(daemon),1(bin),4(adm),7(lp) やはり"deamon"で実行されているようです。sudoresにも正しく設定して いるつもりなのですが、シェルスクリプトは動作しません。 deamonに関してはsudoが使えないのでしょうか。 何かよい方法ありましたら教えてください。 宜しくお願いします。 |
>>2429 橋本 …ふむ。 deamon でなく daemon です。sudoers を修正してみて下さい。 |
>>2429 橋本 どうもありがとうございます。 deamonではなく"daemon" に修正したところ上手くいきました! とてもお恥ずかしいですが、すごくうれしかったです。 ありがとうございました。 |
こんにちは。ヒサブリに質問です。 下のような CGI で euc、sjis の文字列をブラウザに表示します。 #! perl -w # ~/public_html/cgi-bin/moji.cgi use CGI; use Jcode; my $q = CGI->new; print $q->header(); print $q->start_html(); print $q->start_form(-action=>'./answer.cgi'); $str_euc = 'こんにちは'; $str_sjis = $str_euc; Jcode::convert(\$str_sjis, 'euc', 'sjis'); print "euc: $str_euc <br>"; print "sjis: $str_sjis <br>"; print "unpacked euc: ".unpack("H10", $str_euc)."<br>"; print "unpacked sjis: ".unpack("H10", $str_sjis)."<br>"; print "eq:".($str_euc eq $str_sjis)."<br>"; コード自体は EUC で書きました。 ブラウザの設定を EUC にすると、 当然のように、EUC 部分は正しく、sjis 部分は文字化けになります。 (本当は sjis 部分は半角カナになりました) (http://www/~fukushi/cgi-bin/moji.cgiの表示) euc: こんにちは sjis: 、ウ、・ヲヒ、チ、マ unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: これ、ブラウザの設定を sjis にすると、 euc も sjis も文字化けになります。 これはなぜでしょう? (http://www/~fukushi/cgi-bin/moji.cgiの表示) euc: 、ウ、・ヲヒ、チ、マ sjis: 痔宍痔・ヲ射痔蔀痔煮 unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: で、下のように出力する文字列を URL から取得します。 #! perl -w # ~/public_html/cgi-bin/moji.cgi use CGI; use Jcode; my $q = CGI->new; print $q->header(); print $q->start_html(); print $q->start_form(-action=>'./answer.cgi'); $str_euc = $q->url_param('greeting'); $str_sjis = $str_euc; Jcode::convert(\$str_sjis, 'euc', 'sjis'); print "euc: $str_euc <br>"; print "sjis: $str_sjis <br>"; print "unpacked euc: ".unpack("H10", $str_euc)."<br>"; print "unpacked sjis: ".unpack("H10", $str_sjis)."<br>"; print "eq:".($str_euc eq $str_sjis)."<br>"; こうすると、ブラウザの設定を euc にすると、 なんと、euc も sjis も正しく表示されます。 (http://www/~fukushi/cgi-bin/moji.cgi?greeting=こんにちは の表示) euc: こんにちは sjis: こんにちは unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: ブラウザの表示を sjis にすると、euc 部のみ正しく表示されます。 (http://www/~fukushi/cgi-bin/moji.cgi?greeting=こんにちは の表示) (http://www/~fukushi/cgi-bin/moji.cgiの表示) euc: こんにちは sjis: 、ウ、・ヲヒ、チ、マ unpacked euc: a4b3a4f3a4 unpacked sjis: 8ea48eb38e eq: これはなぜでしょう? サーバーの OS は FreeBSD 2.2.8-RELEASE、 言語は jperl5.005_03-990612 EUC Version(Latin モードで使用)、 クライアントの OS は Windows 2000 server、 ブラウザーは Netscape Navigator 4.75 です。 |
今日は。 Awkで {AA [$1]++} END {for (BB in AA) ...........} とやると、AAの中に有る同じ名前のものが幾つあるか数えてくれると思うの ですが、Perlではどうやったら同じことが出来ますか? 例えば @array=(9, 9, 9, 3, 3, 3, 2, 2, 1) とすると、 9は3個、3は3個、2は2個1は1個あるので、 9=3 3=3 2=2 1=1 としたいのですが、宜しくお願いいたします。 |
>>2433 ミング さん: なんとなく似せて書くと #! perl @array = (9,9,9,3,3,3,2,2,1); for (@array) { $array2{$_}++; } for (reverse sort keys %array2) { print "$_=$array2{$_}\n"; } とか。 「ハッシュ」の機能を使っています。 @array の順番には関係なく、 常に大きな数字から出力していますがいいでしょうか。 (ハッシュを使うと、順不同になるので、、) |
>>2432 ふくし > Jcode::convert(\$str_sjis, 'euc', 'sjis'); 逆ですよー。 Jcode::convert(\$str_sjis, 'sjis', 'euc'); |
だれか、solaris8intel_platformをAT互換機で動作する、LANカードを 知っている方いらっしゃいますか? |