|
> ここでその IRC での雑談会の紹介をしたいのですが、 > よろしいでしょうか? よいですよ〜。僕も暇があれば、参加させていただこう かなと思います。 ただ、「文字コードは Shift_JIS で」というのは 参加者にとって ある意味ハードルが高いのでは ないかなと思いました。 # そこに至った事情を知らないので、ただ思っただけです。 |
|
よいですよ〜。僕も暇があれば、参加させていただこう >かなと思います。 ご配慮有難うございます。それから、68user さんに参加して頂くと とても話がはずむと思っています。本当に、お暇な折にで結構ですから、 お話したいと思っておりました。 それでは、お言葉に甘えて案内を掲示させて頂きます。 以下の要領で、毎週土曜日深夜から日曜日にかけて UNIX に関する雑談会を催しています。UNIX を肴に くつろいだお話をするのが目的で、会話に参加して 頂ければ現在の使用 OS などの参加資格はありません。 win による参加も OK です。 詳しい要領とIRC クライアントの設定方法は http://members.tripod.co.jp/ageha/irc にあります。これらの説明は読んだ方が無難かと思います。 ○日時: 毎週土曜日 23:00 〜日曜 2:00 ○サーバ: irc.fef.net:6667 他 ○チャンネル: #tsu ○禁止事項 (1) perl およびセキュリティに関する話題 (2) ログとりのみの参加 (一般的な意味での away などは問題ありません。 また、のべつまくなし喋らなければならないというのでありません。) ○注意事項: #tsu は Shift JIS 限定です。 # Shift JIS は、mIRC のためらしいです。 # 個人的には iso2022-jp か euc が良いんですけど。 # とにかく、チャンネルの founder は別の方なので、 # その方の主義にあわせることになりました。 |
|
どうも、skel.103Mです。 Bourne SHELLに関するアドバイス、どうもありがとうございました。>68userさん・Yuukiさん さっそく、 Bourne Shell 自習テキスト http://www.tsden.org/takamiti/shText/index.html を見てみました。なかなかいいですね、このページ。ブックマークにも 登録しときましたし。このページを見ながら勉強していこうと思います。 > あと、UNIX USER 10月号 (最新号) に 20 ページ程度ですが、 > シェルスクリプト講座が載ってます。結構勉強になると思います。 私も買って少し読んでみました。いわゆるハンドブックとしてはちょっと 不適だと思いました。(←個人的な意見なので気にしないで下さい)ひと 通り文法を知った後で実践として使おうと考えています。 > ただ、sh スクリプトの決定版、というような本は知らないです。 > http://www.oreilly.co.jp/BOOK/bash2/contents.htm > ってのがありますが、読んだことはないです。 このWebページによると bash に関するもののようですね。 明日(っていうか2時間後)秋葉原へ行くので、そのときに見てみよう と思います。 > # 結局 bash と sh は別物だし…。 そうなんですよね。例の秀和システムの「bash Manual & Reference」でも 似たようなことを書いてました。もちろんスタイルは似ているんです けれど、やはり違いがあるらしいです。。。 それでは。 |
|
こんにちは。 68userさん、Ksh変数のご回答ありがとうございました。 しかし、私はまだ、初心者なので、ファイル経由で情報を渡すということがよく分かりません。 ^^^^^^^^^^^^^^^^^^^^^^ もう少し詳しく教えて頂けないでしょうか。 よろしくお願い致します。 |
|
こんばんは。 ここには初めててきました。 質問があるのですが、Cシェルで、 サーバー日付より2日前のファイルを削除するとかっていう ことはできるのでしょうか? 教えてください。 お願いします。 |
|
@ノヴァさん > 質問があるのですが、Cシェルで、 > サーバー日付より2日前のファイルを削除するとかっていう > ことはできるのでしょうか? 使っているシェルにかかわらず可能です。 findというコマンドを使えばいいです。「UNIXの部屋」からfindの概要 や使い方を見たあと、詳細を「man find」で調べればいいと思います。 ではでは。 |
|
@ノヴァさん > ファイル経由で情報を渡すということがよく分かりません その前に > script1 から script2 を呼んでいるのではなく、あるプロセスから > script1 を呼び、script1 の終了後に script2 を呼んでませんか? に対する回答はどうなっているのでしょうか? 引数で渡すとか、環境変数で渡すとか、ファイル経由で 渡すとか、パイプで渡すとか、やり方はいろいろありますが、 どういう呼び出し方をしていて、どれだけの量のどういう内容の データを script2 に渡したいかがわからないとなんとも言えません。 |
|
> @ノヴァさん じゃなくて、やすさんでした。 ところで、make world 中に 家の FreeBSD を ぐっちゃんぐっちゃんに壊してしまったので、もし週末 までに復旧できれば IRC に参加させていただきます。 # が、なかなかうまくいかず…。 |
|
教えていただきありがとうございました。 さっそく、色々やってみます。 |
|
はじめまして、もりやと申します 実は今、シェルスクリプト(でいいんですかね?DOSでいうBATファイルの ことです)でやろうとしていることがあるのですが、やり方が今ひとつ分 かりません。ファイルの複製を作るのですが、複製されるファイルの名前 には、別のテキストファイルのレコードの先頭の4バイトが付加され、そ のテキストファイルは何レコードあるか分かりません。レコードの数だけ 複製を作ります。awkなど使えばよさそうに思って本を読んだりいろいろ試 しましたが、うまくいきません。教えていただければ幸いです。 OSは、HP-UXでバージョンの見方がわからないのですが、ここ2、3年のも のではあると思います。 |
|
はじめまして。 MXレコードを調べたいと思っているんですが、モジュールが使える状況にありません。Net::DNSなどのモジュールを使わずにMXレコードを引く方法があればヒントだけでも教えていただけるとうれしいです。 よろしくお願いします。 |
|
Hmm... I have recovery FreeBSD. But canna server doesn't accept a connection. Something is wrong. sign.... @moriya I can't understand what you want to say. Please show examples of the file and the record. To know OS version, type `uname -a'. @Q > get MX record without Net::DNS There is a sample script to get MX with nslookup. http://X68000.startshop.co.jp/~68user/cgi-bin/view-script.cgi/expn.cgi Another way, connect DNS server (port 53/udp), talk DNS protocol. # I hate multipost. You have to reply in 2ch, don't you? |
|
説明不足で申し訳ありませんでした。 org.datというファイルがあるとします あと、tencd.txtというテキストファイルがあり、その中身は 000420000101 002320001010 034320001020 とします この場合、 org.datをコピーしてorg004.dat、org0023.dat、org0343.dat という3つの複製ファイルを作成したいのです。 tencd.txtは何レコードあるかは不定です。 因みにHP-UXのバージョンはB.10.20でした。 よろしくお願いします |
|
What do you mean? hahaha... |
|
sh なら exec < tencd.txt while read line do set -- $line num=`echo $line | sed 's/^\(....\).*/\1/'` cp org.dat org$num.dat done csh なら foreach line (`cat tencd.txt`) set num=`echo $line | cut -c-4` cp org.dat org$num.dat end てな感じでしょうか。 # シェルスクリプトと言っても、シェルにはいろいろ種類が # あるので、sh か csh かそれ以外かを明記してください。 先頭4バイト取得には、sed でも cut でも awk でも お好きな方法をどうぞ。 もちろん全体を awk スクリプトで書くこともできます。 でもまぁ、perl を覚えた方がよいとは思いますね。 |
|
すいません、Perl一般の話ですいませんが、 サブルーチン リファレンスを使うとコールバック関数が作れる、 という場合の、コールバック関数ってどんなもんなんでしょうか? どんなときにどう使うと便利なんでしょうか? リファレンスの勉強をしていて、そこだけピンと来る例題のある章が なくて困っています。 御無理のない範囲で教えてくださいー。 |
|
Perl/Tk で何かアクションがあったときの動作を記述する関数 sub pushed { print "ボタンが押されました\n"; } $top->Button( -text => 'Push me', -command => \&pushed, )->pack(-side => 'left'); とか、シグナルハンドラ、たとえば SIGALRM による タイムアウトが起こったときの動作を記述する関数 sub signal_handler { print "1秒待ちましたが、入力がありませんでした\n"; alarm(1); } $SIG{ALRM}=\&signal_handler; alarm(1); $buf = <STDIN>; などをコールバック関数といいます。 後者は、より実践的に書けば http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=889 てな感じです。 なお、関数へのリファレンスを使わず、$SIG{ALRM}=sub {...} などと 無名関数を使ってコールバックを設定することもできます。 |
|
ありがとうございます。このふたつの例はわかりました。 他に、ユーザープログラムが呼び出すサブルーチンを 「コールバック」と呼ぶことはないんでしょうか。 「コールバック」という言葉じたいの定義が本によってあやふやな気がして、、。 たびたび申し訳ありません、、。 |
|
> 「コールバック」という言葉じたいの > 定義が本によってあやふやな気がして、、。 その本の記述例を見せていただけますか? |
|
すいません、、。 −−−−−−−−−−−−−−− 「Perl 5 パワフルテクニック大全集」(インプレス) 、、コード参照は、おもに、コールバック関数(後で呼び出してもらう関数)を指定するときに使う。、、 #! /usr/local/bin/perl # コールバック関数の定義 sub callback { my $mesg = shift; print "$mesg\n"; } # 関数への参照を作成 my $coderef = \&callback; # 異なるパラメータで関数を呼び出す &$coderef("Hi Mike!"); &$coderef("How are you?"); −−−−−−−−−−−−−−−−−−−− 「Perl 5 マスターブック」(翔泳社) サブルーチン関数の一般的な用途としてはコールバック関数があります。コールバック関数では、サブルーチンの配列をテーブル内に作成し、Perl プログラムから1つまたは複数呼び出します。、、 sub central_greeting { print "Hello!"; } sub eastern_greeting { print "Yo!"; } sub western_greeting { print "Howdy!"; } %greetings = ( "Central" => central_greeting, "Eastern" => eastern_greeting, "Western" => western_greeting, ) (中略、どこの土地のひとかを $where に入れて) $hash_ref = \%greetings; $sub_ref = $hash_ref=>($where); &$sub_ref(); −−−−−−−−−−−−−−−−−−−− 「実用Perlプログラミング」(オライリー) コールバック関数とは、リファレンスとしてあちこちに渡され必要に応じて呼び出されるようなサブルーチンです。そうしたものが構文的に用意されているわけではなく、使い方としての名称に過ぎません。呼び出す(リファレンスを使用する)側のコードでは、そのサブルーチンが何をするものかを意識する必要はありません。本節では、ディスパッチテーブル、シグナルハンドラ、描画関数の3つの例を通して、コールバック関数の使い方を説明します。 −−−−−−−−−−−−−−−−−−−− うーん、用例にしても呼び出しのレベルがいたずらに増えてるだけで、いまいち便利になった実感が。 |
|
こんにちは。 @ふくしさん ぼくの少ない経験でしか言えませんが、 今までぼくは「コールバック関数」(もしくはハンドラ)の名称は、 「何らかのアクションを要求した際に呼び出される関数」 に対して使ってきました。 #ボタン押下のイベントに対して呼び出されるモノであったり #シグナルイベントに対して呼び出されるモノであったり ふくしさんが例に出されている、それぞれの本では、 >「実用Perlプログラミング」(オライリー) の説明がほぼ的確だと思います。 >「Perl 5 パワフルテクニック大全集」(インプレス) や >「Perl 5 マスターブック」(翔泳社) の説明は、これらの部分だけを見ると コールバック関数と呼ぶのはおかしいような気はしますね。 どちらかと言うと、コールバック関数として使う際に便利に呼び出せるように 準備をしているところに見えます。 あくまでもそれぞれ、コード参照とサブルーチンの説明なのではないでしょうか。 |
|
全くもって同感です<hsj さん > 「何らかのアクションを要求した際に呼び出される関数」 あと、このアクションは「非同期に発生する」というのも 重要な要素なのかな? (違うかも) |
|
なるほどー(知恵熱) ひとつわからないのが、Tkやシグナルハンドラのように、 そのアクションをキャッチする機構がシステムによって用意されているもの (BASICのON命令みたいなもんですね) だけをコールバックと呼ぶんでしょうか? それとも、呼び出し元も自前のPerlコードで書いた例がなにかあるでしょうか? あと非同期ってどういう意味なんでしょう。 あとなんでコールバック(電話を掛けなおすこと)っていうんでしょね。 すいませんずうずうしくお伺いして、、。 |
|
ん〜、こういうのは自分の中で納得できるかどうかなので、 うまく説明するのは僕には難しいなぁ。 > あと非同期ってどういう意味なんでしょう。 プログラム側から「いつそのアクションが起きるか」を 知ることができないということです。たとえば、マウスの クリックがいつ発生するだとか、シグナルがいつ飛んで くるかを、プログラムの側から予想することはできません。 > Tkやシグナルハンドラのように、そのアクションをキャッチする機構が > システムによって用意されているものだけをコールバックと呼ぶんで > しょうか? そうだと思います。というより、システム (OS) の手助けを 借りなければ、非同期なアクションに応答することはできません。 signal は非同期でやってきますので、シグナルハンドラという 機構が OS にあります。 ボタンの押下は、結局は X Window System のイベントとして socket 経由でデータが送られてきます。これは select で データが送られてきているかどうかを調べます (たぶん)。 結局どちらも OS の手助けを借りている (=システムコール を使う) わけです。 |
|
にゃるほどー、わかりました。 非同期というのがユーザープログラムでわからない、 システムがキャッチする、 それを処理するのがコールバック、というのであれば納得できます。 あとはシグナルハンドラやTkのプログラムを勉強するなかで 勉強しようと思います。 どうもありがとうございます!>68userさん、hsjさん |
|
FreeBSDでネットワークプログラミング(カーネル)を しているのですが、たくさんの構造体が でてきてすこし混乱しています。 わかりそうでわからないので 構造体を日本語で具体的に説明しているHP、本などを 知っている方がいらっしゃいましたら どうか教えてください。HPの方がありがたいです。 乱文ですが、よろしくお願いします。 |
|
はじめまして、UNIX見習いです。 今まではke◯t氏の有名な掲示板や、ゆいチャ◯トのソース等を参考に Perlの勉強をしていましたが、68userさんのスクリプトを見て 目からウロコが落ちた感じでした。 変数のネーミングセンスも良く、可読性も高いスクリプトを初めて見て、 今まで参考にしていた人のスクリプトって何だったんだろうと思っちゃいました。 あと、Perlでネットワークプログラミングが出来るとは知らなかったし(爆) さっそくechoサーバのサンプルスクリプトを使わせてもらって勉強していますが、 IO::Socketを使ったechoサーバの場合、外部からのアクセスが出来なくて悩んでいます。 現在の状況は、 echo-server.pl・echo-server-fork.pl・echo-server-select.pl は外部からのアクセスでも動きますが、 IO::Socketを使ったechoサーバのサンプルスクリプトは全部 外部からのアクセスには反応しません。localhostからだと、ちゃんと機能するのですが…。 サーバの環境は、Perl 5.005_03 on Linux2.2.14で、 echoサーバのサンプルスクリプトは全てデフォルトのまま設置です。 IO::Socketを使った場合、なぜ外部からのアクセスが出来ないのか 原因が分からずに悩んでいます。 あと、標準モジュールの使い方の学習で効果的なリソースって何でしょうか? 私の手持ちの書籍では、標準モジュールの利用に関して載っていないので 何かオススメの書籍、もしくはネット上のリソースで参考になるところがあれば 紹介していただきたいと思います。なるべく日本語のリソースで(←贅沢かな?) 長々と書いちゃってすみませんが、ご指導の程、よろしくお願いいたします。 |
|
こんどは canna が かんじに へんかんしてくれなくなりました。やれやれ、 こどもみたいな ぶんしょうだ。 > IO::Socketを使ったechoサーバのサンプルスクリプトは全部 > 外部からのアクセスには反応しません。 おお、ほんとだ。というわけで しらべてみたところ、 LocalAddr => 'localhost', がわるいです。 ふつう、マシンには じぶんじしんあてへのインタフェイスがあります。 これをループバックとよび、127.0.0.1 という IP アドレスがふられて います (127.0.0.1 がループバックという きまりはありません。 (IPv4 では) ただのかんれいです)。 そして、インターネットにつながっているならば、さらにインターネットへ つながるインタフェイスがあります。これには 210.249.139.22 のような グローバル IP アドレスがふられています。 つまり、つうじょう、マシンには 2つのインタフェイス/IP アドレスが あるわけです。 たいていのサーバプログラムは2つのインタフェイスを くべつしません。 しかし、くべつできるような しくみは いちおうあります。それが http://X68000.startshop.co.jp/~68user/net/func.html#bind のさいごにかいてある、bind でどちらの IP あどれすをつかうかを えらべる、ということです。 で、LocalAddr => 'localhost' は、この bind のひきすうに IP アドレス (localhost にたいおうする 127.0.0.1) を あたえたのと おなじいみです。 これは LocalAddr をしていするときと しないときで、それぞれ netstat -an をじっこうすると わかりやすいでしょう。 tcp 0 0 127.0.0.1.5000 *.* LISTEN (LocalAddr してい) tcp 0 0 *.5000 *.* LISTEN (LocalAddr していない) と、LocalAddr をつけると、127.0.0.1:5000 しか みていないのが わかります。だからローカルホストからしか せつぞくできなかったわけです。 > 今まではke◯t氏の有名な掲示板や、ゆいチャ◯トの > ソース等を参考にPerlの勉強をしていましたが、 ゆいチャットはしりませんが、kent とか rescue などと くらべられるのは しんがいです :-) まぁ、こっちもそんなにレベルが たかいわけではないので (こんかいの ようなミスもあるし)、これいじょうは えらいひとからの つっこみが こわいので いいません。 ちなみに perl って、しょしんしゃでも なんとか うごかせるから でしょうか、うそだらけのページがおおいですね。ぼくがぜんめんてきに しんらいしているサイトは http://www.context.co.jp/perlnews/ http://www.din.or.jp/~ohzaki/perl.htm の2つだけです。 > あと、標準モジュールの使い方の学習で効果的な > リソースって何でしょうか? perl モジュールガイドとかいうほんが しゅっぱんされていません でしたっけ? しょうさいは わかりませんが。 ただ、もくてきのモジュールがわかっているならば、perldoc を ながしよみして、けっこうなんとかなるかとおもいます。 よみにくいぶんしょうで しつれいしました。LocalAddr の ぶぶんは、じかいこうしんじに さくじょいたします。 @yuji さん カーネルの TCP/IP まわりのこうぞうたいのことですよね? ぼくもしりたいです。だれかおしえて。 |
|
そうなんですよ。なかなかネットワークの構造体について わかりやすい説明って詳しいないんですよね。 特にFreeBSDの場合は・・・ 誰か知っていたら教えてください。 |
|
残念ながら、僕は知らないです。僕の持っている UNIX カーネル 関連の書籍にも、TCP/IP は載ってませんでした。 BSD Magazine No.4 に、IP の話が少し載ってますが、 構造体の説明はありません。 というわけで、解説書いて(笑)>yuji さん |
|
そうですね。つくってみますか! っていってもなかなか・・・ 理解した分だけ作っていくのは いいかもしれません。あとあと 役に立ちますし。 ええ、BSD Magazine No.4 に書いてありましたね。 どのような流れでデータが動いているのかは 理解するのに役に立ったと思います。 |
|
LocalAddr => 'localhost'を削除したら、外部からのアクセスに反応することを こちらでも確認できました。 #しかし普段からLinux使ってるのにnetstatしなかった私って…ごめんなさい(汗) それから、Perldocというものが自分のマシンに入っていることも実は知りませんでした。 昨日からネット上で検索かけまくって、やっとPerldocの存在を知りました。 さっそくperldoc -m IO::Socketして読んでみます。 68userさん、早急な解答ありがとうございました。 |
|
はじめてここに書きこみさせていたただきます よろしくお願いします。 今メーリングリストを開設しようと思っています サーバーはLinuxで aliasesファイルに転送先のメンバーリストファイルを指定したのですが 開かず、悩んでいます ----- The following addresses had permanent fatal errors ----- <aki@my-member.com> :include: /home/sites/www.my-recruit.com/web/recruit/bin/Mailing-list/mylist-member-list (expanded from: <aki@my-member.com> ) ----- Transcript of session follows ----- 550 :include: /home/sites/www.my-recruit.com/web/recruit/bin/Mailing-list/mylist-member-list... Cannot open /home/sites/www.my-recruit.com/web/recruit/bin/Mailing-list/mylist-member-list: Group writable directory 554 <aki@my-member.com> ... aliasing/forwarding loop broken -------------------------------------------------------------------------------- のようなメッセージが帰ってきます。 ファイルのパーミッションは644です すでに1週間と一日・・・私くじけそうです・・・ もしわからる方いらっしゃいましたらお願いします。 |
|
> Group writable directory グループが書き込めるディレクトリ、だから危険なので 実行するのはや〜めた、と言ってます。 |
|
68userさんありがとうございます パーミッションをいろいろ試したのですが・・・開きません ファイルやディレクトリのパーミッションを もしよろしければ、どうすればファイルを開いてくれるのか教えてください よろしくお願いします・・・ |
|
すみません、私のミスでした・・・ ディレクトリのひとつのパーミッションがおかしかっただけです う〜んこんなこと気づかないなんて・・・ ありがとうございました〜 |
|
質問させてください。 perlで、ログをファイルではなくDBMで管理するBBSを作っています。 ところが、プロセス間でDBMの排他制御を行う方法が分かりません。 もし知っていたらご教授ください。 おねがいします。 |
|
申し訳ございません もう一度同じような質問させてください メーリングリストを作っていまして パイプを通してプログラムに渡したのですが ----- Transcript of session follows ----- sh: mysite-filter not available for sendmail programs 554 | "/usr/local/lib/mailing-list/mysite-filter"... Service unavailable のようなメッセージがきまして メールがプログラムに渡っていません・・・ この場合、どのようなミスが考えられるのでしょう? 多分初歩的なミスだと思いますが よろしくお願いします・・・ |
|
はじめまして。 perlでradiusの認証クライアントを作成したいのですが、 perlのモジュールでAuthin::radiusというものがあって、 それを使用して作成したのですが、二重ログインしようとしてしまい、 二重ログインは不可の設定にしていますので、ログインできません。 と言う経緯で、1から作成しようと思います。 Sokcetのモジュールで、ポートを指定して、 ソケットを生成するのは一緒だと思うのですが、 radiusサーバに送るリクエストをどのように記述していいのかがわかりません。 radius サーバはDTC Radius Ver 2.03です。 どなたかご存じの方は教えていただけないでしょうか。 よろしくお願い致します。 |
|
ミワと申します。 シグナルについて質問させてください。 レンタルサーバーなどでは、スクリプトが一定時間動き続けていると、 TERMシグナル?が飛んでくるよ と聞いたことがあるんですが (クライアントがブラウザを閉じたり、中止をしたときも) 私が使っているサーバーで実験してみたんですが 全く飛んできませんでした。 無限ループとかになってしまった場合どうするのか など心配になってきたんですが(telnetでkillすればいいんですが)、 これはサーバー側の設定がなにかあるんでしょうか? #環境は Cobalt Linux & Apache です。 お分かりになる方、ご教授お願いします。 #実験で使ったPerlスクリプトはここにあります。 http://www.offside.ne.jp/~icon_store/sig/signal.txt |
|
TCP/IPの構造体についてなら http://www.kurasc.kyoto-u.ac.jp/plasma-group/data/misc/doc/koala にて概要はつかめるのではないでしょうか。 ただ,話がUNIXよりなのは fj.lecture だからかしらん。 |
|
@aki さん > sh: mysite-filter not available for sendmail programs /etc/sendmail.cf に P=/foo/bar/smrsh という部分がある なら、P=/bin/sh として、sendmail を再起動してください。 それでもダメならわかりません。 もしうまくいったなら、see smrsh(8)。smrsh を使い続けるならば、 /usr/libexec/sm.bin/ 以下にコマンドを置くべきでしょう。 @ノリスケさん > ところが、プロセス間でDBMの排他制御を行う方法が分かりません。 おそらく DBM には排他の仕組みはないと思います。flock/symlink/mkdir などを使って、自前でロックするしかないと思います。 @tam さん > perlでradiusの認証クライアントを作成したいのですが、 これはさっぱりわかりません。radius 自体あまり理解していないので…。 @の さん > http://www.kurasc.kyoto-u.ac.jp/plasma-group/data/misc/doc/ko じゃなくて、カーネルソースを読む際に参考になるドキュメントは ないだろうか、という意味じゃないでしょうか。 @ミワさん > シグナルについて質問させてください これは後ほど。というか、忘れちゃったので実験しないと。 # 時間がないなぁ… なお、apache では httpd.conf で、Timeout 300 などと 設定されています。 |
|
ご教授ありがとうございます。 >なお、apache では httpd.conf で、Timeout 300 などと >設定されています。 サーバー管理者に”TELL”シグナルを送って確認したところ デフォルトのまま触ってないので、Timeout 300 になってるっス という返答が帰ってきました。 なぜでしょう?? 何かほかの部分がマズいのでしょうか? よろしければ、ご教授お願いします。 |
|
基本的に、ブラウザを中断しても SIGTERM は飛んできません。 が、子プロセスがいる場合などに飛んでくる場合もあります。 前に調べたときはたしかそういう結論になったような覚えがあります。 # つまりよくわからなかったということ。 |
|
68userさんありがとうございました /usr/adm/sm.bin/ に置いたらできるようになりました! また何かあったらよろしくお願いします。 |
|
@tamさん RADIUSはRFCで規定されていたはずなので 認証パケットのフォーマットやプロトコルの詳細はそれを見ればわかると思います。 #ぼくはつくったことはありません アクセスサーバとの連携が必要だと思うので、ちょっとばかりめんどくさい事に なりそうですが・・・。 @ミワさん ぼくも詳しくないのですがアレですが、 Apache1.3.12のソースをナナメ読みした限りでは、 タイムアウト後にSIGTERMとSIGKILLが飛んでくるように なっているようにみえました。 で、FreeBSD4.0-RELEASE + Apache_1.3.12で実験してみたところ、 その通りに動作しているようにみえます。 #ちなみに、SIGKILLはトラップできないのが正しい動作ですね もしかしてですが、ログをつくるディレクトリの 書き込み権限が落ちてるとかはないですか? |
|
@68user さん 68user さん、hsj さん、ご教授ありがとうございます。 >基本的に、ブラウザを中断しても SIGTERM は飛んできません。 >が、子プロセスがいる場合などに飛んでくる場合もあります。 >前に調べたときはたしかそういう結論になったような覚えがあります。 ># つまりよくわからなかったということ。 なるほど。そうなんですか。 前に見た情報は間違っていた可能性がたかそうですね。 >もしかしてですが、ログをつくるディレクトリの >書き込み権限が落ちてるとかはないですか? それはlogディレクトリのことでしょうか? 私が使っているサーバーは、自分のアカウントで入ると 最初の階層にはwebというディレクトリしかないんです。 (web内はweb領域になってます) なので、エラーログなど見たことがないんですよ。 これっておかしいですよね。 logディレクトリを作れば、その中にエラーログやアクセスログが書き込まれて 今回の問題も解決するものなのでしょうか? (.htaccessなどで設定する?) |
|
@ミワさん >それはlogディレクトリのことでしょうか? いえ、そうではなくてsignal.logが書き込まれるディレクトリです。 web(nobody?)権限での書き込みができなければ動きませんよね。 ・・・が、よく考えると >全く飛んできませんでした。 とおっしゃってますし、とくにエラーになるとも書かれてませんね・・・。 と言うわけで、コレはハズしてそうです。 かき混ぜてスミマセン。 >これっておかしいですよね。 それは、ftpdがchrootされてるのでしょう。 セキュリティの確保が目的だと思います。 #CGIが使えるんだから、あまり意味が無いと言えば無いのですが(笑 |
|
@hsj さん >>全く飛んできませんでした。 >とおっしゃってますし、とくにエラーになるとも書かれてませんね・・・。 エラーにはなってないと思うんですが、ちょっと自信がないです。 >それは、ftpdがchrootされてるのでしょう。 >セキュリティの確保が目的だと思います。 なるほど、セキュリティの為に意図的に設定してあるんですね。 もしかして KeepAlive は関係しているのでしょうか? http://japache.infoscience.co.jp/japanese_1_3/manual/keepalive.html KeepAliveがoffに設定してあると、KeepAliveTimeoutが適応されて Timeoutに移行する という解釈でいいのでしょうか? #はずしてそうですが... |
|
@aki さん > /usr/adm/sm.bin/ に置いたらできるようになりました! で終わってしまうと、スキルアップにつながらないので、 僕がどうやって調べたかってのを書いておきます。 パーミッションを落としたりして適当にいろいろ試してみるが、 FreeBSD 4.0-RELEASE では同じエラーを出せない。 というわけで、sendmail のソースを探す % locate /sendmail/ どうやら /usr/src/contrib/sendmail らしい。 % cd /usr/src/contrib/sendmail ソースから available for sendmail という文章を探す % grep "available for sendmail" */* smrsh/smrsh.c: fprintf(stderr, "%s: %s not available for sendmail programs\n", smrsh って何? コマンドのようだが… % man smrsh 「smrsh - sendmail用に制限されたシェル」だそうな。特定の ディレクトリに置いてあるプログラムしか、~/.forward や /etc/aliases から呼び出せないらしい。 sendmail.cf から sh か smrsh を探す % egrep '/bin/(sh|smrsh)' /etc/mail/sendmail.cf Mprog, P=/bin/sh, F=lsDFMoqeu9, S=10/30, R=20/40, D=$z:/, なるほど。FreeBSD のデフォルトでは /bin/sh を使っているので 同じエラーは出ないわけね。 あと、最初に質問した掲示板に、解決したことを書き込んでおく べきでしょう。 |
|
はじめまして。 よろしくお願いします。 wwwboard.cgiを拝見して、これは...! と思っていただきました。 些末なことなのですが、自分の間借のWebスペースにテスト設置してみて 気付いたことを報告します。 コメントアウトしてスクリプトのご説明をされている部分で、 ディレクトリ配置のご説明でlockとされているディレクトリ名が my変数の定義ではlockdirとなっていました。ありがたいことに 細かく動作チェックできるのですぐに修正できましたが、為念。 --- wwwboard.cgi設置に際して、自分の方に別の問題があります。 こちらでお聞きしていいものかどうか判断せずに書き込みしていますので、 不適当であれば無視してください。 問題 スクリプトの実行権限の種別が、所有者権限(個人のアカウント名)、 nobody権限のいずれでもなくwwwの権限となる。 書き込みはできるが、生成されるログのOwnerがwwwとなり、 ぼくのアカウントではログの削除ができなくなる (^^; ぼくの方の環境 (ISPにWebページ用の領域を間借している形態です) ・WebサーバのOS : RS/6000 ・CGI設置場所の制限 : 個人のhomeディレクトリ以下であればどこでも可 ・wwwboard.cgiで使用するコマンドのうちnamazuとmd5が使用不可 動作チェックの出力の結果 http://www.ad.il24.net/~noiz/bbs/wwwboard.cgi?test |
|
フォローありがとうございます。 radiusのこともまだ知ったばかりですので、 知らないことがいっぱいです、もっと調べなければ... |
|
@noizさん はじめまして。 私も同じ掲示板を使っています。 削除に関しては、管理モードなどの追加(自作)をするのが 一番かも妥当なのかも知れません。 掲示板のログファイルの形式を見ていただくと、 一括方式にしろ分割方式にしろ、1件ごとの書き込みは わかりやすい形式で保存されていると思いますので、 単純なサブルーチンでもって管理可能なのではないかと思います。 # 本当はどうするのがいいですかね>68user |
|
ああ、僕を含めて 3人目のユーザを確認。ちゃんとサポートなんか してみたりして。 > スクリプトの実行権限の種別が、所有者権限(個人のアカウント名)、 > nobody権限のいずれでもなくwwwの権限となる。 www は nobody と同じようなものだと思ってください。そのサイト 全てのユーザの CGI が www 権限で動きますので、状況は nobody と 変わりません。 > 書き込みはできるが、生成されるログのOwnerがwwwとなり、 > ぼくのアカウントではログの削除ができなくなる (^^; ファイルの削除ができるかどうかは、ファイルのオーナーとは 関係ありません。そのファイルの置いてあるディレクトリに Write パーミッションがあるかどうかです。 現状では umask 002 としていますので、 separate_log/000/ (ディレクトリ) separate_log/000/00001 (ファイル) のパーミッションは、それぞれ 775,664 になるはずです。 で、OS が BSD 系ならば削除はできるはずです。なぜなら、 separate_log/ は owner:group が 68user:realuser で、パーミッションが 757 という状況で、ユーザ www が separate_log/000/ (ディレクトリ) separate_log/000/00001 (ファイル) を作ろうとすると、 separate_log/000/ は owner:group=www:realuser で、パーミッションが 775 separate_log/000/00001 は owner:group=www:realuser で、パーミッションが 664 となるはずです。親ディレクトリのグループを引き継いでいる ところがミソですね。 ところが、SysV 系では、作成したファイル・ディレクトリの グループは、ファイル・ディレクトリ作成者の実効 GID となるので、 仮に CGI の実行が uid:gid=www:www で行われるとしたら separate_log/000/ は owner:group=www:www で、パーミッションが 775 separate_log/000/00001 は owner:group=www:www で、パーミッションが 775 となり、separate_log/000/00001 は、CGI 経由でないと 消せなくなります。 # ここらへんの動作を決める要素は、他にも sgid bit があるけど、略。 # なお、Linux だと mount 時のオプションでどちらの挙動をするかを # 決められます。 というわけで、まずは削除ができるかどうか試してみてください。 RS/6000 の OS が BSD 系ならば消せるでしょう。 # でも多分 AIX だろうから、SysV だよなぁ…。しかし、RS/6000 を # 使っている ISPか。金持ちだ (いくらか知らんけど)。 > 削除に関しては、管理モードなどの追加(自作)をするのが > 一番かも妥当なのかも知れません。 へい、作りまっせ〜。何か要望があれば今のうちに言ってください。 数日経ってやる気が失せる前に (笑) > my変数の定義ではlockdirとなっていました こちらも直します。 |
|
68userさんありがとうございました 大変勉強になりました! おかげさまでだんだんコツがつかめてきました〜 またひとつ、同じ流れで質問させてください メールをプログラムに落とし、perlで処理をして転送と言う簡易な処理はできるようになったのですが、 ファイルのオープン処理やファイル作成などができません デバックではうまく出来ているのですが・・・?? よろしければまた、お願いします |
|
hasさん、68userさん、ありがとうございます。 ははあ、とりあえず www 権限は nobody 権限と考えていいんですね。 68user さんのご指摘通り、生成された分割ログのパーミッションは、 ディレクトリ=775、ファイル=644、となっています。で、結論から 言って削除できませんでした (泣笑)。Web サーバは FTP ポート しか開放されていないので、Mac/Win の FTP クライアントで ログファイルの削除を試してみましたが、Permission Denied で はねられました。 >> 削除に関しては、管理モードなどの追加(自作)をするのが >> 一番かも妥当なのかも知れません。 > へい、作りまっせ〜。何か要望があれば今のうちに言ってください。 > 数日経ってやる気が失せる前に (笑) 厚かましいのですが、ぜひぜひお願いします。ぼくはプログラム全般 ぜんぜん分からないので、ログまわりの改造をしていただけると使うのに 何のハードルもなくなってありがたいです。 また質問があるのですが、検索で使用する namazu は Perl 版で良いのでしょうか? |
|
煩瑣になってすいません。ログファイルのパーミッションは以下のとおりです。 ×644 ○664 |
|
> へい、作りまっせ〜。何か要望があれば今のうちに言ってください。 > 数日経ってやる気が失せる前に (笑) んじゃあ、キャッシュのほう、情報を表示のに加えて、 削除とかもできるようにしといてもらえますか? # ここのキャッシュ、合計100MBってちゃんと消さないと:-p うちの方は、携帯から見やすいようにしたり、カレンダーなどと 組み合わせてみたりといろいろいじってしまい、 追加された機能を自分のに反映するのに苦労しそうです…。 |
|
せっせと作っております。機能設計書も詳細設計書も、 テスト仕様書もないプログラミングはなんと楽しいことか…。 @has > んじゃあ、キャッシュのほう、情報を表示のに加えて、 > 削除とかもできるようにしといてもらえますか? あい、了解です。あと、ソース送ってちょーだいな。 採り入れられる機能は採り入れます。 @noiz さん > 検索で使用する namazu は Perl 版で良いのでしょうか? namazu (の一部) は C言語で書かれているため、コンパイルが 必要です。ログインできないなら、あきらめた方がよいでしょう。 # プロバイダのマシンにコンパイラがあるかどうかわからないし、 # もしあったとしても namazu 環境を構築した経験がない # なら、とても苦労するでしょう。 簡易検索機能でも付けるかなぁ…。 @aki さん > メールをプログラムに落とし、perlで処理をして転送と言う > 簡易な処理はできるようになったのですが、 メーリングリストサーバを自作しているんですか? > ファイルのオープン処理やファイル作成などができません > デバックではうまく出来ているのですが・・・?? 実行権限が違うとか、環境変数が足りないとか、原因はいろいろ 考えられますので、これだけの情報ではわかりません。 /tmp あたりに適当にファイルを作ってみて、ファイルの オーナーを確認したり、環境変数を全部表示させたりすれば わかるかもしれません。 |
|
68userさん ありがとうございます。結局 CGI の改造をお願いすることに なってしまいましたが、嬉しいです。 はい、namazu で検索はあきらめます :-) でも検索機能がなくてもぼくにはもったいないくらいです。 |
|
いつもお世話になっています。 私の質問掲示板に.htaccessのdenyについての質問がきたのですが..,。 68userさん、ちょっと見てもらえますか。よろしくお願い致します。 http://www.parkcity.ne.jp/~chaichan/qanda/qa246.htm |
|
どうも、ご無沙汰しております、yujiです。^^ 現在、ソケットファイルを作成したいのですが、 その方法がわからず、困っております。 UNIXドメインソケットファイルの使い方はいろいろなサイトに記述されて いるのですが、根本となるUNIXドメインソケットファイルの作成の 仕方について触れているサイトを見つけることができませんでした。^^; もしなにかご存知でしたら、どうぞよろしくお願いします。 それでは、また。^^ |
|
どうも、yujiです。^^ 下の記事の訂正なのですが、 簡単にUNIXドメインソケットファイルを 作成するコマンドはないのかなと思いまして。 すいませんが、よろしくお願いします。 |
|
@ちゃいぱさん > 私の質問掲示板に.htaccessのdenyについての質問がきたのですが..,。 > 68userさん、ちょっと見てもらえますか。 えっと、こういう形での回答依頼はご勘弁を。答えたければ 答えるし、興味がなければ/知らなければ答えない、ということで。 今回の件に関しては、既にどなたかが書いておられますが deny from .XXXXX.ocn.ne.jp というふうに先頭に . を付けるか、ホスト名が逆引きされて いないならIP アドレスでの制限をする、くらいしか思い 付きませんでしたが、 deny from dion.ne.jp がうまくいっているなら外れっぽいですね。後は「どうやって うまくいかないと確認したのか。その確認方法が間違っている のではないか」くらいでしょうか。 @yuji さん > 簡単にUNIXドメインソケットファイルを作成するコマンドは > ないのかなと思いまして。 多分ないと思います。FIFO (名前付きパイプ) とは違って、ソケット ファイルはサーバ側のプロセスが必ず存在していなければいけない ので (必ずソケットに bind されていないといけない)、仮に 「作成するコマンド」があったとしても、その「ソケットファイルを 作成したプロセス」が終了した瞬間にソケットファイルは無効となります。 # という説明でいいのかしら…。FIFO は mkfifo や mknod コマンドで # 作れます。念のため。 |
|
いつもお世話になっています。 > こういう形での回答依頼はご勘弁を。 すみません、ついあまえちゃって、68userさんに振ってしまう私です...。 切り札使いすぎました。以後、気を付けます。 > その確認方法が間違っているのではないか 質問者に尋ねて見ます。 いつもながら、アドバイスありがとうございます。 違う意味で、今後もよろしくお願い致します。 |
|
http://virtys.virtualave.net/cgi-bin/so.cgi こーゆー、SNMPに外部からアクセスできるかどうかを調べるには、 どしたらいいですか? Perlでやりたいんですが。。 UNIXのコマンドとかあるのかな? |
|
掲示板ですが、こんな感じでどうでしょうか。 http://X68000.startshop.co.jp/~68user/tmp/wwwboard.cgi 「管理者モード」というのを追加しました。パスワードは 「abc」です。管理者モードからは、記事の削除、キャッシュの削除、 各種カスタマイズができます。 テスト用なので、好きにいじっていただいて構いません。 has からは > 消したいキャッシュをマークしてから[削除]とかのボタンを > 押すと消せる、というような感じがいいです。 という要望を頂いておりますが、使いやすいインタフェースが 思い付かず、未実装です。よさげな案があれば提案してもらえますか? 動作チェック・キャッシュ情報は、web 上からの設定変更で 一般に公開しないモードにできるようにしました。 それと、管理者用のパスワードですが、CGI 経由で設定 できるようにすると、CGI が nobody/www 権限で動く場合、 どうやってもセキュリティホールが出きてしまうので、 面倒ですが直接スクリプトを手で書き換えるようにしています。 あと、ちょっと手を広げすぎて、バグがたくさん残ってますので、 現在のバージョンは未完成品です。 @yamama さん > SNMPに外部からアクセスできるかどうかを調べる 残念ながら SNMP は全くわからないのでパスです。 |
|
掲示板、さっそくテスト書き込み・削除をしてみました。 管理モードで一気に堕落しそうです :-P 自分のところでもテストで設置して試してみます。 |
|
@yamamaさん おそらく対象サーバのSNMPのポートにアクセスして、 publicで情報が引っぱれるかどうかチェックしているだけでしょう。 要はSNMPクライアントの簡易版を実装しているんだと思います。 多分コマンド一発でお手軽に、みたいなのは無いと思いますが ほぼ決め打ちで行けると思うのでそんなに面倒でもないと思います。 もちろんperlでも可能ですが、最低SNMPの認証部分のプロトコルを 解っていなければいけないでしょうね。 |
|
@68user > という要望を頂いておりますが、使いやすいインタフェースが > 思い付かず、未実装です。よさげな案があれば提案してもらえますか? たとえば"checkbox"を使って、 <INPUT NAME="check" TYPE="checkbox" VALUE="1">キャッシュ1<BR> <INPUT NAME="check" TYPE="checkbox" VALUE="2">キャッシュ2<BR> 連想配列/パーサの都合で困難そうであらば、 <INPUT NAME="check1" TYPE="checkbox" VALUE="x">キャッシュ1<BR> <INPUT NAME="check2" TYPE="checkbox" VALUE="x">キャッシュ2<BR> なんていう風なのを想像してたんですけど、どうですかね? # "checkbox"なのに名前が全部違うってのはきれいじゃないか… |
|
> たとえば"checkbox"を使って、 やってみました。削除するなら最近の発言を削除することが 多いだろう、ということで http://X68000.startshop.co.jp/~68user/tmp/wwwboard.cgi http://X68000.startshop.co.jp/~68user/tmp/wwwboard.cgi?mode=admin&passwd=abc こんな感じ。どんなもんでしょ? さらに前のは「前の50件」ボタンで 表示できるようにするつもりですが、未実装です。 あと、 > 消したいキャッシュをマークしてから[削除]とかのボタンを > 押すと消せる、というような感じがいいです。 これって s/キャッシュ/ログファイル/ の typo じゃないかと 思っていたのですが、キャッシュも checkbox で選択して 消したい、ということですか? スクリプトに書いてある「TODO」の部分が今後の課題です。結構増えました。 http://X68000.startshop.co.jp/~68user/tmp/wwwboard.txt というわけで、どうも2、3日中に完成しそうにはありませんねぇ。 |
|
現在、cronが自由に使えるレンタルサーバを探しています。知っている方いませんでしょうか。プロバイダは別に入っているので、ホームページ作成用として考えています。 |
|
@68user > 思っていたのですが、キャッシュも checkbox で選択して > 消したい、ということですか? きちんと説明していなくてスミマセン。 そうです、キャッシュの削除の話でした。 ところで、発言の編集については実装なしですか? あと、閲覧者の側から出力文字コードの指定(km=euc|jis|sjis等)が できるようになると、携帯からも見られるようになるのでうれしいです。 > というわけで、どうも2、3日中に完成しそうにはありませんねぇ。 ゆっくりやっていただければ、と思います。 「やる気が失せた」という言葉を聞くのが一番恐いです;-) |
|
こんばんわ。 HTTP クライアントを作ってみようで書かれてたものを そのままをコピーしてCGIとしてvirtualave.netに設置したんです。 そこで問題が! 設置したサーバーと同じサーバーに置かれてるファイルは ちゃんとダウンロードできないんですよ。 404になってしまいます。 これは一体どういうことなんでしょうか? 考えられる事がありましたら教えて頂きたいです。 |
|
書き忘れです。 他のサーバーに置かれてるファイルは ちゃんとダウンロードすることが出来ます。 |
|
http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1131から始まる一連のトピックで、同じ問題が取り上げられています。 |
|
どうもありがとうございました。 おかげで出来ました。 過去ログに書いてあった、 セパレータが CR でも LF でも CR LF でも認識できるようにする ってのはどうすればいいんでしょうか? ちょっと頼りすぎですかね?(^^; |
|
シスログについての質問です。 よろしくお願いします。 サーバが現在UNIXサーバ2台(サーバA、サーバB)があり、 サーバAのシスログの一部をサーバBに転送するように syslog.confの設定を行なっています。 こうすると、サーバBに転送されるログのうち 日本後でメッセージが記述されたものは 文字化けを起こしてしまいます。 転送されないログに関しては日本語のメッセージも うまく読むことができるのですが、、 もともと日本のメッセージを書く事自体間違って いるのでしょうか? 解決策をしっておられる方がいましたら よろしく御願いします。 |
|
@has > ところで、発言の編集については実装なしですか? > あと、閲覧者の側から出力文字コードの指定(km=euc|jis|sjis等)が > できるようになると、携帯からも見られるようになるのでうれしいです。 キャッシュファイルを作るようにした時点で、「シンプル」なんて 形容詞はどこかに飛んでいってしまったので、こうなったら全部 実装しまっせ。 文字コードの指定ってのは、どういう風にするのがよいですか? 携帯から文字コードを指定するときに、どういうインタフェースに したらよいか、いまいち想像できんです。 @あつしさん > 日本後でメッセージが記述されたものは文字化けを起こしてしまいます。 UNIX と言ってもいろいろありますが、OS は何ですか? エンコーディングには EUC/JIS/SJIS などがありますが、 どれを使っていますか? 他のエンコーディングにしても ダメですか? あと、どういうふうに化けますか? > もともと日本のメッセージを書く事自体間違っているのでしょうか? どうなんでしょうねぇ。個人的には気持ち悪いので日本語は使い ませんが、いまどき 8bit スルーじゃない syslogd もどうかと思います。 # あっちの人たちも 8bit 目が立ってる iso-8859-1 (Latin-1) を # 使ったりしないのかしら。 |
|
おっと見逃してた。 > セパレータが CR でも LF でも CR LF でも認識できるようにする > ってのはどうすればいいんでしょうか? m/^\r\n$/ and last; # 改行のみの行ならループを抜ける で、CR (\r) LF (\n) がくるとヘッダの終了とみなしています。 なので、CR か LF のみの行でもヘッダの終了とみなすように すればよいです。 # chomp して last if $_ eq '' でもいいんですが。 |
|
はじめまして。 私は今、Redhat linux6.2を使用し、パスワード変更プログラムを作成しています。 expectスクリプトをCGIより起動させ、コマンドレベルでユーザーアカウントを変更しようとしているのですが、簡単すぎるパスワードだと変更することができません。端末から普通にコマンドを入力しても拒否されるpasswdコマンド。これを簡単なパスワードでも受け入れられるようにするにはどうしたらいいのでしょうか。ぜひお教えください。 |
|
@68user > 文字コードの指定ってのは、どういう風にするのがよいですか? > 携帯から文字コードを指定するときに、どういうインタフェースに > したらよいか、いまいち想像できんです。 携帯の場合、sjisであれば日本語として表示することができるので、 USER_AGENTなどから携帯からのアクセスかどうか判定して、 勝手にsjisにしてくれる(私の場合は表示形態も切り替えている)、 ってのも便利かと思いますが、 wwwboard.cgi?km=sjis とかって指定するのでもいいかと思います。 |
|
@68userさん HTTPはResponseヘッダとボディの間はCRLFで区切るって 規定されてませんでしたっけ。 #さっきnews.yahoo.co.jpのうち一つで試してみたら、 #ちゃんとCRLFで区切られてました。 ちょっとだけ気になったので。 #もちろん、内容のわかっている規定違反をしているサーバには #対応しておくべき、というのが正しい道なのはわかります。 #できれば歩きたくない道ですが(笑 @超初心者さん おそらくPAMでcracklibが有効になっていると思われるので、 これを無効化するか、パスワード変更プログラムをsuid rootすれば できるようになるでしょう。 その辺を調べてみてください。 ただ、セキュリティ的には間違いなく「改悪」なので 止めておくことをお勧めします・・・。 |
|
ほんとしょうもない質問ですみません。 Print Screen機能を使って画面を印刷したいんですが、 どうしたらいいのでしょうか。 教えてください。 |
|
-u 同一内容の行は1度しか表示しない。 % cat sample | sort abc def def ghi % cat sample | sort abc def (同じ行は一度しか表示しない) ghi 2回目に-uが入ってないのでは 初心者なので違っていたら済みません。 |
|
> 簡単すぎるパスワードだと変更することができません。 root なら「パスワードが簡単すぎるぞ」と怒られても、再度 同じパスワードを入力すればムリヤリ変更できますが、一般 ユーザでは hsj さんの書かれたようなことをしない限り、 無理でしょうね。 > HTTPはResponseヘッダとボディの間はCRLFで区切るって > 規定されてませんでしたっけ。 です。 http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1135 の書き方はちょっとアレなので、書き直すと、 http://news.yahoo.co.jp/headlines/top/ のヘッダ/ボディのセパレータは LF になってます。 00000000 48 54 54 50 2f 31 2e 30 20 32 30 30 20 4f 4b 0a |HTTP/1.0 200 OK.| 00000010 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 65 |Content-Type: te| 00000020 78 74 2f 68 74 6d 6c 0a 43 6f 6e 74 65 6e 74 2d |xt/html.Content-| 00000030 4c 65 6e 67 74 68 3a 20 31 39 31 30 33 0d 0a 0a |Length: 19103...| 00000040 3c 68 74 6d 6c 3e 0a 3c 68 65 61 64 3e 0a 3c 21 |<html>.<head>.<!| > Print Screen機能を使って画面を印刷したいんですが、 Print Screen キーを押したら、xwd コマンドを実行するように、 ウィンドウマネージャを設定するのが一番簡単そうです。 > 2回目に-uが入ってないのでは ですね。御指摘どうもです。次回更新時に修正しておきます。 |
|
はじめまして。 今、procmailを用いて転送制限の設定を行っているのですが 添付ファイル付きのメールを転送しない設定ができません。 ある雑誌に載っていた方法を試したのですが、どうもうまくいきません。 :0 c * !Content-Type:.*multipart !転送先メールアドレス 資料に目を通した限り、うまくいきそうな感じがするのですが 間違いなり、さらにうまい方法があるならばお教えください。 お願いします |
|
追記します。 下記の例は、添付ファイルがついていた場合 メール転送しないという意味で書いています |
|
68userさん、hsjさん。返信ありがとうございます。 やはりそうですか・・・。 さすがにセキュリティを下げると問題があるので、コマンドレベルから やることは破棄せざるをえなくなりました。 その代替となると、passwdコマンドのソースを研究するしかないのかもしれませんね。どこかにそんなことを詳しくのっている場所はないでしょうか? 現在自分自身でも検索中です。 |
|
@68userさん スミマセン、ぼくの確認方法が正しくなかったようです。 確実な方法で確認したところ、確かにnews.yahoo.co.jpは LFしか返してきませんね。はー > http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?log=1135 > の書き方はちょっとアレなので、書き直すと、 > http://news.yahoo.co.jp/headlines/top/ > のヘッダ/ボディのセパレータは LF になってます。 こっちの意味は取り違えてなかったんですが(苦笑 @超初心者さん いやそうではなくて、ユーザが任意の文字列を選ぶ際に、 その文字列のパスワードとしての強度を(ある程度)判定してくれる物を 取り除いてしまうこと自体が「改悪」だと言う意味です・・・。 |
|
お礼が遅れてすいませんでした。 てっきり頼り過ぎたので無視されたと 思って掲示板を見てませんでした(^^; なるほど、良く分かりました。 ありがとうございました |
|
> 超初心者 > 超メール初心者 > 超ビギナー こういうハンドルはやめてください。そこまで匿名性を 求めるならば、www.2ch.net などを利用してください。 > 今、procmailを用いて転送制限の設定を行っているのですが > 添付ファイル付きのメールを転送しない設定ができません。 まずは ~/.procmailrc の先頭に LOGFILE=$HOME/procmail-log などと書いて、ログを取りましょう。原因究明はその後です。 > passwdコマンドのソースを研究するしかないのかもしれませんね。 まぁそうなりますが、passwd は人間様が対話的に使うコマンド なので、*BSD ならスクリプト向きの pw コマンドってのが あります。これは root での使用を前提としているので、 指定したパスワードをそのまま設定してくれます。Redhat Linux にも、その手のコマンドがあるかもしれません。 で、以下のようなスクリプト #!/usr/bin/suidperl $username=$ARGV[0]; $newpasswd=<STDIN>; chomp($newpasswd); echo $newpasswd | pw usermod -n $username -h 0 を passwd_change という名前で保存して、 # chmod 4755 passwd_change # chown root passwd_change しておけば、誰でも % echo newpasswd | passwd_change username で変更できます。 もちろんこのままでは、セキュリティもへったくれもないので 何かしらの制限を付けないといけません。 @has 文字コードの件、了解です。 |
|
どうも皆さん始めまして。 私は最近Cygwinでプログラミングの勉強を始めました。 Linuxのことはまだほとんどわからないので2つ同時に 勉強しなければならないので大変です(^_^;) で、インターネットで拾ってきたいろんなサンプルソースを コンパイルして遊んでるんですが、LinuxとWin32での ソースレベルでの互換性に疑問があります。 たとえば、あるサンプルソースの場合、シリアルポートにアクセス するのに #makefile SERIALDEVICE = /dev/ttyS0 #tool.c /* setup serial port */ void open_serial(char *devicename) { struct termios newtio; dfd = open(devicename, O_RDWR | O_NOCTTY); if (dcfd < 0) { perror(devicename); exit(-1); } open_serial(SERIALDEVICE); という具合にデバイスをオープンしているのですが、 このソースをWin32アプリとしてコンパイルしても当然(?)動きません。 で、SERIALDEVICEの部分を COM1 に変えて見たのですが、これも 動きませんでした。 他のファイルやソースを眺めてみても、良くわからないのですが、 この場合、Win32で動作させるにはどのようにすべきなのでしょうか? |
|
ども、はじめまして。雅人と言います。 質問なのですが 掲示板をつくろう(1)でperlを書くならEUCで書くべきと 書かれてたのでSJIS(CRLF)からEUC(CRLF)に変換したところ 逆に文字化けが起こってしまいました。 ローカルな環境(win95)でもアップロード先(virtualave.net) でも文字化けが起こってしまいます。 これの原因とは一体なんなのでしょうか? よろしくお願いします。 |
|
超メール初心者あらため宗佑です。 procmailの転送設定、自己解決しました。 記述が足りなかっただけでした。 うーん、奥が深いですね、メール転送。 これからスクリプトを徐々に複雑にしていこうと思います。 でもprocmailを記述しているHPって少ないものなんですね。 載っている例も基本的なものです。 私も自分で試している途中ですが、procmailの達人みたいな例の 載っているHPをどなたかご存知内でしょうか? お願いいたします |
|
@雅人さん > ローカルな環境(win95)でも メモ帳などのエディタで化ける、ということならば EUC を読めるエディタを入手して下さい。 > アップロード先(virtualave.net) でも ブラウザの文字コード設定を「日本語 EUC」として直るならば、 CGI の出力する日本語部分が短かすぎるため、ブラウザが 文字コードを正しく解釈していないのでしょう。その場合は、 print "Content-type: text/html\n\n"; を print "Content-type: text/html; charset=EUC-JP\n\n"; として下さい。 @宗佑さん > でもprocmailを記述しているHPって少ないものなんですね。 > 載っている例も基本的なものです。 確かに少ないですね。僕もあまり見かけたことがありません。 ただ、基本的なところをわかっていれば procmailrc(5) と procmailex(5) でなんとかなることも多いです。 @Madstar さん うーん、さっぱりです。シリアルポートの操作さえしたことがないので…。 |
|
> print "Content-type: text/html; charset=EUC-JP\n\n"; > として下さい。 というより、Content-type ヘッダには EUC-JP/Shift_JIS/ISO-2022-JP などの charset を付加 *すべき* です。 僕のところの CGI プログラムには一部にしか付いていませんが、 これは悪い CGI の見本です。必ず charset を付けましょう。 |
|
どうも、ありがとうございました! 無事できました。 |
|
みなさん、はじめまして。海苔王と申します。 現在、ソラリス7でサーバーを構築しています。 apache,sendmail,popper と動かしてきて、昨日までは メールが動いていたのですが、突如、受信ができなくな ってしまいました。電八で出たエラーは以下のとおりです。 +OK QPOP (version 3.0.2) a ******starting. C: USER *** S: +OK Password required for ****** C: PASS ******** S: -ERR [SYS/TEMP] maillock error 3: '/usr/mail/*****' といった内容でした。sendmail.def からいろいろ見直したのですが、 うごきませんでした。どうかアドバイスお願いします。 |
|
チェック項目を思い付くままに。 1. /var/log/messages や /var/log/maillog に詳細なエラーは出ていないか 2. /usr/mail/ のパーミッションがおかしくなったのではないか (ls -ld /usr/mail) 3. /usr/mail/ にロックファイルらしきものは残っていないか (ls -lA /usr/mail) 4. ディスクの残り容量は (df -k)。i-node space が枯渇していないか (dk -ki) 5. ソースから grep maillock して、エラー箇所を捜し出す あと重要なのが、全ユーザでメールを取得できないのか、 一人だけメールを取得できないのかってこと。全ユーザなら 1,2,4 あたり。一人だけなら 3 をチェック。 ってな感じでしょうか。 |
|
>うーん、さっぱりです。シリアルポートの操作さえしたことがないので…。 残念です(T_T) まぁシリアルポートなんて今更余り使わないですよねぇ(^_^;) いろいろ検索かけてるんですが、さっぱりです。 |
|
>まぁシリアルポートなんて今更余り使わないですよねぇ(^_^;) DOS時代には、awkで print "AT" > "AUX" みたいな感じでモデムとお話してましたが、 Windowsではどうなんだろう…試してません(^^; |
|
> シリアルポート ぼくの当てにならない記憶によると、 winでシリアルポートを開くときはAPIのCreateFile()を使うはずです。 その辺を調べてみてください。 で、この辺のソースはwin系と*nix系での互換性を維持するのは 難しいところだと思います。 ぼくはCygwinは使ったことありませんが、おそらくopen()を実装するのに このAPIを使ってると思うので、もしかしたら開けるかもしれません。 が、結局フラグが違うでしょうからあまり意味無いと思います・・・。 #そもそもLinuxのopen()ってシステムコールですしね |
|
初めまして。 Perlの勉強をし始めたばかりなのですけど、ソケットを使ったクライアントプログラムの作り方とか…全くの初心者な私にはすごく解りやすくて、それに読みやすかったです。 全部説明しよとう難しくなってるサイトや、簡単に説明しようと補足説明が抜けてるサイトも多いですけど、このサイトの説明はとても解りやすいです。 えっと感想をここに書いて良い物かどうか解りませんが、本当に参考になりました。ありがとうございます。 |
|
少なくともNTであれば C:\> type CON > COM1 といった方法でシリアルポートとお話できます。 parityやbaud rate、タイムアウト等の設定は、MSDOSと同じ modeコマンドで行います。 Windows95/98のことは知りませんが、似たようなものだと思いますよ。 |
|
@ありしあさん お褒めの言葉ありがとうございます。でもありがたくは思いますが、 もっとありがたいのは「ここは間違っている」「ここの記述が 理解しにくかった」などの指摘です。もちろん「こういうサンプル プログラムがあるとよい」とか、単なるタイプミスのご報告でも 大歓迎です。 何かしら気づいた点がありましたら、よろしくお願いします。 と言っておきながら、これまでいくつかプログラムの不具合や 記述ミスのご指摘を頂きましたが、忙しくて web に反映できず、 誠に申し訳なく思っています。手元にあるファイルは修正して いますので、暇ができ次第更新するつもりです。 # なのに、また忙しくなってきてしまった…。 |
|
procmailについてあるツールformailについての 質問です。 formailを使用して自動返信設定を作成中なのですが from句を任意で指定したアドレスに変更して、返信したいのです。 今の状態を見るとユーザー名+サーバーのドメイン名といった具合になってしまいます。 これを"xxx@xxx.yyy.zzz"といった指定したメールアドレスをfrom句に入れて自動返信したいのです。そういった方法はあるのでしょうか? よろしくお願いいたします |
|
追記です。 現在、procmailの設定は :0 h c * !^FROM_DAEMON * !^X-Loop:your@own.mail.address | (formail -r -A"Precedence: junk" \ -A"X-Loop: your@own.mail.address" ; \ cat resmsg) | $SENDMAIL -t これだと、送信者名がUNIXのユーザー名になってしまう。 最後の$SENDMAILで送信しているから当然なのですが・・・ ので、この送信者をxxx@xxx.yyy.zzzとしたいのです。 なにとぞ、よろしくお願いします。 追伸 どなたか、linuxサーバー(Redhat 6.2)で使用可能なお勧めの 自動返信ツールをご存知でしたら教えてください。 smtpにはsendmail8.9.3を使用しています。 |
|
むにむに。。思ったこと。 link-check.pl 114-115行目。 &check_link(SITES=>[@sites], MAX_CHILDRED=>20); 138-143 if ( defined $args{SITES} ){ @sites = @{$args{SITES}}; } if ( defined $args{MAX_CHILDREN} ){ $max_children = $args{MAX_CHILDREN}; } MAX_CHILDRED -> ? |
|
>68user 様 アドバイスありがとうございました。 どうやら容量の枯渇が原因でした。 余計なものを移動したら、動くようになりました。 ありがとうございました。 |
|
Perlのネットワークプログラムで、サーバーとの接続が 切れた状態を検出したいのですが、LANケーブルがつながった状態で 通信できなくなった状態は検出してPerlプログラムを終了出来るのですが LANケーブルを引きぬくことによって、通信できなくなった状態はどのようにして検出したらよいのですか? 一応、Perlの中でPingをうって帰ってきた値を見て検出しようと したのですが、Perlの中のPingはRoot権限でないとエラーに なってしまいます。 Root権限以外でPingを実行する方法か、あるいは違う方法を 知っていたら教えて下さい。お願いします(v_v) |
|
@宗佑さん > "xxx@xxx.yyy.zzz"といった指定したメールアドレスを > from句に入れて自動返信したいのです。 これは、単に From ヘッダが xxx@xxx.yyy.zzz になっていれば いいのですか? それとも envelope from が xxx@xxx.yyy.zzz と なっていて、例えば転送途中でメール送信に失敗した場合、 エラーメールが xxx@xxx.yyy.zzz に送られることを意図して いますか? 前者ならただ単に From: を置換するだけなので、formail -i や formail -I でできそうです。後者なら sendmail -f xxx@xxx.yyy.zzz でしょうか。 なお、僕は formail を使ったことはありませんし、できるか どうか試してもいません。 @やままさん > MAX_CHILDRED -> ? む、typo ですね。直しました。御指摘ありがとうございました。 @ありさわさん ケーブルを抜いた状況だとどうなるんですかね。多分僕なら一定時間で タイムアウトさせて unreachable かどうかを判断すると思いますが、 本当はどうすべきなのかは わかりません。 それはそれとして、以下は ping で判断するという前提の話。 ping は ICMP プロトコルを使いますが、これは root 権限が ないと実行できません。その証拠に ping コマンドは root に suid されています。 % ls -l /sbin/ping -r-sr-xr-x 1 root wheel 195956 Jul 27 23:31 /sbin/ping* というわけで、素直 (?) にping コマンドを使うのがいいのでは ないでしょうか。 |
|
>ケーブルを抜いた状況だとどうなるんですかね。多分僕なら一定時間で >タイムアウトさせて unreachable かどうかを判断すると思いますが、 >本当はどうすべきなのかは わかりません。 OS 依存ですが、ifconfig -a とすると表示されることがあります。 下は FreeBSD の場合です。 dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::xxx:xxxx:xxxx:xxxx%dc0 prefixlen 64 scopeid 0x1 ether xx:xx:xx:xx:xx:xx media: autoselect (none) status: no carrier supported media: autoselect 10baseT/UTP <full-duplex> 10baseT/UTP none no carrier というのがケーブルが抜けたことを意味していると思っても だいたいあたっているはずです。一方、Solaris のように抜けた瞬間に /var/adm/messages などに記録されるものもあります。 Solaris がでたついでなので、 >1. /var/log/messages や /var/log/maillog に詳細なエラーは出ていないか Solaris の場合 sendmail のログは通例 /var/log/syslog に記録され、 BSD の /var/log/messages にあたるものは /var/adm/messages です。 |
|
No.1299の ありさわ です。 いろいろご回答いただきありがとうございます。 掲示板に書き込みしたのが初めてだったので、 返答が有ったことにチョット感激してます。 この件については結果的に、僕の技術不足で違う方法によって 対処をすることになりましたが、今後のためにこの件について 前の書き込みで説明が足りなかった分の説明をさせていただきます。 切断を検出して子プロセスをKillする一連の作業は コマンドラインからではなくPerlプログラム内で行いたいです。 ついでに何を作成したかというと、ここのサンプルプログラムを 利用してネットワーク対戦のロビーサーバーを作成しました。 Q.LANケーブルを抜いたらどうなるのか? まずこれは、クライアント側のLANケーブルを抜いた時のことです。 ※LANケーブルを抜いた時の様子 ・最初にケーブルがつながった状態でサーバーに接続をしにいきます。 ・サーバーはこのクライアントに対して子プロセスを作成します。 ・接続が確立した状態でクライアントのケーブルを引きます。 ・子プロセスはクライアントとの接続が切れたことを認識できず 残ったままになります。 ・この作業(嫌がらせ)を何度もされると子プロセスが溜まっていって 結果、サーバーがダウンするんじゃないか?って思ってます。 あたたかいご回答、本当にありがとうございました。 |
|
ありがとうございます。 formailによる自動返信完了しました。 errorメールに関しても、本文に細工をしてなんとか解決しています。 こういうことが、やりたかったのも、UNIXのアカウント名とメールアカウント名が、まったく一致しない仕様のシステムを使っているので、外部に対する送信者が誰であるかを混乱させないようにする目的があったからです。 ありがとうございました |
|
はじめまして。 GOOで検索してきました。 perlの事について質問があるのですが。。。。 perlを使ってActiveXのDLLファイルを舐めようと思っているのですが、全くもって方法が解りません。 ここの過去ログや、その他色々探して見ましたがそれらしいものは見当たりませんでした。 どうぞお解りになる方がいらっしゃいましたら御指導宜しくお願いします。 |
|
@rosegarden さん > OS 依存ですが、ifconfig -a とすると表示されることがあります。 なるほど、勉強になりました。どうもです。 @ありさわさん > 子プロセスはクライアントとの接続が切れたことを認識できず > 残ったままになります。 という用途なら、TCP のタイムアウトを待つか、自前で タイムアウトの機構を作るのが普通のような気がします。 @Taka さん > perlを使ってActiveXのDLLファイルを舐めようと思っているのですが 「ActiveX の DLL を舐める」の意味からして さっぱりわかりません。 google で検索すると http://www.union-net.or.jp/~cgifaq/Archive/msg13177.html Subject: [cgi:13180] Re: Perl からActiveX のDLL を呼び出すには というのが引っかかりますが、現在サーバの容量オーバーにより公開を 中止しているようで。あと perl モジュールの Win32::COM ってのが ありますが、関係あるのかなぁ…。 http://www2s.biglobe.ne.jp/~cru/library/zddbbs/cgi-bin/wwwboard.cgi に行くと、その道の偉い人が教えてくれるかもしれません。 |
|
初めまして。 上條と申します。 かなり困っております。 どなたかお知恵を拝借願います。 現在Windows98にFTPサーバソフトをインストールしてあり、カスタマイズチューンナップされた シェルのないFreeBSDにファイルをダウンロードさせたいのです。 FreeBSD側のコントロールはTelnetでコマンドを入力することにより、FreeBSD側は指定された IPのFTPサーバに(この場合Windows98)接続をしてダウンロードを開始する仕組みなっています。 この際のFTPサーバへの21番にどういったコマンドが流れているのか不明ですが、様々なFTPサーバソフトを 試した結果、NDMTというコマンドがFTPサーバソフト側で処理できないこと、winftpdeamonの コミュニケーションタイムがオーバーになるというエラーが出て、FTPサーバ側で切断をしてしまいます。 一度、Win98+wftpdでの成功例を聞いたことがありますが、色々設定を変えてみましたが、うまくいきません。 接続の形態としてはルータ支点に同ノード内の10BASE-T接続です。 Freebsd側とは全てのPORTで接続は出来ます。 プロトコルはTCP/IPを使用しています。 もっとも最初からLinuxやFreeBSDにFTPサーバをたてることが出きれば問題なく接続できることは マニュアルに明記してあるのですが、私がFTPをたてるだけの技術がないことと、本日中という時間の中で 手元に使用できるLINUXなどがなく、大変困っております。 詳しい説明でなくても結構ですので、何か妙案がございましたら、どなたかお教えいただけないでしょうか。 よろしくお願いいたします。 |
|
AnHTTPD で HTTP 使ってダウンロードするのは? FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 FreeBSD の 4.0-RELEASE 以降だと ftp クライアントの類は passive mode で動作しますが、これはチェックしました? passive mode をオフにするには /etc/login.conf の default エントリで FTP_PASSIVE_MODE という環境変数を セットしているから、そのファイルを書き換えて、NO にすれば 良いですよ。 思い付くのはこれだけですね。カスタマイズされているのだから、 これ以上答えようがないですね。 |
|
> FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 失礼、/usr/bin/fetch ですね。 それから wget でも良いかも知れません。 もっとも、FreeBSD がわで IPv6 の設定(デフォルト)してあると最近の wget は IPv4 のオプションつけないと no route to host って エラーを出すこともありますが。 |
|
> FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 失礼、/usr/bin/fetch ですね。 |
|
はじめまして。 時々68userさんのページ拝見させていただいてます。 いろんなことが書いてあってとてもためになります。 場違いかもしれないんですがXについて少々よろしいでしょうか? このページでHello World のソースをとってきて、 gcc -o test test_hello_world.c -I /usr/X11R6/include -L /usr/X11R6/lib -lX11 -lm とコンパイルしたところ、正常に動作したのですが、 右上のバツボタン押してもちゃんと終了してくれず、 X connection to :0.0 broken (explicit kill or server shutdown). と、怒られてしまいます。 ちなみにVine Linux2.0CRを使用しております。 あと、右上のバツボタンがそのHello Worldのみに関しておかしい 表示になってしまいます。 と、いうか自分で書いてみたやつは全部なんですが。 もし心あたりがあったらご教授いただけませんでしょうか? お願いします。 でわまた寄らせていただきます。 |
|
@いえろーばっくすさん > X connection to :0.0 broken (explicit kill or server shutdown). これはクライアント側の Xlib が出力しているメッセージです。 # 個人的には、あまり気にするほどのメッセージではないと # 思っています。 よくわかってませんが、多分ウィンドウマネージャの「×」を 押すと、X サーバとのコネクションが切断されるのでしょう。 X クライアントは、コネクションが切断されたので X サーバと 通信できなくなり、エラーとなって終了しているわけです つまり、「×」ボタンを押すと X クライアントのプロセスが直接 kill されるわけではないということです。 これを直したいなら、まず Atom a1,a2; アトムを宣言します。次に a1 = XInternAtom(display, "WM_PROTOCOLS", False); a2 = XInternAtom(display, "WM_DELETE_WINDOW", False); XSetWMProtocols(display, window, &a2,1); とすれば、「×」ボタンを押すと、ClientMessage イベントが 送られてきます。後は switch 文の中で case ClientMessage: if ( event.xclient.message_type == a1 && event.xclient.data.l[0] == a2 ){ XCloseDisplay(display); exit(0); } break; とすればいいでしょう。 「×」を押しても終了しないアプリや、終了する前に後始末を するアプリを作るときは、こういうふうにします。 @rosegarden さん > FreeBSD の方は標準コマンドの /usr/sbin/fetch で落せますよ。 FreeBSD なら ftp コマンドでも落とせますね。 % ftp http ://foo.bar.com/hoge.html % ftp ftp ://foo.bar.com/hoge.tgz などなど。Solaris にもこういうコマンドがあればいいのに。 @上條さん > 私がFTPをたてるだけの技術がないことと シェルがないということなので今回は無理かもしれませんが、 ftp サーバを立てるだけなら、/etc/inetd.conf に ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l と書いて、kill -HUP `cat /var/run/inetd.pid` でおしまいです。 # FreeBSD のデフォルトでは、ftpd は使用可能です。 anonymous ftp サーバなら、さらに (FreeBSD なら) jman ftpd に 書いてあるとおりにやればよいです。 「ネットワークプログラミングの基礎知識」に「HTTP の並行アクセス」 http://X68000.startshop.co.jp/~68user/net/http-parallel-1.html というページを置きました。お暇な方、ご笑覧くださいませ。 |
|
perl CGIの実行権限について質問させて下さい。 CGI内部でこれを調べる方法を探してて、 ここの掲示板のソースを参考にさせてもらおうと思ったのですが、 ここでは、(getpwuid($>))[0]で、実行権限が誰かを表示してますよね。 これを -o $script_name の検査で、 直接、所有者権限か(真の場合)、それとも他の権限か(偽の場合)を 検査することはできないのでしょうか? @ActiveX の DLL を舐める ウチのURLが出てるなぁ…でも、私宛じゃない(笑い) これ、単にDLLの内部データを読み出したいだけじゃないんでしょうか? (そういう、ツールがあったと思う) それなら、perlで注意するのは、binmodeを使うことくらいでしょう。 後は、DLLのバイナリ構造をどこかで調べればいい(私は知らないですが)。 |
|
おそらく -o $filename は $> == stat($filename)->uid ? 1 : 0 と同じだと思うので、それで問題ないと思います。 getpwuid を使ったのは特に意味はないので (強いて言えば -o の存在を知らなかったから)、今後は if ( -o $0 ){ 所有者権限 } で判別しようかと思います。 |
|
>と同じだと思うので、それで問題ないと思います。 UIDとかは自信がないので、ありがとうございました。 ウチもそれで行きます♪ |
|
> FreeBSD なら ftp コマンドでも落とせますね。 これは知りませんでした。勉強になりました。 > などなど。Solaris にもこういうコマンドがあればいいのに。 Solaris は /usr/local/bin に GNU コマンドとか BSD コマンドとか インストールしないと日常的な作業は確かに辛いですね。 |
|
UNIXの/var/adm/crashディレクトリについての質問です。 最近仕事でHP−UNIXを使用しているのですが、/var/adm/crash ディレクトリに、「core〜」、「bounds」のディレクトリが作成されて しまい、/var の領域が100%になってしまいます。 「core〜」については、削除しても良いと本に載っていたのですが、 「bounds」については、削除してよいか分からないです。 どなたかご存知の方いらっしゃいましたら、お教えください! よろしくお願いします! |
|
HP-UX は知りませんが、マニュアル savecore(1M) には > savecore saves the core image in the file > dirname/hp-core.n and a copy of dumpsystem, which contains the > namelist, in the file dirname/hp-ux.n. The trailing n in the path > names is a number that increases by one every time savecore is run in > that directory. This number is kept in the file dirname/bounds, which > is created if it does not already exist. とあるので、消してもいいんでないでしょうか。 |
|
「SSLプログラミング」に関する質問です。 サーバー・クライアント間でSSL通信を行っている状態のものに、 「プロキシプログラム」なるものを両者の中間に介在させた場合 について・・。 サーバー・クライアントの「メッセージのやりとり」をログファイル等に 出力したいのですが、当然この両者は「暗号」によるデータのやりとりを している為に「メッセージ」に関しては???と言った状態です この暗号を「解読」と言った事は出来ないものでしょうか? |
|
どうも。いえろーばっくすです。 68user様、windowの件ありがとうございました。 今やってみたところちゃんと閉じることができました。 ボタンの表示もちゃんと直りました。 これからもいろいろと質問することがあるかもしれませんが、 どうぞよろしくお願いします。 |
|
はじめまして。 日付,時間,なまえ,・・・ 日付,時間,なまえ,・・・ 日付,時間,なまえ,・・・ といったようなログから当日分のみを抜き出し他のファイルに保存する。 といったようなバッチを作りたいのですが、 UNIX初心者でさっぱりわかりません。どなたか教えていただけませんか? |
|
@みーたんさん 盗聴できるかということならば、無理です。なぜなら SSL は 公開鍵と秘密鍵を使うから。盗聴によって公開鍵を盗めても、 秘密鍵はクライアント・サーバそれぞれが保持していますので、 データは守られます。 # という説明でわかってもらえるかしら。 @M.K さん sh スクリプトで書きたいとか、perl を使いたいくらいは 書きましょうよ。こちらがサンプルを書いても、「いえ、 そうじゃなくて…」という返事はもらいたくないので。 まぁ 一言でいうと、date コマンドで現在日時を取得し、それを キーとして grep です。date と grep のマニュアルを読みましょう。 |
|
はじめまして。 当方cshシェル環境にてUNIXを利用しております。 その環境設定で「カレントディレクトリをプロンプトに追加」というのがありますが、 ディレクトリの移動によって「今現在どこに居るか」というのを表示させたいのです。 set prompt = "`whoami`@`hostname -s`[\!][`pwd`]%" のように `pwd` をつけてもsourceコマンドによって.cshrcを再有効に した時点でのカレントディレクトリが格納されたまま変化してくれません。 ディレクトリの移動に応じてプロンプト上に表示されるカレントディレクトリを 逐次変化させるためにはどの様に.cshrcを書き換えれば良いのでしょうか? `pwd`の部分を$cwdとかに変えてもダメだったし...ほとほと困っております。 参考までに、現在の.cshrcの内容を書いておきます。 alias dir 'ls -alF' alias less 'jless' setenv LANG japanese setenv EDITOR vi setenv PAGER less setenv BLOCKSIZE K setenv EXINIT 'set showmode' setenv LESSCHARSET japanese set prompt = "`whoami`@`hostname -s`[\!]%" なお、FreeBSD3.4R上での環境です。 どうかよろしくお願いします。 |
|
C言語を覚えたいのですが どなたかC言語を教えに来ていただけませんでしょうか。 兵庫県姫路市 ho-muzu@mui.biglobe.ne.jp メールください。 |
|
> ディレクトリの移動によって「今現在どこに居るか」というのを表示させたいのです。 とりあえず、こんなんでどうでしょうか? テストは tcsh でやったので、 断定的なことは言えませんが、古い csh と互換性のある構文を使っています。 alias sp 'set prompt=`whoami`@`hostname -s`\[`pwd`\] ' alias cd "cd \!* ; dirs -l ; sp" alias pushd "pushd \!* ; sp" alias popd "popd ; sp" ポイントは set prompt の alias をシングルクォートで囲むところですかね。 あと、cd, pushd, popd のごとに prompt の set をするということですね。 4.1-RELEASE 以降だと /bin/csh は tcsh なので、もっと簡単に出来ます。 たしか %/ とかいうのを使えば、良いだけだったと思います。 |
|
rosegardenさんへ> >ポイントは set prompt の alias をシングルクォートで囲むところですかね。 >あと、cd, pushd, popd のごとに prompt の set をするということですね。 なるほど。cdコマンドを使うたびにset promptするんですね。 ためしてみたところ、確かに出来ました。 >たしか %/ とかいうのを使えば、良いだけだったと思います。 これは知りませんでした。tcshの利用が可能なマシンがあるので 試してみましたが、ホントですね。うーん、こっちの方が簡単だなぁ。 でもメインのマシンはシェルの変更を許可してくれないので、 alias方式で行きます。どうもありがとうございました。 |
|
> でもメインのマシンはシェルの変更を許可してくれないので 僕は sh・csh のような非人間的なシェルを使うのは耐えられない ので、そういうときは勝手に tcsh を入れて、~/.cshrc に if ( ${?tcsh} == 0 ) then exec /usr/local/bin/tcsh endif などと書いてます。 前にちょっとはまったことを書いておきますと、これをするなら ~/.cshrc に setenv TERM vt100 などと書いてはいけません。 普通にログインするときはいいのですが、もし端末がない場合 (rsh を使う場合など) は、tcsh が端末があると勘違いして 入力待ちになってしまい、rsh が効かなくなるからです。 Solaris などで、デフォルトだと TERM=kterm になってしまい、 さらに /etc/termcap に kterm のエントリがないため、vi や emacs を実行すると文句を言われるので仕方なく setenv TERM vt100 と書いている人もいると思いますが、それをするなら if ( ${?TERM} ) then setenv TERM vt100 endif と書けばいいです。これなら rsh のときは TERM が設定されません。 |
|
はじめまして。今UNIXにおいてのプロセス間通信として、 FTPをモデルとして調べていて、ここのHPにたどりつきました。 ものすごく参考になってます。で、聞きたいことがあります。 聞きたいことは、FTPクライアントのプログラムでのことですが、 C言語版での、GET及びPUTなのですが、GETの場合は、Perl同様に soketより手に入れたデータをfopen関数を用いてのそのデータをGetしたファイルと同じ名前で保存することでGETされるのですか?PUTも同様ですか? また、FTPサーバーでは、LESTやGETやPUT のプログラム上では、どのような動きをしてるのでしょうか? 自分なりには、イメージがあるのですが自信がないので教えてもらい たいです。 こちらの勝手なお願いですが、今週中までに返事を掲示板のほうでいただけると大変助かります。 |
|
初歩的な質問ですが, AIXを触り始めたのですが, telnetでrootのログオンを許容しているのを やめたいのですが, 設定ファイルがわかりません。 どのファイルにその設定が書いてあるのでしょうか? あと,tcshをmakeするとEUCコードで作成されてしまいますが AIX用(SJIS)での作成方法もご存知の方,お教え願います。 よろしくお願い致します。 |
|
> telnetでrootのログオンを許容しているのをやめたいのですが, AIX は管理したことも使ったこともありませんのでわかりません。 init, pam, login, tty, ttys などのマニュアルを探してみてください。 FreeBSD なら /etc/ttys Solaris なら /etc/default/login Linux なら /etc/security あたりなので、/etc の下に片っ端から grep かけてみる のもいいでしょう。 cd /etc; egrep -i 'secur|root|login' * */* */*/* > soketより手に入れたデータをfopen関数を用いてのその > データをGetしたファイルと同じ名前で保存する そうです。C でも perl でもやることは同じです。 > FTPサーバーでは、LESTやGETやPUT > のプログラム上では、どのような動きをしてるのでしょうか? コマンド用コネクションから RETR hoge が送られてきたら、 データコネクションを確立し、hoge のファイルを fopen して データコネクションに hoge の内容を流します。 コマンド用コネクションから LIST/NLST が送られてきたら、 データコネクションを確立し、/bin/ls の結果 (別に ls を 使わなくてもいいけど) をデータコネクションに流します。 > 自分なりには、イメージがあるのですが自信がないので > 教えてもらいたいです。 自分なりのイメージを書いた上で、それが合ってるか間違ってるか たずねるのがスジというものでしょう。 |
|
質問というか、ご意見頂きたいです。 掲示板が荒らされたなら、制限したり削除できますが メールが大量に届いたり本文が最悪なタグの羅列だった場合 どうすればいいんでしょうか?明日も変なメールきそうで カナリ、不安です。これって警察に言えたりするものなのでしょうか? 迷惑防止条例とか。 http://www.alles.or.jp/~tll/toc/hino.html |
|
Perlの質問です。 2000/10/01の三日まえを表示したいのですが どのようにやれば良いでしょうか? 宜しくお願いします。 |
|
> 2000/10/01の三日まえを表示したいのですが Time::Local で time_t 形式に変換し、3日分の秒数を引いてから、 再度 localtime で年月日の形式に戻します。 use Time::Local; $time = timelocal(0,0,12,1,10-1,2000-1900); $time -= 60*60*24*3; ($sec,$min,$hour,$day,$mon,$year) = localtime($time); printf "%4d/%02d/%02d",$year+1900,$mon+1; > メールが大量に届いたり メールが何通届いていて、それぞれサイズはどれだけか、という ことは、メール本文を取得する前に調べることができます。 また、これはメールサーバにもよりますが、あるメールの先頭 何行のみを取得、ということもできます。そういう機能を持つ メーラーを探してみてはどうでしょうか。 % telnet メールサーバ名 110 USER your_user_name PASS your_password LIST (メール一覧とサイズ表示) TOP 1 3 (1通目のヘッダと本文3行のみを表示) QUIT (終了) > 本文が最悪なタグの羅列だった場合 Windows はよく知らないんですが、HTML メールが送られて きたら、HTML として開くか plain text として開くかを 確認してきませんか? 聞いてこないなら、まともなメーラーに かえましょう。 |
|
68userさん > こないだは説明が足りずに済みません。助かりました。 またしても質問なんですが、 sh スクリプトで2つのファイルの内容が完全に一致した場合に aというファイルに 日付,"一致"(文字列)を出力して、 一致しなかった場合には 日付,"不一致"(文字列)を出力したいんですが 全然わかりません。よろしかったら教えてください。 |
|
ファイルの比較には cmp か diff を使います。一致 したかどうかはコマンドの戻り値を見ればよいですが、 sh なら $? で参照できます。あとはマニュアルを よく読んでみてください。 |
|
No.1269で、超初心者さんがやってたのと同じように、CGIからexpectスクリプト を呼び出して、他のマシンにtelnetしてパスワードを変更するシステムを作って いるんですが、telnetで戻ってきた文字が一部うまくexpectに渡されないようで 途中で止まってしまい、上手くいきません。 そこで$|=1にして出力を見たら、以下のところで止まっている事が分かりました。 spawn telnet server Trying xxx.xxx.xxx.xxx ... Connected to server.xxx.xxx. Escape character is '^]'. ”Escape character is '^]'.”の後に、CRLFが来るんですが、それから先が上手 くexpectに渡されていない(?)ようです。 HTTPdがCRLFだから止めてしまっているんでしょうか? それってHTTPdの仕様なんでしょうか? exec 'expect';の後のprint文はexpectのtimeout後に出力されます。 どこで止めてしまってしまっているかを調べる方法や解決方法など、アイディア がありましたら教えてください。 |
|
僕は expect 使ったことありませんのでわかりませんが、せっかく perl を使っているんですから、Net::Telnet モジュールでやって みてはいかがでしょう。 use Net::Telnet; $t = Net::Telnet->(Timeout=>10, Prompt => '/\w+?@\w+?: /'); $t->open('hostname'); $t->login('yourname', 'password'); @lines = $t->cmd("/bin/ls -l"); print @lines; $t->close(); 言うまでもないかもしれませんが、Prompt のところは適切に 変更しないと動きません。詳しくは perldoc Net::Telnet をどうぞ。 |
|
うーん、むずかしい…。全然理解してないことがよくわかった。 すごく汚くて変な書き方ですがこんな感じ。 use Net::Telnet; $username='yourname'; $oldpasswd='secret1'; $newpasswd='secret2'; $t = new Net::Telnet (Timeout => 5, Prompt => '/\w*? /', Dump_Log => 'telnet-log'); $t->open("localhost"); $t->login($username, $oldpasswd); $t->prompt('/Old password:/'); $t->cmd("/usr/bin/passwd"); $t->print("$oldpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->print("$newpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->print("$newpasswd\n"); ($prematch,$match) = $t->waitfor('/[a-zA-Z ]+:/'); print "[$prematch] [$match]\n"; $t->close(); 適当に $match の結果に応じて、パスワードが違うやら、 新しいパスワードが短いやら出力すればいいのかな。 expect の方がすっきり書けるような気も。 |
|
やっぱ僕がやるとしたら pw コマンドの wrapper 作って、 それを root に suid するなぁ。passwd の挙動を 全て把握するのは厳しい。 |
|
結局、68userさんのおっしゃる通りpasswdの挙動を全て把握するのは 厳しいので、telnetされる側のServerにID,Passwordを変数として受け 取って、passwdファイルを直接編集するperlを置き、それをCGI(Perl) からtelnetして、rootで実行させるようにしました。 結局何故expectで動作しないのかは不明なままですが、要求を満たす 物は出来ました。 アドバイスありがとうございました。 |
|
私の場合、次のような感じのスクリプトで動きます。 一応、ログインしてコマンド実行程度なら、大丈夫のようです。 環境は perl 5.00503 + Expect-1.08 + FreeBSD 4.2-BETA です。 #!/usr/bin/perl use Expect; my $user = 'rose'; my $password = 'password'; my $prompt = 'host\{rose\}\d+\s'; my @cmdlist = ( 'ls -alF', 'ps -auxw', 'exit', ); my $telnet = Expect->spawn("telnet localhost"); $telnet->expect(30,"login: ") || die "NO login prompt"; print $telnet "$user\r"; $telnet->expect(30,"assword:") || die "NO password prompt"; print $telnet "$password\r"; my $match = $telnet->expect( 30, "closed by foreign host", "-re", $prompt ); die "refused by server\n" if $match == 1; die "NO shell prompt, ".$telnet->exp_error()."\n" unless $match; foreach $cmd ( @cmdlist ) { print $telnet "$cmd\r"; my $match = $telnet->expect( 30, "closed by foreign host", "-re", $prompt ); last if $match == 1; die "NO prompt after command\n" if $telnet->exp_error(); } $telnet->hard_close(); exit; |
|
最近Unixを始めたのですが、サブルーチンの作り方がわかりません。 (呼び方、書き方) 簡単な例を教えていただけると幸いです。 |
|
awk scriptを使って下の様なことがしたいのですが、方法を教えて下さい。 Input File1: 10 abcde 9 bcdef 12 cdefg Input File2; 3 abcde 5 cdefg 12 defgh ファイル1と2を比較し、$2の内容が同じ場合、file1 と file2 の $1 $2 を output file の $1 $2 $3 $4に出力する。 比較して見つからない 場合はスペースを出力する。 Output file 10 abcde 3 abcde 12 cdefg 5 cdefg 3 abcde 12 defgh よろしくお願いします。 |
|
> サブルーチンの作り方がわかりません。 言語がわからないと何とも言えません。 > awk scriptを使って下の様なことがしたいのですが #!/usr/bin/awk -f BEGIN{ while (getline< ARGV[2] >0 ){ hash[$2]=$1 } while (getline< ARGV[1] >0 ){ if ( hash[$2] ){ print $1,$2,hash[$2],$2 } else { printf "%s %s \n",$1,$2 } delete hash[$2] } close(ARGV[2]); while (getline< ARGV[2] >0 ){ if ( hash[$2] ){ print $1,$2 } } } FreeBSD の awk と Solaris の nawk では動きましたが、 Solaris の awk では動かず。 うーん、awk らしくない…(笑) まぁ awk スクリプトを 書いたのは4年ぶりくらいなので、これで勘弁して下さい。 # 見本求む。 |
|
すみません。 Perlです。 |
|
> # 見本求む。 見本かどうか分かりませんが、私は次のように書きました。 #!/usr/bin/awk -f { array[$2] = sprintf("%s %s", array[$2], $1); } END { for( key in array ){ split(array[key], tmp); if( 2 in tmp ) printf("%s %s %s %s\n", key, tmp[1], key, tmp[2]); else printf("%s %s\n", key, tmp[1]); } } 起動は % awk -f script file1 file2 としてください。連想配列に記録して、最後に出力という感じです。 ただし、次のような $2 が同じだが $1 が違う値を含む形式のデータは 仮定していません。 10 abcde 11 abcde どちらかを捨てるようになっているかと思います。実際にはデータの形式の チェックが要るかと思います。あと出力の順が不定になります。出力の 順番に依存する処理には向きません。動作チェックはしていません。 多分、本家の awk じゃ無理かな。動作チェックは gawk でやっています。 |
|
># 見本求む。 単なるバリエーションということで… #!/usr/bin/awk -f NR == 1 { f = FILENAME } f == FILENAME { hash[$2]=$1 } f != FILENAME { if ( $2 in hash ) { print hash[$2], $2, $1, $2 delete hash[$2] } else print $1, $2 } END { for (r in hash) print hash[r], r } |
|
もう他人の書いた awk スクリプトを見ても意味がわからん (笑) > Perlです。 で、どういう処理をするサブルーチンの例を見たいのですか? あと、素人とか初心者とかいうハンドルはやめてください。 それから、誰に向けて言うわけでもないですが、回答をもらっても 返事をする気がないなら、最初から質問しないでね。 |
|
沢山の回答、どうもありがとうございます。 あとお礼が遅くなってどうもすいません。 試してみてから出そうと思っていたのですが、家にUNixがないので 月曜になってしまいます。 このページを発見して間もないのですが、これから色々質問することもある思うので、その時はまたよろしくお願いします! |
|
行頭のスペース、全角スペースを に置換するように してみました。 if ( m/^(<BR>)?(\>|>)/ ){ $_ = qq(<FONT COLOR="$color{QUOTE}">$_ </font>); } の後に s|^( +)|' ' x length($1)|e; s|^( +)|' ' x length($1)|e; を追加しただけです。 現状でこれをしちゃうとまずい UA ってありますっけ? |
|
こんにちは、はじめての書込ですが... http://tsu.virtualave.net/TSU/whimsy.html 今週上のようなのをやることになったので お時間のある方はどうぞ。(ちなみに日本語コードが 前のようなSJIS固定から、普通の日本語チャンネルと 同様のJISになってます) GUIクライアントは、FreeBSDだとportsにGTK+使うXchat の日本語化版があるそうです。 Linuxだとhttp://dns.manabi.gr.jp/~blend/の辺りが よいかと(FreeBSDでこれrpmから出して使う場合は GNU makeが要ります)。 いずれにせよJISになったので一般に配布されている 日本語化パッチの類が簡単に使用できるようになりま した。 |
|
えっと、早い話が「エポ」の場所教えて下さい!! sachiyo@viola.ocn.ne.jp までメールで教えて下さいっす! |
|
どうも、おひさしぶりです。 > 現状でこれをしちゃうとまずい UA ってありますっけ? 現状の解釈が、わからなかったので、手元のブラウザで 調査しました。 OK win98 IE2 IE4 w3m(cygwin) FreeBSD Nestcape3 chimera w3m NG win98 Netscape3 とりあえず、こんな感じです。 ※ ディスク容量が足りなくなって、だいぶuninstall したので、この程度位までしか調査できませんでした。 |
|
> 68user さん > 行頭のスペース、全角スペースを に置換するように > してみました。 おかげで助かります。今まで、unexpand して投稿していましたが、 インデントが崩れるのが悩みの種でした。 どうもありがとうございます。 |
|
DATを初期化するコマンドって、UNIXでありますか?? |
|
> 行頭のスペース、全角スペースを に置換するように > してみました。 やっぱ、これが一番現実的みたいですね。 ウチでやらなかったのは、当時、使ってたWin95 NN4.1 が カット&ペーストで全角スペースに変換してたからだけど、 今のNN4.73では、ちゃんと半角になります。 ところで、 タブ も変換して貰えると助かるんですが… |
|
> NG win98 Netscape3 なるほど。よく知らないんですが、 が中黒になる んでしたっけ? UNIX 系の NN3 も表示できないと思って いたんですが、OK なんですね。では、Win+NN3 環境は 残念ながら泣いていただく、ということにします。 > ところで、タブも変換して貰えると助かるんですが… tab stop はいくつがお好みですか? (僕は4です) でもこれをやるなら、書き込み時に置換しないと いけないので、 TAB が発見されました。tab stop=4 だと以下のように表示されます。 [OK TAB=2にする TAB=8にする] てな感じ? (笑) ところで行頭以外のスペースを に置換するのって 意味ありますかね? > DATを初期化するコマンドって、UNIXでありますか?? テープ関係はよく知りませんが、mt erase あたりではダメでしょうか。 > http://tsu.virtualave.net/TSU/whimsy.html 僕も何度かおじゃまさせていただきました。お暇な方はどうぞ。 |
|
> が中黒になる そうです。目も当てられないです。 >UNIX 系の NN3 も表示できないと思って 少なくとも、Version 3.04 [ja_euc]はそうでした。 |
|
すいません、追加です。 winで確かめたNetscapeは、Version 3.01です。 .01と.04の差か(不明)? ←信じられん ※ win+NN3は、サポート外でいいと、思います。 ほとんどNN4/IE4以上だろうし・・・ |
|
どなたかP内部のCPUやメモリーやモデムなどに詳しい方 色々教えて下さい。 仕事上、自らバージョンアップをしたいと考えていますのでよろしくお願いします。 またこのURLは現在の仕事上のものです。 興味がある方はアクセスしてください。 |
|
No.1343,1345、1346の例を参考にやってみたのですが、SolarisのAwkでは動きませんでした、、、、 そこで、InputFile1の$2だけをInputFile3にcopyして、InputFile2の$2を、InputFile4にCopyし、単純にINputFile3、と4を比較し、同じ内容はOutputFile1へ、違う内容はOutputFile2へ出すようにするのであれば、Awkでもできるでしょうか? |
|
nawk では動きませんか。 # の話はまた明日…。 |
|
>tab stop はいくつがお好みですか? (僕は4です) 基本的には、私も4です…でも、最近は2なんてことも…(^^; >てな感じ? (笑) インデントさえあれば、結構見易くなると思うので、 1個でもいいんじゃないでしょうか?(笑い) >1346の例を参考にやってみたのですが、SolarisのAwkでは動きませんでした、、、、 The AWK Proramming Language 準拠のスクリプトが動かないなんて、どんなAWKだ(笑い) |
|
こんばんわ。またXについてわからないところが出てきました。 EXPOSEイベントについてです。 例えば、windowの一部が画面の外側に出ている状態で、 そこからwindowを現在ある位置から移動したとき、 EXPOSEイベントがたくさん飛んで来るようで、 飛んで来た回数だけ再描画されてしまいます。 この再描画を一回だけで終わらせる方法はないでしょうか? 自分で書いてみたのは全部書くと長いので 省略して書くとこんな感じです。 while( done == 0 ) { XNextEvent( display, &event ); switch( event.type ) { case Expose: if( myevent.xexpose.count == 0 ) { ..... ..... ..... ..... } break; case .... .... .... .... .... } いつもお世話になります。 ご教授おねがいします。 |
|
はじめまして。某企業でイントラネットの担当をしています。 本日、某ソフトメーカーのホームページ作成ツール(Go**ve ver5)を 導入したのですが、コンテンツをFTPでサーバにアップしようとしても 接続するのですが、既存のファイル名やディレクトリ名が、一切表示されないのです。 しかたなく、ユーザサポートに電話しても、「そんな馬鹿な・・・」と 冷たく言われる始末。。。 押し問答の末、担当者が「ブラウザから ftp://(username):(password)@(server)/(directory) と 入力すると、何が表示されますか?」というので、やってみると アクセス権表示(rwxr--r--)しか表示されないのです。 担当者曰く、「本来は、ファイル名やタイムスタンプが表示されるべきですが、 サーバの設定がおかしいみたいですね!」と冷たい回答。 サーバ担当者に問い合わせても、「他のホームページ作成ツールじゃ、 問題なくFTP出来ますから、そのツールのバグじゃないですか?」と 言われました。 ちなみに、マシンはSun, OSはSolaris 2.6, WWWはNetscape Enterpriseです。 何を調べればよいか、見当もつきません。 よろしくご教示ください。 |
|
> ちなみに、マシンはSun, OSはSolaris 2.6, WWWはNetscape Enterpriseです。 server 側の ftpd は Solaris 付属の ftpd ですか? Solaris の ftpd のファイルリスト表示って癖があったように思います。 Fetch という Mac の ftp クライアントでもファイル一覧は まともに表示されなかったことがありました。 これは、日本語版の Fetch なら対応しているんですが。 LIST か NLIST か詳しいことは忘れましたが、その表示が変わっていて 少なくとも古い Solaris の一部にはそういう癖があるので、別の ftpd 入れて見て試されては? NcFTPd とか UW_ftpd とか。 > SolarisのAwkでは動きませんでした、、、、 今度試してみます。 |
|
手抜きして、表示時に TAB を変換することにしてみました。 s|^(\t+)|' ' x length($1)|e; > 「ブラウザから ftp://(username):(password)@(server)/(directory) と > 入力すると、何が表示されますか?」というので、やってみるとアクセス > 権表示(rwxr--r--)しか表示されないのです。 rosegarden さんのおっしゃるとおり ftpd の問題なんでしょうが、 考えられるのは ・NLST だとファイル一覧がうまく取れないのかもしれない。 ・inetd が LANG=ja で実行されているため、inetd から呼ばれる ftpd も LANG=ja になり、日付が日本語になってしまう (11月14日など) てなところでしょうか。 で、他の ftp サーバを相手に試してみるとか、その ftp サーバに ftp -d で anonymous login して、プロトコルを見てみる (うまく いく ftp サーバとプロトコルの内容を比較する) などなど。 ちなみに ftp のファイル一覧の形式は、RFC で規定されていません。 一般的には ls -l の表示形式であることが多いですが、ls -l の 形式にすべしとはどこにも書いてありません。 > 例えば、windowの一部が画面の外側に出ている状態で、 > そこからwindowを現在ある位置から移動したとき、 > EXPOSEイベントがたくさん飛んで来るようで、 うーん、状況がよくわからんです。 http://X68000.startshop.co.jp/~68user/xprogram/xlib-3.html のように、ウィンドウ内に子孫ウィンドウを作ってますか? 子孫ウィンドウで Expose イベントに対応していないため、 上位のウィンドウにイベントが上昇伝播していて、その 結果複数のイベントが飛んできていませんか? もしそうなら、子孫ウィンドウでも XSelectInput して、 イベントが飛んできたら、どこ宛 (親ウィンドウ or 子 ウィンドウ) のイベントかどうかを判定し、適切な ウィンドウを再描画すればよいです。どのウィンドウ宛かは event.window でわかります。 1つのウィンドウでも発生するなら、 Expose が飛んできたとき、XCheckTypedEvent で さらに別の Expose イベントが飛んできていないか 調べる。 という方法があります。 case Expose: while (1){ if ( ! XCheckWindowEvent(display, window, ExposureMask, &event) ){ break; } てな感じ。ただし、根本的な解決方法かどうかはわかりません。 |
|
昨日間違って /var/adm のfileと subdirectoryをすべて削除してしました。、、、、、それが何なのか分からず、後でほかのUnixからコピーすればいいと思って昨日そのままShutDownしてしまったのですが、今朝起ち上げる時にcannot create car/adm/utmp or utmx. Failed to write of untmx entryというエラーが出て起ち上げられません。Ultra5+Solaris1.1.2なのですが、CDRomからそのDirectoryだけInstallする方法はありますか? |
|
Solaris 2.5.1 以降のことしか分からないんですが、 > 昨日間違って /var/adm のfileと subdirectoryをすべて削除してしました。 そこにあるのはログファイルの類だけです。sulog とか loginlog とか messages とかです。ログファイルが決定的な意味を持たないのなら問題ないです。 どっちにしても、CD-ROM にあったとしても元には戻りません。 utmp とか utmpx とかはログインとかの記録を保持するファイルです。当然 boot した時間や shutdown した時間も記録するので、それで文句を言うのでしょう。 私はこれを更新する際には実にアバウトに # cat utmp > utmp # cat utmpx > utmpx とかで済ませています(環境は Solaris 2.5.1 ですが)。だから空のファイルが あれば問題ないかと思います。空のファイルを作っておけば良いだけなので、 スイッチをいれた直後に L1+a で ROM モニタモードに移行してから、 boot -s して、/var をマウントして touch コマンドあたりで空のファイルを 作れば良いかと思います。あるいは、起動時に utmp がないと文句を言われて 止まった時に CTRL-C とか打ち込んでもブートの続きが始まるかも知れません。 CD-ROM にこだわるのなら、やはりスイッチいれた直後に L1+a で ROM モニタ モードに移行してから、OK プロンプトに boot cdrom すれば CD-ROM から たちあがあります。Solaris 1.1.2 は知らないのですが、2.5.1 以降だと Openwin が使えて、cmdtool なんかも好きなだけ使えます。で、適当な ところに手動で /var をマウントしてからコピーすれば良いかと思います。 参考までに Solaris 7 のインストール CD-ROM の /var は次のように なっています。tar でコピーするとか、 手動で同じもの作っても問題ないんじゃないでしょうか? # ls -alRF /tmp/root/var/adm total 8 drwxrwxr-x 4 root sys 2048 Jul 31 1999 ./ drwxr-xr-x 16 root sys 2048 Jul 31 1999 ../ -rw------- 1 kmem kmem 0 Jul 31 1999 aculog drwxrwxr-x 2 tty tty 2048 Jul 31 1999 log/ drwxrwxr-x 2 tty tty 2048 Jul 31 1999 passwd/ -rw-rw-rw- 1 operator kmem 0 Jul 31 1999 spellhist -rw-r--r-- 1 root kmem 0 Jul 31 1999 utmp -rw-r--r-- 1 root kmem 0 Jul 31 1999 utmpx -rw-rw-r-- 1 tty tty 0 Jul 31 1999 wtmp -rw-rw-r-- 1 tty tty 0 Jul 31 1999 wtmpx ./log: total 4 drwxrwxr-x 2 tty tty 2048 Jul 31 1999 ./ drwxrwxr-x 4 root sys 2048 Jul 31 1999 ../ ./passwd: total 4 drwxrwxr-x 2 tty tty 2048 Jul 31 1999 ./ drwxrwxr-x 4 root sys 2048 Jul 31 1999 ../ # 長くってすみません |
|
rosegadenさん 回答どうもありがとうございます。 おっしゃる通り、空のファイルを作っただけで起ち上げに成功しました! あーよかった。 L1というのはKeybordについているのですか? その他色々わからないTerminologyがあるのですが、その辺は またゆっくり調べてみます。 ご指導どうもありがとうございました! |
|
はじめまして 実は今Linuxでデーモンプログラムの勉強をしてるのですけど、 よくわかりません。 デーモンプログラムってループして実行時に&でバックグラウンド でいいんでしょうか? HP探しててもサンプルソースが見つからないし‥ よろしかったら教えて下さい。お願いします。 |
|
> デーモンプログラムの勉強をしてるのですけど まずはここを読んで下さい。結構面倒です。 http://www.race.u-tokyo.ac.jp/~moro/unix-programmer/faq-j_2.html#SEC16 実行時に明示的に & でバックグラウンドにしなくても、 自力でデーモンとして常駐 (って UNIX ではあんまり 言わないか) するのが望ましい挙動です。 ところで Netscape6 が出ましたね。 http://www.netscape.com/index.html |
|
68user さんありがとうございました。 自分はデーモンについての知識がまだたりませんね。 HPを見て勉強します。 |
|
お忙しいところすいません。初めまして、はぴおと申します。 ネットワークプログラミング大変分かりやすく、勉強させて いただいております。 このサイトを参考にPerl(CGI)でPOP3クライアントをつくったのですが、 一つだけ分からないことがあります。 色々な本やサイトを見ても、FROMヘッダーにはメール送信者の名前と メールアドレスが入ると思うのですが、自作POP3クライアントで メールを受信した場合、FROMヘッダーにはメール送信者名しか入りません。 同じメールをOutlookで受信してみると、同じメールでもちゃんとFROM ヘッダーに、メールアドレスが付加されてました。 以下自分の推測なのですが、色々と理由を自分なりに考えてみました。 ・自作POP3クライアントが正しくメールを受信できていない。 ・正しくメールを受信できているが、ほかにやらなければいけないこと がある 昨日一日、色々なサイトをまわったり、本を調べたり、MLで聞いて みたりしましたが、分かりませんでした。 藁にもすがる思いでココに書き込んでます。 どうかご意見をお聞かせ下さい。 それでは宜しくお願いします。 以下参考になるか分かりませんが、私の環境です。 -OS: WIndows2000 -Perl : ActivePerl Build 620 -apache_1_3_12_win32 はぴお lovex@bd.mbn.or.jp |
|
初めて投稿させていただきます。 UNIX歴2か月の初心者で 今初めてシェルプログラミングに挑戦してます。 作成したいものは、lastcommで前日のログ履歴を出し、管理者宛にメールを 送るというものなのですが早速つまずいてしまいました。 現在の日付(MON,DAY)を取得するまではできるのですが、”前日”をどうやって表現すればいいのかわからず困っています。 DAYを-1しようとしたのですがうまくいきません。 以下のように記述しています。 どなたかご存知の方、ご教授お願いします。 LANG=C; export LANG BUF= set `date` echo $2 # "Nov"と表示されます echo $3 # "15"と表示されます expr $3 -1 > $BUF # expr: syntax errorになります |
|
68userさんいつも助けていただいて感謝です。 case Expose: while (1){ if ( ! XCheckWindowEvent(display, window, ExposureMask, &event) ){ break; } これを使ってみたところちゃんと一回だけ描画してくれました。 こんな関数もあったんですね。 勉強不足で申し訳ありません。 根本的に解決できなくても動いてくれれば とりあえずは解決したと思っておきます。 本当にありがとうございました。 またお世話になるかもしれないですが、 そのときはよろしくお願いします。 |
|
初めましてbookと申します。 UNIXのgccで作成したライブラリを、CCでコンパイルを行う時に 使用できるのか調査しています。 gcc -c share_test.cc ar cr libtestshare.so share_test.o ranlib libtestshare.so CC test_gcc.cc -L. -ltestshare 現状は、ライブラリ内の関数を呼び出す箇所で、 コンパイルエラーになってしまいます。 そもそも、このような使い方が出来るのかどうか、 ご存知の方がいらっしゃいましたらご教授ください。 よろしくお願いします。 |
|
> ”前日”をどうやって表現すればいいのかわからず困っています。 > DAYを-1しようとしたのですがうまくいきません。 > expr $3 -1 expr $3 - 1 です。- と 1 の間にスペースが必要です。 しかし、これだと毎月1日に実行すると 0日となって しまうので、根本的にまずいです。というわけで、-v オプションを使いましょう。 % date -v-1d で1日前の日付が得られます。ただし、Solaris などの date には -v オプションはないので、sh でやるなら perl などを呼び出すのがいいでしょう。 # なので、最初から perl で書くのも手です。 > 現状は、ライブラリ内の関数を呼び出す箇所で、 > コンパイルエラーになってしまいます。 どういうエラーが出るのかちゃんと書きましょう。 FreeBSD と Solaris ではこの方法でうまく動きました。 あと、これは static link 用のライブラリですので、 拡張子は .so より .a が適切でしょう (違うかなぁ?) > 自作POP3クライアントでメールを受信した場合、 > FROMヘッダーにはメール送信者名しか入りません pop は、ただ単にヘッダとボディを送信するだけです。 From がどうだとか Subject がどうだとか、そういう データ内部には立ち入りません (基本的には)。 Outlook で「メールのソースを表示」したものと、 自作 pop3 クライアントの出力の、From: 周辺を両方 見せて下さい。 |
|
前日の日付取得の件 68userさん、ご教授ありがとうございました。 Solaris環境なのでシェルで作成するのはやめます。 perlも少し触ったことがあるのですがC言語の方が経験が長いので Cで作成しようと思っています。 が、一般的 or perlの方が効率的なのでしょうか? |
|
68userさん、早速のレスありがとうございます。はぴおです。 ちょっと長くなってしまいますが、同じメールを自作POP3クライアントと Outlookのそれぞれで受信したソースを載せておきます。 なんか"<"、">"の部分だけが読み込めてない感じです。 それではよろしくお願いします。 [自作POP3クライアント] ------------------------------------------------------------- Received: from ns.ics.lan ([202.228.221.126]) by bd.mbn.or.jp (8.9.1/bd.mbn.or.jp-2.0) with ESMTP id RAA13962 for ; Wed, 15 Nov 2000 17:26:03 +0900 (JST) Received: from kimura ([202.228.221.125]) by ns.ics.lan (8.9.3/3.7W) with ESMTP id RAA26374 for ; Wed, 15 Nov 2000 17:20:05 +0900 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> From: "kimura" To: "kimura" Subject: test Date: Wed, 15 Nov 2000 17:31:00 +0900 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 X-UIDL: cde5eb4f8ec74762f85d10deccb2a5a3 test [Outlook Express] ------------------------------------------------------------- Received: from ns.ics.lan ([202.228.221.126]) by bd.mbn.or.jp (8.9.1/bd.mbn.or.jp-2.0) with ESMTP id RAA13962 for <lovex@bd.mbn.or.jp>; Wed, 15 Nov 2000 17:26:03 +0900 (JST) Received: from kimura ([202.228.221.125]) by ns.ics.lan (8.9.3/3.7W) with ESMTP id RAA26374 for <lovex@bd.mbn.or.jp>; Wed, 15 Nov 2000 17:20:05 +0900 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> From: "kimura" <lovex@bd.mbn.or.jp> To: "kimura" <lovex@bd.mbn.or.jp> Subject: test Date: Wed, 15 Nov 2000 17:31:00 +0900 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.50.4133.2400 X-MimeOLE: Produced By Microsoft MimeOLE V5.50.4133.2400 X-UIDL: cde5eb4f8ec74762f85d10deccb2a5a3 Status: RO test |
|
68userさん、さきほどは説明不足ですみませんでした。 エラー内容と環境を書いておきます。 よろしくご教授お願いします。 gcc -c share_test.cc ar cr libtestshare.so share_test.o ranlib libtestshare.so CC test_gcc.cc -L. -ltestshare test_gcc.ccは読み込んだライブラリ内の関数を呼び出しているだけです。 ###################### エラー内容 ###################### 未定義の 最初に参照している シンボル ファイル ShareTest::get(void) test_gcc.o __builtin_delete ./libtestshare.a(share_test.o) __rtti_user ./libtestshare.a(share_test.o) ShareTest::~ShareTest(void) test_gcc.o ShareTest::ShareTest(void) test_gcc.o ld: 重大なエラー: シンボル参照エラー。 a.out に書き込まれる出力はありません ###################### 使用環境 ###################### Kernel Architecture is sun4u OS Name is SunOS OS Version is 5.6 OS Distribution is Japanese Solaris 2.6 HW:2 s297s_hw2smccDesktop_09b SPARC Kernel Version is SunOS Release 5.6 Version Generic_105181-17 [UNIX(R) System V Release 4.0] |
|
> gcc -c share_test.cc > CC test_gcc.cc -L. -ltestshare ああ、CC って typo かと思っていたら、C++ なのか…。 # C++ は完璧に忘れたなぁ。Hello world さえ作れないです。 おそらく gcc と CC でクラス/メソッドのシンボル名の 命名規則が違うのが理由だとは思うのですが、意図的に gcc と Sun の CC を混在して使っているのですか? gcc (g++) か CC に統一できない理由があるので、調査 しているということですよね? もしそうなら、すいませんがわかりません。gcc の オプションで指定できるのかもしれませんが…。 > なんか"<"、">"の部分だけが読み込めてない感じです。 もしかして CGI として動かして HTML を吐いていませんか? んでもって < > & を (< > & に変換せず) その まま出力していたりしませんか? 根拠は以下の通り。 1. received の <〜> も出力されていない for ; Wed, 15 Nov 2000 17:26:03 +0900 (JST) for ; Wed, 15 Nov 2000 17:20:05 +0900 2. でも Message-ID は出力されている。 Message-ID: <000501c04ede$6249e4d0$5400a8c0@kimura> タグは英文字から始まる。数字が先頭にくることはない。 > が、一般的 or perlの方が効率的なのでしょうか? 僕なら間違いなく perl でやりますが、まぁそれはお好きな方で。 ちなみに sh からだと set `perl -e 'print scalar(localtime(time()-60*60*24))."\n"'` です。 |
|
> % date -v-1d > で1日前の日付が得られます。ただし、Solaris などの > date には -v オプションはないので、sh でやるなら > perl などを呼び出すのがいいでしょう。 このオプションは知りませんでした勉強になりました。 > Solaris環境なのでシェルで作成するのはやめます。 あきらめるのは早いです。 #!/bin/sh LANG=C set `date` year=$6 mon=$2 date=$3 if [ `expr $year % 4` = "0" ] ; then is_leap="YES" fi if [ `expr $year % 100` = "0" ] ; then is_leap="NO" fi if [ `expr $year % 400` = "0" ] ; then is_leap="YES" fi date=`expr $date - 1` if [ "$date" = "0" ] then case $mon in Jan) mon="Dec" date=31 ;; Feb) mon="Jan" date=31 ;; Mar) mon='Feb' if [ "$is_leap" = "YES" ]; then date=29 else date=28 fi ;; Apr) mon="Mar" date=31 ;; # 以下略 *) ;; esac fi echo The yesterday is $mon $date. なんていう面白味も芸もないスクリプトなら Solaris でも動くんじゃないかと 思いますよ。 もっとも、 > 作成したいものは、lastcommで前日のログ履歴を出し、管理者宛にメールを > 送るというものなのですが早速つまずいてしまいました。 この用途なら、日付の計算は不要で前々日分までの lastcomm のログの バックアップをとっておいて、前日分との差分を diff でとるという方法もあります。 (ただし、lastcomm のログなので、GB 単位になってもおかしくないのですが。) FreeBSD なんかのセキュリティチェックは全部前日分までのバックアップと 本日分のログの差分抽出でやっていますね。 # また長くなりすみません。 |
|
> あきらめるのは早いです。 うーん、ごもっとも。恥ずかしながらこういう 方法には全く気づきませんでした。 |
|
68userさん、ご教授ありがとうございました。 gccのオプション調べてみます。 |
|
こんにちは、はぴおです。 68userさんレスありがとうございました。 非常に恥ずかしい話ですが、68userさんのおっしゃる通りです。 何で気が付かなかったんだろうか??? ありがとうございました! HTTP、SMTP、POP3ができたので、今度はFTPをやろうかと 思います。 |
|
お世話になります。 実は今、C言語でCGIの勉強をしているのですけど、 CGIのデバッグってどうやるんでしょうか? もしかして、動作確認はいちいちブラウザで確認するしかないのですか? つ、つらい‥ なにか、効率的なデバッグ方法を知っていらしたら 教えて下さい。お願いします。 |
|
> もしかして、動作確認はいちいちブラウザで確認するしか > ないのですか? まさか :-) CGI というのはインタフェースです。 ブラウザからの情報を、環境変数と標準入力経由で プログラムに引き渡すインタフェース。それが CGI。 だから、 % env REQUEST_METHOD=GET QUERY_STRING='hoge=1&fuga=2' ./foo.cgi とか % set content='number=123&str=%21%22%23' % echo -n $content | env REQUEST_METHOD=POST CONTENT_LENGTH=`echo -n $content|wc -c` ./foo.cgi とかとか、 #ifdef DEBUG #define INPUTFILE_FOR_DEBUG "debug.txt" { char tmp[128]; struct stat sb; setenv("REQUEST_METHOD", "POST", 1); stat(INPUTFILE_FOR_DEBUG, &sb); sprintf(tmp, "%d", sb->st_size); setenv("CONTENT_LENGTH",tmp , 1); freopen(INPUTFILE_FOR_DEBUG, "r", stdin); /* この使い方合ってるっけなぁ… */ } #endif とかとかとか。 |
|
こんにちは。 掲示板のファイルに書きこむ部分で、 「web と CGI のひみつ」の「掲示板を作ろう (2)」の最後にある テンポラリファイルに書き込んでからrenameする方法いいなと思ったのですが、 これだとrenameするときに衝突する可能性ありますよね? http://www.wakusei.ne.jp/twn/wwwlng.cgi?print+200003/00030031.txt ここにあるcheck-lockスクリプト(いつもありがたく使わせていただいてます m(_ _)m ) でやってみようと思うのですが、うまくrename時の衝突を回避する方法があればご教授ください。 |
|
http://x68000.startshop.co.jp/~68user/net/sample/echo-server-1.c このコードのバグを見つけました。 コンパイルして動かすとacceptで失敗するのでこっちの設定が 悪いんだろうと思ってFreeBSD関連のメーリングリストを 検索していたら原因がわかりました。 connected_socket = accept(listening_socket.... の上に len = sizeof( sin ); が必要です。 バグの理由は http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/43141 です。 |
|
はじめまして。 No.1389の指摘のついでですが len = sizeof(peer_sin); は、いらなんじゃないですか? バグの理由でも書かれてるとおり acceptの第3引数は、入出力両用ですので 帰ってきた値をそのまま使うのが正しいと思うのですけど。 |
|
> len = sizeof( sin ); > が必要です。 なるほど、確かに FreeBSD 4.2-BETA で動かすと accept に 失敗していました。これまではたまたま動いていたわけですね。 修正しておきます。ありがとうございます。 > len = sizeof(peer_sin); > は、いらなんじゃないですか? こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 Getpeername() returns the name of the peer connected to socket s. The namelen parameter should be initialized to indicate the amount of space pointed to by name. On return it contains the actual size of the name returned (in bytes). The name is truncated if the buffer provided is too small. > これだとrenameするときに衝突する可能性ありますよね? えっと、あの例では rename は使っていません。あの後 排他処理に ついて書くつもりでしたが、時間がなくて全く手を付けていません。 > うまくrename時の衝突を回避する方法があればご教授ください。 もし rename でやるとしても、それ以前に複数のプロセスが tmp_file へ同時に出力しようとする可能性があるので、あの 部分全体を排他する必要があります。 で、方法ですが、適当なロックファイルを用意して排他処理を 行えばよいです。flock でも symlink でも mkdir でも rename でも 何を使っても構いません。 |
|
返事どうもありがとうです。 > えっと、あの例では rename は使っていません。 よく見てませんでした。申し訳ないです。。 > もし rename でやるとしても、それ以前に複数のプロセスが > tmp_file へ同時に出力しようとする可能性があるので、あの > 部分全体を排他する必要があります。 なるほど。そこで、お教えいただいた通りにちょっと改造してみました。 # 毎回違う名前で作る $tmp_file = 'bbs'.$$.'.tmp'; open(TMP_OUT,"> $tmp_file"); print TMP_OUT "発言者: $from<BR>\n"; print TMP_OUT "$now_date $host<BR>\n"; print TMP_OUT "$message<HR>\n"; open(IN,"$data_file"); while (<IN>){ print TMP_OUT $_; } close(IN); close(TMP_OUT); # tmp_file の内容を $data_file にコピーするだけ #open(TMP_IN,"tmp_file"); #open(OUT,"> $data_file"); #while (<TMP_IN>){ # print OUT $_; #} #close(TMP_IN); #close(OUT); # コピーのかわりに、$data_fileにrename # その前に排他処理。 $lock_file = 'bbs.lock'; touch($lock_file); open(IN,"$lock_file"); flock(IN, 2); rename($tmp_file, $data_file); close(IN); unlink($lock_file); # 必要ない?? これで完璧ですか?? 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 改善点があればご教授くださいませ。 長文すみませんでした。 |
|
>> len = sizeof(peer_sin); >> は、いらなんじゃないですか? >こっちの getpeername のは必要だと思います。以下 getpeername(2) より。 失礼しましたぁ。。勘違いです。 きっちりしたサイズを指定しなくてもよかったんですね。 小さい場合は切り詰めるって仕様も最初は意味不明でしたが、 よく考えると最低でもアドレスファリは所得できそうなので有用ですね♪ |
|
いつもすいません、ふくしです。 LDAP の使い方でこんなことができるかどうかどなたか相談に乗ってください。 Microsoft Exchange Server のアドレス帳で、集団のアドレス (営業部 <markettng@nantoka.org とか)があって、 そこに送るとたくさんのひとに (yamada.tarou@nantoka.org、satou.hanako@nantoka.net、、)に 行くようになっているとき、組織名を渡してこの構成員一覧を返す アプリケーションを作ろうと思っています。 Exchange は LDAP を受け付けるときいたので、 Perl に Net::LDAP をインストールして、 サンプルをいじって使ってみたのですが、 marketting というメール アドレスが「ある」ことはわかるところまで いったのですが、その内容まではわかりません。 ご存じの方がいらっしゃいましたら、よろしくお願いします。 |
|
ちょっと前にHTTPのセパレータの話がありましたが、 どうも最近の携帯の中には、\r\nにしか対応していないものもあるようで、 友人からの「携帯からアクセスできない」との苦情に対応方法がわからず、 「まさか」と思いつつもこれまで\n\nとしてきたセパレータに\r\nを加えてみたところ、 ちゃんと読んでくれるようになりました。 これはうちのサーバの設定の仕方がおかしいんでしょうか。 (普通は\r\nに勝手に変換してくれるものなんですか?) それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 |
|
どうもこんにちは、 Winsock初心者のYOUと申します。 ソフトバンクの、「Winsock2.0プログラミング」という本を 買ってきたのですが、手始めに、サンプルのCH02->Hostinfo をビルドしようとすると、以下のようなエラーが出てしまいました。 プロジェクトへのリンク等には、特に何も指定していません。 どうすれば、解決出来るのでしょうか。 --------------------構成: Win - Win32 Debug-------------------- リンク中... Hostinfo.obj : error LNK2001: 外部シンボル "_WSACleanup@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAStartup@8" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_ntoa@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_WSAGetLastError@0" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyaddr@12" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_gethostbyname@4" は未解決です Hostinfo.obj : error LNK2001: 外部シンボル "_inet_addr@4" は未解決です LIBCD.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 link.exe の実行エラー Win.exe - エラー 9、警告 0 よろしくお願いします。 |
|
はじめまして。Elmoです。 telnetでポート80を指定して、”GET”と”Host:”を実行するシェルスクリプト(bash)を作成したいのですが、どうやって、シェルからGETとHost:を実行すればいいのかわかりません。ちなみに、”echo”とパイプを使用してみましたが出来ませんでした。 わかる方、教えて下さい!! |
|
has 殿へ。11/25 (土) に行けたら行きます。仕事次第。 では手短に。 > (普通は\r\nに勝手に変換してくれるものなんですか?) apache だと変換してくれないですね。 > それともCGIの方で正式な\r\nに対応すべきなんでしょうか。 です。でもうちではやってません。いけませんなぁ。 > LDAP の使い方でこんなことができるかどうかど LDAP は勉強しようとしたことはありますが、どうやっても LDAP サーバをあげられず断念しましたので、わかりません。 でも、get_values とかでダメですかねぇ。 > .\Debug/Win.exe : fatal error LNK1120: 外部参照 8 が未解決です。 僕は Windows の開発環境を持っていないので、わかる方に おまかせします。 > 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って > どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 試してませんが、心配ならば open(IN,"> $lock_file") と すればいいでしょう。 あと、ロックを開始する場所は open(TMP_OUT,"> $tmp_file"); です。rename の部分だけロックすると、ファイルは壊れませんが 同時に発言しようとしたとき、一方の発言が反映されないです。 それから、失敗する可能性のある場所では、エラーチェックを 必ずしましょう。例えば、OS によってファイルを同時にオープン できる数というのは決まっているので、それを越える open は 失敗します。もし open(IN,"$lock_file"); が失敗したらその後の flock も無意味になり、ロックが働きません。 > telnetでポート80を指定して、”GET”と”Host:”を実行する > シェルスクリプト(bash)を作成したいのですが (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com") | telnet foo.bar.com 80 てな感じで。 |
|
改行が足りてない。 (sleep 3; echo "GET /index.html HTTP/1.0"; echo "Host: foo.bar.com"; echo ) \ | telnet foo.bar.com 80 でした。 |
|
はじめまして。 プログラミングは超初心者で、ここで質問して回答してもらえるのかどうか もわからないのですが、もし答えていただけるならば教えてください。 HTMLにJPGやGIFを貼り付けているのですが、マウス右クリックで 「画像を名前をつけて保存」ってできてしまいますよね。これを保存できな くする方法ってあるんですか?拡張子を変える、とか。 よろしくお願いします。 |
|
> ちかさま。 表示してる時点で、保存もできます。。 保存しにくくするのなら、JavaScriptとかで、できそうだけど。 |
|
はじめましてフ−ミンと申します。 CGIを初めたばかりで分からない事があるので質問させて下さい。 おそらくものすごく初歩的な事だと思うので悪いのですが…。 今「何とか度鑑定」みたいなのをPerlで作っているのですが、 色々なこういうサイトを参考にしても、質問が多くなってくると、 必然的に画面をスクロールしなくてはなりませんよね。 デザイン的にどうかと思っているのです。 そこで、質問を数ページに分ける方法を教えて頂きたいのです。 VALUE値を次のページまで持ち越すには多分、 INPUT TYPE=hiddenとかが関係しているのは分かるのですが、 具体的にどうしたらいいのか全く分からないのです。 こんな初心者ですみません。ヒント程度でもお答え頂ければ 幸いです。それでは失礼いたします。 |
|
yamamaさん、どうもありがとうございます。 printScreenされちゃうと終わりですよね(^ ^; JavaScript ですか。勉強してみます。 |
|
>YOUさん #include <windows.h>とか #include <winsock.h>とか ヘッダファイルをincludeしてますか? |
|
> 今「何とか度鑑定」みたいなのをPerlで作っているのですが、 他の BBS とマルチポストしているのなら、その旨書くべき だろうと僕は思います。答えを得たいために無節操にいろんな ところで質問しまくるのは、回答してくれる人に失礼でしょう。 > マウス右クリックで「画像を名前をつけて保存」ってできて > しまいますよね。 いろいろと保存しにくくする方法はありますが、 http://www06.u-page.so-net.ne.jp/wa2/mugi/hp/jsindex.htm ある程度知ってる人に対しては無力です。個人的には、 コピーしてほしくないものはインターネット上に置かない のが一番だと思っています。 |
|
>68userさん まったくもってその通りです。 あせって、つい自分の事しか考えられなくなっていました。 反省しています。どうもすみませんでした。 |
|
どうもこんにちわ。 最近Qtに手を出し始めたいえろーばっくすです。 ところが早速わからないことが出てきてしまって・・・・ QStringクラスのtoInt( bool *ok=0, int base=10 )関数 の使いかたをご教授ください。 QLineEditからtext()関数でQStringに読み込んだ値を intに変換したいんですが、読み込んだ値を表示させても 必ず0にしかならなくて困ってます。 どなたかわかるかたいらしたらお願いします。 |
|
> 読みこみ専用でオープンしてるのにflock()のオペレーションが「2」って どうなんですかね。ちゃんと書きこみモードでオープンしなきゃだめですか?? 読み込みモードで「2」だと、Solarisではflockが利かないようです。「1」なら大丈夫です。わたしのページですが、Perlの排他制御についてまとめてあります。 http://homepage1.nifty.com/glass/tom_neko/web/web_04.html |
|
@YOUさん もう解決してらっしゃるかもしれませんが・・・ wsock32.lib(もしくはws2_32.lib)をリンクしてみてください。 もうひとつ、WinMainが未解決だって言われてるのは、 プロジェクトをコンソールアプリでつくって ソースがwin32アプリのものだからじゃないでしょうか。 win32アプリでプロジェクトをつくり直してみてください。 |
|
お答え頂いてとてもありがとうございます。 さっそく (sleep 3; echo "GET http://www.geocities.co.jp/.../rfc2068-ja.txt HTTP/1.0"; echo "Host:") | telnet www.geocities.co.jp 80 でやってみたのですが、telnet後、GET,Host:コマンドを実行せずにそのままtelnetを終了してしまいます。どうしてか、教えて下さい!! どうぞよろしくお願いします。 |
|
どうも。いえろーばっくすです。 この前の質問なんですが、なにやらtoInt関数以外のところで つまづいてるっぽいことが発覚しました。 プログラムを最小単位にして確認してみたところ ちゃんとtoInt関数は使えてました。 確認怠って質問してしまってすみませんでした。 まだ不具合は解消されてないのですが、 とりあえずがんばってみます。 板汚してすんませんでした。 |
|
返事遅れてすみませんでした。 ファイル書き込み(排他処理)の件、勉強になりました。 あとでやってみようかと思います。 ありがとうございました。 |
|
68user殿 アドバイスありがとうございました。 教えていただいたサイトには「障害が多いのでやめます」って 書かれていました。ショック・・・。 ほかにどこかありましたら、アドバイスお願いします。 |
|
> telnet後、GET,Host:コマンドを実行せずにそのままtelnetを > 終了してしまいます。 おろ、最後にも sleep が必要だった。んでもって、echo だけじゃ 改行が出ないのか。 ( sleep 2 ; \ echo "GET /index.html HTTP/1.0" ; \ echo "Host: www.goo.ne.jp" ; \ echo "" ; \ sleep 2 ) | telnet www.goo.ne.jp 80 これでも不完全なような気がする。 まぁ、この方法では所詮完全なクライアントは作れません。 どうしても perl でなくて bash でやりたいなら、except コマンドを使いましょう。 > 最近Qtに手を出し始めたいえろーばっくすです。 ちなみに Qt は全く知りません :-) じゃあ Gtk+ がわかるか というと、こっちもわかりません。でも、Xaw がわかんないが 一番痛い。 |
|
お教え頂き本当にありがとうございました。本当に感謝しています。 さっそくやってみたところ、大成功でした。 ただ、”不完全だ”というコメントが気になります。 manで、exceptコマンドをさがしてみたのですが、見つかりません。 そこで、簡単なexceptコマンドの使用例を教えて下さい。 あともう一点、 awkコマンドで、以下のように全角空白でsplit出来てしまうのですが、これは大丈夫なのでしょうか? kanji_n = split ($44, kanji_name, " ") gawkでなくても大丈夫ですか? 何度も申し訳ありません。よろしくお願いします。 |
|
> これでも不完全なような気がする。 これは多分勘違いです。シェルスクリプトでやる以上は、まぁ ベストに近いでしょう (ベストだと言い切る自信はない)。 ただし、 > まぁ、この方法では所詮完全なクライアントは作れません。 この見解は正しいです。なぜなら telnet の接続に 2秒以上 かかったら、もうおしまいです。telnet を使う方法は、所詮 クライアントもどきでしかありません。 > exceptコマンドをさがしてみたのですが、見つかりません。 普通 expect は標準では入っていません。お使いの OS の パッケージをインストールするか、ソースを手に入れて コンパイルして下さい。で、まずは man をよく読みましょう。 ちなみに僕は expect は使ったことがないので、多分答えられ ないと思います。 > awkコマンドで、以下のように全角空白でsplit出来てしまうのですが うーん、それで動いているのならいいんじゃないでしょうか。 awk って言ってもいろいろ亜種があるので、なんとも言えません。 |
|
初めまして、kmkです。 質問があるのですが、PCからUNIXへftpする際に 2Gを超えるファイルがはじかれたのですが、 limitで見るとfilesizeは無制限で、datasize が2Gチョイの制限になっていました。 マニュアルを見ても、なぜdatasizeでひっかかるのか 理由がわからないので、ぜひ教えてください。 |
|
Linux あたりなら、最近まで1つのファイルの最大サイズが 2GB まで、という制限があったそうですから、それじゃないで しょうか。 FreeBSD だと 5GB くらいは作れたという報告はみかけましたが、 最大サイズはわかりません。ちなみにファイルシステムとしての 最大サイズは、Linux も FreeBSD も 1TB か 2TB (忘れた) です。 商用 UNIX だと 1ファイル 1TB くらいはいくのかな? # でも Solaris2.6 だと最大 2GB だったような気も。 |
|
ありがとうございました。助かりました。 素直に、gzipで圧縮して、送ることにしました。 本当にありがとうございました。 |
|
ん、gzip で圧縮して送って、向こうで伸張できたのですか? なら最大ファイルサイズは関係なかったですね。 |
|
どうもお世話になります。 質問があるのですが、 プロセス中で動的メモリをmallocで取得して、そのプロセスが異常終了 (freeせずに)した時に取得した動的メモリは開放されるのでしょうか? #聞いた話によると確保した動的メモリは開放されずにそのまま #メモリに残ると聞いた事があります。 |
|
> 取得した動的メモリは開放されるのでしょうか? UNIX では必ず解放されます。 # OS のバグがない限り |
|
複数個(MAX100個)のウインドウを開く為に Display *display[100] Widget top_level[100] の行列で宣言して forループで,条件にヒットした場合のみ XtRealizeWidget(top_level[i]);などと コード化してみましたが,WINDOWが1つしか 表示しません.行列でwidgetを宣言するのに 問題があるのでしょうか?? |
|
>> 取得した動的メモリは開放されるのでしょうか? > UNIX では必ず解放されます。 元の質問とは大きく外れますが、共有メモリ(ipcs -mで見える)だと残りますね。 単なるFYIですが。 |
|
詳細はコード見ないと指摘できませんが、 > 複数個(MAX100個)のウインドウを開く為に > Display *display[100] ここだけ見ても、Displayに対する誤解がある気がします。 DisplayはXサーバとの接続ポイントです。 (socketとは限らないですが)分かりやすく言えば、socketを100用意して、それぞれ独立にサーバにつなごうとしているようなものです。 # 原理的には可能ですが、100のイベントループを管理するプログラムを書くのは嫌ですね。 |
|
補足ですが、Xt では XtDisplay(top_level) で Display * が 得られるので、Display を自前で用意する必要はありません。 % grep XtDisplay /usr/X11R6/include/X11/* IntrinsicP.h:#define XtDisplay(widget) DisplayOfScreen((widget)->core.screen) |
|
突然に書き込みで質問させていただく失礼をお許しください。 現在、ソケット通信(TCP/IP、マルチ)を行うプログラムを、 参考書などを調べながら作っております。 正直、概念などが良くわかっておりませんので、的外れな 物言いがあるかもしれませんが、御容赦ください。 現在、作成しようとしているシステム(X:仮名)では、 対向するYシステムと通信します。 また、Xシステム内部のプロセス間でも、クライアント・ サーバ間の通信を行います。 これらの通信に於いて、タイマを用意し、ヘルスチェックを 行おうとしていますが、この場合のタイマを、どのような形で 用意したものかで悩んでおります。 それぞれのプロセスの中から fork()したタイマで、上記のような 動作を行おうとしているのですが、この方法で大丈夫でしょうか? (事前の知識がありませんもので、不安を感じております。) あるいは、このような場合の、なにか、セオリーのようなもの というのは、あるのでしょうか? どうか、教えてくださいませ。 |
|
<AWKを使用した2つのファイルの文字列比較について>ご教授願います サンプルファイルです... <Input File1> <Input File2> <<Output File>> X01 X01 X025 X02 X02 X03 X03 X025 X04 X04 X07 X05 X05 X08 X06 X06 X099 X099 X07 X09 X08 X10 X09 X10 Input File1の文字列と Input File2の文字列の比較をします 結果としてOutputFileの出力を得たいのですが... 条件(雑でスミマセン) InputFile1の文字列が InputFile2の各文字列と一致する=出力しない InputFile1の文字列が InputFile2の各文字列と一致しない=出力する このケースでは InputFile1だけに存在する文字列 InputFile2だけに存在する文字列 がありますが InputFile2内の文字列を優先し (例) InputFile1の”X02"を比較するとき InputFile2”X02” は一致している => 出力しない 次のInputFile1の文字列”X03”を比較するとInputFile2の” 次行”である”X025"は一致していない (※) => X025 X03 の様にInputFile2の文字列”X025"を出力後InputFile1の”X03”を出力 InPutFile1の”X04 - X06"はInputFile2に含まれない =>そのまま出力 "X07 - X08"は双方含まれるので出力しない X09 の処理は(※)と同様に => X99 X09 の順で出力します(数としての比較ではありません) X10はInputFile2に含まれない =>そのまま出力 (AWK本も2冊買い込み(良い参照本があったら紹介願います)さらに同種質問の過去ログ”No. 1342”を参考(goo の"awk"検索でやっとこのHPにたどり着きました...)に考えてみたのですがどうしてもうまく作成出来ませんでした、AWK使いの方々:どうぞ宜しくお願いいたします) |
|
No.1428の修正です 申し訳ありません、サンプルファイルのスペースがおかしく なってました再送させていただきます。 <Input File1>____<Input File2>____<<Output File>> X01________________X01________________X025 X02________________X02________________X03 X03________________X025_______________X04 X04________________X07________________X05 X05________________X08________________X06 X06________________X099_______________X099 X07___________________________________X09 X08___________________________________X10 X09 X10 Input File1の文字列と Input File2の文字列の比較をします 結果としてOutputFileの出力を得たいのですが... 条件(雑でスミマセン) InputFile1の文字列が InputFile2の各文字列と一致する=出力しない InputFile1の文字列が InputFile2の各文字列と一致しない=出力する このケースでは InputFile1だけに存在する文字列 InputFile2だけに存在する文字列 がありますが InputFile2内の文字列を優先し... 以下例文です InputFile1の”X02"を比較するとき InputFile2”X02” は一致している => 出力しない 次のInputFile1の文字列”X03”を比較するとInputFile2の” 次行”である”X025"は一致していない (※) => 025 X03 の様にInputFile2の文字列”X025"を出力後InputFile1の”X03”を出力 InPutFile1の”X04 - X06"はInputFile2に含まれない =>そのまま出力 "X07 - X08"は双方含まれるので出力しない X09 の処理は(※)と同様に =>X099 X09 の順で出力します(数としての比較ではありません) X10はInputFile2に含まれない =>そのまま出力 (AWK本も2冊買い込み(良い参照本があったら紹介願います)さらに同種質問の過去ログ”No. 1342”を参考(goo の"awk"検索でやっとこのHPにたどり着きました...)に考えてみたのですがどうしてもうまく作成出来ませんでした、AWK使いの方々:どうぞ宜しくお願いいたします) |
|
そもそも > ヘルスチェック という言葉を初めて聞いたのですが (health check?)、文脈 からして正しく通信ができているかどうか調べ、一定時間 正常な反応がないならエラーにするという意味でいいですか? 目的にもよりますが、 1. サーバマシンが生きていて、network reachable かどうかを 調べるなら定期的に ping を打つ 2. TCP スタックが生きていることがわかればいいなら、定期的に echo サーバに接続。 3. サーバソフトウェアが生きていることを確認するなら、NOP の ような何も処理をせず返事を返すだけのプロトコルを実装し、 それを使って定期的に確認。 4. 該当スレッドが生きていることを確認するなら、select や alarm でタイムアウト処理をして、一定時間反応がなければ エラー、という処理をする。 ってなところです。どれがお望みですか? 当然 1 が簡単 ですが、信頼性のあるのは 4 ですね。 全然関係ないところに反応するのもアレですが > AWKを使用した2つのファイルの文字列比較について おお、化けてる。しかも元データは… http://X68000.startshop.co.jp/~68user/tmp/01428 http://X68000.startshop.co.jp/~68user/tmp/01429 正しそう。掲示板のバグですね。どこらへんだろう。 さて、本題は…今日は体力の限界に達したので…また後程。 朝起きたら誰か親切な人が答えてくれてるといいなと思いつつ、 おやすみなさい。 # 気になるのは Input File1 と Input File2 の内容は、文字列 # としてソートされていることが保証されているか、ってとこ # ですか。されているなら簡単。されていないなら…それでも # そんなめんどくさいことじゃないかも。 |
|
ほうぼうで話題になってるのでご存知の方も多いでしょうが、FYI。 WXG for Linux/FreeBSD http://www.ekotoba.com/ フリーソフトです。Canna プロトコルをしゃべりますので、 クライアント側の環境設定は必要ありません。 入れ換えるには cannaserver を殺して、/tmp の.iroha-unix や .ki2-unix (kinput2 を使っている場合) を削除し、wxgserver を 実行するだけです。で、どれくらい賢いかと言うと…(fj で見かけた ネタですが)、 cannaserver 貴社の貴社が貴社で帰社した。 (問題外) 帰社で帰社したのは帰社の帰社です (ここまでダメだとすがすがしい) MSIME 貴社の記者が汽車で帰社した。(正しい) 汽車で帰社したのは記者の記者です。(まぁ惜しいか) WXG 貴社の記者が汽車で帰社した。(正しい) 汽車で帰社したのは貴社の記者です。(正しい) うーん、すばらしい。まだバグっぽい誤変換もありますし、 単語登録に問題アリですが、十分実用に使えます。 A.I.SOFT に感謝しつつ、周りの環境を片っ端から WXG に replace 中。 |
|
No.1425,1426のアドバイスありがとうございます. i = 0,1,2,,,100 display[i] = XtOpenDisplay(context2, NULL, NULL, "TestApp", NULL, 0, &argc, argv); とコード化しているのですが,forで回しても,どうも同じwindowが 何度も開いている様です.第1引数が悪いのでしょうか. もう一度だけお願いします. |
|
traceroute.cgiを期待をかけてダウンロードさせていただきました。 なかなか上手く動かないので書き込みに参りました。 上記CGIと、environment.plもFTPしましてディレクトリも変更しました。 ところがscript Errで動きません。Redhat6.2では利用できないのでしょうか? それともDNSやDHCP等が関係して出来ないのでしょうか? 恐らく初心者の私の待ちがいとは思いますが、ご指導宜しくお願いいたします。 |
|
HP−UXでメモリ内のデータをソートしたいのですが、 サイズが大きいため無理なのかなと思っています。 sortコマンドではどれくらいの件数をソート出来るか 知っている方いませんか? |
|
> AWKを使用した2つのファイルの文字列比較について diffの出力をawkで加工、ってのじゃダメなのかな? |
|
> No.1425,1426のアドバイスありがとうございます. 全然通じていないような・・・ Displayを複数オープンする必要はありません。 100のXサーバと接続するクライアントには応用できるので、一応書いてみました。 XtAppContextは内部で複数のディスプレイ接続に対応していますね。 しかし、あくまで、複数のXサーバと接続するクライアントの為の仕組みであって、ひとつのXサーバ相手に、複数のディスプレイ接続は無意味です。 #include <X11/Intrinsic.h> #include <X11/StringDefs.h> #include <X11/Shell.h> int main(int argc, char **argv) { XtAppContext ac; Display *dpy[100];/* ridiculous example */ Widget w[100]; Arg arg[2]; int i; char title[64]; /* Xt initialization */ XtToolkitInitialize(); ac = XtCreateApplicationContext(); XtSetLanguageProc(NULL, NULL, NULL); XtSetArg(arg[0], XtNwidth, 100); XtSetArg(arg[1], XtNheight, 100); for (i = 0; i < 100; i++) { /* ridiculous example */ dpy[i] = XtOpenDisplay(ac, NULL, NULL, "TestApp", NULL, 0, &argc, argv); sprintf(title, "%d", i); w[i] = XtAppCreateShell(title, "TestApp", applicationShellWidgetClass, dpy[i], arg, 2); XtRealizeWidget(w[i]); } XtAppMainLoop(ac); } |
|
#68user氏ではないですが。 @hayataさん traceroute.cgiについて。 私自身 perl をやり始めたばかりなんでアレかのしれませんが、 ・perlが存在するパスは? 確認方法は「which perl」を実行したときの出力を見ることです。これ が「/usr/local/bin/perl」でなければ、perlが別のパスにインストール されているか、そもそもインストールされていない可能性があります。 インストールされていない場合は実行不可能ですが、別のパスが出力 された場合は、このスクリプト(traceroute.cgiとenvironment.plの両方)の 最初の行 #!/usr/local/bin/perl を修正する必要があります。例えば、「/usr/local/perl5/bin/perl」と表示 された場合は、 #!/usr/local/perl5/bin/perl とします。 ・tracerouteが存在するパスは? 確認方法は perl の場合と同様、「which traceroute」を実行したときの 出力を見ることです。これが「/usr/sbin/traceroute」でなければ、ダウン ロードした environment.pl の $traceroute = "/usr/sbin/traceroute"; という部分を修正する必要があります。例えば、「/bin/traceroute」と 表示された場合は、 $traceroute = "/bin/traceroute"; とします。 の2つをとりあえず指摘させていただきます。これ以外にも原因が考えられる でしょうが、少なくともこの2つを確認し、しかるべき対処をしないと実行 できませんので。 あと、このスクリプトは、*これを実行したホスト*と指定されたホストの間の ネットワークのつながりを調べますので、 http://X68000.startshop.co.jp/~68user/Cgi-room/ から直接実行した場合とでは出力結果が異なります。 @68userさん traceroute.cgiで気づいたのですが、 http://X68000.startshop.co.jp/~68user/Cgi-room/ の「www.cs.gunma-u.ac.jpと指定のホストの間の」は誤りで、正しくは 「X68000.startshop.co.jp」ではないでしょうか。 それでは。 |
|
はじめまして。lbと申します。 >AkiAkiさんへ inputfile1, 2ともあのようにソートしてあるならば、 comm -3 inputfile1 inputfile2 | sed 's/[[:space:]]*//g' で近い出力が得られるのではないでしょうか。awk じゃなくて すみませんが、ようするにカラムの間の space を削除すると いうことです。[:space:]という書き方がサポートされていない 場合は s/▲*//g にしてみてください。▲は キーボードのスペ ース の入力です。 |
|
どうも、skel.103Mです。 No.1437の > @68userさん > traceroute.cgiで気づいたのですが、 > http://X68000.startshop.co.jp/~68user/Cgi-room/ > の「www.cs.gunma-u.ac.jpと指定のホストの間の」は誤りで、正しくは > 「X68000.startshop.co.jp」ではないでしょうか。 は、正しくは ---------- @68userさん traceroute.cgiで気づいたのですが、 http://X68000.startshop.co.jp/~68user/Cgi-room/ の「www.cs.gunma-u.ac.jpと指定のホストの間の」は誤りで、正しくは 「X68000.startshop.co.jpと指定のホストの間の」ではないでしょうか。 ---------- ですね。ミスしてしまいました、申し訳ないです m(__)m |
|
No.1436 Display *dpy[100]; -> Display *dpy; に修正しました. わざわざコードまで,書いてもらってありがとう. 参考にさせてもらいます. |
|
こんにちは。 apacheのアクセスログのバックアップファイルを 作成したいと思ってます。 cpでファイルを作成しているときに アクセスログに書かれたログは、 反映されるものなのでしょうか? 知っている方がいらしたら教えていただけませんか? よろしくお願いします。 |
|
1438,1435アドバイスありがとうございます。 結果がこの結果になれば "awk"にはこだわってません (”perlが良いんじゃないか”とか会社の周りの連中は言ってますが..) ●diff を awkで加工... ●comm (Unix歴は長かったつもりですが...こんなコマンドがあったんですね) 来週早々会社のマシンでトライしてみます |
|
はじめまして。atomと申します。 教えて頂きたい事があります。 unixで特定の文字列を含むファイルを 特定の場所から検索するには どのようにすればよいのでしょうか? "unixの部屋"のgrepの説明で grep −−− dir/* というのがありますが これでよいのでしょうか。 どなたか、教えて下さい。 よろしくお願いします。 |
|
> sortコマンドではどれくらいの件数をソート出来るか > 知っている方いませんか? 適当なデータを作って、実験してみましょう。sort できる 限界までいったら、swap の状況を見つつ、sort のせいなのか メモリが足りないのか見極めましょう。 > traceroute.cgiを期待をかけてダウンロードさせていただきました。 補足ですが、まずは web サーバのログを見ましょう。 perl -c traceroute.cgi で文法チェックしましょう。 CGI として動かすのはもっと後の話です。 > 正しくは「X68000.startshop.co.jpと指定のホストの間の」では > ないでしょうか。 へい、その通りです。直します。 # が、CGI の小部屋は技術的に未熟だった頃 (今もたいした # ことはないけど) のコンテンツなので、既にメンテナンス # する気力をなくしております。暇を見付けて修正しておきます。 > grep −−− dir/* というのがありますがこれで > よいのでしょうか。 それでよいです。他人に聞く前に自分で試してみましょう。 試してダメだったのなら、何をした結果どうなったか、 というのが第三者にわかるように質問しましょう。 > cpでファイルを作成しているときにアクセスログに > 書かれたログは、反映されるものなのでしょうか? 試してませんが、恐らく反映されません。なので、 log を適当なタイミングで rotate して、古くなった ログファイルをコピーするのがよいでしょう。 apache なら rotatelogs というコマンドが付属しています。 |
|
>ん、gzip で圧縮して送って、向こうで伸張できたのですか? >なら最大ファイルサイズは関係なかったですね。 ファイルサイズですが、FreeBSD 4.1-RELEASE で 6GB 以上の報告も あるようです。6GB のディスクを dd コマンドでファイル化した なんて話がどこかで書いてありました(URI は失念しました)。 推測の域を出ませんが、2GB で引っかかったというので思い付いたのですが…。 まさかとは思いますが、singed int でファイルサイズを保持しているような 状況だとエラーが出るでしょうね。プログラムのバグかも知れません。 >grep −−− dir/* というのがありますが >これでよいのでしょうか。 この質問は答えにくいですね。dir 以下のディレクトリツリーを トラバースするのなら、これじゃ不足です。 find . -type f -exec grep PATTERN {} \; ですかね。GNU grep 使っているのなら、 grep -r PATTERN * でもすみます。ただし、シンボリックリンクがループしていると死にますね。 質問をみるとファイル名だけが表示されれば良いようにも読めるので、 そういった場合だと、 grep -rl PATTERN * かな? >適当なデータを作って、実験してみましょう。sort できる >限界までいったら、swap の状況を見つつ、sort のせいなのか >メモリが足りないのか見極めましょう。 GNU sort の場合 TMPDIR みていますね。ルートパーティションを 小さめにとっているシステム( 32MB とか 64MB )だと、メモリがあまっているのに ファイルシステムがあふれたりして。256MB メモリのあるマシンで実験したら、 こんな感じです。 % la -alF total 40330 -rw------- 1 root wheel 36666584 Dec 10 05:51 hoge % sort hoge /: write failed, file system is full sort: write error: No space left on device ちなみに、ルートパーティションは 64MB で、のこり 17 MB でした。 >perlが存在するパスは? 蛇足ですが、CGI スクリプトを win から binary mode で転送すると パスが正しくてもアウトですね。一行目が #!/usr/bin/perl^M とかなりますから。^M って CR のことです。つまり ascii の 0x0d |
|
> GNU grep 使っているのなら、 > grep -r PATTERN * あれ、今の GNU grep って recursive option あるんですか。 と思って ChangeLog 見たら、-r が追加されたのは 1998/08/18 でした。結構前なんですね。 |
|
nac と申します。ネットワークプログラミング大変参考になりました。 私も、POP3 クライアントを作ってみて疑問がでてきました。 rfc1939 を読んでみると pop3 サーバーの返答は 512文字まで と書いてありました。そこで、一行が512文字以上のメールを pop3 から落してくると、次のように hogehoge...hoge!CRLF hogehoge....hogeCRCF 途中で ! マークが入っておりました。rfc1939 を読む限りこの、! に ついては言及されていないようですが、これはどこで規定されているのでしょうか。 (もし、rfc の中で書いてあるようでしたら、理解不足です、すいません) |
|
> rfc1939 を読む限りこの、! については言及されて > いないようですが ちらっとしか見てませんが、512 ってレスポンス行 (+OK とか +ERR) の最大長であって、メールの1文の長さとは 無関係じゃないでしょうか? とはいえ、! で fold されていたというのは気になりますね。 現在 IMAP 環境しかないので試せませんが、その POP3 サーバアプリケーションの名前を教えてください。qpopper ですか? |
|
一応インストールは成功しているみたいです。GNOME+enlightenmentで「サウンドを有効にする」ボタンを押したらでは正常に動いたのですが、その後デスクトップのタスクバーが出なくなり、仕方なく再インストールして一からやり直したんですが、GNOM+Sawmillでは無理なんでしょうか? PCはNECのLAVIE「LV16CWS」(ノート型)です。サウンドカードはESS社 ES1869Sで、動作確認の取れたOSSの最新版ファイルをインストール済みです。ディストリビューションは、Turbo Linux6.0です。 音だけじゃなくて、スクリーンセイバーもKDEだと動くのにGNOMEではプレビューでは見れても、実際には動きません。ウィンドウマネージャーとの愛称って在るんですかね???誰かアドバイスお願いします。 あとメモリーの自動認識ができないのですが、方法ありますか?解れば教えて下さい。96MBなのでデフォルトでは認識しないようです。宜しくお願いします。 |
|
skel.103Mさん @hayataです。 No.1437でのアドバイスありがとうございます。 出張でこちらの掲示板を見落としてしまいました。これからアドバイスに沿って再挑戦してみます。 成功しましたは報告いたします。 ではでは |
|
1430の回答、ありがとうございました。 すぐに応答くださったのに、質問を投げた私が、反応が鈍く、 大変失礼いたしました。 「ヘルスチェック」という言い方は、どうやら「職場方言」のようですが、 68userさんの御推測の通りのものです。 回答いただいたうちの、3、及び4を、使用してみようと思っています。 ありがとうございました。 また、なにかの折りには、よろしくお願いいたします。 |
|
>とはいえ、! で fold されていたというのは気になりますね。 qpopper の場合一行の最大は \0 込みで 1024 bytes です。 ソースを見ると早いでしょう。 /* Send the header of the message followed by a blank line */ while (fgets(buffer, MAXMSGLINELEN, p->drop)) { if (!strncasecmp(buffer, "Content-Length:", 15) || !strncasecmp(buffer, "X-UIDL:", 7)) { /* Skip UIDLs */ continue; /* Content-Length is MTA dependent, don't send to MUA */ } \0 込みと言うのは、fgets 使っているための仕様です。 もしも、512 文字というのが 2 バイト文字の意味で、512 文字なら ちょうどこの制限に引っかかります。\0 込みなので、iso2022-jp なら 途中出来られると ! なんていくらでも出て来ます。iso-2022-jp なら 「。」なんて「!#」とかなりますから。 ただ、普通は困りませんね。rfc で決められている一行の推奨値は 70 bytes + αですから。 問題は本当に POP3 サーバだけの制限なのかということです。 実験の際に使った MUA や MTA の制限も関係あります。 sendmail 8.11.1 のソースを見たら行の長さ関係は 2048 bytes でした。 また POP3 サーバなどをinetd を通している場合 inetd 自体の制限も あります。8192 bytes かな? FreeBSD の inted の場合。ヘッダーしか見て いないので断定できませんけど。 もっとも、自分で /var/mail/ のファイルにメールらしきものを手動で append して実験した場合は話は別ですが。 他にも実験を telnet でやったのなら、telnet などの制限も考えられます。 FreeBSD なら ring buffer 使っているので、 そういう制限はありませんが、OS のベンダによってこの実装は変わるでしょうね。 |
|
> qpopper の場合一行の最大は \0 込みで 1024 bytes です。 それはヘッダの出力で、本文はその下の /* Send the message body */ while(fgets(buffer, MAXMSGLINELEN, p->drop)) { /* Decrement the lines sent (for a TOP command) */ if (--msg_lines <= 0) break; pop_sendline(p,buffer); if (hangup) return(pop_msg(p, POP_FAILURE, "SIGHUP or SIGPIPE flagged")); } でないでしょうか。で、pop_sendline は pop_sendline(POP *p, char *buffer){ char * bp; /* Look for a <NL> in the buffer */ if (bp = index(buffer,NEWLINE)) *bp = 0; /* Send the line to the client */ (void)fputs(buffer,p->output); /* Put a <CR><NL> if a newline was removed from the buffer */ if (bp) (void)fputs ("\r\n",p->output); } となっているので (一部略)、fgets で得たデータに改行が 含まれない場合も、余計な改行は付加されないように思う のですがどうでしょう # 改行なしだと bp==NULL になって fputs("\r\n") は実行されない。 rosegarden さんは qpopper-2.x 系列を見ておられるよう ですが、僕が見たのは qpopper-2.2 (ってこりゃまた古いな) の pop_send.c です。 |
|
>rosegarden さんは qpopper-2.x 系列を見ておられるよう >ですが、僕が見たのは qpopper-2.2 (ってこりゃまた古いな) >の pop_send.c です。 私が見たのは、qpopper-2.3 のソースですね。古いことにはかわりないんですが…。 確かに、 >それはヘッダの出力で、本文はその下の > /* Send the message body */ > while(fgets(buffer, MAXMSGLINELEN, p->drop)) { は御指摘の通りです。本質的にソースに差異はありません。でも、 これも結局 #define MAXLINELEN 1024 #define MAXMSGLINELEN MAXLINELEN なんで、結果的には同じですね。ただし、結果的に同じだっただけで、 私の間違いは間違いです。御指摘ありがとうございます。 なお、上のは同じバージョンの popper.h の define です。 >となっているので (一部略)、fgets で得たデータに改行が >含まれない場合も、余計な改行は付加されないように思う >のですがどうでしょう まず、fgets は man 3 fgets すると >The fgets() function reads at most one less than the number of characters >specified by size from the given stream and stores them in the string str. 最大で size で指定された文字から一文字少ない文字をバッファに読み込む とあります。これは \0 をappendしないといけないからです。 サンプルプログラムを次のようにします。 #include <stdio.h> int main( int argc, char **argv ) { FILE *fp; char buff[256]; if( argc != 2 ){ fprintf( stderr, "usage : fgets FILENAME\n" ); exit(1); } if( ( fp = fopen( argv[1], "r" ) ) == NULL ){ fprintf( stderr, "Cannot read %s\n", argv[1] ); exit(1); } while( fgets( buff, 10, fp ) ){ puts(buff); } exit(0); } さらにこれを gcc -g -O -o fgets fgets.c としてコンパイルして gdb で buff の中を見ます。 (gdb) break 18 Breakpoint 1 at 0x8048604: file fgets.c, line 18. (gdb) set arg fgets.c (gdb) run Starting program: /home/user/tmp/fgets fgets.c Breakpoint 1, main (argc=2, argv=0xbfbff740) at fgets.c:18 18 while( fgets( buff, 10, fp ) ){ (gdb) display buff 1: buff = "\201\203 (ゴミのため略) (gdb) n 19 puts(buff); 1: buff = "#include \000\005( 以下ゴミ ) (gdb) q こんな感じですね。 ># 改行なしだと bp==NULL になって fputs("\r\n") は実行されない。 これは違うと思います。bp == NULL なら単に \r\n を append するだけ で bp != NULL なら \n を \0 で潰してから、\r\n を append だと 思います。良く見てください、元のコードを *bp = '\0' となっています。 bp は index が拾って来た \n のあるところのポインタです。 |
|
ん? 失礼しました。 >># 改行なしだと bp==NULL になって fputs("\r\n") は実行されない。 >これは違うと思います。bp == NULL なら単に \r\n を append するだけ これ間違いですね。 >/* Put a <CR><NL> if a newline was removed from the buffer */ > if (bp) (void)fputs ("\r\n",p->output); bp == NULL だと確かに \r\n は付かないですね。 あと、 >となっているので (一部略)、fgets で得たデータに改行が >含まれない場合も、余計な改行は付加されないように思う 改行がつかないのは確かですね。 すると長い行の場合は次の行と連結するんですかね? 大変失礼しました。 ただ指定のバッファサイズより一文字減るのは確かです。 なんかそれを言おうとして、論点ずれた挙げ句に大量のゴミみたいな メッセージを書き込んでしまい申し訳ありませんでした。 |
|
2ch 風にリンク張れるようにしてみました。^(>>|@)\d+ は リンクが張られます。ただ、2ch のように数字に identify を 持たせたくないなぁ。 >>1453 さんの言うように…してみたところ、うまく動きました とかはちょっと嫌。 >>1455 rosegarden さん > 論点ずれた挙げ句に大量のゴミみたいな > メッセージを書き込んでしまい申し訳ありませんでした。 いいえ〜。こういう機会でもないとなかなかソース 読まないタチなので、この手の話は歓迎です。 ちなみに僕はデバッガ使えないようなレベルなので (bt しか知らない)、今後ともいろいろと御教示下さい。 >>1449 kiki@TL さん > GNOME+enlightenmentで すいませんが、GNOME も E も KDE もほとんど使ったことが ありませんので、僕はわかりません。 |
|
こんにちは。 >>1441のmerryです。 68userさん >>1444で質問に答えていただきありがとうございます。 rotateを調べてみたいと思います。 |
|
こんにちは UNIXでsendmailを使ってメールを送信するスクリプトを Perlで作ろうと思っているのですが、 添付ファイルを付けることは可能なのでしょうか? よろしくお願いします。 |
|
はじめまして。 crontabで毎日12:00にabcというスクリプトを 起動するといった設定を現在しているんですが、 これを最終金曜日だけ11:00起動でそれ以外は12:00に起動させるっていう 方法はあるんでしょうか? 教えていただきたく。 |
|
初めまして、辻 です。 HTTPでGETするプログラムを作成しています。HTTP クライアントを作ってみよう(4) を参考にさせていただいて、URLのエンコードしようとしています。 で、 /~user/hoge.cgi?fuga=ABC!"$ DEF+ が /%7euser/hoge.cgi?fuga%3DABC%21%22%5C%24+DEF%20 と書かれています。自分で作ったプログラムで確かめてみると、 /%7euser/hoge.cgi?fuga%3dABC%21%22%24+DEF%2b となりました。 また、URLのエンコードの対象はURL全てですか?それとも、CGIとかで使われる、?の後ろのみなのでしょうか?~が含まれるので、そんなことはないでしょうが。?そのものは、対象にならないようですし、ファイル名に@等がついてたりしたらどうなるのでしょうか? ちなみに、 string yHttpGet::UrlEncode(string url) { char buff[10]; for(int i=0; i<url.length(); i++) { char c = url.at(i); if(((c <'0') || ('9' < c)) && ((c < 'a') || ('z' < c)) && ((c < 'A') || ('Z' < c)) && ('/' != c) && ('?' != c) && (' ' != c) && ('_' != c) && ('-' != c) && ('.' != c) && ('*' != c)) { sprintf(buff, "%%%02x", c); url.replace(i, 1, buff); } else if(c == ' ') { url.replace(i, 1, "+"); } } return url; } 今のところ、このようなコードを書いています。 |
|
@1458 masa さん > UNIXでsendmailを使ってメールを送信するスクリプトをPerlで作ろうと > 思っているのですが、添付ファイルを付けることは可能なのでしょうか? モジュールが使えるなら http://www.parkcity.ne.jp/~chaichan/qanda/qa425.htm?00-12-13-19-49 で、ふじさんが述べておられる方法がお勧めです。 @1459 M.K さん > これを最終金曜日だけ11:00起動でそれ以外は12:00に起動させる > っていう方法はあるんでしょうか? 少なくとも FreeBSD の crontab では、それを実現する簡単な 方法はありません。 金曜日の 11:00 毎日 12:00 という二つのエントリを作って、スクリプト内で 最終金曜日で12時台なら、処理終了 金曜日 && 最終金曜日でない && 11時台なら、処理終了 とするのがいいでしょう。 試してませんが、*BSD や GNU の date なら、 date +%m … 現在の月を求める date -v+7d +%m … 一週間後の月を求める を利用して 0 11 * * 5 [ `date +%m`!=`date -v+7d +%m` ] && run-script 0 12 * * * [ `date +%w'!='5' -o `date +%m`!=`date -v+7d +%m` ) ] && run-script てなことが可能かもしれません (条件合ってるかな?)。 @1460 辻さん foo.cgi?.... という GET 形式は、? 以降の文字が QUERY_STRING (疑問符文字列) という名前で取り出せることからわかるように、 ? はエンコードする必要はありません。疑問符であることが重要なのです。 > URLのエンコードの対象はURL全てですか? 全て、というかパス (/~user...) も含めてエンコードが必要です。 ただし、引数を渡したい場合は ? はエンコードしません。 でなくて、ファイル名の一部に ? が含まれる場合は エンコードが必要です。 この掲示板の上にある発言フォームから文字を入力すると、 Name … 68user Email … 68user@X68000.startshop.co.jp Message … ほげほげ というような、対応関係が生まれます。このようなフォームで 生成されたデータを POST で送るとき、クライアントは application/x-www-form-urlencoded という mime type で 送信しなければいけません。「HTTP クライアントを作ってみよう」 では手抜きして送ってませんが、本来は送るべきです。 で、GET の場合も同様に x-www-form-urlencoded 形式ならば ?foo=bar は ?foo=bar でよいです。= は URL エンコードしません。 しかし、そうではなく 「foo=bar」という引数を渡したいのなら ?foo%3Dbar となります。 というふうに、本当は /~user/hoge.cgi?fuga=ABC!"$ DEF+ という例だけでは、どこをエンコードすべきかは明確には なりません。なので、あの解説はあまりよろしくないですね。 例えば hoge.cgi?foo=bar&def=ghi は、フォームに foo、 bar という要素があるならこのまま送ればよいですが、 foo=「bar&def=ghi」という意味なら foo=bar%26def%3Dghi」 とすべきです。どちらなのかは hoge.cgi?foo=bar&def=ghi だけでは正確には判断できません。 |
|
こんばんは、質問をした本人のレスが遅れて申し訳ありません。 (しかも、ソースまで見て頂いて恐縮です。) >サーバアプリケーションの名前を教えてください。qpopper ですか? 一般のプロバイダで実験したので、わかりませんでした。 今度他の qmail, sendmail が動いているサーバーで実験してみます。 さて、私も手元にあった、qpopper3.0.2 のソースを眺めてみました。 (POP_TERMINATE は '.' buffer は buffer[MAXMSGLINELEN] (MAMSGLINELEN=1024) と宣言されています) pop_sendline ( p, buffer ) POP * p; char * buffer; { char * bp; /* * Byte stuff lines that begin with the termination octet */ if ( *buffer == POP_TERMINATE ) (void)fputc ( POP_TERMINATE, p->output ); /* * Terminate the string at a <NL> if one exists in the buffer */ bp = index ( buffer, NEWLINE ); if ( bp != NULL ) *bp = 0; /* * Send the line to the client */ (void) fputs ( buffer, p->output ); /* * Put a <CR><NL> if a newline was removed from the buffer */ if ( bp != NULL ) (void) fputs ( "\r\n", p->output ); } これをみると、やはり、\n がなければそのまま出力されて しまうようですね。なんとなく、最初から、\n があることを 想定しているような感じも受けます。 |
|
68user さん、何度もありがとうございます。 私は、HTMLにある<A>タグでリンクされているHTMLをGETするプログラムを作っています。フォームに関わるCGIを作ってるわけではないのですが、リンク先が掲示板で?で引数を渡すリンクがある場合は、正しく渡して、取り出したいと考えています。 この場合、GETなのか、POSTなのかはわからないのですが。ブラウザがフォームからの結果以外で単純にリンクから、ページを読み込むときは、GETを使っているのだと思うので、GETでいいのですか? で、よくわかっていないのですが。この場合も、URLを%とかでエンコードすべきかは判断できないのですか?ブラウザはやっているように思えるのですが。。。 |
|
行頭に「>>1461」または「@1461」と書くと、 >>1461 68user というふうにリンクを張るようにしました。このとき、自動的に リンク先の発言者の名前を補完します。「さん」付けは なしですが、御了承下さい。 また、「>>1461 ほげほげ」と、数字の後に何かを書くと、 >>1461 ほげほげ とリンクだけが張られ、名前の補完はされません。しかしスクリプトが どんどん汚くなってきた…。brush up が必要だなぁ。 >>1463 辻 義一 > GETでいいのですか? foo.cgi?hoge.. という形式なら GET でよいです。 要は、HTML を読んで <A HREF="foo.cgi?hoge=fuga">..</A> という 部分から foo.cgi?hoge=fuga という文字列を切り出した場合、どこを エンコードすべきかということですよね。普通は何もエンコードせず デコードせず、そのまま使えばいいと思います。アンカーに書く URL は既に URL エンコードされているはずだからです。 それを無理にエンコードする必要はないですが、あえて行うならば ?=&%#/.-*_ 以外の記号と 0x80〜0xff はエンコード、でいいのでは ないでしょうか。 >>1462 nac > これをみると、やはり、\n がなければそのまま出力されて > しまうようですね。 そうですね。POP3 サーバとしては、本文の行がどれだけ長くても、 改行は付加しないのが普通ではないかと思います。基本的にクライ アントにデータを流すだけですから。 |
|
>それを無理にエンコードする必要はないですが、あえて行うならば >?=&%#/.-*_ 以外の記号と 0x80〜0xff はエンコード、でいいのでは >ないでしょうか。 html の文法的には hoge.cgi?foo=1&bar=2 は hoge.cgi?foo=1&bar=2 と書くそうなので、そういった html の文字参照の変換は 必要になるかも知れません。例えば、$ とか…。 |
|
68user さん。 ありがとうございます、エンコードもデコードもしなくて良いと言うことですか。楽は楽なのですが。~もそのままで良いのかな。。今のプログラムでGETできているので、このままで行こうかと思います。 rosegarden さん。 その変換について走っていますが、、タグ内の文字列(""で囲まれた部分)までは適用しなくても良いと思うのですが。しているのも見たことありませんし。 |
|
>>1466 辻 義一さん http://www.ne.jp/asahi/minazuki/bakera/html/opinion/ampersand が、良くまとまっています。ご参考まで。 ※ 僕のサイトは、どうしてたかなぁ・・・ |
|
たまたま、この件で大ハマリしてました (1時間悩んだ)。 http://X68000.startshop.co.jp/~68user/tmp/amp.html FreeBSD jman へのリンクを張ろうとしていたのですが、 上のリンクは mroff.cgi?.....&dir=jpman-4.2.0%2Fman§=8 と書いていますが、うまくいきません。よく知りませんが、&sec か § という実体参照があるのでしょう。で、ブラウザ (FreeBSD+NN4.75) がその文字に置き換えてリクエストを送るので、mroff.cgi 側に こちらの意図したデータを渡せないのでしょう。 下のリンクは mroff.cgi?.....&dir=jpman-4.2.0%2Fman&sect=8 としているので OK です。 うちのページは何も考えず & のままにしていますね。いかんなぁ。 |
|
>>1467 (自己フォロー) http://www.asahi-net.or.jp/%7Ejy3k-sm/i_net/url.html にも、色々あります。 >>1468 68user 雨が降って、ひまなので、ついでに、調べてみました。 http://www.w3.org/TR/REC-html40/sgml/entities.html によると、sectはsection signだそうです。 因みに、win98/IE4,NN4では§、bidi-mozilla(11-13)では%A1%F8 になりました。 |
|
どうも、お世話になります。 最近、DNSの勉強していて、試しに立ててみようと 思っています。(Redhat Linux) そこで、質問なんですけど、 ・ダイヤルアップ接続でDNSサーバは動かせますか? #もちろん一時的でいいんで‥ ・DNSサーバで必要なものは何でしょうか? 気をつける点等.. #そういうHPを知っていたら教えて下さい。 よろしくお願いします。 |
|
>・DNSサーバで必要なものは何でしょうか? 気をつける点等.. >#そういうHPを知っていたら教えて下さい。 Linux-HOWTO で詳しく書いたものがありましたよ。 |
|
>>1471参照 ついでだったので、調べておきました。 http://www.linux.or.jp/JF/JFdocs/DNS-HOWTO.html JF インストールすれば大抵入っています。 |
|
rosegardenさん有難う御座います。 教えてくれたページを見て勉強します。 これからもよろしくお願いします。 |
|
ども。お世話になってます。 管理モードのパスワードとかって、普通crypt()でハッシュしますよね。 でもDESの場合辞書アタックとかで簡単に破られちゃいますよね。 なのでmd5(md5sum)コマンドで「4fcf95ef97e1b7b248698bca83781902」みたいに ハッシュしているのですが、これはcrypt()のDES、MD5($1$...$)と比べてどっちが セキュリティ的によろしいのでしょうか。 |
|
URLエンコードの件ありがとうございました。 URIですか?に&をそのまま入れているページはたくさんあります。自分のホームページ上のCGIもそうだし、検索エンジンとかもそう。修正しようか迷っています。登録されている実体参照と重なっていないようなので、事実上大丈夫なのでしょうが。勉強になりました。これを、CGIに反映させるかは迷っているのですが。 現在作っているプログラムでは、色々動かして問題がないようですので、このままにしておきます。ブラウザでも正しくエンコードされていない、ページを開くときに支障があるぐらいですから、こちらで変換すれば上手く出来そうですが、ページの責任と言うことで。終わらせます。 ありがとうございました。 今回は、 |
|
こんちはーっす。 ず、ずいぶんまえに、ここに(そのときとはURL違うような気もするが) 永久保存版の過去ログなかったっすか? 久しぶりに見たくなって検索したのですが・・・・ 最近行ってないけどtestボードまだ、げんきなのかなー・・・・ |
|
>>1474 ぷに辻 > 管理モードのパスワードとかって、普通crypt()でハッシュしますよね。 DESやmd5を1方向関数として使用している点は了解していると仮定します。 (余談1 ハッシュ関数と1方向関数は同義と言ってもよいですが、一応別物です。 1方向関数は(結果的に)ハッシュ関数ですが、逆は必ずしも真ではありません。 moduloはハッシュ関数ですが、出力から元の値が容易に推測可能なので良い1方向関数ではありません。) > でもDESの場合辞書アタックとかで簡単に破られちゃいますよね。 辞書アタックと言っているのは、1方向関数でエンコードされたパスワードを奪われて、それに対して、しらみつぶしにパスワードを探索していると仮定します。 (余談2 暗号化パスワードと呼ぶ場合もありますが、復号化するわけではないので、誤用に近いと思っています。) 辞書アタックは、ワードを同じ1方向関数でエンコードして、マッチするものを探すことですから、同じ長さのパスワードなら、探索にかかるコストは、DESでもmd5でも大差無いと思います。 ただ、DESの場合、鍵長が56bitで、パスワード自体を鍵に使うことで(本来、暗号化アルゴリズムであるDESを)1方向関数にしているので、パスワードの長さが8文字に制限されます。 md5は(本来から1方向関数で)元データの長さに(現実的な)制限はないので、もっと長いパスワードが選べます。 この差は大きいですが、弱い(or 短い)パスワードを使っている限り、辞書アタックに対する強さは変わらないと思います。 (辞書アタック以外の探索法に対する強さは分かりません。 DESが簡単に破られる、と言っているのは、3年ぐらい前(もっと前?)のRSAコンテストで、約半年かかって破られたことを根拠にしていると思いますが、逆に言えば、未だ辞書アタックしか有効な手が無いという辺り、腐ってもDESと思わせるものもあります。) |
|
>>1476 SabaCurry > 永久保存版の過去ログなかったっすか? はい、ありました。半永久保存版は1997年9月16日だけですが、 一応 1997/9/29〜1998/09/20 の分は保存してあります。 データはありながらも閲覧用 CGI スクリプトがどっか行っちゃって 見られない状態が続いてましたが、さきほど発掘してきました。 見てたら恥ずかしくなったので (笑)、URL はメールで送ります。 そのうちアナウンスもなくひっそりと公開します。 >>1474 ぷに辻 > crypt()のDES、MD5($1$...$)と比べてどっちがセキュリティ的に > よろしいのでしょうか。 md5 より crypt+md5 の方が、salt という仕組みがある分 強固ではないかと思います。推測にしか過ぎませんが。 >>1477 gixs > RSAコンテストで、約半年かかって破られたこと 専用ハードウェアを使うと、56bit DES 解読に要する時間は 22時間くらいでしたっけ。剣呑剣呑。 |
|
>>1478 68user > URL はメールで送ります。 From: MAILER-DAEMON@lala.v3.com (Mail Delivery System) <tetuya@i.am>: unknown user: "tetuya" ということで、メールが送れませんでした。 |
|
>>1478 68user さん >md5 より crypt+md5 の方が、salt という仕組みがある分 >強固ではないかと思います。推測にしか過ぎませんが。 そう言えば、perl スクリプトなどから crypt 使うと FreeBSD の最近の RELEASE では DES で決めうちになっていることが多いようです。 ことに 4.1.1-RELEASE 以降の暗号解禁リリースの話です。 無論 DES 入れなければ、MD5 ですが。 システム全体では、切替え用のライブラリ関数もあって DES と MD5 を切替えて使えるのに perl が FreeBSD の切替えメカニズムに追従できていないようなんです。 それともできるのかな?ご存知の方いたらスクリプトレベルでの 切替え法を教わりたいです。 断定はしませんが、ソースをちょっと見た印象として、 -current は、login.conf で切替えられて、 デフォルトは MD5 です。今の所。4-stable は DES 入れると 有無を言わさず DES みたいですね。 |
|
>>1480 参照 >ことに 4.1.1-RELEASE 以降の暗号解禁リリースの話です。 正確にはDES が気軽に使えるようになったのは 4.0-RELEASE からですね。 |
|
>>1480 rosegarden > システム全体では、切替え用のライブラリ関数もあって > DES と MD5 を切替えて使えるのに perl が FreeBSD の > 切替えメカニズムに追従できていないようなんです。 あ、そうなんですか。全然知りませんでした。 /usr/lib/libcrypt* -> libscript* というリンクなら MD5、 /usr/lib/libcrypt* -> libdescript* なら DES、くらいの切り替え方法しかないのかと思ってました。 4.2-BETA (make world しなきゃな〜) のソースを見た限りでは よくわからなかったのですが、切り替え用ライブラリ関数とは どれのことでしょうか? |
|
>>1480 参照 >今の所。4-stable は DES 入れると有無を言わさず DES みたいですね。 ちょっと調べて見たら、意外に以前のバージョンで変更されていますね。 知らなかった。 green 2000/08/21 19:15:54 PDT Modified files: (略) usr.bin/passwd local_passwd.c usr.sbin/pw Makefile pw_user.c Log: Add working and easy crypt(3)-switching. Yes, we need a whole new API for crypt(3) by now. In any case: Add crypt_set_format(3) + documentation to -lcrypt. Add login_setcryptfmt(3) + documentation to -lutil. Support for switching crypt formats in passwd(8). Support for switching crypt formats in pw(8). The simple synopsis is: edit login.conf; add a passwd_format field set to "des" or "md5"; go nuts :) Reviewed by: peter ちなみに RELENG_4 だと変更のタイムスタンプは 2000/09/20 04:19:56 PDT 見たいですね。ちょうど、4.1.1-RELEASE のでる前後ですね。 >>1482 68user さん >4.2-BETA (make world しなきゃな〜) のソースを見た限りでは >よくわからなかったのですが、切り替え用ライブラリ関数とは >どれのことでしょうか? 答えは上の commitlog を御覧ください。crypt_set_format ですね。 |
|
失礼しました。転送メールがうまくいってない(?除名された? みたいなので よければ、こちらの方にURLを教えていただけないでしょうか? 久々にセガの過去ログなど見て、懐かしさにひたってしまいました。 |
|
>>1477 gixs >>1478 68user gixsさん、68userさんありがとうございました。 > md5 より crypt+md5 の方が、salt という仕組みがある分 > 強固ではないかと思います。推測にしか過ぎませんが。 なるほど。では全部のスクリプトcrypt+md5に変えようと思います。 # gixsさんのは難しすぎて僕には分かりませんでした(汗) |
|
> # gixsさんのは難しすぎて僕には分かりませんでした(汗) 説明する側の落度です。精進します。 >> md5 より crypt+md5 の方が、salt という仕組みがある分 >> 強固ではないかと思います。推測にしか過ぎませんが。 正しいと思います。 下のぼくの(分かりにくい)説明は、crypt+des vs. crypt+md5の話です。 結論は、パスワード長が同じなら辞書アタックに対する強度に差はないだろう、ということです。 saltありなしに関する余談は・・・、また分からないと言われるのが恐いので止めます。 |
|
>>1483 rosegarden > システム全体では、切替え用のライブラリ関数もあって なるほど。crypt(3) の切り替えではなく、passwd(1)/pw(1) で 使用される crypt ライブラリのフレームワークが追加された ということですね。 > perl が FreeBSD の切替えメカニズムに追従できていないようなんです。 > それともできるのかな? perl も libutil 使えばいいのにってことでしょうか。 でも #ifdef __FreeBSD__ を埋めこむようなものなので (埋めこまないけど、意味としては同じ)、仕組みとしては 美しくないですねぇ。 ここらへんのもどかしさが Yes, we need a whole new API for crypt(3) by now. と言わせるのでしょうか。 > スクリプトレベルでの切替え法を教わりたいです。 安直ですが、MD5 っぽい salt を渡すのはどうでしょう。 % perl -e 'print crypt("secret","salt")."\n"' saHW9GdxihkGQ (DES) % perl -e 'print crypt("secret","\$1\$salt\$")."\n"' $1$salt$ez2vlPGdaLYkJam5pWs/Y1 (MD5) >>1484 SabaCurry > よければ、こちらの方にURLを教えていただけないでしょうか? はい、後ほど送ります。 |
|
マルチプロセスがよく分かっていませんので お願いします ... 今fork関数を使い,二つのプロセス, 1)表示画面にイヴェントが発生したら処理するプロセスと 2)時間監視を行っているプロセス を作成しました. 2)は,ある時間の条件でXtOpenDisplayでメッセージ画面が表示し,OKボタンが押させるか画面右上のXボタンが押されると,メッセージ画面が消えます.しかし,メッセージ画面が複数個,表示されるのに,一画面を消去するだけで,全てのメーッセージ画面が消去されてしまいます. その為,複数プロセスにしよう ー 3つのメッセージ画面が表示されたら,3つのプロセスが 動いている − フ゜ロク゛ラムを作成中なのですが,3つ出力されればいいのに6つ(3つx2回)出力されたり,.... 何か簡単に作成できる方法はないでしょうか? execl命令などを使わずに簡単にできませんでしょうか. |
|
>>1487 68user さん >安直ですが、MD5 っぽい salt を渡すのはどうでしょう なるほど、salt をかえればいいんですね。言われて見れば、 確かにそうですね。もっとも、言われるまでは気が付きませんでしたが。 どうもありがとうございました。 |
|
>>1488 Qさいとう > 今fork関数を使い,二つのプロセス, > 1)表示画面にイヴェントが発生したら処理するプロセスと > 2) 時間監視を行っているプロセス > を作成しました. X サーバとの通信の実態は、ソケット経由でのデータのやりとりです。 大抵は (同一ホスト内なら) /tmp/.X11-unix/X0 経由です。 # つまり UNIX ドメインソケットを使う。 で、ソケットを作成したあと fork して、複数のプロセスが ソケット共有するのは多分うまくいかないでしょう。 # そういう構成であるとは書いてありませんので推測ですが。 クライアント→サーバは OK かもしれませんが、サーバ→ クライアントのデータは親プロセスか子プロセスのどちらに 渡るかが決まっていないからです。 というわけで、そもそも構成がまずいと思います。1プロセスで できませんか? Xt は知らないのですが、何かコールバック関数を 登録できる仕組みがあると思います。 仮に複数プロセスでやるとしても、X サーバと接続する前に fork して、片方は X サーバとの通信、もう片方は監視などと 役割分担し、両プロセスの間はパイプやシグナルやソケット経由で やりとりすべきでしょう。 >>1487 68user >> よければ、こちらの方にURLを教えていただけないでしょうか? > はい、後ほど送ります。 あ、まだ送ってなかったかもしれない。今日明日はちょっと 無理かもしれないので、すいませんが気長にお待ちくださいませ。 |
|
「UNIXの部屋」で telnet リモートホストにログインする という項目がありました。 ここで 自動的にログインし、自動的にコマンドを実行するには sleep の項のサンプルを参照。 (コマンド sleep *) とありますが、sleepの項では、下記のようになってます。 sleep 指定秒数だけ動作を止める 5分間 (300秒) 動作停止するには % sleep 300 とする。sleep コマンドは、スクリプトの中で使うことが多い。 % ( echo username ; sleep 1 ; echo password ; sleep 1 ; echo ls ; sleep 1 ) | telnet foo.bar.com なんてこともできたりする。 (日本語マニュアル sleep) 実際に自動的にログインし、自動的にコマンドを実行したい場合はどうすれがいいのでしょうか 誠に勝手なお願いですが、ぜひ教えてください。 |
|
>>1491 酒井 > 実際に自動的にログインし、自動的にコマンドを実行したい場合は > どうすれがいいのでしょうか そこに書いてある % ( echo ... sleep 1 ) | telnet foo.bar.com ではダメだったのでしょうか。 まぁ普通は ssh や rsh を使いますね。 http://X68000.startshop.co.jp/~68user/unix/pickup?keyword=rsh&target=command#rsh http://www.jp.FreeBSD.org/QandA/HTML/1576.html |
|
古い話ですが >>1380 book > gcc -c share_test.cc > ar cr libtestshare.so share_test.o > ranlib libtestshare.so > CC test_gcc.cc -L. -ltestshare gcc に -g オプションを付ければいける、と fj で読んだような 読んでないような。 >>1484 SabaCurry メールで送りました。 |
|
BIOSの設定画面で、MPSってありますけど Versionの1.1と1.4の違いってなんでしょうか? |
|
ある日突然?起動音が出なくなり、サウンドはすべて聞えなくなりました。[リソースの競合に遭遇し、自己流で、[コントロールパネル]-[システム]- デバイスマネージャー]より、「はてなマーク」のものを削除して、 [サウンド関連のデバイス]を手動設定変更し、競合を避けることができ、 デスクトップ右下にスピカーが表示され音が出るようになったのですが、 再起動するたびに、「PCI Universal Sirial Bus」の入手案内が表示され、キャンセルボタンを押してからでないと、正常に作動を開始しません。起動の度に案内画面が出ないようにするにはどうすればよいでしょうか? |
|
チャトって、どこですか??? |
|
あけましておめでとうございます。本年もよろしくお願いします。 別のことをやっていて偶然発見したんですが、 ------------------------------ foo #! perl use strict; my $n = 17; # 普通の変数 print "---> $\$n\n"; # リファレンスしていきなりデリファレンス ------------------------------ % perl -w foo Use of uninitialized value in concatenation (.) or string at foo line 5. ---> 17 結果は確かに出てるんだけど、なんかundefの変数を二重引用符に入れたときと同じ 警告メッセージが出ます。これはなぜでしょう? |
|
>結果は確かに出てるんだけど、 ↓を試してみて下さい。 my $n = 17; # 普通の変数 $\ = '<OUTPUT RECODE SEPARATOR>'; print "---> $\$n\n"; # リファレンスしていきなりデリファレンス ↓こっちも my $n = 17; # 普通の変数 print "---> ${\$n}\n"; # リファレンスしていきなりデリファレンス |
|
>>1494 CoreFighter > BIOSの設定画面で、MPSってありますけど > Versionの1.1と1.4の違いってなんでしょうか MultiProcessor Specification の略ですが、詳しいことはさっぱりです。 現状では ACPI に取って変わられたんじゃないかな。具体的なことは intel のサイトあたりに仕様書が転がってるかもしれません。 |
|
>mmさん あー、、、(^^;;;;; すいませんでした。 どうもありがとうございます! |
|
UNIXで、C言語で、TCP/IPを使って、クライアント/サーバ(マルチクライアントがアクセスする。非ブロッキングという)プログラムをしています。 selectを使用して、特定の、クライアントが接続しているソケットのタイムアウトを知りたいのですが、その方法が、良くわかりません。 こちらの方が詳しいということなので、ぜひ教えてください。 お願いします。本を読んでも、良くわかりませんでした。 |
|
>>1501 E田 現状はどこまでわかっているんですか? 何もわからないなら、まずは http://X68000.startshop.co.jp/~68user/net/c-echo-1.html を読んでください。で、ソケットを使えるようになると。 で、perl ですが、select の使い方はこんな感じ。イメージをつかんで下さい。 http://X68000.startshop.co.jp/~68user/net/echo-4.html んで、C での select(2) の使い方。 http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/54916 http://home.jp.FreeBSD.ORG/cgi-bin/showmail/FreeBSD-users-jp/54917 わからなければ、作ってるソースから余計な部分をそぎ落としたソースを 公開して、再度質問してください。 |
|
こんにちは。ネットワークプログラミングについて質問があるのですが…。 現在、Debian Linuxをもちいて、簡単なプログラミングから練習している のですが、いき詰まりました。 PF_PACKETをつかってデータリンクに直接データを渡したいのですが、 ethhdrのh_dest や h_sourceにどうやってMACアドレスを入れて良いか 解らなくなりました。IPアドレスでは、inet_ptonとかあったんですが、 MACアドレスの場合もあるのですか?? 宜しくお願いします。 |
|
>>1503 inpaku > 簡単なプログラミングから練習しているのですが、いき詰まりました。 ははぁ、「簡単なプログラミングから練習」で、いきなりデータリンク層ですか。 僕にはちょっと荷が重いなぁ。 確認ですが、非 TCP/UDP かつ 非 IP のデータを送りたいのですよね? UNIX Magazine 2000年7月号「BSD をハックする - 齊藤明紀」で、 - 非 IP のプロトコルを使うにはどうすればよいか - 送信する Ethernet パケットに含まれる MAC アドレスを自由に 設定することはできるか について、NetBSD での解説が書かれています。 また、「UNIX ネットワークプログラミング第2版 Vol.1」 http://X68000.startshop.co.jp/~68user/net/link-book.html#8 では、データリンクへのアクセス手法として、 - BSD の BPF (BSD Packet Filter) - SVR4 の DLPI (SVR4 Data Link Provider Interface) - Linux の SOCK_PACKET の3つがあげられています。どうやらここらへんは OS により API がまちまちらしいですね。実際、手元の FreeBSD 4.2-BETA では (PF|AF|SOCK)_PACKET という定数は定義されていません。 で、この本によると Linux の SOCK_PACKET を使うなら fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL)); とすると、データリンクからすべてのフレームを受けとれる らしいです。 あと、tcpdump が使用している libpcap というライブラリが 上記3種の方法に対応しているようなので、参考になるかも しれません。 # libpcap は読み出ししかできませんが、送信に対応させるのは # それほど面倒ではないとか。 > IPアドレスでは、inet_ptonとかあったんですが、 > MACアドレスの場合もあるのですか?? BSD には libc に ether_aton とか ether_hostton てのがあります。 Linux はどうですか? くぅ、面白い話題だけど、調べるのに一杯一杯だ。 |
|
68userさんへ 親切にお答え下さって、ありがとうございます。 ether_aton とか ether_hostton ですか、探してみます。 実は僕もUNIX ネットワークプログラミング第2版 Vol.1を 持ってますが、はっきりいって、C言語すらおぼつかない僕 には辛いです(笑) たしかにLinuxではSOCK_PACKETを使うと本には書いてあり ましたが、Kernel2.2以降?からはPF_PACKETを使えと、man ページに書いてあったものですから、それを使ってます。 また、libpcapのソースも落としましたが、書き換えるのは 僕には不可能でした(苦笑) ところで、僕は何をしたかったのかというと、自分で任意の プロトコルをつくってそれで通信させてみようということだ ったんです。無謀とお思いでしょうが、やらなきゃならんの です。卒業のために…。とにかくがんばってみます。 ありがとうございました。 |
|
早速、回答してくださいまして、ありがとうございます。 どこまでわかっているか、ということなので書きますが、 ソケットの生成とかは、できています。 サンプルとかを真似して、クライアント/サーバで動かしてみました。 fork()で、マルチクライアントにもできています。 でも、select()を組み合わせると、よくわかりません。 動作は、教えてもらったページとかで、なんとなくわかるのですが、 それをCでやろうとすると、わからなくなります。 select[1]とかと書いて、タイムアウトの時間を指定してやると、 それをすぎても読み出せない時にはタイムアウトしたっていうことで 検出できるんですか? よろしくお願いします。 |
|
追伸です。 ソースとかは、まだ、ほとんど、サンプルとかのechoサーバとかなので、 書きませんでした。 |
|
すみません、もう一つ質問です。 送信するデータで、データの最初に全データの長さが入っていて、 その次に、データのIDが入っていて、その後にデータの本文が 入っているというものを受信する時の方法についてなんですが、 それを読む時、最初のデータの長さとIDを読んで、その後で データの本文を読みたいのですが、構造体みたいなのを用意して、 そこに格納しようと思っています。 データの長さはu_longで4byteで、 IDは、0x00100101(u_longで4byte)とかという番号で、 データの本文は、u_shortで2byte+longで4byte+char[8]です。 socketでの送信用のchar型からキャストしてみようと しているんですが、最初の00がうまく行きません。 (送信する時のキャストはうまく行っています。受信する時は、 ちゃんと全部、もとのままのデータを受け取っています。) これは、socketの扱い方の方のhton()とかでやらないと いけないのですか? それから、もしかすると、Cの方の書き方が下手糞なせいなのかも しれないのですが、構造体に格納するのがうまく行かないので、 たとえばで良いので、もしも良かったら、例を教えてくれませんか? お願いします。 |
|
> 最初の00がうまく行きません。 うまく行かないプログラムを (余計な部分は削った上で) 公開してください。 はい、C+select の超手抜きサンプル。バグありまくりですが 一応動きます。細部は参考にせず、おおまかな流れを見て下さい。 ------------------ #include <stdio.h> #include <netdb.h> #include <sys/types.h> #include <sys/time.h> #include <sys/socket.h> #include <sys/uio.h> #include <unistd.h> #include <sys/param.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUF_LEN 256 /* バッファのサイズ */ int main( int argc , char *argv[]){ int connected_socket[100]; int listening_socket; struct sockaddr_in sin; int sock_optval = 1; int port = 5000; char buf[BUF_LEN]; struct timeval waitval; fd_set fd; fd_set org_fd; int max_sock = 0; /* リスニングソケットを作成 */ listening_socket = socket(AF_INET,SOCK_STREAM,0); /* ソケットオプション設定 */ if ( setsockopt(listening_socket,SOL_SOCKET,SO_REUSEADDR, &sock_optval,sizeof(sock_optval)) == -1 ){ perror("setsockopt"); exit(1); } /* アドレスファミリ・ポート番号・IPアドレス設定 */ sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = htonl(INADDR_ANY); if ( bind(listening_socket,(struct sockaddr *)&sin,sizeof(sin)) < 0 ){ perror("bind"); exit(1); } if ( listen(listening_socket, SOMAXCONN) == -1 ){ perror("listen"); exit(1); } printf("ポート %d を見張ります。\n",port); waitval.tv_sec = 1; waitval.tv_usec = 0; FD_ZERO(&org_fd); FD_SET(listening_socket, &org_fd); max_sock = listening_socket; while (1){ int i; struct hostent *peer_host; struct sockaddr_in peer_sin; memcpy(&fd, &org_fd, sizeof(org_fd)); select(max_sock+1, &fd, NULL, NULL, &waitval); for ( i=0 ; i<=max_sock ; i++ ){ if ( FD_ISSET(i, &fd) ){ if ( i == listening_socket ){ int len; len = sizeof sin; max_sock++; printf("connected_socket[%d]\n",max_sock); connected_socket[max_sock] = accept(listening_socket, (struct sockaddr *)&sin, &len); if ( connected_socket[max_sock] == -1 ){ perror("accept failed.\n"); } len = sizeof(peer_sin); getpeername(connected_socket[max_sock], (struct sockaddr *)&peer_sin,&len); peer_host = gethostbyaddr((char *)&peer_sin.sin_addr.s_addr, sizeof(peer_sin.sin_addr),AF_INET); printf("接続: %s [%s] ポート %d\n", peer_host->h_name, inet_ntoa(peer_sin.sin_addr), ntohs(peer_sin.sin_port) ); FD_SET(max_sock, &org_fd); } else { int read_size; read_size = read(connected_socket[i], buf, sizeof(buf)-1); if ( read_size == 0 ){ printf("接続が切れました。引き続きポート %d を見張ります。\n",port); close(connected_socket[i]); FD_CLR(i, &org_fd); } else { printf("メッセージ: %s",buf); write(connected_socket[i],buf,strlen(buf)); } } } } } close(listening_socket); return 0; } |
|
もう、お返事を頂けたとは! すごいです。 ありがとうございます。 参考にして、勉強してみます。 それと、構造体に入れるところのプログラムを、そこのところだけ書きます。 テスト用に、こういう構造体を作りました。 struct test_s{ u_long test_1; u_short test_2; u_short test_3; u_short test_4; u_short test_5; }; struct test_s tes; それから、読み込むところのプログラムです。 while(1){ int len; char *ptr; char buf1[256]; len = read( newsockfd, buf1, sizeof( buf1 )); buf1[len] = '\0'; if( len > 0 ){ if( strncmp( buf1, "end", 3 ) == 0 ){ break; } ptr = buf1; tes.test_1 = (int)ptr[0]; tes.test_2 = (atoi)ptr[1]; tes.test_3 = (atol)ptr[2]; tes.test_4 = (int)ptr[3]; tes.test_5 = (int)ptr[4]; } } こんな感じです。 test_2以降に入る予定のデータは、みんな同じのを送っていますけど、 どれも、変な感じになってしまいます。 (ここには書いていないですけど、printf()で表示させています。) 構造体とかポインタとか、意味は勉強したんですが、 書くのは初めてなので、そのせいかなとも思うんですが、 キャストのやり方が違うのかもしれません。 いろいろやっているうちに、自分ではわからなくなってしまいました。 ほんとうにすみませんけれども、教えてください。 お願いします。 |
|
>>E田 >キャストのやり方が違うのかもしれません。 確かにおかしな部分はあるようです。もっとも、それがどの程度 全体に影響を及ぼしているかは分かりません。参考程度と言うことで。 まず、次のようなサンプルプログラムを用意します。 #include <stdio.h> #include <string.h> struct test_s { unsigned long test1; unsigned short test2; unsigned short test3; unsigned short test4; unsigned short test5; } tes_s; int main(int argc, char *argv[]) { char buff[256]; char *ptr; buff[0] = '\x12'; buff[1] = '\x34'; buff[2] = '\x56'; buff[3] = '\x78'; buff[4] = '\x0'; buff[5] = '\x1'; buff[6] = '\x0'; buff[7] = '\x2'; buff[8] = '\x0'; buff[9] = '\x3'; buff[10] = '\x0'; buff[11] = '\x4'; ptr = buff; tes_s.test1 = ((unsigned long *)ptr)[0]; tes_s.test2 = ((unsigned short *)ptr)[1]; tes_s.test3 = ((unsigned short *)ptr)[2]; tes_s.test4 = ((unsigned short *)ptr)[3]; tes_s.test5 = ((unsigned short *)ptr)[4]; return 0; } なおキャストの仕方がE田さんのとは違いますが、 E田さんの意図を汲むのなら上の方がおそらく良いでしょう。 これをデバッガで検査してみました。最後の手前で break させて 変数を見ます。 (gdb) x/100bx ptr 0xbfbfd6f0: 0x12 0x34 0x56 0x78 0x00 0x01 0x00 0x02 0xbfbfd6f8: 0x00 0x03 0x00 0x04 0x44 0xd7 0xbf 0xbf これを見る限りデータはちゃんとセットされています。 (gdb) p/x tes_s.test1 $1 = 0x78563412 最初の 4 バイトはひっくり返っています。もしも、動作させる予定の 計算機の CPU が little endian なら memcpy などを使って 1byte ずつ コピーした方が無難です。ただし、SPARC とか m68k なら気にしなくて良い 場合もあります。(ただし、完璧に機種依存になるので、その旨コメントで 明記した方が良いでしょう。) (gdb) p/x tes_s.test2 $2 = 0x7856 (gdb) p/x tes_s.test3 $3 = 0x100 (gdb) p/x tes_s.test4 $4 = 0x200 (gdb) p/x tes_s.test5 $5 = 0x0 (gdb) q 次からは、ずれていますね。例えば、tes_s.test2 = ((unsigned short*)ptr)[1] というのは最初から、short が並んでいるとして、最初から 2 番目のものを とりだすことになるので 配列先頭からの 3 バイト目と 4 バイト目をとりだ します。更に、バイトオーダが絡んで来るので、話しは複雑になります。 機種に依存して良いのなら、 union hoge { struct some_struct { .... } hogehoge; char buff[256]; } などとして一気にコピーする手法が典型的ですが、バイトオーダに悩まされま す。これをすると SPARC では動くが intel 系の CPU では動かない、あるい はその逆のプログラムになります。 まるで、馬鹿みたいに思えるかも知れませんが、memcpy で地道に値のコピー を行った方が良いです。 繰り返しますが、これをなおしたとしても、 E田さんの問題の解決になるとは限りませんので、あらかじめおふくみおき下 さい。あくまでも気がついた範囲ではと言う話です。 |
|
>>1509 68user 68userさんはご存知かもしれませんが、他の人がはまらないように。 Linuxのselect(2)は、戻った時、第5引数の値が残り時間を示して戻ってくる(タイムアウトしたら値はゼロになる)ので、waitvalの値の設定はwhileループ内でやる必要があります(manにも書いてあります)。 > コピーした方が無難です。ただし、SPARC とか m68k なら気にしなくて良い > 場合もあります。(ただし、完璧に機種依存になるので、その旨コメントで > 明記した方が良いでしょう。) 教育的観点から言っても、やはり「常にネットワークバイトオーダに」でしょう。 > まるで、馬鹿みたいに思えるかも知れませんが、memcpy で地道に値のコピー > を行った方が良いです。 バイトオーダと構造体のパディングを考えると、これしかありませんね。 参考 http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#ss2.15 データ型をやりとりしたいなら、構造体ひとつに対し専用の読みだしと書き出しの関数を作るのが常套手段です。 (内部的には、構造体のメンバ変数をチマチマとネットワークバイトオーダにしながら、バッファにバイト列として書き出します。send側)。 もうひとつの手は(書かなかったら、68userさんが指摘するでしょうが)、数値でもなんでも文字列にしてしまう手です。 クライアント側のテストをスクリプト言語やtelnetを使って簡単にできるので、お薦めです(ただし、簡単すぎて卒業研究っぽくならないかもしれませんが)。 |
|
68userさん MPSの件有難う御座いました。 ところで今疑問に思っている事があるのですが、 NICにはMACアドレスってのがありますよね。 モデムやTAにもMACアドレスってあるのでしょうか? #ものすごい些細な質問で・・すんません。 |
|
はじめまして すいませんが質問です。 vi でヒアドキメントの使い方がわかりません linuxで試しているのですが ex/vi: Vi's standard input and output must be a terminal とエラーになってしまいます。 できないのでしょうか? |
|
>>1514 taka > vi でヒアドキメントの使い方がわかりません ex mode なら大丈夫なようです。ただし ex コマンド使わないと いけませんが。そのまま vi mode で使う方法は分かりません。 #!/bin/sh ( vi -e | sed -e 's/^#/foo: /' ) << 'END' a hoge hoge hoge hoge . 1,$s/^/#/ 1,$p q! END あとシングルクォートかエスケープ使った方が良いです。 最後の行の $ とシェル変数がバッティングしますから。 |
|
有難うございます 以下のシェルで更新できました。 #!/bin/sh vi -e data001 << 'END' i hoge hoge hoge hoge . wq! END ps レスのつけ方がわかりませんでしたすいません |
|
>>1510 E田 構造体の受け渡しに関しては、僕の出る幕はなさげですが、 一応まとめておきます。まず、E田さんはポインタの使い方を 学んで下さい。rosegarden さんのソースは tes_s.test1 = ((unsigned long *)ptr)[0]; tes_s.test2 = ((unsigned short *)ptr)[1]; となっていますが、rosegarden さん自身が説明されている通り これではまずいので tes_s.test1 = *(unsigned long *)(ptr); tes_s.test2 = *(unsigned short *)(ptr+4); の方がいいでしょう。わからなければ再度質問してください。 で、それを理解してからやっとバイトオーダの話になります。これは 今回の件では関係ないかもしれない (エンディアンによってたまたま 問題が顕在化していないかもしれない) ので、参考程度にどうぞ。 以下のソースでは配列 data から変数 test1/2/3 に値を代入しようと しています。 #include <stdio.h> #include <string.h> void my_memcpy(char *dst, char *src, size_t len){ src += len-1; while (len--) *dst++ = *src--; } main(){ unsigned long test1; unsigned short test2; unsigned short test3; char data[] = {0x12,0x34,0x56,0x78,0x0,0x1,0x0,0x2}; char *ptr = data; test1 = *(unsigned long *)(ptr); test2 = *(unsigned short *)(ptr+4); test3 = *(unsigned short *)(ptr+6); printf("普通に代入 0x%x 0x%x 0x%x\n", test1, test2, test3); memcpy(&test1, ptr+0, sizeof(test1)); memcpy(&test2, ptr+4, sizeof(test2)); memcpy(&test3, ptr+6, sizeof(test3)); printf("memcpy 0x%x 0x%x 0x%x\n", test1, test2, test3); test1 = htonl(*(unsigned long *)(ptr)); test2 = htons(*(unsigned short *)(ptr+4)); test3 = htons(*(unsigned short *)(ptr+6)); printf("hton して代入 0x%x 0x%x 0x%x\n", test1, test2, test3); my_memcpy(&test1, ptr+0, sizeof(test1)); my_memcpy(&test2, ptr+4, sizeof(test2)); my_memcpy(&test3, ptr+6, sizeof(test3)); printf("逆順にmemcpy 0x%x 0x%x 0x%x\n", test1, test2, test3); } このサンプルでは char data[] = {0x12,0x34,0x56,0x78,0x0,0x1,0x0,0x2}; となっていますが、これを適当に切り取って変数に代入すると 順序が狂ってしまいます。実行結果は以下の通り。 普通に代入 0x78563412 0x100 0x200 (間違い) memcpy 0x78563412 0x100 0x200 (間違い) hton して代入 0x12345678 0x1 0x2 (正しい) 逆順にmemcpy 0x12345678 0x1 0x2 (正しい) 前の2つは順序が逆になっています。これはリトルエンディアンマシン (x86 など) で発生します。ビッグエンディアン (68000, Sparc など) では起こりません。 後の2つは htons/htonl や自作の my_memcpy でバイト順を置換して 代入しています (もちろん hton を使う方がよい)。 これはソケット経由でデータを送ると、バイト順が狂うという 意味ではありません。エンディアンが異なるマシン間でも、 データは送った順序で届きます。ですから、同じエンディアン 同士でデータを送りあえば問題は顕在化しません。 ただし、 「異なるエンディアン間で変数の値を直接送信したとき」 は、 「一方の CPU 内部ではバイト順の交換が行われるのに、 他方では行われない」 ので、バイト順が狂ってしまいます。ですから、 「事前にネットワークバイトオーダに変換してから送信」 し、 「受信側はネットワークバイトオーダと認識して変数に代入する」 のが望ましいということです。 実際のソースで書くと、以下のような感じになります。 送受信側でバイトオーダが一致していれば OK。異なるなら NG。 (送信側) long send_num=0x12345678L; write(socket, &send_num, sizeof(send_num)); (受信側) long recv_num; read(socket, &recv_num, sizeof(recv_num)); バイト列をソケット経由で変数に代入する。受け手側が リトルエンディアンなら OK。そうでなければ NG。 (送信側) char buf[]={0x12,0x34,0x56,0x78}; /* 0x12345687 を送りたいとする */ write(socket, buf, sizeof(buf)); (受信側) long recv_num; read(socket, &recv_num, sizeof(recv_num)); ネットワークバイトオーダで送信。ネットワークバイトオーダを ホストバイトオーダにして代入。これが一番よい。 (送信側) long send_num = htonl(0x12345678L); write(socket, &send_num, sizeof(send_num)); (受信側) long recv_num; char buf[256]; read(socket, buf, sizeof(recv_num)); recv_num = ntohl(*(long *)(buf)); なお、ネットワークバイトオーダ=ビッグエンディアンのオーダです。 別に両者で合意が取れていればいいので、リトルエンディアンで 統一したければそれはそれで構いません。 ちなみに X プロトコルでは高速化のため、事前にクライアント・サーバ 間でバイトオーダが異なるかどうかチェックして、 - 同じバイトオーダならそのままデータを送る - 異なるバイトオーダならネットワークバイトオーダに変換してから送る となっているとか。 ところで my_memcpy(void *dst, void *src, size_t len){ とすると gcc に invalid use of void expression と怒られるんですが、 引数を void * で受けるのってできないんでしたっけ? >>1512 gixs > Linuxのselect(2)は、戻った時、第5引数の値が残り時間を示して戻ってくる > (タイムアウトしたら値はゼロになる) ので、waitvalの値の設定はwhile > ループ内でやる必要があります(manにも書いてあります)。 ご指摘どうもです。その通りですね。ちなみに FreeBSD では select(2) の BUGS の項で、本来上記のような動作をするべきだが、 現状ではそうなっていない (waitval の値は書き換えられない) と あります。 >>1513 CoreFighter > NICにはMACアドレスってのがありますよね。 > モデムやTAにもMACアドレスってあるのでしょうか? ないです。なぜかっちゅうと NIC は Ethernet の端点だからです。 # なぜ Ethernet だと MAC アドレスが必要で、モデム/TA に # MAC アドレスが必要ないか…は、うまく説明できないなぁ。 # 誰か教えて下さい。 |
|
すいませんがまた質問です。 今度はftp でヒアドキメントの使い方がわかりません ftp ftp.xxx.xxx.ne.jp << EOF userid password by EOF これで実行すると Password:Name(ftp.xxx.xxx.ne.jp:root): と聞かれてしまいます。 シェルだけで実行する方法はありませんか? |
|
>>1518 taka > 今度はftp でヒアドキメントの使い方がわかりません http://X68000.startshop.co.jp/~68user/unix/pickup?ftp の -n オプションの説明を見て下さい (Linux で使えるかどうかは わかりませんが)。 |
|
>>1487 68user 先日の FreeBSD の crypt(3) のデフォルトについてですが、 暮れから新年にかけてライブラリ関数のレベルで切り替えの メカニズムが commit されたようです。いまとのところ 5-current でしか使えず、管理権限がないと切り替えられないのですが。 /etc/auth.conf に crypt_default=md5 という設定を入れると perl の crypt もデフォルトが md5 になるようです。 # 今日 CVSup でソースとって来た人は 20 時以降のソースとって来た方が # いいです。昼のソースだと pccard 周りのコンパイルが出来ません。 # 今はなおっていますが。 |
|
せっかくなので、 >>1509 68user のソースを書き直して 「C 言語で echo サーバを作ってみよう (2)」 http://X68000.startshop.co.jp/~68user/net/c-echo-2.html を作ってみました。C言語+select によるタイムアウト機能付き echo サーバです。 # 一応バグは潰したつもり。 あと、これまでご指摘を頂いた >>1389 Yuuki の accept のバグ、 >>1215 UNIX見習い >>1216 68user の LocalAddr のバグを修正しました。お二人に感謝。 |
|
>>1520 rosegarden おろ、/etc/login.conf には passwd_format=md5 で、/etc/auth.conf には crypt_default = md5 des で、libutil で、libcrypt ですか。全然なにが なんだかわかってませんが、手元にソースがないので調べにくい。MFC を待つか…。 # 軟弱なので、うちは今朝の 4-STABLE です。 |
|
>>1522 68user 言葉が足りないようですみません。 4-stable では /etc/login.conf に passwd_format=md5 と明示的に 指定することによって passwd コマンドなどで 使用するハッシュ関数は変更できますが、perl などで使用している crypt(3) などのハッシュ関数はそのまま des だったりします。 解禁以降、大抵の人はそのまま des 入れているでしょうから。 一方、5-current だと /etc/login.conf でのハッシュ関数の 指定は passwd コマンドでは有効になりますが、それとは別に crypt(3) のハッシュ関数を /etc/auth.conf で指定できます。 これはさっき CVSup して確かめましたが、4-stable には反映されていません。 http://www.jp.FreeBSD.org/cgi/cvsweb.cgi/src/lib/libcrypt/crypt.c ソースはここで確かめられます。 CGI で差分も見れます。 > # 軟弱なので、うちは今朝の 4-STABLE です。 いや、あまり関係ないかと思います。去年の暮れに 4-stable が page fault 頻発して 放棄せざるを得ない状態まで追い込まれたことあります。結局 kernel panic 起こしながら、数個ずつ kernel のファイルをコンパイルして、 安定した kernel をインストールし、それで回復させましたが。 同じ時期の 5-current はすごく安定していました。 ハード構成いかんではそういうことも起こり得ます。 |
|
初めまして。 FreeBSD 3.5.1と、それに付属のperlを使っています。 そこでソケットに関するプログラムを組みましたが、ちょっと問題が出てきました。 下記のソースを見てください。 HTTPサーバに接続して、メッセージを受け取り、一定時間何も受信できないと プログラムを終了しようとしています。 (本当は、相手のサーバからコネクションを切られたら終了するようにしたいんです。) サーバと接続されいる状態では、selectは期待した値を戻してくれるのですが、 接続が切断されたあとも、selectの戻り値が 0以外で、いつまでたっても、 ループから抜けられません。 なにか解決方法はないでしょうか? (大抵のサンプルはwhile (<SOCK>) って感じでやってるみたいですが、 バイナリファイルが対象でもうまくいくのでしょうか?) ## ソケットを開いて、ポート80)に繋ぐ。 ## send(SOCK,"GET /index.html HTTP1.0\r\n",0); $rin=''; vec($rin,fileno(SOCK),1)=1; while (1) { $ret = select($rout=$rin,undef,undef,1); if ($ret == 0 ) { last; } #タイムアウト recv(SOCK,$x,1,0); print $x; } |
|
>>1524 みかん ちろっと見た感じでは 1. \r\n が一個足りません。 2. 相手側がコネクションを切断したときも select は 1 を返します。 その際、recv すると1バイトも読めず、0を返しているはずなのに 無視しているので永遠に終わらないのです。 # http://X68000.startshop.co.jp/~68user/net/echo-4.html |
|
>>1523 rosegarden > 言葉が足りないようですみません。 いや、解説を催促するつもりはなかったのですが、恐縮です。 login.conf ということはユーザごとに DES か MD5 を定義 できて、しかも各ユーザは ~/.login_conf で上書き自由、 ということだと思うんですが、それが出来て何がうれしい んだろう…ってのが疑問なんです。 # NIS 使用時に幸せ? > 去年の暮れに 4-stable が page fault 頻発して > 放棄せざるを得ない状態まで追い込まれたことあります。 恐いですねぇ。僕は FreeBSD-stable も流し読みだし、make world で こけたとき直すスキルもないので、ビクビクしながらやってます。 4-STABLE じゃなくて 4.2-RELEASE にしとけばよかったな。 >>1524 みかん > 大抵のサンプルはwhile (<SOCK>) って感じでやってるみたいですが、 > バイナリファイルが対象でもうまくいくのでしょうか? <> は C でいうところの fgets 相当 (+バッファサイズが無限長) なので うまくいきます。 うまくいきますが、改行コードが1つもないデータを読もうとすると 一度に多くのバッファ (=メモリ) を消費するので、 sysread(SOCK, $buf, 8192); read(SOCK, $buf, 8192); while ( read(SOCK, $buf, 8192) ){ print $buf } などの方がよいです。 ついでに言っておくと、状況にもよりますが、select に <> や read を使うのは不適切です。select で読み込み 可能だからといって、「改行コードを含むデータ」や 「指定したサイズのデータ」が読み込めるとは限らない ので (データの前半部分だけが先に到着しているかも しれない) からです。せっかく select でブロッキングを 回避しているのに、<> や read の部分でブロッキング してしまうかもしれない。 # ここでいう read は read(2) でなく perl の read (fread(3)) です。 |
|
>>1517 68user > ところで > my_memcpy(void *dst, void *src, size_t len){ > とすると gcc に invalid use of void expression と怒られるんですが、 > 引数を void * で受けるのってできないんでしたっけ? おや? 68userさんにしては珍しい。 # まあ、プログラミング言語って(自然言語も同じようなものですが)、 # ちょっと離れるだけで勘がにぶって、ポカをやらかしてしまいますが。 そのエラーは、引数で受けた部分ではなく、 dst++などの演算のところのエラーですね。 逆に、char*で受けた場合、gcc -Wallのwarningを黙らすために、 (char*)&test1のようなキャストが必要です。 # gccはいつも-Wall。これでポカミスを結構見付けられます。 |
|
>>1526 68user > それが出来て何がうれしい うーん、それはそうですね。ただ、人によってこだわりは あるでしょうから。本当の理由は私も良く分かりませんが、 des インストールしても md5 で crypt できるのはやはり 嬉しいです。 |
|
>>1527 gixs > そのエラーは、引数で受けた部分ではなく、 > dst++などの演算のところのエラーですね なるほどなるほど。 void my_memcpy(void *dst, char *src, size_t len){ (char *)src += len-1; while (len--){ *((char *)dst)++ = *((char *)src)--; } } てな感じでしょうか。 > おや? 68userさんにしては珍しい。 僕は元々ヘボです。-Wall は付けてますが、いつも warning が出る ものの、キャストの仕方がわからず、大抵「まぁ動いているからいいや」で 済ましてしまうレベル (^^; >>1528 rosegarden > des インストールしても md5 で crypt できるのはやはり > 嬉しいです。 ちと考えてみましたが、例えば apache+suExec で CGI を動かす とき、「俺は前の環境で作成したパスワードがあるので DES」 とか「私はセキュリティ重視で MD5」などと、ユーザごとに DES/MD5 を選べたりする、ってな場合があるかもしれませんね。 全然関係ありませんが、掲示板の使い方 http://X68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse を作りました。上の [使い方] から飛べます。 |
|
こんにちは、UNIX1年生のみかんと申します。 文字列置換のsedコマンドを使って変数の中の文字列を置換して 別の変数に入れたいと考えております。このようなことは可能でしょうか? sed -e "s/aaa/bbb/g" ${ABC} ここで変数${ABC} の中に入っている値(例えばaaa)を置換して 変数${CBA}に挿入したいと考えております。 大変に恐縮ですが、ご存知の方がいらっしゃいましたらご教授いただけませんでしょうか。よろしくお願いします。 |
|
>>1505 inpaku あー、もう解決してらっしゃるかもしれませんが、 だいぶ前にこう言うものをつくりました。 http://www.geocities.co.jp/MotorCity/5319/deception_doc.txt http://www.geocities.co.jp/MotorCity/5319/deception.txt 暇つぶしにつくった趣味のソースなんで、ぼく自身が忘れないための やる気のないコメントしか入ってません(苦笑 自ホストのNICからMACアドレスを引っぱってきてるのは、 gethwaddr()関数のあたりです。 あて先ホストのMACはlookup_mac()関数で持ってきてます。 ARPリクエストを流してから、自分のNICにキャッシュされたか 確認することで取得しています。 今見ると、ところどころマヌケできったないソースですが 参考になれば。 |
|
68userさん、rosegardenさん、gixsさん、 回答、ありがとうございます。 今から、読みながら、また勉強します。 本当に、ありがとうございました。 やってみて、また、わからなかったら質問すると思いますが、 また、よろしくお願いします。 |
|
はじめまして. IPアドレスとポート番号で,サーバーとそこで動いているサーバープログラムが特定できる所までは理解できました. では,あるマシンで2つWWWブラウザーを立ち上げて,その両方とも同じHTTPサーバーにアクセスした場合,サーバはどちらのブラウザーにHTMLを送り返すか分からないと思うのですが,それはどうやって識別しているのでしょうか. |
|
>>1530 みかん > こんにちは、UNIX1年生のみかんと申します。 >>1524 みかん の方とは別の方ですか? sh・bash なら CBA=`echo $ABC | sed 's/aaa/bbb/g'` csh・tcsh なら set CBA=`echo $ABC | sed 's/aaa/bbb/g'` set CBA=$ABC:s/aaa/bbb/g (これって SunOS の csh でも使えるのか〜) てな感じでしょうか。他にも方法があると思いますが、 僕はこれだけしか知りません。 >>1533 とも > では,あるマシンで2つWWWブラウザーを立ち上げて,その両方とも > 同じHTTPサーバーにアクセスした場合 2つのブラウザは、それぞれソケットを生成しますが、それぞれ 同じサーバに connect したとき、自動的に OS が選んだポート 番号が割り振られますので、それで識別できます。 ブラウザが1つであっても、HTML とその中に貼られている画像を 平行して読み出すときなどはソケットを複数使いますが、これも 別のポート番号が割り当てられます。 クライアントは、getsockname すれば自分に割り当てられた ポート番号がわかりますし、サーバからは getpeername すればクライアント側のポート番号がわかります。 ちなみに IP データグラムのヘッダには始点 IP アドレス、 始点ポート番号、終点 IP アドレス、終点ポート番号が 記録されています。 |
|
>No. 1534 68user 68userさん、ご教授ありがとうございます! >>>1524 みかん >の方とは別の方ですか? いいえ、みかんという方が他にもいらっしゃったんですね。 これからはみかん(一年生)と名乗ることにします。 68userさんのご教授いただいた内容にて、問題が解決いたしました。 非常に感謝しております。ありがとうございました。 今後ともよろしくお願いいたします。 ・・・質問ばかりしていてはだめだとは思っているのですが(>_<) |
|
初めて書き込みします。 質問なのですが、ローカルマシンからリモートマシンへコピー(移送)した場合、コピーしたファイルやディレクトリのユーザーID/グループIDがその時の実行ユーザーID/グループIDに変わってしまいます。 これをそのままの設定のままコピーする事はできないでしょうか? ちなみにrcpとftp(ディレクトリのコピー(移送)自体が既に無理)では無理でした。 出来ればUNIXコマンドかPerlで可能な方法があれば教えて下さい。 これらでは無理でも他の方法でなら可能だと言うご意見でも構いませんので、よろしくお願いします。 使用環境:solaris8 使用言語:Perl5.0、csh |
|
>>1534 68user > sh・bash なら > CBA=`echo $ABC | sed 's/aaa/bbb/g'` sh・bash で他の方法があったら教えてください。 >>1536 ゆきえ > ユーザーID/グループIDがその時の実行ユーザーID/グループIDに > 変わってしまいます。 というのが既に誤解ではないかと思います。 % rcp ~/a.txt userA@host:~/b.txt … host:~userA/b.txt のオーナーは userA % rcp ~/a.txt userB@host:~/b.txt … host:~userB/b.txt のオーナーは userB となります。 ですから、ファイルのオーナー/グループが誰になるかは 「その時の実行ユーザID/グループID」 で決まるのでなく、 「rcp するとき どのユーザで認証を行うか」 によります。ftp も同じで、ログイン時にどのユーザ名で 認証を行うかで決まります。 |
|
お答えありがとうございます。 >「rcp するとき どのユーザで認証を行うか」 ですと、認証したユーザーに結局は変更されてしまいますよね? ディレクトリの配下には色々なユーザーIDやグループIDが存在していますのでそれを変更したくはないのです。 調べていますとfilename.tar.zをrcpで移送して、rshでuncompress、tar -xvfpをすろ事でこの問題が回避されそうなのですが、tar -xvfpがうまくいきません。 マシンAのルートディレクトリにある./usr.tarをマシンBからrshで rsh A tar xvfp ./usr.tar rsh A tar xvfp ./usr.tar ./. rsh A tar xvfp ./usr.tar -C ./. いずれの場合も展開されませんでした。 どうすればtarファイルを展開できるのでしょうか? |
|
>>1538 ゆきえ > tar -xvfpがうまくいきません f の直後に tar ファイル名を指定しないといけません。 だから、いつも f は最後と覚えてください。 tar -xvpf hogehoge.tar |
|
>>1538 ゆきえ > ディレクトリの配下には色々なユーザーIDやグループIDが > 存在していますのでそれを変更したくはないのです。 ああ、なるほど。理解しました。 1. ファイルのオーナーを調べ、その権限で rcp する foreach file (*) set owner=`ls -l $file | awk '{print $3}'` rcp $file ${owner}@host:~ end 2. root で tar xvfp する。 ただし、展開時のファイルのオーナーは、ユーザ名でなく uid に 従うので、ローカルとリモートの uid の割り振り (/etc/passwd) が 同じである必要がある。 てなところですか。 > マシンAのルートディレクトリにある./usr.tarをマシンBからrshで > rsh A tar xvfp ./usr.tar rsh の前に マシンA に rcp で usr.tar をコピーしましたか? >>1539 rosegarden > f の直後に tar ファイル名を指定しないといけません。 今回は問題ないんじゃないですかね。x,v,p とも引数を取らないので。 |
|
>>1540 68user >> マシンAのルートディレクトリにある./usr.tarをマシンBからrshで >> rsh A tar xvfp ./usr.tar > rsh の前に マシンA に rcp で usr.tar をコピーしましたか? ああ失礼、マシンAにファイルはあるのね。で、「ルート ディレクトリ」は「ホームディレクトリ」の間違いですか? % rsh A tar xvfp ./usr.tar だと、~/usr.tar を読みにいってしまいますので。 # root 権限でやってるならルートディレクトリでいいのかも。 |
|
初めて書き込みします。 質問なのですが、DBの接続はDBIで行っています。使用言語はPERLです。 DBへの接続は通常DBIの場合、connectにより行っていますが、 現時点でconnectがされているか、されていないかをコーディング上で 確認する方法はありますでしょうか? ご存知の方がいらっしゃいましたらご回答のほうをお願いします。 |
|
>>1542 の > 現時点でconnectがされているか、されていないかを > コーディング上で確認する方法はありますでしょうか? ping ちうのがありますね。$rc = $dbh->ping; |
|
>>1538 ゆきえ 断りなしにマルチポストする人は、うちの掲示板に 書き込まないで下さい。 http://www.parkcity.ne.jp/~chaichan/qanda/qa539.htm?01-01-11-10-57 今後は向こうでどうぞ。 |
|
>>1540 68user > > f の直後に tar ファイル名を指定しないといけません。 > 今回は問題ないんじゃないですかね。x,v,p とも引数を取らないので。 はずかしながら今まで、知りませんでした。 御指摘ありがとうございます。 |
|
> > > f の直後に tar ファイル名を指定しないといけません。 > > 今回は問題ないんじゃないですかね。x,v,p とも引数を取らないので。 > はずかしながら今まで、知りませんでした。 たびたびすみません。知らなかったのは事実なのですが、GNU tar だと ハイフン付けて tar するとだめみたいです。 GNU tar 1.13 の場合 % tar -xvfp hoge.tar tar: Cannot open p: ファイルもディレクトリもありません。 tar: Error is not recoverable: exiting now 一方、Solaris の /bin/tar は 68user さんのおっしゃるとおり 関係なくファイルを取り出せます。これも知りませんでした。 |
|
>>1543 68user >> 現時点でconnectがされているか、されていないかを >> コーディング上で確認する方法はありますでしょうか? > ping ちうのがありますね。$rc = $dbh->ping; ご回答ありがとうございます。 実際に試してみたんですが、disconnectされている状態で $rc = $dbh->ping;を実行すると以下のようなエラーが出力されました。 DBD::Oracle::db ping failed: ERROR Database disconnected at ****.pl line ****. For help, please send mail to this site's webmaster, giving this error message and the time and date of the error. 続けて処理をすることはできないのでしょうか? それとも根本的に何かが違うのでしょうか? よろしくお願いします。 |
|
>>1543 68user >> 現時点でconnectがされているか、されていないかを >> コーディング上で確認する方法はありますでしょうか? > ping ちうのがありますね。$rc = $dbh->ping; ご回答ありがとうございます。 実際に試してみたんですが、disconnectされている状態で $rc = $dbh->ping;を実行すると以下のようなエラーが出力されました。 DBD::Oracle::db ping failed: ERROR Database disconnected at ****.pl line ****. For help, please send mail to this site's webmaster, giving this error message and the time and date of the error. 続けて処理をすることはできないのでしょうか? それとも根本的に何かが違うのでしょうか? よろしくお願いします。 |
|
同じ内容を2度送信してしまいました。 どうもすみません。 |
|
>>1546 rosegarden > % tar -xvfp hoge.tar > tar: Cannot open p: ファイルもディレクトリもありません。 なるほど。tar -x -v -f p hoge.tar と同じ扱いになるわけですね。 いつも - を付けないので知りませんでした。 >>1547 の うーん、SunOS5.6 + perl-5.004_04 + DBD-Oracle-1.06 + Oracle8.0.5.0.0(?) では use DBI; $o_DB = DBI->connect("dbi:Oracle:", "username", "passwd") or die "connect error"; $o_DB->{RaiseError} = 0; $o_DB->disconnect; if ( $o_DB->ping ){ print "connect!\n"; } else { print "not connect!\n"; } で、not connect! と表示されました。標準エラー出力には DBD::Oracle::db ping failed: ERROR Database disconnected at a line 7. と表示されますが、その後も処理は続けることができました。 > 同じ内容を2度送信してしまいました。 > どうもすみません。 いえいえ。 おそらくどこかのロボットが がんがんアクセスしているので、 OS の最大数以上のディスクリプタを開こうとして OS や apache や perl がこけまくってるようです (だからサーバエラーが頻発している)。 普通は二度書きチェックを行っていますが、ちょうど二度書き チェック用ファイルのオープンに失敗したくさいですね。 |
|
>>1547 68user 回答ありがとうございます。 私もif文で確かめてみましたが、not connect! と表示されず、 処理が途中で止まってしまいました。 やはり、記述の通り環境の問題があると思われます。 ただ、確認の方法が分かったので助かりました。 ありがとうございました。 |
|
>>1551 の > 私もif文で確かめてみましたが、not connect! と表示されず、 > 処理が途中で止まってしまいました。 なるほど。うちの環境では、他のエラーは全てトラップできるのに、 ブレースホルダ `?' の数より多く bind_columns すると、エラーと なって perl が終了してしまうという問題があります。 perl や DBI/DBD のバージョンによっては、ping も同様に トラップできないエラーを発生することがあるのかも しれませんね。 # perl+DBI 暦は3ヶ月程度なので、全体的によくわかってません。 ## が、Pro*C や PL/SQL より100倍使いやすいということは ## よく理解できました。 |
|
apacheのlogを見ていたのですが、 ほとんどのlogがGETやPOSTの中で 192.168.1.1 - - [11/Jan/2001:04:27:16 +0900] "HEAD / HTTP/1.0" 403 0 っていうlogがありました。 このHEADってなんでしょうか? |
|
はじめまて。 http://x68000.startshop.co.jp/ これ、かっこいいんですけど・・・・ .htaccessでできるんですか? よかったらやりかた教えてください・・・ |
|
No. 1555は参照元のページの著作権のルールにのっとって いなかったようなので、もう一度書き込みます。 # 1555は消しておいて下さい>68user >>1553 CoreFighter HEADはその名の通り、 HTTP/1.1 200 OK Date: Fri, 12 Jan 2001 15:34:47 GMT Server: Apache/1.3.12 (Unix) mod_ssl/2.6.5 OpenSSL/0.9.5a Last-Modified: Wed, 12 Apr 2000 09:18:00 GMT ETag: "a7f83-3e0-38f43f48" Accept-Ranges: bytes Content-Length: 992 Connection: close Content-Type: text/html など、HTTPのヘッダ情報だけを返すMETHODのようです。 参照元:丸山不二夫著「WWWサーバー管理」(稚内北星ビブリオン内) http://www.wakhok.ac.jp/~maruyama/W3serv/document/node95.html # wakhokは講義テキストを公開しているそうで、参考になります |
|
>>1554 ぽよぞー > http://x68000.startshop.co.jp/ > これ、かっこいいんですけど・・・・ > .htaccessでできるんですか? 無償でこのサーバを提供していただいている Netboy さんが 作成されたものをそのまま使っています。apache のデフォルト設定では - HEADER というファイルに書いたものは、ディレクトリ一覧の先頭に表示される - README というファイルに書いたものは、ディレクトリ一覧の最後に表示される で、さらに - HEADER, README だとプレインテキスト扱いで、(< > & が置換される) - HEADER.html、README.html だと HTML 扱い (< > & はそのまま出力) という扱いがされます。というわけで、 http://X68000.startshop.co.jp/~68user/tmp/HEADER.html http://X68000.startshop.co.jp/~68user/tmp/README.html てな感じのものを置いとけばいいです。細かなカスタマイズは IndexIgnore、 IndexOptions、IndexOrderDefault で。詳しくはこちらをどうぞ。 http://httpd.apache.org/docs/mod/mod_autoindex.html >>1556 has > # 1555は消しておいて下さい>68user へい、消しました。 >>1553 CoreFighter > このHEADってなんでしょうか? 質問する前に、一通り眺めてくれるとうれしいです。 http://X68000.startshop.co.jp/~68user/net/http-3.html#5 |
|
>>1430 68user > おお、化けてる。 - s|^( +)|' ' x length($1)|e; + s|^(( )+)|' ' x length($1)|e; というバグが原因でした。 |
|
通りすがってみました。(意味不明) @HEAD こういう奴もあったりする。 telnet www.yahoo.com 80 Trying 204.71.200.68... Connected to www.yahoo.akadns.net. Escape character is '^]'. HEAD / HTTP/1.0 HTTP/1.0 200 OK Content-Length: 15629 Content-Type: text/html <html><head><title>Yahoo!</title> 以下略 |
|
はじめまして。ちょっとわからなくてききたいのですが・・・。 crontabに登録しようとしているのですがうまくいきません。 10 * * * * /home/〜(実行形式ファイルのフルパス) と登録したところ、 >UX:crontab:警告:コマンドは /usr/bin/sh で実行されます. というメッセージが出てきてしまいます。 どうしたらよいのでしょうか? |
|
>>1560 debra > >UX:crontab:警告:コマンドは /usr/bin/sh で実行されます. > というメッセージが出てきてしまいます。 SHELL=/bin/sh とかいれてもだめですか? /usr/bin/sh なんていう sh をもつシステムが思い当たらないので、 詳しいこと言えませんが。 man 5 crontab (*BSD, Linux) あるいは man -s 5 crontab (Solaris の場合) すると書き方が大抵の場合かいてあります。 あるいは man crontab して SEE ALSO を見るとセクション番号が 分かるはずです。 |
|
4-stable のビルドしてますが、 make release の最中にまた page fault 起こしました。make world しなきゃよかった。:-< 今回のは悪質で、backtrace がとれないです。 まあ、page fault なんで、もはや素人の出られる幕はありませんが。 % uname -v FreeBSD 4.2-STABLE #0: Fri Jan 12 21:43:37 JST 2001 一回だけなので、年末のよりはましですが、私の環境で安定していたのは FreeBSD 4.2-STABLE #0: Tue Jan 9 00:25:52 JST 2001 の奴ですね。これは、ちょうど、この前 68user さんが make world した 前後のと kernel はそんなに変わらないとおもいます。 当分の間 4-stable の make world は見合わせた方がいいです。 それから g++ も不安定ですね。ランダムに compiler internal error が出ます。top コマンド見ているとメモリが少なくなった状況で このエラーが出るようです。だから、libstdc++ とか groff の make でこけることが多いです。しかも、失敗してから、もう一度 make すると通ることもあるので、嫌になってきます。 次に多いのが、perl の library の make の失敗。これは原因がかなり はっきりしていて、make world 始める前に /usr/obj 消しておくと 出食わしません。 # 三月に 4.3-RELEASE でるんだろうか? # どうも 4.1-RELEASE よりは不安定になっている様な気がする。 # -current の方がよほど安定しているし ;-< |
|
お世話様です。 perl に ついてお伺いしたいのですが何方かご存知でしたら教えてください。 文字置換で下記のような物を実行するとエラー(ドキュメントにデータが無い) とエラーが出て動作しません。どうも”ー”のキャラクターが原因のようです。 kk,mmの変数でtest変数文章を部分変換したいのですがココでつまずいています。 #!/usr/local/bin/perl print "Content-type: text/html\n\n"; $test = "ホームページの更新"; $kk = "ホームページ"; $mm = "掲示板"; $test =~ s/$kk/$mm/; print $test; -----------------------eof------------------------- |
|
>>1562 rosegarden 最近の stable では、thread まわりのバグが fix されて、 mozilla5 が動くようになったそうですが、cvsup するのは やめときます (笑) >>1560 debra >UX:crontab:警告:コマンドは /usr/bin/sh で実行されます. 「警告」っつーのが謎ですね。動作には影響ない? >>1563 yoshi CGI 経由でデバッグするのはやめましょう。まずはコマンドライン からです。さすれば /z[y[W/: unmatched [] in regexp at a line 6. か /ホームページ/: unmatched [] in regexp at a line 6. というエラーが表示されることが確認できるでしょう。 というわけで「ホームページ」という文字列をダンプすると 203 z 201 [ 203 200 203 y 201 [ 203 となります。「ー」の2バイト目が `[' と同じコードのため、 [] が正規表現として正しくない (']' で閉じていない) ということです。 対処法としては 1. SJIS を使わない。スクリプトの文字コードを EUC にする。 2. jperl を使う http://www.jp.FreeBSD.ORG/QandA/HTML/1218.html です。他にも \Q〜\E で囲むだとか、quotemeta を使うなどの手は ありますが、所詮小細工のレベルです。根本的には上のいずれかを 選びましょう。 |