68user's page 掲示板

Prev< No. 3625〜3899> Next  [最新発言に戻る] [過去ログ一覧]
No. 3625 # バンガード [URL] [E-mail] 2004/03/15 (月) 12:55:51
>>3624 68user
>aix4* では aix-r4x3 はマッチしないように見えますが、
>またしても不適切な例ではありませんか?
おっしゃるとおりです。
重ね重ね申し訳ございません。

>if ではできませんが、case ならできます。
なるほど、caseでなら「aix4*」が可能ですか。
助かりました。

No. 3626 # 裏方 [E-mail] 2004/03/15 (月) 16:35:44
初めまして、裏方と申します。
WinSockを用いたウィンドウズネットワークプログラムで、インター
ネットを介して、私のマシン名からIPアドレスを取得する方法に
ついて悩んでいます。言語はC言語を扱っております。

ローカルネットワークではマシン名からIPアドレスを取得するには
Gethostbyname関数で取得できるのですが、インターネットを介した
遠方のマシンのから私のマシンのIPアドレスを取得する事が出来ま
せん。(私のはサーバマシンでは無いので当然なのですが・・・)

私のマシンは大学で扱っているもので、ネットワークに繋ぐたびに
動的なIPアドレスが割り当てられるのですがサーバプログラム等を
私のマシン上で動かすときにいちいち相手に今のIPアドレスを教え
なければならないので非常に不便です。

どうにかして、私のマシン名からIPアドレスを取得する方法が
あるのでしょうか?どなたかアドバイスをお願いします。

No. 3627 # 68user 2004/03/15 (月) 16:58:12
>>3626 裏方
- 逆引きできないから困っているの?
    (もしそうなら「マシン名」というのは何?)
- IP アドレスがころころ変わるから困っているの?
    (もしそうなら「マシン名」は関係ないのでは?)
- そもそもマシン名って何を指しているの? FQDN?
- DHCP で振られる IP アドレスには FQDN が設定してあるが、
    外部向け DNS サーバには登録してなくて、内部からしか逆引き
    できない、という状況?

などなど疑問はつきませんが、http://www.dyndns.org/ などの
DynamicDNS と呼ばれるサービスを使うのが一つの解でしょう。

ただしこれは、大学とは全く関係ない FQDN を、大学から付与されて
いる IP アドレスに結びつけるということです。管理者が寛容である
ことを期待するか、リスクを負ってこっそりやるのがよいでしょう。

No. 3628 # Tangerine 2004/03/15 (月) 17:11:48
始めまして、UNIX使い始めです。
この度、awkコマンドを使用してファイルを分別して削除するシェルを作成しているのです。

そこでお聞きしたい事がるのです
awkコマンドのifなどの中で変数は使えないのでしょうか?

現在全ファイルに作成日付が付加されており、
指定日より前の物を削除したいいのです
シェルの前半で指定日付を変数へ代入し
lsとawkをパイプで繋いで削除しようとしています
awk内のifなどによる条件判断で変数を宣言すると$0のメンバー名全体が表示されており判別できないのです
(ifを削除しprintで変数を表示させて確認)

出来ないのであれば何か別の方法を考えなくてはいけないのですが
何方かお答えください

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3629 # zsh 2004/03/15 (月) 17:50:12
>>3628 Tangerine
具体的にどのようなスクリプトなのか見せて頂けませんか?
(そもそもawkを使う必要があるのでしょうか?)

No. 3630 # Tangerine 2004/03/16 (火) 11:02:40
返信遅れてすいません。
えっと、確かに自分もawkを使う必要があるのか微妙ですが

#! /usr/bin/sh

make_date=`date +"%Y%m%d"`
make_date=`echo $make_date"-1" | bc`
echo $make_date
ls *.*.* | awk -F. '{if($2<make_date) print $0}'

問題としているのはこのあたりです。
変数make_dateに昨日の日付けが入り、
それ以前のものを表示させたいのです。

正直なところを言えばawkを使う必要性はまったくといってないです
ただ、自分が色々調べた結果awkを使ってやれば出来るのか?
と、考えて使ってみただけですので

awkじゃなくて別の方法で行えるのであれば
御教授いただけると嬉しいです。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3631 # zsh 2004/03/16 (火) 12:48:26
>>3630 Tangerine
単純に昨日以前のファイルを表示するのであればこんな感じで。
(ファイルが無い時を考えるとls使った方がいいのかな?)
------
#!/bin/sh

make_date=`date '+%Y%m%d'`
for f in `echo *.[0-9]*.*` ; do
    d=`echo $f | cut -d. -f2`
    [ $d -lt $make_date ] && echo $f
done
------

awkを使うのであればこんな感じかな。
実装されているawkによって変数の設定の仕方が違うので注意してください。
------
#!/bin/sh

make_date=`date '+%Y%m%d'`
ls *.[0-9]*.* | awk -F. '{if($2 < d) print}' d=$make_date

No. 3632 # Tangerine 2004/03/16 (火) 13:56:36
>>3631 zsh
おおっ!!有難う御座います(T▽T)
なるほど、forですね。なんとも勉強不足でした(^^;
やはりawkでは変数をそのまま引き継げないのですね
awk内で更に変数に入れ込まなければいけないとは(^^;
有難う御座います
教えていただいた方法で作成していきます。
本当に助かりました(w

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3633 # 68user 2004/03/16 (火) 14:15:32
>>3632 Tangerine
> やはりawkでは変数をそのまま引き継げないのですね。
そういうわけではありません。

> ls *.*.* | awk -F. '{if($2<make_date) print $0}'
awk はどういう引数が欲しいか、というと
      awk -F. '{if($2<$make_date) print $0}'

      awk -F. '{if($2<make_date) print $0}'
ではなくて、
      awk -F. '{if($2<20040315) print $0}'
となってほしいわけです。

で、こうなるように書くにはどうすればよいか。

[方法1]
まず
      awk -F. '{...}'
と '' で囲ってはいけません。'' で囲った時点で中に入っている
変数が展開されなくなります。というわけで、
      awk -F. "{...}"
と "" で囲みます。これで中の変数が展開されます。しかし
      awk -F. "{if($2<$make_date) print $0}"
と書いてしまうと、$2 や $0 まで展開されてしまいます。$2 や $0 は
awk にそのまま渡したいので、
      awk -F. "{if(\$2<$make_date) print \$0}"
と \ でエスケープします。

[方法2]
方法1 のエスケープがうっとうしいなら、まず
      awk -F. '{...}'
と '' で全体を囲みます。そして狙いのところだけ '' の外に出します。例えば
      awk -F. '{if($2<'$make_date') print $0}'
こんな感じ。つまり
      'x'$y'z'
という形にするわけですが、これは 'x' + $y + 'z' というふうに結合されるので
うまく動きます。

いずれの場合であっても、
      % sh -x hoge.sh
と -x オプションを付け、変数が狙い通り展開されているかどうか
チェックする癖をつけましょう。

No. 3634 # Tangerine 2004/03/16 (火) 14:52:46
なるほど〜、ややこしい事になっていたのですね〜
おかげさまで希望の日付以前のファイルを削除することが出来ました、
有難う御座います。

追伸
>% sh -x hoge.sh
使うようにしてみます(^^;

No. 3635 # zsh 2004/03/16 (火) 18:53:22
>>3633 68user
その方法があることをすっかり忘れてました。
(というか使った試しが無い・・・反省)
いつもながら勉強になります。

No. 3636 # tomato 2004/03/19 (金) 18:06:05
初めまして、Perl初心者です。
Socketを使ってUDPのプロキシ機能を作りたいのですが、
Send関数のあて先の指定で、inet_atonを使わずに指定
する方法がわかりません。というのも、あて先IPアドレスは
分かっているのですが、/etc/resolv.confには記述されて
いないからなのですが。
やっぱりinet_aton関数を使ってホスト名からIPアドレスを
取得しないとダメなのでしょうか?
どなたか教えてください。
環境は、Solaris8 、perl5 です。
今はこんな感じなのですが、、、

socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
$ip = '192.168.253.155';
$sock_addr = pack_sockaddr_in(2426, $ip);
send(SOCKET, "test", 0, $sock_addr);

No. 3637 # 68user 2004/03/19 (金) 18:36:10
>>3636 tomato
inet_aton には IP アドレスも渡せます。なので、
    socket(SOCKET, PF_INET, SOCK_DGRAM, 0);
    $ip = '192.168.253.155';
    $iaddr = inet_aton($ip);
    $sock_addr = pack_sockaddr_in(2426, $iaddr);
    send(SOCKET, "test", 0, $sock_addr);
でよいです。

    http://x68000.startshop.co.jp/~68user/net/func.html#inet_aton
ではホスト名しか渡せないような書き方をしていますので、ちょっと
不適切でした。

そもそも、C 言語での inet_aton の機能は、
      aaa.bbb.ccc.ddd という文字列を解析し、in_addr 構造体に格納する
というもので、名前解決は行いません。一方、perl の Socket パッケージの
inet_aton は、ホスト名も受け付けるように機能拡張されているわけです。

No. 3638 # バンガード [URL] [E-mail] 2004/03/19 (金) 23:25:32
    また初歩的なことで申し訳ありません。
    以下のプログラムで、13行目以降で配列(CMD)の内容を表示させて
いるのですが、全てNULLになってしまいます。

        +1 #!/usr/bin/ksh
        +2 INDEX=0
        +3 TEST=`ls -l |
        +4 while read LINE
        +5 do
        +6 CMD[$INDEX]=$LINE
        +7 echo $INDEX":"${CMD[$INDEX]}
        +8 let "INDEX = INDEX + 1"
        +9 done`
      +10 echo "$TEST"
      +11
      +12 INDEX=0
      +13 while [ $INDEX -lt 5 ]
      +14 do
      +15 echo $INDEX":"${CMD[$INDEX]}
      +16 let "INDEX = INDEX + 1"
      +17 done

    このプログラムの3行目から10行目を以下の様に修正すれば、13行目
以降でも配列の中身が正常に表示されます。
        +3 ls -l |
        +4 while read LINE
        +5 do
        +6 CMD[$INDEX]=$LINE
        +7 echo $INDEX":"${CMD[$INDEX]}
        +8 let "INDEX = INDEX + 1"
        +9 done
      +10

    最初のプログラムの様に、最初のループの結果を変数にセットする
場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう
か?

No. 3639 # zsh 2004/03/21 (日) 22:59:40
>>3638 バンガード
バッククォーテーションでくくると別プロセスになるから
変数を保持することはできないと思いますが・・・

No. 3640 # 68user 2004/03/22 (月) 14:19:23
>>3638 バンガード
> このプログラムの3行目から10行目を以下の様に修正すれば
この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。

No. 3641 # バンガード [URL] [E-mail] 2004/03/22 (月) 14:51:49
>>3640 68user
3行目から10行目の修正ですとwhile文の出力は標準出力へ出て行くだけです。
これを最初のプログラムの様にwhile文の出力を変数に格納したいと考えています。

No. 3642 # 68user 2004/03/22 (月) 15:27:00
>>3641 バンガード
> while文の出力は標準出力へ出て行くだけ
それは echo しているからでは? echo しなければ OK かと思います。

> while文の出力を変数に格納したいと考えています
修正版の方でも CMD[$INDEX]=$LINE と格納しているように見えます。
また、ループを抜けた後でも参照が可能だと思います。

No. 3643 # バンガード [URL] [E-mail] 2004/03/22 (月) 16:12:09
>>3642 68user
まず、3行目から10行目を修正した場合の結果は以下の通りです。
0:合計 7
1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
5:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test5
6:-rw-r--r-- 1 furu man 4 Mar 22 16:01 test6
7:-rw-r--r-- 1 furu man 20 Mar 22 16:02 test7

0:合計 7
1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4

次に3行目から10行目を修正しない場合の出力結果です。
0:
1:
2:
3:
4:

ちなみに7行目のecho文をコメントにしても結果は同じです。

この様にwhile文をダブルクォーテーションで囲むかどうかでwhile
文を抜けた後で配列を参照できるかが異なってきます。

No.3639でzshさんが回答されている様にダブルクォーテーションで囲んでいるために別プロセスになってしまうのが原因の様です。
whileの出力を変数に格納した上で、whileから抜けた後も配列の内容が参照出来る様にするにはどうしたら良いのでしょうか?

No. 3644 # 68user 2004/03/22 (月) 17:05:31
>>3643 バンガード
> ちなみに7行目のecho文をコメントにしても結果は同じです。
わたしはありえないと思いますが、そういう ksh もあるんですかね。
当方の HP-UX11i で
    #!/usr/bin/ksh
    INDEX=0
    ls -l |
    while read LINE; do
        CMD[$INDEX]=$LINE
        let "INDEX = INDEX + 1"
    done
    INDEX=0
    while [ $INDEX -lt 5 ]; do
        echo $INDEX":"${CMD[$INDEX]}
        let "INDEX = INDEX + 1"
    done
というのスクリプトを実行したところ、
    0:合計 7
    1:-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
    2:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
    3:-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
    4:-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
というような、先頭 5 行分だけの出力が得られました。

No. 3645 # バンガード [URL] [E-mail] 2004/03/22 (月) 19:34:47
>>3644 68user
御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出
ます。

以下の様に修正した場合に配列の中身が2つ目のwhile文で出力され
なくなります。
        #!/usr/bin/ksh
        INDEX=0
        TEST=`ls -l |
        while read LINE; do
                CMD[$INDEX]=$LINE
                let "INDEX = INDEX + 1"
        done`
        INDEX=0
        while [ $INDEX -lt 5 ]; do
                echo $INDEX":"${CMD[$INDEX]}
                let "INDEX = INDEX + 1"
        done

No. 3646 # 68user 2004/03/23 (火) 01:56:23
>>3645 バンガード
> 御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出ます。
そうでしょうね。

> 以下の様に修正した場合に配列の中身が2つ目のwhile文で出力されなくなります。
そうなりますね。`〜` とするとサブシェルが起動されますから、
$CMD が設定されるのはサブシェルだけで、親のシェルには反映
されません。

質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641
の希望を満たしているように見えますが違うのですか? まだ説明して
いない理由があって、>>3644 は採用できないのですか?

No. 3647 # バンガード [URL] [E-mail] 2004/03/23 (火) 03:49:34
>>3646 68user
>質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641
の希望を満たしているように見えますが違うのですか? まだ説明して
>いない理由があって、>>3644 は採用できないのですか?
3644のスクリプトでは、最初のwhile文の出力を変数に格納していません。
この形式であれば、最初の私の質問で御提示させていただいている通りで
す。(3行目から10行目を修正したもの)
次に質問を続ける理由ですが、3642で「echo しているからでは?
echo しなければ OK かと思います。」
「ループを抜けた後でも参照が可能だと思います。」と回答されているの
で、そんなことは無いと言うことで3643の回答をしています。

それに対して、3644で「わたしはありえないと思いますが」とお答え
いただいていますよね?
ですから、それに対しての回答で3645の回答をさせていただいていま
す。

3642の回答が無ければ、3639の回答で「なるほど」と納得していた
のですが、3640で「なぜだめなのか?」と言う事ですので状況を説
明させていただいている次第です。

結局3640の回答にある通り、バッククォーテーションで囲んでいる
ために別のジョブとして起動されるためにwhileから抜けた後で配
列を参照できないのですよね。

私としては最初のwhile文での出力を変数に格納した上でwhile文の
外でも配列の中身を参照したいと言うのが最終目標です。
しかしながら、バッククォーテーションで囲んだ以上は別タスクに
なるために、while文の外で配列が参照できないとなれば、最初の
while文の出力をファイルに格納するしかないかと考えています。
もし、それ以外の方法があるのであれば、お教えいただけると助か
ります。

No. 3648 # 68user 2004/03/23 (火) 10:26:19
>>3647 バンガード
やっとわかりました。変数に格納って TEST=`…` のことですか。

わたしの読解力が足らないだけでしょうが、
      「変数 TEST に ls の出力全体を、CMD には 1行ずつの
          結果を代入したい」
     「このスクリプトの目的は ls の結果全体を表示しつつ、
          なおかつ先頭 5 行を表示すること」
などと書いていただければもっと早く理解できたと思われます。

で、スクリプトは以下のような感じでしょうか。

#!/usr/bin/ksh
INDEX=0
ls -l |
while read LINE; do
    CMD[$INDEX]="$LINE"
    TEST="$TEST ${INDEX}:$LINE"
    let "INDEX = INDEX + 1"
done
echo "$TEST"
INDEX=0
while [ $INDEX -lt 5 ]; do
    echo "${INDEX}:"${CMD[$INDEX]}
    let "INDEX = INDEX + 1"
done

No. 3649 # バンガード [E-mail] 2004/03/23 (火) 11:50:40
>>3649 バンガード
なるほど、全ては私の質問の書き方が原因だったのですね。
本当に申し訳ありません。
今回御指摘いただいた様な表現を最初からすべきでしたね。

御提示いただいたスクリプトで目的が達成できました。

重ね重ね誠にありがとうございました。

No. 3650 # m16 2004/03/23 (火) 13:18:33
awk(正規表現?)でちょっと行き詰まってしまったので質問します。

OS:Solaris8

やりたいこと
    環境変数の内容で awk を使ってテキストファイルの検索を行う。

検索に使用する環境変数を HOGE として

awk '/ENVIRON["HOGE"]/ {print}' FILE_NAME

を行っても検索されませんでした。
ちなみに {print ENVIRON["HOGE"]} とした場合には値が返りませんでした。

何か根本的なところで間違ってるかもしれませんが・・よろしくお願いします。

#grep $HOGE FILE_NAME とすれば出来るのですが・・awk で実現したいのです。

No. 3651 # 68user 2004/03/23 (火) 18:09:25
>>3650 m16
awk はよくわかりませんが、
      % awk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME
ですかね。

No. 3652 # zsh 2004/03/23 (火) 18:47:06
>>3650 m16
/usr/bin配下のawkでは環境変数を参照できなかったと思います。
/usr/xpg4/bin/awkかnawkを使ってください。

% nawk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME

No. 3653 # m16 2004/03/24 (水) 09:40:15
68user さん zsh さん レスありがとうございます。

まだうまくいきません。

確認のため
/usr/bin/awk 、/usr/xpg4/bin/awk 、 /usr/bin/nawk で
{ print ENVIRON["HOGE"] } としても空白しか出てきません。

もうちょっと修行してみます

No. 3654 # zsh 2004/03/24 (水) 10:27:06
>>3653 m16
HOGEはちゃんとexportしてますよね?

No. 3655 # すすむ 2004/03/25 (木) 12:50:36
UNIXのtarコマンドについて教えて下さい。
DATテープから任意のファイルをワイルドカード(*)で取り出したいの
ですが上手くいきません。
どのようにすれば取り出せますか。

rwxr-xr-x 0/3 0 2004年 2月 17日 20:55 ./bkup/
rw-r--r-- 0/3 3506495 2003年 6月 5日 15:48 ./bkup/200303031741data_tar.gz
rw-r--r-- 0/3 3511527 2003年 3月 17日 09:20 ./bkup/200303032300data_tar.gz
rw-r--r-- 0/3 3517092 2003年 3月 17日 09:20 ./bkup/200303042300data_tar.gz


rw-r--r-- 0/3 3511527 2003年 3月 17日 09:20 ./bkup/200312302300data_tar.gz
rw-r--r-- 0/3 3517092 2003年 3月 17日 09:20 ./bkup/200312312300data_tar.gz

このリストから200309となっているもファイルをとりだそうといろいろと
やってみたのですが、

# tar -xvf /dev/rmt/1m 200309\*data.tar.gz
# tar -xvf /dev/rmt/1m ./bkup/200309\*data.tar.gz
# tar -xvf /dev/rmt/1m './bkup/200309*data.tar.gz'
# tar -xvf /dev/rmt/1m "./bkup/200309*data.tar.gz"

上手くいきませんでした。



HP-UX11.00です。

No. 3656 # すすむ 2004/03/25 (木) 12:52:19
>>3655 すすむ
すみません
リストのファイル名は、
YYYYMMDDHHMMSSdata_tar.gz

YYYYMMDDHHMMSSdata.tar.gz
です。

No. 3657 # バンガード [E-mail] 2004/03/25 (木) 13:04:02
>>3656 すすむ
tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
ではどうでしょうか?

No. 3658 # すすむ 2004/03/25 (木) 13:47:55
>>3657 バンガード

>tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
上手くいきません。

No. 3659 # 68user 2004/03/25 (木) 13:51:31
>>3652 zsh
> /usr/bin配下のawkでは環境変数を参照できなかったと思います。
ご指摘ありがとうございます。まわりに Solaris 環境がなくなってしまった
ため誤ったことを書くことが増えると思いますが、そのときはご指導願います。

>>3653 m16
    % echo abc | /usr/bin/nawk '{ print ENVIRON["HOGE"] }'

    % printenv HOGE
で何も出力されないなら、環境変数の設定ミスでしょう。

>>3655 すすむ
> UNIXのtarコマンドについて教えて下さい。
> DATテープから任意のファイルをワイルドカード(*)で取り出したいの
> ですが上手くいきません。
HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用
できないようです。
    - 全部 tar xf で展開し、狙いのファイルを拾う
    - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する
    - GNU tar をインストールする
などの方法を検討するのがよいかと思われます。

>>3657 バンガード
> tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz
sh 系・csh 系いずれも、カレントディレクトリに bkup というディレクトリが
存在し、その下に 200309*data.tar.gz にマッチするファイルが存在した場合、
存在するファイル名に展開されてしまい、結果として意図とは異なるファイルが
展開されます。

また、sh 系ではマッチしなかった場合 ./bkup/200309*data.tar.gz がそのまま
tar に渡りますが、csh 系ではシェルの glob 展開の時点でエラーになります。

メタキャラクタは必ずエスケープしましょう。

No. 3660 # バンガード [E-mail] 2004/03/25 (木) 13:52:51
>>3658 すすむ
当方はAIX 5.2上で試しましたが、以下の様な結果になります。
(tar でなくて申し訳ありません)
% ls -l ./test_dir
合計 7
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030901data
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030902data
-rw-r--r-- 1 furu man 0 Mar 25 13:01 20030903data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031201data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031202data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20031203data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040101data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040102data
-rw-r--r-- 1 furu man 0 Mar 25 13:02 20040103data
-rw-r--r-- 1 furu man 4 Mar 22 15:59 test1
-rw-r--r-- 1 furu man 8 Mar 22 16:00 test2
-rw-r--r-- 1 furu man 8 Mar 22 16:00 test3
-rw-r--r-- 1 furu man 12 Mar 22 16:01 test4
-rw-r--r-- 1 furu man 12 Mar 22 16:01 test5
-rw-r--r-- 1 furu man 4 Mar 22 16:01 test6
-rw-r--r-- 1 furu man 20 Mar 22 16:02 test7
% wc ./test_dir/200309*data
              0 0 0 ./test_dir/20030901data
              0 0 0 ./test_dir/20030902data
              0 0 0 ./test_dir/20030903data
              0 0 0 合計
念のため、csh と ksh で試しましたが、結果は同じです。

No. 3661 # 68user 2004/03/25 (木) 14:10:02
>>3660 バンガード
根本的に誤解があるようです。
> % wc ./test_dir/200309*data
この場合、操作対象ファイルは既に存在するのでエスケープは不要です。
この例ではシェルがメタキャラクタを展開し、wc は
      ./test_dir/20030901data ./test_dir/20030902data ./test_dir/20030903data
というような引数を得ます。

しかし
> # tar -xvf /dev/rmt/1m 200309\*data.tar.gz
の場合は、今から展開しようとしているわけなので、ファイルはまだ
存在しません (仮に存在していたとしても、存在するファイルにマッチ
してもらっては困るわけです)。

よって、シェルが展開しないように \* などとエスケープします。
すると tar は
      -xvf /dev/rmt/1m 200309*data.tar.gz
というふうにメタキャラクタをそのまま受け取るので、それを /dev/rmt/1m
内のデータと比較し、マッチするファイルのみを抽出します。ただし
今回のように tar が自前でメタキャラクタを展開する機能を持っていない
とうまくいきません。

      用語集: ファイルグロブ
          http://x68000.startshop.co.jp/~68user/unix/pickup?%A5%D5%A5%A1%A5%A4%A5%EB%A5%B0%A5%ED%A5%D6

の一読をお勧めします。

No. 3662 # バンガード [E-mail] 2004/03/25 (木) 14:25:24
>>3661 68user
まず最初にお断りさせていただきたいのですが、私が3660の投稿を行ったタイミングでは
まだ3659の発言はありませんでした。
ですので、3660投稿の時点では3659の発言は読んでいませんでした。

ただ、どちらにしても私のテスト自体に思い違いがあった様で御指摘は大変参考になり
ました。
御指摘誠にありがとうございました。
この投稿を送信次第御提示いただいた資料を参照してみます。

No. 3663 # すすむ 2004/03/25 (木) 15:21:18
>>3659 68user
>HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用
>できないようです。
> - 全部 tar xf で展開し、狙いのファイルを拾う
> - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する
> - GNU tar をインストールする
>などの方法を検討するのがよいかと思われます。
tar tvf の結果をgrepで拾って、tar xvf に対して完全なファイル名を
指定する方法でできました。

ありがとうございました。

No. 3664 # Naoki [E-mail] 2004/03/27 (土) 20:37:18
はじめまして。Naokiと申します。
皆さんに教えていただきたいことがあり、書き込ませていただきます。
レンタルサーバーを借りてホームページを開設しようとしているのですが、
最初に読み込まれるトップページを指定したいのですが、どのようにしたらよいのでしょうか?
具体的には、アクセス元がパソコンor携帯かによって、それぞれのトップページを振り分けるCGI
をトップページにしたいと考えています。(ファイル名はindex.cgi)
サーバー会社に問い合わせたところ、『index.cgiやindex.phpをトップページにする方法として、
.fowardファイルにて操作可能』と言われ、それ以上はサポート外なので対応できないということです。
そこで、どのように設定したらよいのか教えてください。
以上、よろしくお願いいたします。

No. 3665 # has 2004/03/28 (日) 23:58:46
こんばんは。
皆様のようにきっちり回答できる自信がなく、時折の書き込みで恐縮ですが、
たまたま一部知っている内容だったので回答させていただきます。

>>3664 Naoki
CGI側でサーバ変数HTTP_USER_AGENTを参考に判定する方法があります。
CGIでよく使われていると思われるサーバ変数を解説しているページが
あったのでご紹介します。
http://www.din.or.jp/~hagi3/Perl/http.htm

Japan Apache Users Groupでの解説個所も見つけました。
http://www.apache.jp/docs/howto/cgi.html#environmentvariables

No. 3666 # samy 2004/03/30 (火) 13:40:12
こんにちわ。
Perlについてのごく初歩的な質問なんですがファイルデータを保存する時の方法についてなんですが
CSV形式なら
open(OUT,">data.dat");
    print OUT "$FORM{'fld1'},$FORM{'fld2'},$FORM{'fld3'},$FORM{'fld4'}\n";
close(OUT);
だと思うのですが固定長の場合はどうしたらよいのでしょうか?
よろしくお願いします。

No. 3667 # 68user 2004/03/30 (火) 13:56:35
>>3666 samy
>固定長の場合はどうしたらよいのでしょうか?
基本は
      printf(OUT "%05d%20s%010d%10s\n",
                    $FORM{'fld1'}, $FORM{'fld2'}, $FORM{'fld3'}, $FORM{'fld4'});
など。%d は数値。%s は文字列。%20d は右詰め。%-20d は左詰め。
%020d はゼロパディング。

項目数が 10〜20 程度ならこの方法でよいでしょう。

もし項目数が 100 を超えるのであれば、出力フォーマットの定義
ファイル化などを検討しましょう。

No. 3668 # samy 2004/03/30 (火) 18:29:45
ありがとうございます。
助かりました。
また、質問があれば投稿しますのでその時はよろしくお願いします。

No. 3669 # Goldwasser [URL] 2004/03/30 (火) 18:58:06
だから私を見て!
http://sgldwssr.hp.infoseek.co.jp/otp.html

No. 3670 # tmr [E-mail] 2004/04/06 (火) 21:38:22
awkについての質問です。

Solaris7上で、nawkを実行する際、

"cat text.txt" | getline var

という構文があるとvarに "cat text.txt" の結果が入るのですが、
同じことを /usr/xpg4/bin/awk で実行すると var に値が
入らないようです。
このあたりの事情をご存知の方、教えてくれませんか?

No. 3671 # tmr 2004/04/07 (水) 15:27:13
下記の件ですが、awkをかける対象のテキストの行数が、
getlineで取り込まれるテキストの行数より少ない場合に
発生することがわかりました。
つまり、getlineで取り込まれるテキストの方が短い場合、
nawkでは最後の行の内容が保持されて、それを利用した置換処理が
行われるが、 /usr/xpg4/bin/awk では行われないということです。

No. 3672 # 68user 2004/04/08 (木) 10:46:06
>>3671 tmr
なるほど。そういう違いがあることは知りませんでした。一般論としては、
getline の戻り値チェックをしっかり行ないましょう、てな感じでしょうか。

No. 3673 # Goldwasser 2004/04/08 (木) 15:38:24
誰かハイホーネットにメールを送信するアプリをくれましたか?(w

No. 3674 # vm 2004/04/12 (月) 22:17:45
はじめましてvmと申します。
UNIXのコマンド処理で質問があるのですが、
何行かあるテキストファイルの指定のカラム位置に文字列を行単位に挿入
するという処理を、UNIXのコマンドだけでやりたいと思っています。

自分で処理を考えてみたのですが、
1. cutコマンドを使用して、指定カラム位置を境にして、
「指定カラム位置より前の文字列が入ったファイル」と
「指定カラム位置より後の文字列が入ったファイル」に分割する。
2. paste コマンドを使用して、セパレータを元のファイルが使用していない文字を指定して、
1で作ったファイルを結合する。
3. sedコマンドでセパレータ文字を挿入したい文字列に置き換える。


ワークファイルができてしまって、UNIXっぽくないので、
これ以外にもっと簡単なやり方がないか探しているのですが、
もしご存知の方いらっしゃいましたら、ご教授いただけないでしょうか。
よろしくお願いします。

No. 3675 # 68user 2004/04/13 (火) 10:35:37
>>3674 vm
やりたいことがよくわからないので、入力と出力のサンプルを
提示してください。

No. 3676 # zsh 2004/04/13 (火) 13:14:57
>>3675 68user
多分このような事を考えているのだと思います。

■入力ファイル
aaaa,bbbb
cc,ddd
eeeeee,ffff

■挿入文字列
00

■出力ファイル
aaaa00bbbb
cc00ddd
eeeeee00ffff

>>3674 vm
で、やりたい事が上記の通りだとすると、
perlとかawkで出来ると思います。

No. 3677 # vm 2004/04/13 (火) 17:42:20
こんにちはvmです。
説明不足でした。

入力データは1ファイルで、

AAAABBBCCCCC
DDDDEEEFFFFF
GGGGHHHIIIII
  :

という感じで項目間の区切り無しのレコードが
いくつか入っているという状態で、

AAAABBB****CCCCC
DDDDEEE****FFFFF
GGGGHHH****IIIII
  :

1行目で見ると、BBBとCCCCCの間に****を挿入するということを、
シェルかUNIX標準コマンドでやりたいと考えています。

先に書いた私の手順ですと、一度cutコマンドで

AAAABBB
DDDDEEE
GGGGHHH
  :

CCCCC
FFFFF
IIIII
  :

2つのワークファイルを作るので手順も多くて面倒なため、
他にやり方がないものかと考えている次第です。
もっと単純化できる方法がありましたら、ご教授ください。
お願いいたします。

No. 3678 # zsh 2004/04/13 (火) 19:10:14
>>3677 vm
区切り文字なしだとすると、文字列の挿入個所は何を基準に判断するのでしょうか?
下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか?

後気になった点はUNIXの標準コマンドというのは
どこまでを指すのでしょう?
インストール時点でインストールされるコマンドは、
OS・インストールオプションによって異なると思いますが・・・

No. 3679 # vm 2004/04/14 (水) 21:04:08
こんにちはvmです。

>下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか?

すみません。そのとおりです。

>後気になった点はUNIXの標準コマンドというのは
>どこまでを指すのでしょう?

POSIXに準拠しているコマンドのことを指していました。

あれからちょっと調べてみたのですが、

awk '{printf("%s%s%s\n", substr($0,1,2), "TUIKA", substr($0,3));}' target.txt > result.txt

awkコマンドであれば、私のやりたいことがワークファイルを作らずに
実現できそうなことがわかりました。

どうもお騒がせしました。
これより良い方法がございましたら、ご教授ください。

No. 3680 # tgr [URL] [E-mail] 2004/04/15 (木) 09:25:34
gfg

No. 3681 # 馬場 2004/04/15 (木) 10:54:14
宜しくお願いします。

tarコマンドを実行した際に以下のメッセーシ゛が出たんですが、
何を意味しているかわかりません。
ご教授ください。

--------------------------------------------------
cd /
tar -cvf /dev/rmt0n ./usr/*
tar -rvf /dev/rmt0n ./var/* ← メッセーシ゛が出ます
--------------------------------------------------
表示メッセージ
tar:blocksize=0
tar:backspace over record failed
--------------------------------------------------
ご教授ください。宜しくお願いします。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3682 # ryo 2004/04/15 (木) 21:47:40
mailxコマンドに関してですが
件名がベース64で本文がJISコードのメールを読む時、
以下の状態になってしまいます。
直す方法を知っている方おりましたらお教えください

1.件名が日本語の長文だと、以降の画面が文字化けします
2.JISコードの本文を開くと
    「---Executing: kterm sh: kterm: 見つかりません」
    とでてしまい表示できません

No. 3683 # 68user 2004/04/16 (金) 04:28:19
>>3679 vm
> これより良い方法がございましたら、ご教授ください。
awk より良い方法かどうかはわかりませんが、
    sed 's/^\(..\)/\1TUIKA/' < target.txt > result.txt
というのもあります。

>>3681 馬場
すでにアーカイブ済のファイルが出現したため、前に戻って
置き換えようとしたが、テープドライブのため前に戻る機能が
なかった、ということではないですかね。

>>3682 ryo
Solaris2.6 ではその症状は出ませんでした。

No. 3684 # Phantom 2004/04/16 (金) 10:02:39
こんにちは。Phantomと申します。

ネットで色々調べた結果ちょっと、見当たらなかったので質問させてください。
アクセスログの話なのですが、Web/FTPサーバのアクセスログでは有りません
(Web/FTPのアクセスログの情報は腐るほど有りました。また、情報が全く無か
ったと言うのは嘘で、高いソフトウェアやASPぐらいの情報しか出てこず、個人
の私としては手が出ません。)。

ローカルのLinux環境内でアクセスされたファイルのログを取りたいと考えて
いるからです(Unix系OSで実現するのが難しいから情報が少ないのでしょうか?)。
当然、アクセスログなのでアクセスしたユーザ名、時間、アクセス先などの情報を
見たいと思っています。
セキュリティの事もあるのですが、私自身が何時ファイル(特に設定ファイル)の
編集を行ったかという履歴を見たいからです。

それで、これに見合った(フリー)ソフトウェアやシェルスクリプト等が存在しまし
たら、紹介していただければ幸いです。(それとも、もしかしてすごく簡単にPerl
とかで組めちゃったりするんでしょうか?)

No. 3685 # 68user 2004/04/16 (金) 11:24:16
>>3684 Phantom
履歴や変更点の確認をしたいということなら、cvs や subversion
などのバージョン管理ツールを使うのがよいでしょう。

履歴を何段階でもとることができ、細かい修正点を記録できるという
利点がありますが、その一方でファイル更新とバージョン管理とが
密に連携しているわけでないので、バージョン管理ツールへの登録
忘れが発生する可能性がある、という欠点があります。

あるいは
> ユーザ名、時間、アクセス先
だけの情報だけでよいなら、
      - ユーザ名、時間、ファイル名を記録する
      - エディタを起動する
      - (必要なら) 編集前と編集後のファイルをどこかに保存する
というファイル編集用スクリプトを作成し、それを使うように
すればよいでしょう。もちろん、このスクリプトを使わずに直接
ファイルを修正してしまうとアウトです。

もっと厳密にやりたいならシステムコールをフックするタイプ
のものが必要です。たとえば Linux Security Module (LSM) や
      Sysrace: http://www.citi.umich.edu/u/provos/systrace/linux.html
など。

しかしこれらの主目的はシステムコールを許可するかしないかを
決めるためのものなので、ログを記録できるような仕組みがある
のかどうかはわかりません。

> Unix系OSで実現するのが難しいから情報が少ないのでしょうか?
Windows なんかだと API のフックが簡単にできますが、UNIX は
そこらへんの機能が弱いのです。

No. 3686 # Phantom 2004/04/16 (金) 12:12:08
>>3685 68user
凄く素早いレス有難う御座いました。
沢山の情報を与えてくださって感謝しております。

> cvs や subversion
成る程。バージョン管理ツールという手が有りましたか。

> ファイル編集用スクリプトを作成
作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル
編集しちゃって失敗しそうです。

> LSM や Sysrace
私には難しいみたいですが、一つの手として調べてみます。

No. 3687 # zsh 2004/04/16 (金) 12:53:07
>>3686 Phantom
>作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル
>編集しちゃって失敗しそうです。
エディタコマンドと同じ名前のスクリプトを作成し、
スクリプトを格納したディレクトリを環境変数PATHの先頭に追加しては如何なでしょうか?

No. 3688 # scott 2004/04/17 (土) 15:00:50
Solaris7にて/dev/consoleに出力しているログを横取りして
ファイルに落としたいんですが、なにかいい方法はありますか?
ありましたらご教授願います。

No. 3689 # MM 2004/04/21 (水) 00:00:53
こんにちは。

あるSolarisからLinuxにPingすると、

do you want to ping broadcast? Then -b というメッセージがかえってくるのですが、
どういう意味ですか?他にも10台あって、この2台以外はお互いちゃんとPingできるのですが、どうしてでしょうか?

SolarisのIPとホストは172.17.155.01 AT002といいます。
Linuxのほうは172.17.155.17 AI007といいます。

SolarisからLinuxにPingすると"no answer from AI" といわれ。
LinuxからSolarisにPingすると"do you want to ping broadcast? Then -b" なります。

教えてください。
MM

No. 3690 # 68user 2004/04/21 (水) 00:51:00
>>3688 scott
syslog に出力するようにして、syslog.conf の方で
ログファイルにも落とすようにする、という方法しか
思いつきませんでした。

>>3689 MM
> do you want to ping broadcast? Then -b
> どういう意味ですか?
x.y.z.255 などのブロードキャスト宛に ping したいので
あれば、-b オプションを付けなさい、ということです。

とりあえずネットワーク設定がうまくいっていないようなので、
そこを見直すのがよいのではないでしょうか。たとえば
/etc/hosts に変な記述がないかとか、ネットマスクは同じか
とか、IP アドレスを直接指定して ping するとどうなるかとか。


で、質問です>どなたか

質問 1.
「Do you want to ping broadcast」でぐぐると、
    http://licensing.steeleye.com/open_source/diffs/ping.c
が見つかりました。

    #ifdef linux
        if (source.sin_addr.s_addr == 0) {
            int probe_fd = socket(AF_INET, SOCK_DGRAM, 0);
            dst.sin_port = htons(1025);
            if (connect(probe_fd, (struct sockaddr*)&dst, sizeof(dst)) == -1) {
                if (errno == EACCES) {
                    if (broadcast_pings == 0) {
                        fprintf(stderr, "Do you want to ping broadcast? Then -b\n");
                        exit(1);
                    }
                }
            }
        }
        bind(s, (struct sockaddr*)&source, sizeof(source));
    #endif

とありますが、何をやってるのかさっぱりわかりません。
source.sin_addr.s_addr が 0 なら、UDP でポート 1025
に connect? なんのために? connect したら、それを bind?
なんのため?

質問 2.
あるディストリビューションの Linux で採用している ping の
ソースを見たいんですが、どこを探せばいいでしょうか? たとえば
RedHat ならどこを見ればよいですか?

No. 3691 # has 2004/04/22 (木) 00:36:04
>>3690 68user
>質問 2.
>あるディストリビューションの Linux で採用している ping の
>ソースを見たいんですが、どこを探せばいいでしょうか? たとえば
>RedHat ならどこを見ればよいですか?

いつもどおり答えになってませんがDebian GNU/Linuxのは見つかりました。
http://packages.debian.org/stable/net/netkit-ping

linuxは基本的にtar.gzやtar.bzでの配布よりもrpm(redhat package manaer)
形式(ソースなら*.srpm、*.src.rpmの場合もあり)が普通みたいですよ。

なお今回は、[ping srpm ソース]で検索→[netkit-ping]で検索→到達です。
# 本当はもっといろいろ遠回りしてますが…

No. 3692 # 流離のカメソらいだ〜 [E-mail] 2004/04/22 (木) 20:59:55
僕は某高専2年の電気科なんですが,C言語の授業があって学校のPCのOSがunixなんですよね〜。
Windowsで作成した文書ファイル(拡張子.c)をFDでunixに送る場合,文字化けしますよね?
それを防止する方法を教えて下さい。メールで返答していただければ幸いです。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3693 # vm 2004/04/23 (金) 13:04:14
>>3692 流離のカメソらいだ〜
一般的にはWindowsの標準文字コードがS-JISで、UnixがEUCだからそうなります。
FDに保存する際にエディタでEUCに変換しておくか、
エディタにその機能がないかUnix上で変換かける場合は、nkfコマンドを使ってください。

No. 3694 # abc 2004/04/24 (土) 13:40:28
texの文書で、dviのファイルをpdh形式に変換したいのですが、人に聞いた
ところGhostscriptを使ってできるとのことで、早速GSを落としてみたので
すが、具体的な操作など教えてもらえれば幸です。

No. 3695 # MM 2004/04/24 (土) 20:58:16
68userさん、ありがとうございます。

>x.y.z.255 などのブロードキャスト宛に ping したいので
>あれば、-b オプションを付けなさい、ということです。

x.y.z.0もブロードキャスト宛ということになるのでしょうか?

No. 3696 # 68user 2004/04/27 (火) 23:02:52
>>3691 has
なるほど、ありがとうございます。Debian の ping は、
      Do you want to ping broadcast? Then -b
というエラーは出さないようですね。

>>3695 MM
> x.y.z.0もブロードキャスト宛ということになるのでしょうか?
x.y.z.0/255.255.255.0 はネットワークアドレスです。

ただ、BSD 系・BSD 系を元にした実装 (Solaris・Linux など) は
ネットワークアドレスに対する ping に対して返事を返します。
Windows 系はたしか返事を返さないはず (ネットワークアドレスに
対する ping だけでなく、ブロードキャストへの ping も返さない)。

だから、ネットワークアドレス宛の ping であっても、ブロード
キャスト宛の ping と同等に機能する環境もあります。

ただし ping は
      「この宛先はブロードキャストアドレスだから `Do you want to
          ping broadcast? Then -b' というメッセージを出そう」
などと判断しているわけではなく、
>>3690 68user
に書いたとおり、connect して errno が EACCES ならこのメッセージを
出力して終了しているだけです。しかしこの connect の意味がさっぱり
わからないので、「ネットワーク設定がおかしいのでは?」以上のアドバイス
はできません。

てゆーか、どなたか >>3690 の意味を教えてください。

>>3694 abc
> texの文書で、dviのファイルをpdh形式に変換したいのですが
pdh は pdf の typo ですか?

gs 付属の ps2pdf はいまいちで、今どきは dvipdfm を使うと
聞いたことがありますが、最新情報や細かなノウハウは知りません。
よって、「dvi pdf 変換」などで検索してみるか、2ch の UNIX 板
などで質問してみてはいかがでしょうか。

No. 3697 # うほほ 2004/04/27 (火) 23:05:16
はじめまして、こんばんは。
LINUX, Apache, PHP, MySQL、HTMLでのシステムを考えているのですが、
ちょっと行き詰まってしまって、、、よろしくお願いいたします。
ページがジャンプした瞬間に、あるフィールドをいきなり入力待ち状態にしたいのです。
通常はページに移動後マウスなどで入力したいフィールドを一度クリックする必要があります。
現在フィールドはフォーム<input>タグで作成しています。

カスタマーは(バーコードを使って>マウス1クリック無しで)
いきなり入力したい!というのがご要望です。

関連のページのご紹介でも何でもかまいませんので、
是非、よろしくお願いいたしますm(_ _)m

No. 3698 # 68user 2004/04/28 (水) 00:06:03
>>3697 うほほ
たとえば http://www.google.co.jp/ がその技を使っています。

ソースを見ていただければわかりますが、
    <body onload="document.hoge.fuga.focus()">
        <form name=hoge>
            <input type=text name=fuga>
        </form>
    </body>
とします。

No. 3699 # has 2004/04/28 (水) 02:45:22
>>3696 68user
>なるほど、ありがとうございます。Debian の ping は、
> Do you want to ping broadcast? Then -b
>というエラーは出さないようですね。
そーゆーことですか、了解です。ならredhat9では次の通りになりました。
% strings /bin/ping | grep Then
Do you want to ping broadcast? Then -b
%

No. 3700 # sagara [E-mail] 2004/04/28 (水) 19:15:37
ファイルをダウンロードするスクリプトを作成していますが、
ファイルサイズが大きいとファイル内容は一部しかダウンロードできません。
sysreadの戻り値$Ret_Lenは、正しい値が返ってきます。
最後のprint文で、全てを出力していません。あるいは、$INBUFに全てが
格納されてないかです。
全ての内容をダウンロードするには、どうすべきなのでしょうか?

    $size = -s $dl_file;
    open(INF, $dl_file) or &CgiError( "Error: Unable to open file $dl_file: $!\n" );
    binmode(INF);
    $Ret_Len = sysread(INF, $INBUF, $size);
    if (defined $Ret_Len) { #エラーではない
        if ($Ret_Len >0) { #読み取りの成功
            ;
        } else { #EOF
            close(INF);
        }
    } elsif ($! == EAGAIN) { #ブロックエラー
        $Ret_Len = sysread(INF, $INBUF, $size);
    } else {
        die "sysread() error: $!";
    }

    $NowMime = substr( $f_name, rindex($f_name, ".")+1, length($f_name) );
    $NowMime =~ tr/a-z/A-Z/;
    $RetMime = "";
# 2001.12.19 added by ishikawa ->
    #$mimeMach = 'dummy';
# 2001.12.19 added end ishikawa <-
    if( $NowMime ne "" ){
        if( open(CB, "./lib/mime.types") ){
            @mimein = <CB>;
            close( CB );
            foreach( @mimein ){
    if(/^[^#\n\r]/){
     s/[\t]+/\t/;
     ($MimeHead,$MimeBody) = split(/\t/);
# 2001.12.19 added by ishikawa ->
     if( defined $MimeBody ){
# 2001.12.19 added end ishikawa <-
     foreach $mimeMach ( split( /\s/, $MimeBody ) ){
     $mimeMach =~ s/\s//g;
     $mimeMach =~ tr/a-z/A-Z/;
     if( $mimeMach eq $NowMime ){
     $RetMime = $MimeHead;
     last;
     }
     }
# 2001.12.19 added by ishikawa ->
     }
# 2001.12.19 added end ishikawa <-
     if( $RetMime ne "" ){ last; }
    }
            }
        }
    }

    if( $RetMime eq "" ){
        print "Content-Type: application/octet-stream\n";
        print "Content-Disposition: inline; filename=\"$f_name\"\n\n";
    }
    else{
        print "Content-Type: $RetMime\n";
        print "Content-Disposition: inline; filename=\"$f_name\"\n\n";
    }

    binmode(STDOUT);
    print $INBUF;

No. 3701 # 68user 2004/04/28 (水) 21:50:48
>>3700 sagara
- 「ファイルサイズが大きい」とは具体的に何バイトですか?
- あるバイト数以上のファイルの場合、常にダウンロードできないのですか?
- 大きいファイルを処理するのに何秒かかりますか?
- length($INBUF) の値は?
- $INBUF の内容をファイルに出力すると、正常に出力できますか?
- 「sysreadの戻り値は正しい」というのは「正常にダウンロード
    できなかった場合でも、sysread の戻り値は正しい」ということ
    ですか?
- sysread ではなく read を使うとどうなりますか?
- OS 名・OS のバージョン・perl のバージョンは何ですか?

あと、コメント部分や関係ない箇所は極力削ってから投稿しましょう。
仕事のソースであれば特に。

No. 3702 # うほほ 2004/04/29 (木) 17:10:34
>68USER様
早々のお返事をありがとうございました。
やってみたら、ばっちりでした〜!
本当にありがとうございました♪

No. 3703 # lock 2004/05/04 (火) 09:58:30
はじめまして。よろしくお願いします。

環境:NetBSD1.5.2、Apache2.0.49

以下に示す接続が、4日くらいたっても消えません。
これは、クライアントがhttpで何かをダウンロード中の状態の1つということでしょうか?
ずっとこの状態のままなのはどういう原因が考えられますでしょうか?

Apacheのログには、このクライアントからのアクセスログは存在しませんでした。
FIN_WAIT_2の状態が終了した後で書き込まれるのでしょうか?


%netstat -an (一部抜粋)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 15964 210.*.*.*.80 133.*.*.*.15241 FIN_WAIT_1
tcp 0 16460 210.*.*.*.80 133.*.*.*.6322 FIN_WAIT_1
tcp 0 16500 210.*.*.*.80 133.*.*.*.19339 FIN_WAIT_1

No. 3704 # 68user 2004/05/04 (火) 19:45:56
>>3703 lock
サーバ側から close すると (正確にはアクティブクローズ
すると) FIN_WAIT_1 になります。普通はこの後にクライアント
から ACK・FIN が帰ってきて FIN_WAIT_2 に遷移しますが、
この辺がうまくいっていないものだと思われます。

> ずっとこの状態のままなのはどういう原因が考えられますでしょうか?
わかりません。普通は FIN_WAIT_1 のままにならないように
タイマか何かがあると思いますが、FIN_WAIT_1 タイマって
存在するのかな? (FIN_WAIT_2 タイマはあるけど)

> FIN_WAIT_2の状態が終了した後で書き込まれるのでしょうか?
これまたわかりません。apache のソースを読みましたが、どこで
ログを吐いてるのかすらわかりませんでした。

とまぁ何の役にも立たない回答になってしまいましたが、
数日様子を見てはいかがでしょうかね。

No. 3705 # hash 2004/05/04 (火) 23:12:07
数日前、FreeBSD 5.2Rをインストールしたのですが、起動時(ログイン前)に

Configuring syscons: keymap blanktime

と表示され、長時間とまってしまって困っています。
その後ログインプロンプトが表示され、ログイン可能ですし、
その他の操作に問題も無い感じなのですが、毎度の事なので釈然としません。

解決方法は無いものでしょうか?それともこういうものなんのでしょうか?
よろしくお願いいたします。

No. 3706 # 68user 2004/05/04 (火) 23:28:38
>>3705 hash
> Configuring syscons: keymap blanktime
の後の sendmail 起動時に固まっているものと思われます。

内容は若干グダグダですが、こちらをどうぞ。
    http://home.jp.freebsd.org/cgi-bin/thread?mesid=%3c200308030422%2eAA02439%40nt%2em8%2edion%2ene%2ejp%3e

てゆーかうちのマシンも sendmail 起動時に固まりますが、
めんどくさいので止まったら Ctrl-C を押してます。

No. 3707 # hash 2004/05/05 (水) 02:07:03
>> 3706
早速のお返事ありがとうございます。
ご指摘頂いた通り、原因はメッセージの後のsendmailの起動でした。
> Configuring syscons: keymap blanktime
のメッセージから検索しても、解決法が見つからないのはあたりまえでしたね。

ご紹介いただいたウェブサイトに目を通すのに時間がかってしまいましたが、
解決することができました。

私の場合はDNSサーバの指定部分で、ADSLモデムの提供しているDNSで解決しようとしていたのですが、
モデムのDNSサービスがIPv6に対応していない為、名前解決できずTime outを待っていたようです。
DNSサーバの指定をプロバイダーのアドレスにしたら解決しました。

起動する度に気になっていたので、すっきりしました。
どうも、ありがとうございます。

No. 3708 # Sjr 2004/05/05 (水) 20:19:41
DESについて質問させて下さい。
OpensslコマンドでDESを使っているのですが、間違った鍵で復号しようとすると
bad decryptというエラーがでます。パリティチェックはOKとします。
これはDESの仕様上、エラーが検出できるということなのでしょうか?
DESというと単にビット単位の置換だと思っているので、エラーが検出できるのが
ちょっと不思議です。
TripleDESの中ででも、いきなり関係無い鍵で復号したりしてますから、さらに
不思議です。

なにか根本的に理解が違っている気もするので、宜しければご教授ください。

No. 3709 # 68user 2004/05/05 (水) 22:59:32
>>3708 Sjr
`bad decrypt' を出しているのは多分 rypto/evp/evp_enc.c の

    int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl){
          b=ctx->cipher->block_size;
          n=ctx->final[b-1];
          if (n > b){
                EVPerr(EVP_F_EVP_DECRYPTFINAL,EVP_R_BAD_DECRYPT);

だと思います。PKCS#5 で定義されている操作に矛盾が発生すると
このエラーが発生すると思っています。

ところで PKCS#5 の日本語訳のありかをご存知の方いらっしゃい
ませんか? (解説している書籍でも可) 以前自分で訳してみたものの、
よく理解していないため何が何だかわからない日本語ができあがって
しまいました。

No. 3710 # Sjr 2004/05/06 (木) 10:56:55
68userさん、ご回答有難うございました。
恥ずかしながらPKCSというのは知りませんでした。PKCS#5というのは、
簡単に言うと文字列を鍵とする場合の決まりごと、みたいなものでしょうか?
頂いたソースやPKCS#5を斜め読みしてもまだ今一つピンときていません。
勉強したいと思います。

今のところなんとなく、PKCS#5でのPS(Padding String)についての記述を
見て、Padding ruleによってはエラーが検出できるのではと予想しています。

やっぱりアルゴリズムを見ていくしかないですねぇ…

No. 3711 # 68user 2004/05/06 (木) 11:54:23
>>3710 Sjr
> 簡単に言うと文字列を鍵とする場合の決まりごと、みたいなものでしょうか?
決まりごとというか、RSA が作った決めごとですね。

DES は 64bit のデータを暗号化・復号化する機能しか持っていません
(だから DES は 64bit ブロック暗号)。

これでは 64bit を超えるデータを暗号化できないので、データを分割して
暗号化する方法の一つが CBC モード (FIPS PUB 81 で規定)。一方、データ
列が 64bit に満たない場合のパディング方法などを規定しているのが
PKCS#5 です。

PKCS#5 でのパディングは
      データ1バイトの場合: A -> A 07 07 07 07 07 07 07 としてから暗号化
      データ2バイトの場合: A B -> A B 06 06 06 06 06 06 としてから暗号化
                  :
      データ7バイトの場合: A B C D E F G -> A B C D E F G 01 としてから暗号化
      データ8バイトの場合: A B C D E F G H -> A B C D E F G H 08 08 08 08 08 08 08 08 としてから暗号化
としていますね。

と書いているうちにわかったような気がしますが、
      http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/crypto/openssl/crypto/evp/evp_enc.c?rev=1.1.1.1.2.4
の EVP_DecryptFinal_ex が呼ばれるときの流れは

      残りブロックサイズ = ctx->cipher->block_size;
      if (残りブロックサイズ > 1){
          /* 残りはパディング部分のみ */
          n=ctx->final[b-1]; /* 最後の 1バイトを読む。その値はパディング長であるはず */
          if (n > b)
              /* パディング長が残りブロックサイズを超えているならエラー */
              for (i=0; i<n; i++)
                    パディング部分の値が全て n であることをチェック
          /* ここまできたら、パディング部分が正しいことがわかる */
          n=ctx->cipher->block_size-n; /* パディング部分を除いたブロックサイズを取得 */
          for (i=0; i<n; i++) /* パディング部分より前のデータについて出力バッファに書き出す */
              out[i]=ctx->final[i];

てな感じでしょうか。

No. 3712 # 68user 2004/05/06 (木) 12:05:05
一応補足。

>>3708 Sjr
> DESというと単にビット単位の置換だと思っているので、エラーが検出できるのが
> ちょっと不思議です。
DES 自体は、鍵に含まれるパリティを以外の誤り検出機能はない、という
理解で正しいと思います。

しかし、PKCS#5 においては誤った鍵を使うと
>>3711 68user
> データ1バイトの場合: A -> A 07 07 07 07 07 07 07 としてから暗号化
> データ2バイトの場合: A B -> A B 06 06 06 06 06 06 としてから暗号化
この最後のデータ列 (06 06 06 06 06 06 など) がめちゃくちゃになって
しまうため、パディングチェック時にエラーとなる、ということですね。


なお、PKCS#5 は DES に限らず、ブロック暗号一般に適用できます。ただし
PKCS#5 は 64bit 暗号に特化した書き方がされているので、64bit 超暗号に
一般化したものが PKCS#7 に規定されています。

# と言っても、mod 8 とか書いてあるか、mod k と書いてあるかの違いしか
# ないような気がしますけど。

No. 3713 # Sjr 2004/05/07 (金) 10:09:34
x168userさん、詳細な説明ありがとうございます。
誤りの検出については、ほぼ理解できたと思います。


>データ8バイトの場合: A B C D E F G H -> A B C D E F G H 08 08 08 08 08 08 08 08 としてから暗号化

のところは意外でした。データが増えてしまうのでしょうか。
確かにこうしないとパディングされているのかされていないのかが
分からない、ということなのでしょうけど。
よくよく見ていくと色々と考えられていて面白いですね。

No. 3714 # SS 2004/05/10 (月) 14:58:25
初歩的な質問です。
複数ファイルを1ファイルにcatで結合しようとしたところ次の問題が発生しました。
各ファイルのファイル名は20文字程あり、それら10ファイルをまとめて作成したい
ファイル名も20文字程あります。cat以下コマンドを入力していくと、255文字で
入力不能となります。環境はSolarisへのTelnet接続、シェルはkshを使っています。
また、結合したい10ファイルは1つのディレクトリにある全てのファイルです。
ファイル名を短くするとか一度にやらないとか方法はあるでしょうが、画期的な方法が
あれば宜しくお願いします。

No. 3715 # ふくし [E-mail] 2004/05/10 (月) 18:01:22
>>3714 SS
さん、

ファイル名に共通点ありますか?

$ cat aaa.txt
a
b
c
$ cat bbb.txt
1
2
3
$ cat ccc.txt
x
y
z
$ cat *.txt
a
b
c
1
2
3
x
y
z

No. 3716 # 68user 2004/05/10 (月) 21:08:55
>>3714 SS
Solaris8 では sh・ksh・csh いずれも 255 文字の制限があるようで、極めて
不愉快ですね。

ワイルドカード (glob) を使う以外の別解としては、文字数の制限がある
のはコマンドラインからの入力時だけのようなので、シェルスクリプト内で
      #!/bin/ksh
      cat file-a file-b ..... > result
などとすれば OK なようです。

あとは、tcsh や bash を使うとか。

No. 3717 # SS 2004/05/11 (火) 13:59:04
シェルスクリプトで実現することにしました。ありがとうございました。

No. 3718 # zsh 2004/05/11 (火) 16:54:18
>>3717 SS
3716で68user様もさらっと書いてますが、ワイルドカードをを使用する事でも回避可能です。
% cat * > outfile

それにしてもこんな制限があるとは知りませんでした。
で、確認してみたところ、255文字ではなく257文字まで入力できました。
・・・・・・なんでこんなに中途半端なんでしょう?

No. 3719 # lock 2004/05/13 (木) 00:00:43
>>3074 68user
返事遅れて申し訳ありません。
回答ありがとうございます。

状況は、全く変化せずFIN_WAIT1の状態のまま残っています。
タイマーはないようです。
OSを再起動すればなくなるのでしょうが、それは出来ないので困っています。
強制的にクローズする方法はありませんでしょうか?

apacheを再起動しても変化なしでした。

No. 3720 # 68user 2004/05/13 (木) 00:18:07
>>3719 lock
であれば、NetBSD のバグだと思われます。

http://www.netbsd.org/Misc/query-pr.html#search
http://www.netbsd.org/MailingLists/ で検索してみましたが、
それっぽいものはありませんでした。

# FIN_WAIT_1 が残るというメールはありましたが、NetBSD 1.3.1
# 以前の問題のようです。

これ以上はわたしには全くわからないので、netbsd.org の
メーリングリストで質問してみてはいかがでしょうか。

No. 3721 # 大谷 2004/05/15 (土) 17:41:21
初めてメールします。CGIを用いてGREE.jpのようなものを作りたいと考えているのですが、何かいい案はございませんか?

No. 3722 # 68user 2004/05/15 (土) 17:53:34
>>3721 大谷
現状何が問題なのかを提示せずに いきなり「何かいい案は?」と
問われても、何と答えればよいのかわかりません。

No. 3723 # つる 2004/05/16 (日) 17:56:22
シェルスクリプト内の変数の使い方について教えて下さい。
環境は、HP-UX11.00で、Cシェルです。

a.cshとb.cshの2つのシェルがあり、
b.cshは、a.cshから呼ばれる動きです。

この時、a.csh内で設定した変数を、b.csh内でもしたいのですが
上手くいきません。

- a.csh -----------
#!/bin/csh

set title = "test log"
./b.csh

- b.csh ------
#!/bin/csh

echo "Subject: $title" >> kekka.log
echo "" >> kekka.log

というように使いたいのですが、上手くできません。
よろしくお願いします。

No. 3724 # zsh 2004/05/16 (日) 18:18:46
>>3723 つる
setenvしてください。

No. 3725 # ふくし [E-mail] 2004/05/19 (水) 15:38:15
留学歴を調べててわかったんですが、
あべ晋三さんって Mac のノート(G4 パワーブック?)で
Unix を使って日本を動かしてるらしい。

    http://www.s-abe.or.jp/image/pc_desk.gif

「./configure; make new_japan; make install」ってのがすごいですね。
実装が知りたい (^^)



さて質問です。tcup という有名なレンタル掲示板に
「プログラム書き込みを禁止する」という設定項目があり、
これを有効にするといわゆるエロ広告がカットできるようなんですが、
どういう実装になってるんでしょうか。
HTTP-AGENT 環境変数とかだったらフツー偽装しますよね。
(いぜん PC を docomo の携帯に偽装して「グリコの抽選の応募」を
    連続応募する裏ワザというのがあった)
ていうか、Internet Explorer だってコンピューターのプログラムには
違いないわけで。どうやって判別できるんでしょう?

No. 3726 # 68user 2004/05/19 (水) 18:21:09
>>3275 kotaro
> 「./configure; make new_japan; make install」ってのがすごいですね。
何ヶ月か前にほうぼうでネタにされてましたね。configure と make は ; で
なくて && でつなぐべきだとか、いったい何を grep してるんだとか、パス
ワード入力時に何で * がエコーバックされるんだとか。

http://www.s-abe.or.jp/ の web も XOOPS を使っているようで、ページ
運営者がそういう系統の人なんでしょうね。

> 「プログラム書き込みを禁止する」
http://www.teacup.com/gbbs/l1new.shtml の「プログラム投稿(迷惑投稿)禁止」
のことですね。

    http://8520.teacup.com/pon/bbs
        あれれ? 投稿者:PON  投稿日:10月10日(金)00時00分26秒

以降の発言を見るに、cookie を食べてくれるかとか、referer を
渡してくるかとか、Javascript を正しく解析してくれるかとか、
そういう感じの判定をしているものと思われます。

No. 3727 # tt 2004/05/22 (土) 16:39:13
質問です。
Solaris8で、バックアップからのフルリカバリを行う際、
パーティションを作成した後にnewfsでファイルシステムの作成を行いますが、
このときSWAP領域にも、newfs /dev/rdsk/.....というようにファイルシステムを
作成するものなのでしょうか?
vfstabファイルによると、SWAPはファイルシステムがufsでなくswapですので、どうなのかと思いまして。
googleで解説ページを検索すると、SWAPにnewfsを行っているサイトもあるのですが、
自分の持っている書籍では行っていません。

ちょっと分からなくなってしまったので、宜しくお願い致します。

No. 3728 # 68user 2004/05/22 (土) 19:00:17
>>3727 tt
ufs ファイルシステムを作るわけではないので、newfs は不要です。

ファイルを swap として追加する場合も、
      # mkfile 512m /foo/bar/swap512m
      # swap -a /foo/bar/swap512m
と、ゼロ埋めのファイルを用意して swap -a するだけですので。

No. 3729 # tt 2004/05/24 (月) 00:57:57
>>3728 68user様
ご回答ありがとうございます。
やはり不要なのですね。
ただ、それでもnewfsを行った場合、何か不具合が出るのでしょうか?
「不要」とは、「行っても問題無いが、する必要が無い」と言った意味になりますでしょうか。
swapをnewfsしている方は、その後問題無いのかなと思いまして。。

No. 3730 # zsh 2004/05/24 (月) 07:25:11
>>3729 tt
newfsしても問題ないと思います。
ただし、実際にswapを使い始めると(書き込みが行われると)
ufsとして書き込みに行かないので、結局ファイルシステムは破壊はされます。
よって、newfsする意味がありません。

No. 3731 # marlboro [E-mail] 2004/05/27 (木) 11:50:40
C言語版FTPクライアントを実行させたところ、RETR後、レスポンスが2回続けて
ありますが(150、226)、226のレスポンスが異常に遅いです(6分後)。
Solaris8、ProFTP(関係ないとおもいますが。。。)の構成です。

No. 3732 # すすむ 2004/05/27 (木) 19:48:05
HP-UX11.00で、Bシェルなのですが、
awkで表示された内容をある数分出力したら別ファイルに
入れたいのですが、

---------------------------------------
#!/bin/sh
#

FILE="test.txt"
OUTPUT="output.txt"

awk -F" " '
        BEGIN {
                count = 0+0 ;
        }
function func() {
        if (・・・・) {
                printf("%s\n",$0) ;
                printf("\n") ;
                return 0;
        } else {
                return 1;
        }

}
{
        if (NF == 0) next ;
        if (NF == 2 && $1 == "dn:") {
                ret=func() ;
                if (ret == 0) count++ ;
        }
        if (count == 1000) {
                count = 0+0 ;
        }
}' ${FILE} > ?????
------------------------------------

1000件ごとに出力するファイル名を変えたい
「output_nnn.txt」ということはできるでしょうか。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3733 # 68user 2004/05/27 (木) 20:54:46
>>3731 marlboro
ご報告ありがとうございます。

調べてみますが、
    - どこからどこ宛の接続なのか (Solaris8 から localhost 宛?)
    - OS 付属の FTP クライアントでは問題ないのか
    - (インターネット上に公開されているサーバであれば) 相手のサーバ名
を教えていただけると助かります。

>>3732 すすむ
HP-UX11.11 の /bin/awk で、
    out="output_nnn.txt";
    print "hoge"> out
などと出力ファイルを指定できるようです。後は out の内容を
動的に変えていけばよいでしょう。

対象ファイルを切り替えるときは close(out) すればリソースの
無駄が省けてよいかもしれません。

No. 3734 # すすむ 2004/05/27 (木) 22:55:17
>>3733 68user
ありがとうございます。

>HP-UX11.11 の /bin/awk で、
> out="output_nnn.txt";
> print "hoge"> out
>などと出力ファイルを指定できるようです。後は out の内容を
>動的に変えていけばよいでしょう。
>対象ファイルを切り替えるときは close(out) すればリソースの
>無駄が省けてよいかもしれません。

確認できる環境が近くにないので確認ができませんが、
以下の様なことなのでしょうか。
------------------------
#!/bin/sh
#

FILE="test.txt"
OUTPUT="output.txt"

awk -F" " '
        BEGIN {
                count = 0+0 ;
                num = 1;
                output="output_num.txt"
        }
        function func() {
                if (・・・・) {
                        printf("%s\n",$0) >> output ;
                        printf("\n") >> output ;
                        return 0;
                } else {
                        return 1;
                }
          }
          {
                if (NF == 0) next ;
                if (NF == 2 && $1 == "title:") {
                                ret=func() ;
                                if (ret == 0) count++ ;
                }
                if (count == 1000) {
                                count = 0+0 ;
                                num++ ;
                                output="output_num.txt"
                }
          }' ${FILE}

No. 3735 # 68user 2004/05/27 (木) 23:37:27
>>3731 marlboro
手元の複数の環境で実験した限りでは再現しませんでした。
>>3733 68user
をご参照の上、より詳細なご報告いただければ幸いです。

>>3734 すすむ
ご自分で動作確認して、わからなければ再度質問してください。

No. 3736 # すすむ 2004/05/28 (金) 08:44:07
>>3735 68user
>ご自分で動作確認して、わからなければ再度質問してください。

失礼しました。
ありがとうございました。
希望通りの動きをしました。

No. 3737 # kentarou 2004/05/28 (金) 08:45:29
>> 「./configure; make new_japan; make install」ってのがすごいですね。
> 何ヶ月か前にほうぼうでネタにされてましたね。configure と make は ; で
> なくて && でつなぐべきだとか、

ごめんなさい、教えてください。
;ではなく&&でつなぐとどうなるのですか?

No. 3738 # zsh 2004/05/28 (金) 12:41:31
>>3737 kentarou
例として、「cmd1 && cmd2」とした場合は、
cmd1の戻り値が0の場合のみcmd2を実行します。

No. 3739 # 68user 2004/05/28 (金) 13:03:19
>>3738 zsh
そして、make は成功時には 0 を、失敗時には 1 を返します。
# http://x68000.startshop.co.jp/~68user/unix/glossary.html#%CC%E1%A4%EA%C3%CD

よって && でつなぐことで、
    - configure でこけたら make 以降は行なわない
    - make でこけたら make install は行なわない
という効果があるわけです。

No. 3740 # 瓜倉 茂 [E-mail] 2004/05/28 (金) 17:25:42
Perl&CGIで授業の出席フォームを作成しようとしています。Perlは初心者です。
サーバーは、Windows2000+IIS+ActivePerl5.6.0で、ブラウザはIE6.0です。
クライアントマシンのIPアドレスを取得するPerlのコードでつまずきました。
inet_aton、gethostbyaddr、inet_ntoaの各関数を使ってIPアドレスを取得する
コードを試しましたが、ブラウザIE6.0のプロキシ設定をしていれば、プロキシ
のIPアドレスが取得でき、クライアントのIPアドレスが取得できません。もちろん
プロキシの設定を外せば、クライアントのIPアドレスが取れます。プロキシを設定
した状態で、クライアントのIPアドレスを取得できる方法がありましたら、ご教示
ください。

No. 3741 # 68user 2004/05/28 (金) 17:59:31
>>3740 瓜倉 茂
> クライアントマシンのIPアドレスを取得するPerlのコードでつまずきました。
IP アドレスは $ENV{REMOTE_ADDR} で取得できますよね。FQDN (ホスト名) の
取得が目的ですか?

それはそれとして、
> プロキシを設定した状態で、クライアントのIPアドレスを取得できる方法が
> ありましたら、ご教示ください。
については
>>3450 68user
の「理屈的には、100% の精度の proxy 判定は不可能です」のくだりを
読んでください。

100% は無理と書きましたが、学内限定でなおかつあなたが管理者の立場なの
であれば、必ず HTTP_X_FORWARDED_FOR を設定させるように proxy サーバの
設定変更するなどの手はあります。

ただ、根本的に信頼性がないので「web で出席を取る」という仕組みが妥当か
どうかは微妙な気がします。

No. 3742 # marlboro 2004/05/28 (金) 22:25:03
>>3733 68user
遅くなりました。すでに確認していただいているのですが。
>調べてみますが、
> - どこからどこ宛の接続なのか (Solaris8 から localhost 宛?)
> - OS 付属の FTP クライアントでは問題ないのか
> - (インターネット上に公開されているサーバであれば) 相手のサーバ名
>を教えていただけると助かります。
あて先は、同じネットワーク内に存在するサーバです。同じくSolaris8です。
UNIXのftpコマンド、Windowsのツール(FFFTP)では問題なく動作します。
#ftpコマンドでPASVで送受信する方法を知らないんですね。。。
サーバ側の問題とも考えにくいです。

No. 3743 # kentarou 2004/05/28 (金) 23:13:18
コマンドを&&でつなぐ件、勉強になりました。
ありがとうございます。

No. 3744 # 瓜倉 茂 [E-mail] 2004/05/28 (金) 23:38:23
68user様
早速のご回答ありがとうございます。Perlの使い方で問題が解決するのかと
思ってましたが、ネットワーク経由だと他のところも絡んでくるのですね。
Webにこだわらないで、出席を取る問題を再考してみます。

No. 3745 # 瓜倉 茂 [E-mail] 2004/05/28 (金) 23:43:36
marlboro様
先ほどのNo.3744の内容は、No. 3742のmarlboro様へのお礼でした。
あて先を間違い失礼しました。改めてmarlboro様の回答にお礼申し
上げます。

No. 3746 # 68user 2004/05/29 (土) 01:03:39
>>3742 marlboro
ProFTPD を相手にすると再現することがわかりました (一番
最初に試すべきことでしたね)。

    % time ./ftp-client -d anonymous foo@example.com ftp.proftpd.org /MIRMON.PROBE
    <-- 220 ProFTPD 1.2.10rc2 Server (proftpd.org Project) [81.223.20.36]
    --> USER anonymous
    <-- 331 Anonymous login ok, send your complete email address as your password.
    --> PASS foo@example.com
    <-- 230 Anonymous access granted, restrictions apply.
    --> PORT aaa,bbb,ccc,ddd,16,36
    <-- 200 PORT command successful
    --> RETR /MIRMON.PROBE
    1085749801
    <-- 150 Opening ASCII mode data connection for /MIRMON.PROBE (11 bytes)
    (ここで6分待たされる)
    <-- 226 Transfer complete.
    --> QUIT
    <-- 221 Goodbye.
    0.000u 0.005s 6:03.75 0.0% 0+0k 0+0io 0pf+0w

対策ですが、
    http://x68000.startshop.co.jp/~68user/net/c-ftp-1.html

        while (1){
                int read_size;
                read_size = read(data_socket, buf, BUF_LEN);
                ...
        }
の後に
        close(data_socket);
を入れることで直るようです。

データコネクションはサーバ側から切ってくれると認識して
いたのですが、間違いなのかもしれません。調査します。

ご指摘いただきありがとうございました。

> #ftpコマンドでPASVで送受信する方法を知らないんですね。。。
Solaris8 の ftp はカスなので、passive モードにできない
と認識しています。GNU モノや BSD モノなら、passive でできます。

No. 3747 # kouzu 2004/06/04 (金) 12:58:35
はじめまして。

ミラーリングの質問をさせていただきたいの
ですが、solaris8 10/01で
内蔵ディスクをRAID1は一般的でしょうが、
RAID1+0(ミラー+ストライピング)を構成
するのはアリなのでしょうか?

そもそもできるのでしょうか??

危険・・・?
ソフトはVeritasCSです。
VxVM VxFSも購入予定

標準内蔵DISKは73GBが6個で、
現状下記で振り分けようとしています。
disk1スライス: /(usr opt含む) , swap
disk2スライス: /export/home , /work

disk3,4でRAID1ミラーを予定だが、
RAID0+1が実は実現できそう・・・

No. 3748 # hash 2004/06/04 (金) 21:45:55
LAN内だけで有効なドメイン名(hogehoge.example等)を使いたいのですが、
そういったことは可能でしょうか?

具体的にはLAN内のWEBサーバに名前でアクセスしたり、
LAN内のメールアドレスを作りたいのです。

なんだか、漠然とした質問で申し訳ありません。
このようなことができるのであれば、解説しているサイトや、
検索に有効なキーワードでも教えていただけると幸いです。

サーバ構成は以下のようになっています。
・OS RedHat Linux8
・MTA sendmail 8
・DNS bind 9
・MUA OutLook Express 6(Windows2000, XP Pro)

WEBサーバにはローカルIPアドレスでアクセスし、
メールはWEBアプリからpostmaster@host.localdomainのように送信して、
POPはOutlook Expressで受信しています。

No. 3749 # hash 2004/06/04 (金) 21:51:53
>>3748 hash
> WEBサーバにはローカルIPアドレスでアクセスし、
> メールはWEBアプリからpostmaster@host.localdomainのように送信して、
> POPはOutlook Expressで受信しています。

度々すいません。
なんだか、意味のわからない文章になっていました。

現在は引用部分のように利用しているということです。
いろいろと面倒なので、何とかしたいと思って色々調べているのですが、
今のところ手がかりも見つからず質問させていただいた次第です。

No. 3750 # 金床 2004/06/05 (土) 06:10:55
>>3746 68user
興味があったので調べてみました。

現状のftp-client.cはデータコネクションでのデータ転送終了時にソケットのcloseを行っていないため、
サーバー側からのFIN-ACKパケットに対してFIN-ACKを送り返しません。

このため、データコネクションの切断について、クライアントからのFIN-ACKパケットを待つProFTPDと、
FIN-ACKパケットを特に待たない他のFTPDとの実装の差が、今回の問題であるプログラムの動作の差になっている
ようです。

>データコネクションはサーバ側から切ってくれると認識していたのですが、間違いなのかもしれません。
データコネクションの切断はサーバー側から行います。原理的に考えても、ファイルやファイルリストのサイズを
送信前に調べることはできませんので、これは間違いありません。

「サーバー側から切断」とはつまりサーバー側からFIN-ACKパケットが送信されるということです。
この際にreadが0を返すので、プログラムはwhileループを抜けます。
ここにclose(data_socket);を追加するとFIN-ACKを返信するようになり、ProFTPDはデータコネクションの切断が
正常に行われたと考え、処理が進みます。

つまり、close(data_socket);を追加することは「切断をクライアント側から行う」ことにはなりません。

以上、まとまりがなく申し訳ありませんが、参考になれば幸いです。

No. 3751 # TSURU 2004/06/05 (土) 17:31:35
初めて投稿します。

現在、sendmail 8.12.9 でSTARTTSLコマンドを有効にしてSSL接続を行っています。
デフォルトでは、SSLプロトコルバージョンは3.1です。これを、SSLプロトコル
バージョン3.0にする必要があるため、プロトコルバージョンが3.1の実行ファイル
と、3.0の実行ファイルを両方作成し、必要に応じて、実行ファイルを置き換えて、
sendmail を起動しなおして、sendmail に接続しています。
プロトコルバージョン3.0のものをコンパイルし、インストールした直後では、
正常にSSLプロトコルバージョンは3.0で通信できました。しかし、一旦、
SSLプロトコルバージョン3.1の実行ファイルに置き換えて起動し、数時間後に、
再度プロトコルバージョン3.0の実行ファイルで起動したところ、プロトコルバー
ジョン3.0では通信できないというおかしな状況になってしまいました。
プロトコルバージョン3.0で、通信できずにエラーとなった時の、
/var/log/syslog に出力された、sendmail のエラーメッセージは以下の
とおりです。

Jun 4 13:52:27 xxxx sm-mta[7195]: STARTTLS=server: 7195:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:290:

プロトコルバージョン3.0にする方法は、SSL_CTX_new() の引数に、
サーバの時はSSLv3_server_method()、クライアントの時は、SSLv3_client_method()を指定するという方法で行っています。
SSLライブラリは、OpenSSL 0.9.6c[engine] を使用しています。

どなたか、原因や対応方法などわかる人がいたら、ご教示していただきたいと
思います。
よろしくお願いします。

No. 3752 # bon 2004/06/05 (土) 18:29:25
お世話になります。
solaris9のx86版で、syslogの設定について質問なのです。
inetdから起動されるデーモンで、
クライアントのIP等の情報を/var/adm/messagesに出力させるには、
/etc/init.d/inetsvc内の最後を、「/usr/sbin/inetd -s -t」として、
マシンを再起動すれば良いらしいのですが、そのようにしてからtelnetで試したところ、
どうしてもログに出力されません。
/etc/syslog.confの設定はデフォルトのままで、
「*.err;kern.debug;daemon.notice;mail.crit /var/adm/messages」
の設定はコメントアウト等されていません。
他に何か設定すべき場所等ありますでしょうか?
宜しくお願い致します。

No. 3753 # zsh 2004/06/06 (日) 20:42:55
>>3752 bon
/etc/default/inetdに
ENABLE_CONNECTION_LOGGING=YES
の指定が必要です。

No. 3754 # zsh 2004/06/06 (日) 20:50:30
>>3748 hash
>WEBサーバにはローカルIPアドレスでアクセスし、
>メールはWEBアプリからpostmaster@host.localdomainのように送信して、
>POPはOutlook Expressで受信しています。

これが今の運用だとすると、
postmaster@host.localdomain
と指定している時点でローカルのドメインを使えているように見えますが・・・
クライアントからホスト名でアクセスするだけだったら
hostsファイルに指定してやれば良い気がします。

No. 3755 # bon 2004/06/06 (日) 21:41:14
>> 3753 zsh様
やっと動きました!
ありがとうございました。

No. 3756 # marlboro 2004/06/08 (火) 21:00:42
>>3746 68user
ありがとうございました。
動作確認できました。やはり6分待たされるんですよね。
>ProFTPD を相手にすると再現することがわかりました (一番
>最初に試すべきことでしたね)。
最初にお伝えするべきでした。

No. 3757 # 68user 2004/06/08 (火) 22:25:42
>>3747 kouzu
> RAID1+0(ミラー+ストライピング)を構成するのは
> アリなのでしょうか?
わかりません。RAID1 しかやったことがないです。

システム領域は RAID1 しか対応していないミドルウェアも
あるようですのでね。どう考えてもお仕事なようですから、
素人のアドバイスなど聞かず、まずは Veritas 社に問い
合わせることをお勧めします。

>>3750 金床
なるほど、勉強になります。サーバプログラムの書き方の違いとしては、
    クライアントの FIN-ACK を待たない
        ⇒ close か、shutdown(fd, SHUT_RDWR)
    クライアントの FIN-ACK を待つ
        ⇒ shutdown(fd, SHUT_WR) して、read が 0 を返すのを待つ
てな感じなんでしょうかねぇ。

>>3751 TSURU
単に 3.0 サーバに 3.1 プロトコルでお話しているということは
ないですよね? tcpdump や ethereal などでプロトコルバージョンを
確認しても間違いはありませんか?

SMTP over TLS は使ったことがないため、たいしたことは言えなくて
申し訳ないです。

No. 3758 # TSURU 2004/06/08 (火) 22:29:20
>>3751 TSURU
こんばんは。
V3.0で通信できない、という件ですが、設定方法を変えたら、正常にV3.0で通信
できるようになりました。
具体的には、sendmail.cfにて、CipherList を設定する方法で、できるように
なりました。
お騒がせしました。
68userさん、レスをいただきありがとうございます。

ありがとうございました。

No. 3759 # 68user 2004/06/08 (火) 22:35:42
>>3758 TSURU
V3.0 と V3.1 で sendmail.cf を共用にしていたため、
V3.1 でしか使用できない Cipher を V3.0 で使おうとして
エラーになっていた、ということでしょうか?

No. 3760 # TSURU 2004/06/08 (火) 23:10:56
>>3759 68user
いや、それはないと思います。
sendmail.cfファイルも、V3.0用とV3.1用で別々に作成して、置き換えて使っています。
僕も、それほどSSLについて詳しいわけではありませんが、
SSLプロトコルバージョンと暗号化アルゴリズム(Cipher)は、直接は関連性はないように
思います。
おそらく、この認識で合っているとは思いますが。

No. 3761 # 68user 2004/06/08 (火) 23:31:37
>>3760 TSURU
SSL3.0 と TLS1.0 (≒SSL3.1) の仕様上は、使用できる暗号
スイートに違いがあります。たとえば SSL3.0 では FORTEZZA
が使用できましたが、TLS1.0 では削除されました。また、AES
関連の暗号スイートについては、TLS のみに追加されました。
今後も新規暗号スイートは TLS のみに追加されていくでしょう。

http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt
http://www21.ocn.ne.jp/~k-west/SSLandTLS/draft302-Ja.txt
http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc3268-Ja.txt

# ただし実装においては SSL3.0 と TLS1.0 はコードを共有して
# いるでしょうから、もしかしたら SSL3.0 で AES が使用できる
# ような実装もあるのかもしれません。

よって、暗号スイートの違いから接続がうまくいかなかったのでは
ないかと考えた次第です。

後学のために教えていただきたいのですが、
>>3758 TSURU
> sendmail.cfにて、CipherList を設定する方法
何と書くとうまくいかなくて、何と書くとうまくいったのか
お教えいただけますか?

No. 3762 # TSURU 2004/06/09 (水) 23:37:31
>>3761 68user

1.通信できなかった場合
sendmail.cfで、CipherList は特に設定していない。
また、SSL_CTX_new() の引数にSSLv3_server_method()、
又は、SSLv3_client_method()を指定する。
この方法だと、通信できなくなった。

2.通信できた場合
sendmail.cfで、CipherList に、DEFAULT:+SSLV3 を指定する。
また、SSL_CTX_new() の引数にSSLv23_server_method()、
又は、SSLv23_client_method()を指定する。
(つまり、sendmail のソースコードをいじらないままの状態です。)
この方法で、正常に通信できるようになりました。

No. 3763 # aits 2004/06/09 (水) 23:37:44
どなたかご教授下さい。

すでに動いているSolaris8の機器に新規Diskを追加し、Formatコマンドでパーティション切って、
labelしたあとにリブートする必要はありますか?
リブートしないと反映しないのですかね?
リブートは必要ないと思っていますが。。

No. 3764 # 68user 2004/06/10 (木) 00:40:32
>>3762 TSURU
ありがとうございます。暇を見つけて試してみたいと思います。

>>3763 aits
リブートして /etc/vfstab の内容が正しいことを検証しておく
方がよいと思われますが、リブートが必須かどうかと問われれば、
必須ではありません。リブートせずに、そのまま mount できます。

No. 3765 # 金床 2004/06/10 (木) 10:25:20
>>3757 68user

>サーバプログラムの書き方の違いとしては、
> クライアントの FIN-ACK を待たない
> ⇒ close か、shutdown(fd, SHUT_RDWR)
> クライアントの FIN-ACK を待つ
> ⇒ shutdown(fd, SHUT_WR) して、read が 0 を返すのを待つ
> てな感じなんでしょうかねぇ。

ProFTPDのソースを見てみました。ご指摘の通り、
shutdown(fd, SHUT_WR)
になっていました。
#実際にはSHUT_WRはハードコーディングされて1になっていましたが

shutdown後にreadしているかどうかまでは追えていません。
時間があるときにコードを書いてshutdownの動作を確かめてみたいと思ってます。


ちなみにProFTPDのこの部分を
shutdown(fd, SHUT_RDWR)
に変えてみたところ、closeを追加しないftp-client.cでも処理が止まらずに進むことを確認できました。

No. 3766 # 初心者 2004/06/10 (木) 23:15:30
unix上でzip圧縮した際にパスワードを設定したいのですが、
どなたかご存知な方いらっしゃいいますか?
windowsだと基本的にzip圧縮の際にパスワードを設定できるように
なっているのですが・・・。
一応manコマンドで調べると-eという暗号化のオプションが存在する
ようなのですが出来ません。
環境はsolarisです。よろしくお願いします。

No. 3767 # hash 2004/06/11 (金) 00:08:24
>>3754 zsh
> クライアントからホスト名でアクセスするだけだったら
> hostsファイルに指定してやれば良い気がします。

お返事ありがとうございます。
全クライアント(Win2000)のhostsファイルを変更するのは
大変(そんなに数はないのですが)なのでDNSにローカルのbindを指定して使っています。

ということは、bindのゾーン設定が悪いんですね。
とりあえず切り分けができたのでもう少し試行錯誤してみます。
報告できるようなことがあれば、また報告させていただきたいと思います。

ありがとうございました。

No. 3768 # hash 2004/06/11 (金) 00:27:09
>>3766 初心者

$zip -e out.zip target.o
Enter password:
Verify password:
    adding: target.o (stored 80%)

で出来ました。
RedHatですが、同じだと思います。

No. 3769 # 68user 2004/06/11 (金) 00:56:56
>>3766 初心者
> unix上でzip圧縮した際にパスワードを設定したいのですが、
Solaris 標準の zip は、おそらく暗号化ライブラリなしで
コンパイルされていると思うんですよね。たぶん。

FreeBSD の ports
        http://www.jp.freebsd.org/cgi/cvsweb.cgi/ports/archivers/zip/Makefile?rev=1.29
を参考に、zcrypt29-exportable.zip を持ってきたり、
-DUSE_CRYPT を指定したりして自分でソースからコンパイル
すれば大丈夫でしょう。

もしかしたら
    SunSite
        http://sunsite.tus.ac.jp/sun/solbin/
のバイナリパッケージが暗号化機能付きでコンパイルされて
いるかもしれません (試していません)。

No. 3770 # zsh 2004/06/11 (金) 17:04:11
>>3769 68user
Solaris標準・SunSiteのバイナリパッケージ共に暗号機能なしのようです。

No. 3771 # den 2004/06/13 (日) 18:34:51
Servlet を C の exe からソケットを使って起動させようとしているのですが
うまく起動しません。

どなたかわかる方はいませんか?

No. 3772 # 68user 2004/06/13 (日) 19:44:10
>>3771 den
情報不足です。

http://www.hyuki.com/writing/techask.html を読んでください。

No. 3773 # 68user 2004/06/13 (日) 22:56:01
日記。

今日は
    http://www.amazon.co.jp/exec/obidos/ASIN/475614389X/qid%3D1087134585/249-1275008-5298706
        プログラミングテクニック - UNIXコマンドのソースコードにみる実践プログラミング手法
        (UNIX MAGAZINE COLLECTION)
を買いました。UNIX MAGAZINE に連載されていた記事をそのまま
まとめただけですが、これでたまっていた UNIX MAGAZINE を捨て
られるので、部屋が狭い人にはお勧めです。

ただ、この人の書く文章にはおもしろみのかけらもなく、全く読む
気にならないのが残念なところ。プログラミングって こんなに
つまらないものだったかなぁ、と思えることうけあいです。

No. 3774 # 68user 2004/06/14 (月) 02:54:44
日記 2。

久々に whois.cgi なぞを触っていたら、FreeBSD 5.2.1-RELEASE の
/usr/bin/whois は、いちいち NIC (Network Information Center) を
指定しなくても、
    % whois u-tokyo.ac.jp
で情報を参照できる。昔は
    % whois -h whois.nic.ad.jp u-tokyo.ac.jp
としなくてはならなかったはずなのに何故? と思ってソースを読んだ
結果、
    xxx.whois-servers.net
    (例えば TLD が jp だったら jp.whois-servers.net)。
の CNAME を引っ張ると、whois.nic.ad.jp が返ってくるので、
そこに再接続すればよいらしい。

あるいは
    % whois -h jp.whois-servers.net u-tokyo.ac.jp
とすると whois-servers.net が proxy となって whois.nic.ad.jp
から勝手に情報を取得してくれるようだ。

whois-servers.net に対応したのは、FreeBSD 4.0-RELEASE・
FreeBSD 3.4-RELEASE から。

http://www.jp.freebsd.org/cgi/cvsweb.cgi/src/usr.bin/whois/whois.c

No. 3775 # kiyo 2004/06/14 (月) 13:46:37
dateコマンドでは、最大何日前までの日付計算が行えるのでしょうか?
教えてください。

No. 3776 # yoko 2004/06/14 (月) 15:22:44
Solaris(UNIX)でフォルダの削除が行えません。
rmdir フォルダ名のコマンドでは「ディレクトリが存在しません。」
のメッセージがでます。CPコマンドで同じフォルダを同じ場所にコピーすると
同じ名前のファルダが2つできてしまいます。
このフォルダの消し方をどなたか教えていただけないでしょうか。

No. 3777 # TSURU 2004/06/14 (月) 17:21:18
>>3776 yoko

こんばんは。

rm -r <ディレクトリ名>

で削除できませんか?

No. 3778 # den 2004/06/14 (月) 21:42:32
ソースを載せます。

//***************************************************************
// From the book "Win32 System Services: The Heart of Windows 95
// and Windows NT"
// by Marshall Brain
// Published by Prentice Hall
//
// Copyright 1995, by Prentice Hall.
//
// This code implements a TCP sender.
//***************************************************************

// ssipsend.cpp

#include <windows.h>
#include <iostream.h>
#include <winsock.h>

#define NO_FLAGS_SET 0

#define PORT (u_short) 8080
#define DEST_IP_ADDR "127.0.0.1"

#define MAXBUFLEN 256

INT main(VOID)
{
    WSADATA Data;
    SOCKADDR_IN destSockAddr;
    SOCKET destSocket;
    unsigned long destAddr;
    int status;
    int numsnt;
    char toSendtxt[3][256];

    int numrcv;
    char buffer[MAXBUFLEN];

    strcpy( toSendtxt[0], "GET http://localhost:8080/example00/HitTime?userid=1207&date=20004/06/11%2008:30:00 HTTP/1.1\r\n" );
    strcpy( toSendtxt[1], "Host: localhost:8080\r\n" );
    strcpy( toSendtxt[2], "\r\n" );

    /* initialize the Windows Socket DLL */
    status=WSAStartup(MAKEWORD(1, 1), &Data);
    if (status != 0)
        cerr << "ERROR: WSAStartup unsuccessful"
            << endl;

    /* convert IP address into in_addr form */
    destAddr=inet_addr(DEST_IP_ADDR);
    /* copy destAddr into sockaddr_in structure */
    memcpy(&destSockAddr.sin_addr,
        &destAddr, sizeof(destAddr));
    /* specify the port portion of the address */
    destSockAddr.sin_port=htons(PORT);
    /* specify the address family as Internet */
    destSockAddr.sin_family=AF_INET;

    /* create a socket */
    destSocket=socket(AF_INET, SOCK_STREAM, 0);
    if (destSocket == INVALID_SOCKET)
    {
        cerr << "ERROR: socket unsuccessful" << endl;
        status=WSACleanup();
        if (status == SOCKET_ERROR)
            cerr << "ERROR: WSACleanup unsuccessful"
                << endl;
        return(1);
    }

    cout << "Trying to connect to IP Address: "
        << DEST_IP_ADDR << endl;

    /* connect to the server */
    status=connect(destSocket,
        (LPSOCKADDR) &destSockAddr,
        sizeof(destSockAddr));
    if (status == SOCKET_ERROR)
    {
        cerr << "ERROR: connect unsuccessful" << endl;
        status=closesocket(destSocket);
        if (status == SOCKET_ERROR)
            cerr << "ERROR: closesocket unsuccessful"
                << endl;
        status=WSACleanup();
        if (status == SOCKET_ERROR)
            cerr << "ERROR: WSACleanup unsuccessful"
                << endl;
        return(1);
    }

    cout << "Connected..." << endl;

    int idx = 0;
    while(1)
    {
    Sleep(1000);
        cout << "Sending..." << endl;
        numsnt=send(destSocket, toSendtxt[idx],
            strlen(toSendtxt[idx]) + 1, NO_FLAGS_SET);
        if (numsnt != (int)strlen(toSendtxt[idx]) + 1)
        {
            cout << "Connection terminated" << endl;
            status=closesocket(destSocket);
            if (status == SOCKET_ERROR)
                cerr << "ERROR: closesocket unsuccessful"
                    << endl;
            status=WSACleanup();
            if (status == SOCKET_ERROR)
                cerr << "ERROR: WSACleanup unsuccessful"
                    << endl;
            return(1);
        }
    idx++;
    if(idx>2){
        break;
    }

    /* Wait before sending the message again */
    //Sleep(4800);
    } /* while */

    return 0;
}

それほど難しいことはしていないはずなのですが...
よろしくお願いします。

No. 3779 # TSURU 2004/06/14 (月) 23:20:59
>> 3771
Servletって、JavaのServletのことですよね?
なぜ、わざわざCのプログラムからServletを起動する必要があるのですか?
そこが分かりません。

No. 3780 # とーりすがり 2004/06/15 (火) 00:03:33
>>3776 yoko
ディレクトリを作成した時にディレクトリ名にスペースとか
コントロールコード(^hとか)が入ってしまったってことはないですか?

とりあえず そのディレクトリ上位の階層でls -l > hoge.lst
としてvi hoge.lst を表示もしくはod -x hoge.lstあたりで
確認されてみてはいかがでしょうか?
外してしたらスミマセン
  

No. 3781 # den 2004/06/15 (火) 08:41:41
>> 3779 TSURU

なぜ、わざわざといわれるとどう答えていいのかわからないのですが。
サーブレットは、起動されるとデータベースに時刻を登録するようにできています。
それでタイムカードのように出社時間と退社時間を記録してゆこうとしているのです。
そのときにわざわざブラウザを立ち上げてフォームのボタンを押してサーブレットを
起動するのは面倒らしいので、スタートアップにEXEをと登録して、
パソコンが起動するとサーブレットを呼び出すようにしようとしています。

という回答でよいでしょうか。
よろしくお願いします。

No. 3782 # den 2004/06/15 (火) 08:44:36
>> 3779 TSURU

ちなみになぜ、Cでやろうとしているかというと、Java だと各パソコンに
JREをインストールしてやらなければならないかなと思っているので
それが面倒なのでCを使おうとしています。

No. 3783 # 68user 2004/06/15 (火) 11:49:45
>>3775 kiyo
> dateコマンドでは、最大何日前までの日付計算が行えるのでしょうか?
FreeBSD の date は 1900 年まででした。他の OS でも、time_t の仕組みに
のっけているなら、同じでしょうね。てゆーか OS 名くらい書きましょうね。

>>3776 yoko
> Solaris(UNIX)でフォルダの削除が行えません。
ファイルの特定方法もいろいろあるので参考にしてください。
    http://www.jp.freebsd.org/QandA/HTML/1671.html

>>3778 den
> ソースを載せます。
どこでどういうふうにエラーになるんですか? 「うまく起動しません」
とはどういう意味ですか? OS は? ブラウザで該当 URL を見ると正しく
記録されるのですか?

…などという点が情報不足なのですよ。期待した結果と実際の結果を書けと
    http://www.hyuki.com/writing/techask.html
にもあったはずです。

ソースをざっと見た感じでは怪しげなところはないように見えますが、
わたしの手元に Windows 開発環境がなくコンパイルできないので、
どなたかコンパイルして検証できる環境をお持ちの方がいらっしゃい
ましたらよろしくお願いします。

>>3779 TSURU
> なぜ、わざわざCのプログラムからServletを起動する必要があるのですか?
C で HTTP クライアントを作るって話なので、別に変ではないです。

No. 3784 # den 2004/06/15 (火) 13:24:16
OS は、クライアント、サーバともに Windows 2000 Professtional 又は Windows XP Professtional です。
Tomcat は、Tomcat/4.1.27 です。

サーブレットに動作したことがわかるようにコンソールへの出力が組み込んであるので
起動したことは、コンソールを見るとわかるようになっています。

ブラウザでサーブレットの URL をたたいた場合は、ちゃんとコンソールへの
出力がでて、起動していることがわかります。

No. 3785 # den 2004/06/15 (火) 13:30:15
>> 3783

HTTP は、ここで改行しないとダメだとかこういう順番でテキストを
送らないとダメだとかどういうルールがあるのでしょうか?

No. 3786 # den 2004/06/15 (火) 15:18:43
>> 3783

改行を入れるようにしたらレスポンスは返すようになってのですが、
やはりサーブレットは起動しません。

OS は、サーバ、クライアントともに Windows 2000 Professtional か Windows XP Professtional です。
Tomcat は、Apache Tomcat/4.1.27 です。

起動するというのは、コンソールに文字が出力されるということです。

ブラウザで同じことをした場合は、ちゃんと起動します。

No. 3787 # den 2004/06/15 (火) 15:19:42
>> 3783

レスポンスは、

HTTP/1.1 505 HTTP Version Not Supported
Content-Type: text/plain
Date: Tue, 15 Jun 2004 06:24:28 GMT
Server: Apache Coyote/1.0
Connection: close

・・・・・・

です。

No. 3788 # den 2004/06/15 (火) 15:30:52
>> 3783

リクエストの2行目の

strcpy( toSendtxt[1], "Host: localhost:8080" );

を削除したらうまく行きました。
どうもありがとうございました。

No. 3789 # 68user 2004/06/15 (火) 15:31:24
>>3786 den
> 改行を入れるようにしたらレスポンスは返すようになってのですが、
全くついていけません。具体的にどこをどういうふうに修正したんですか?

ふと思いましたが、
>>3778 den
> numsnt=send(destSocket, toSendtxt[idx],
> strlen(toSendtxt[idx]) + 1, NO_FLAGS_SET);
この +1 は不要では?

No. 3790 # どら 2004/06/15 (火) 15:34:48
はじめまして。まだ初めて1ヶ月の初心者です。
すいませんがどうしてもエラーメッセージの意味がわからないので、教えていただかないでしょうか?

OSはSolarisの5.8です。

--------------------------------------------------------------------------------
ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS
6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます
。それ以外は無視されます
ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
--------------------------------------------------------------------------------

というものでした。特にldというものがいまいち理解できないのですが、ぜひとも教えてただければと思います。よろしくお願いします。

No. 3791 # den 2004/06/15 (火) 18:28:48
>> 3786

HTTP 1.0 以降では、ヘッダと本文を空行で分けているらしく、その空行が
ないためにレスポンスがないことがわかりました。

その後、HTTP Version Not Supported というレスポンスが返されるだけ
だったのですが、リクエストを "POST <<URL>> HTTP1.1" と空行だけに
したところちゃんとしたレスポンスを返すようになりました。

    

No. 3792 # TSURU 2004/06/15 (火) 20:48:47
>>3783 68user
>C で HTTP クライアントを作るって話なので、別に変ではないです。
いえ、僕は、サーバ上にある、Servletのプロセスを起動する処理を
Cのプログラムの中で実装する話だと思ってしまったので、
おかしいと思ったんですよ。

No. 3793 # TSURU 2004/06/15 (火) 21:00:07
denさんへ

根本的な話をしていいですか?

>>3781 den
の発言を読むかぎりでは、denさんのやりたいことは、
出社時間と退社時間を記録したいということですよね。
それだけのために、なぜサーブレットが必要になるんですか?
そこが分からないんですよ。
出社時間と退社時間を記録するだけだったら、別にサーブレット
を使わなくても、方法はいくらでもありますよね。
どうしてもサーブレットじゃないとだめなんですか?

でも、もうできたんですよね。
だったら、無理に他の方法でやれとは言いませんが、
ただ気になったので、書いてみました。

No. 3794 # TSURU 2004/06/15 (火) 21:57:40
denさんへ

>>3793 TSURU
の書き込みは、べつにあげあしとりとか、意地悪をするために書いたのではありません。
あくまで、単に疑問に思ったことを書いただけですので、くれぐれも誤解なきよう
お願いします。

No. 3795 # den 2004/06/15 (火) 22:24:04
>> 3793

話がややこしくなりそうなのであまり追求しようとは思わないのですが、
サーブレット以外にもやり方はあると思います。

ただインターネットエクスプローラから時間の記録ができたら便利かなと思って
そのようにしました。

でも仮で運用しているとそれでは使いづらいといわれてしまったので、
既存のサーブレットを利用して、C で起動する処理を作って済まそうと
思ったわけです。

サーブレットは、HTTPのリクエストをサーブレットコンテナが受信すれば
起動されるのでサーブレットを起動するには、HTTPクライアントとして
リクエストを送るだけでいいのです。

どうもありがとうございました。

No. 3796 # TSURU 2004/06/15 (火) 22:34:20
>>3795 den
なるほど。
細かい事情は分かりませんが、サーブレットを起動することで
済ませたかった訳ですね。
ゼロから実装するより、既存のもので済ませた方がずっど楽ですからね。
分かりました。

No. 3797 # yoko 2004/06/17 (木) 12:01:46
>>3776 yoko

返事遅くなりました。No.3776 yokoです。
No. 3783 # 68user
No. 3780 # とーりすがり
No. 3777 # TSURU
さん、レスありがとう。
ls -l > hoge.lst で調べるとtest^Mといった(^M)がついていました。
原因は分かりましたが、まだ格闘中です。
rm -r test^M
rm -r 'test^M'
rmdir 'test^M'
でも消えないんですよね。

  rm-r

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3798 # yoko 2004/06/17 (木) 17:11:08
>>3776 yoko

3776で投稿した yokoです。
rm -r test^Mで消えませんでしたがrm -r test*で消す事ができました。
皆さん、
ありがとうございました。

No. 3799 # kou 2004/06/17 (木) 21:10:06
RSA暗号についての質問なんですが、公開鍵とモジュロは分かるんですよね。
それならば、どういう頻度で循環しているか分かってしまうのではないでしょうか?
循環する頻度と公開鍵があれば秘密鍵も分かってしまうのでは・・?

No. 3800 # 68user 2004/06/17 (木) 23:55:01
>>3790 どら
まず、以下の質問に答えてください。

- gcc をインストールしていますか?
- Sun のコンパイラをインストールしていますか? (/opt/SUNWspro/bin/cc などが存在しますか?)
- which cc と which ld の結果は?
- echo $PATH の結果は?
- 「あなたは」どのコンパイラを使ってコンパイルしようとしていますか? (gcc or Sun の cc)
- 実際に使用されていると思われるのはどのコンパイラですか? また、その根拠は?

>>3797 yoko
> ls -l > hoge.lst で調べるとtest^Mといった(^M)が
> ついていました。
^M はエスケープシーケンス \r (0x0d) です。シェルから
入力する場合は
    sh なら
        % rm test(Ctrl-v Ctrl-m)
    tcsh なら
        % rm test(Ctrl-v Ctrl-j)
とします。csh はどっちだか知りません。

ところでなぜ tcsh は Ctrl-j が ^M で、Ctrl-m が ^J
なんでしょうね?

>>3799 kou
> RSA暗号についての質問なんですが、公開鍵とモジュロは分かるんですよね。
> それならば、どういう頻度で循環しているか分かってしまうのではないでしょうか?
えーと、そういうことはないんですが、何と説明すればよいか
わかりません。

    秘密鍵: e, n
    公開鍵: d, n
    暗号化: (平文^e)%n
    復号化: (暗号文^d)%n

として、今、平文と e が不明だとします。何をどうすると、
何がどういうふうに循環すると考えておられますか?

なお、(平文^e)%n という操作は単射です。つまり異なる平文が
同じ値になることはありません。

もし数学的に厳密な証明を期待しておられるなら、わたしには
その能力がないので、
      http://www.faireal.net/
での質問をお勧めします。

No. 3801 # どら 2004/06/18 (金) 00:27:52
>>3800 68user
68userさん、レスありがとうございます。
質問に答えさせていただきます。

(1)gcc をインストールしていますか?
gccというもの自体はわかりませんが、fccとccはインストールしてあるみたいです。(すいません、学校のものなので・・・)

(2)Sun のコンパイラをインストールしていますか? (/opt/SUNWspro/bin/cc などが存在しますか?)
/opt/SUNWspro/bin/ccはディレクトリの中にありました。

(3)which cc と which ld の結果は?
which cc:/usr/ucb/cc
which ld:/usr/ucb/ld
という結果でした。

(4)echo $PATH の結果は?
/bin /usr/bin /usr/ucb /etc /opt/SUNWspro/bin /opt/FSUNf90/bin /disk2/user/md/gnuplot
という結果でした。

(5)「あなたは」どのコンパイラを使ってコンパイルしようとしていますか? (gcc or Sun の cc)
いままでの練習ではccでコンパイルしていました。これからもccでコンパイルするつもりです。

(6)実際に使用されていると思われるのはどのコンパイラですか? また、その根拠は?
上にも書きましたが、いままではccのコンパイラでコンパイルしていたので、ccのコンパイラだと思います。

さきほどgccについて調べた所、GNUが関連しているみたいでした。これから先にGNUplotを使用してグラフも書きたいと思っているのですが、
それについても何かアドバイスをいただければありがたいと思います。よろしくお願いします。

No. 3802 # 68user 2004/06/18 (金) 01:07:24
>>3801 どら
あらそうですか。予想と外れていたのでもうひとつ追加で質問。

>>3790 どら
> ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:...
ここだけでなく、コンパイルしてからコンパイルが終わるまで全ての
部分を見せてください。Makefile を使っているにせよ、自分でタイプ
したにせよ、とにかく全部見せてください。

> これから先にGNUplotを使用してグラフも書きたいと思っているのですが、
紛らわしいですが、gnuplot は GNU とは関係ありません。

GNU というのは、フリーなソフトウェアが大好きな FSF
という団体が提唱するソフトウェアのライセンス方式の
ことを指します。gcc も GNU ライセンスで配布されています。
しかし gnuplot はそうではありません。

あと、gcc と gnuplot は関係ないです。gcc はコンパイラ。
gnuplot はグラフ描画ソフト。

No. 3803 # 2004/06/18 (金) 10:59:55
はじめまして、こんにちは。いきなりで非常に申し訳ないのですが、socketのインクルードファイルはどこでダウンロードしたらいいのでしょうか?もしくは、どのOSになら入っているのでしょうか?

No. 3804 # 68user 2004/06/18 (金) 11:12:39
>>3803
わたしの知る限りでは、UNIX 系であれば標準で入っています。

Windows 系であれば、VC++ や C++ Builder などのコンパイラに
添付されているのかな?

No. 3805 # 蒲鉾 2004/06/18 (金) 11:41:29
UNIXの<sys/socket.h>の様なファイルは
windowsでどこにあるのですか
windowsで<sys/socket.h>をインクルードしてもファイルが開けない
というようなメッセージがでてしまいます。

No. 3806 # kou 2004/06/18 (金) 19:37:06
> 秘密鍵: e, n
> 公開鍵: d, n
> 暗号化: (平文^e)%n
> 復号化: (暗号文^d)%n
>
>として、今、平文と e が不明だとします。何をどうすると、
>何がどういうふうに循環すると考えておられますか?
nを生成するのがp,qで、それらの最小公倍数がe,dだという私の認識自体が間違っていたのでしょうか^^;
一定の頻度で循環しているから、それ以内の適当な数eでべき乗しても補完関係にあるd(最小公倍数-e)で復号化できる。
平文に「1,2,3・・」といった具合に数を代入していけば循環周期が分かるのでは?と思ったのです

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3807 # 68user 2004/06/19 (土) 00:23:45
>>3805 蒲鉾
> UNIXの<sys/socket.h>の様なファイルはwindowsでどこにあるのですか
winsock.h ですが、Windows の場合は他にもいろいろと書き方が
異なります。「winsock」で検索して、よさそうなサンプルを
探してください。

もっとも信頼できると思われるサンプルは
    http://www.kt.rim.or.jp/~ksk/wskfaq-ja/examples/basics/
でしょうが、ライブラリ化してあるのでわたしは初心者には
わかりやすいとは思いませんが、もし理解できるならこれを
参考にするのがよいでしょう。

>>3806 kou
> nを生成するのがp,qで、それらの最小公倍数がe,d
誤りと思われます。
    http://x68000.startshop.co.jp/~68user/net/crypt-2.html
の「RSA の本当のところ」を読んでください。

もう少し正確に、かつ数学的に書くと、
    p,q: 素数
    n: n=pq
    e: 1<e<(p-1)(q-1) かつ gcd(e, (p-1)(q-1))=1 を満たす自然数
    d: 1<d<(p-1)(q-1) かつ de≡1 (mod (p-1)(q-1)) を満たす自然数
として求めます。

# gcd(e, (p-1)(q-1))=1 は、e と (p-1)(q-1) が共通の約数を持たないということ。
# de≡1 (mod (p-1)(q-1)) は、d*e を (p-1)(q-1) で割った余りが 1 であるということ。

No. 3808 # どら 2004/06/19 (土) 00:52:56
>>68user
何度もありがとうございます。

“ex3-2.c”というファイルを“keisan3-2”としてコンパイルした結果を載せさせていただきます。
--------------------------------------------------------------------------------
tds1% cc -o keisan3-2 ex3-2.c
ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS
6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます
。それ以外は無視されます
"ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません
ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
---------------------------------------------------------------------------------

以前実行した時はうまくいったのですが、いつの間にかできなくなりました。
あと、上の文章の中で“16行目:〜ありません”という警告文もどのプログラムにも発生するみたいです。(この警告も以前はありませんでしたし、ファイルの中身はかえてないはずです。)
一応、簡単な文章でもうしわけないのですが、プログラムも載せさせていただきます。(教科書のコピーです…)

---------------------------------------------------------------------------------
/* 【例題3.2】 rei3_2 */

#include <stdio.h>

main()
{
    int a,b;

    printf("異なる2つの整数を入力してください--->");
    scanf("%d %d",&a,&b);
    if(a > b)
    printf("%d --- BIG\n",a);
    else
    printf("%d --- BIG\n",b);
    return(0);
}
-----------------------------------------------------------------------------------

よろしくお願いします。

No. 3809 # 68user 2004/06/19 (土) 01:43:46
>>3808 どら
たびたびすみませんが、
    % sh -x /usr/ucb/cc -v -o keisan3-2 ex3-2.c
の結果 (全文) を教えてください。

あと、env の結果も教えてください。ホスト名やログイン名などを
公開するのが嫌なら、適当に削ってから提示してください。


これ以上引っ張ると怒られそうなので、一部回答しておきますが、

> ucbcc: 警告: ld が起動される場合は、... 無視されます
> ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
これは警告なので、実行には支障がないはずです。keisan3-2 が
生成されていませんか?

> "ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません
これは文字通り、ファイルの最終行が改行コードが付いて
いないのでしょう。ファイルの最終行の末尾で改行してください。
ファイル末尾に改行がないとその行を読んでくれないプログラムも
あるので、改行をつける癖をつけておくことをお勧めします。

No. 3810 # どら 2004/06/19 (土) 09:48:43
>>3809 68user
何度もありがとうございます。このミスが見つからないと先に進みづらいので、教えていただけるのなら、どれだけ質問されても怒ったりしません。むしろどれだけでも聞いてください。お願いします。

% sh -x /usr/ucb/cc -v -o keisan3-2 ex3-2.cの結果を下に書きます。
------------------------------------------------------------------------------
+ [ -f /usr/ccs/bin/ucbcc ]
+ [ 4 -eq 0 ]
UCB_LIB_DIR=/usr/ucblib
CCS_LIB_DIR=/usr/ccs/lib
USR_LIB=/usr/lib
TYPE=
dopt=
cgdir=
+ [ x = x ]
LD_RUN_PATH=/usr/ucblib
+ export LD_RUN_PATH
+ [ = -Bstatic ]
LIBS=-lucb -lsocket -lnsl -lelf -laio
+ + awk/usr/bin/ls -ln /usr/ccs/bin/ucbcc{print $11}

cclink=/opt/SUNWspro/WS6U2/bin/acc
+ /usr/bin/dirname /opt/SUNWspro/WS6U2/bin/acc
ccdir=/opt/SUNWspro/WS6U2/bin
+ [ != ]
nccdir=/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin
LD_LIBRARY_PATH=/usr/ucblib:/usr/ccs/lib:/usr/lib
+ export LD_LIBRARY_PATH
+ /usr/ccs/bin/ucbcc -Xs -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SU
NWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib -v -o keisan3-2 ex3-2.c -I/usr/ucbinclude
  -lucb -lsocket -lnsl -lelf -laio
ucbcc: 警告: ld が起動される場合は、オプション -YP,:/usr/ucblib:/opt/SUNWspro/WS
6U2/bin/../lib:/opt/SUNWspro/WS6U2/bin:/usr/ccs/lib:/usr/lib は ld に渡されます
。それ以外は無視されます
### コマンド行ファイルおよびオプション (展開済み):
### -v -o keisan3-2 ex3-2.c -I/usr/ucbinclude -lucb -lsocket -lnsl -lelf -laio
### ucbcc: 注釈: LM_LICENSE_FILE = (null)
### ucbcc: 注釈: NLSPATH = /opt/SUNWspro/WS6U2/bin/../lib/locale/%L/LC_MESSAGES/
%N.cat:/opt/SUNWspro/WS6U2/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat
/usr/ccs/lib/cpp -undef -D__SunOS_5_8 -D__SUNPRO_C=0x510 -Dunix -D__unix -Dsun -
D__sun -D__BUILTIN_VA_ARG_INCR -D__SVR4 -Dsparc -D__sparc -I/usr/ucbinclude ex3-
2.c >/tmp/cpp.20856.0.i
/opt/SUNWspro/WS6U2/bin/acomp -Qy -y-o -yex3-2.o -I/usr/ucbinclude -g "/opt/SUNW
spro/WS6U2/bin/acc -Xs -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNW
spro/WS6U2/bin:/usr/ccs/lib:/usr/lib -v -I/usr/ucbinclude -c" -b -y-fbe -y/opt/
SUNWspro/WS6U2/bin/fbe -y-xarch=generic -y-xmemalign=4s -y-verbose -Xs -D__SunOS
_5_8 -D__SUNPRO_C=0x510 -Dunix -Dsun -Dsparc -D__unix -D__sun -D__sparc -D__BUIL
TIN_VA_ARG_INCR -D__SVR4 -y-s -I/opt/SUNWspro/WS6U2/include/cc -i /tmp/cpp.20856
.0.i
"ex3-2.c", 16 行目: 警告: ファイルの最後に改行文字がありません
rm /tmp/cpp.20856.0.i
### ucbcc: 注釈: LD_LIBRARY_PATH = /usr/ucblib:/usr/ccs/lib:/usr/lib
### ucbcc: 注釈: LD_RUN_PATH = /usr/ucblib
### ucbcc: 注釈: LD_OPTIONS = (null)
/usr/ccs/bin/ld -o keisan3-2 /opt/SUNWspro/WS6U2/lib/crti.o /opt/SUNWspro/WS6U2/
lib/crt1.o /opt/SUNWspro/WS6U2/lib/values-xs.o -Y P,/opt/SUNWspro/WS6U2/lib:/usr
/ccs/lib:/usr/lib -YP,:/usr/ucblib:/opt/SUNWspro/WS6U2/bin/../lib:/opt/SUNWspro/
WS6U2/bin:/usr/ccs/lib:/usr/lib ex3-2.o -lucb -lsocket -lnsl -lelf -laio -lc /op
t/SUNWspro/WS6U2/lib/crtn.o
ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
rm ex3-2.o
ret=0
+ exit 0
-------------------------------------------------------------------------

envの結果も書かせていただきます。

-------------------------------------------------------------------------
HOME=/disk2/user/md
PATH=/bin:/usr/bin:/usr/ucb:/etc:/opt/SUNWspro/bin:/opt/FSUNf90/bin:/disk2/user/
md/gnuplot:.
LOGNAME=
HZ=100
TERM=vt100
TZ=Japan
SHELL=/bin/csh
MAIL=/var/mail/md
LANG=ja
_INIT_NET_STRATEGY=none
_INIT_PREV_LEVEL=S
_INIT_RUN_LEVEL=3
_INIT_RUN_NPREV=0
_INIT_UTS_ISA=sparc
_INIT_UTS_MACHINE=sun4u
_INIT_UTS_NODENAME=
_INIT_UTS_PLATFORM=SUNW,Sun-Blade-1000
_INIT_UTS_RELEASE=5.8
_INIT_UTS_SYSNAME=SunOS
_INIT_UTS_VERSION=Generic_108528-27
PWD=/disk2/user/md
USER=md
LD_LIBRARY_PATH=/opt/FSUNf90/lib:/opt/SUNWspro/lib
MANPATH=/opt/FSUNf90/man:/opt/SUNWspro/man
-------------------------------------------------------------------------
という結果でした。


>>ucbcc: 警告: ld が起動される場合は、... 無視されます
>>ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
>これは警告なので、実行には支障がないはずです。keisan3-2 が
>生成されていませんか?
はい、ファイルはできています。実行すれば結果も出力されています。ただ、毎回この警告文がでていて、どれぐらい問題なのかどうかもわからないので、できるかぎり問題を取り除くことと、その理由が知りたいので…

>ファイル末尾に改行がないとその行を読んでくれないプログラムも
>あるので、改行をつける癖をつけておくことをお勧めします。
初めてしりました。ありがとうございます。気をつけます。

あと、もしお手数でなければ、今までされた質問の意図を教えていただければありがたいと思うのですが…手間がかかるようでしたら全然かまいませんので、よろしくお願いします。
それではまたよろしくお願いします。

No. 3811 # 68user 2004/06/19 (土) 22:05:38
>>3810 どら
結局、よくわかりませんでした。

Solaris の /usr/ucb/cc はシェルスクリプトで、/usr/ccs/bin/ucbcc
を起動しています。/usr/ccs/bin/ucbcc は /opt/SUNWspro/WS6U2/bin/acc
へのシンボリックリンクになっているはず。ですから、
        ucbcc: 警告:...
というのは acc が出力しているわけです。

コンパイラは
    http://x68000.startshop.co.jp/~68user/unix/pickup?gcc
にあるように、プリプロセス・コンパイル・アセンブル・リンクという
ステップを踏みます。提示していただいた例だと、最初に /usr/ccs/bin/ucbcc
(実体は /opt/SUNWspro/WS6U2/bin/acc) が実行され、それが
    /usr/ccs/lib/cpp (プリプロセッサ)
    /opt/SUNWspro/WS6U2/bin/acomp (コンパイラ)
    /usr/ccs/bin/ld (リンカ)
を順次起動しています。

# この場合、アセンブルはコンパイラの中で行われています。

で、
      ucbcc: 警告: ld が起動される場合は、オプション .. は ld に渡されます。...
というのは、最初に起動された ucbcc が -YP,.. というオプションを
理解できなかったため、
      「わたしの知らないオプションだけど、今から起動する ld ならこの
          オプションを理解できるかもしれないので、ld に -YP を渡します」
と言っているわけです。ただし、cc に -c オプションをつけたりすると
リンクは行われないため、そういうときに備えて
      「ld を実行しないようなオプションを指定された場合は ld が
          実行されないので、結果的に -YP オプションは無視されます」
とも言ってます。

で、
> ld: 警告: オプション -YP が複数回存在します。最初の設定で行います。
についてですが、-YP オプションは ld に渡されます。実行結果を
見るとなぜか /usr/ccs/bin/ld に -YP が 2つ渡されてしまって
います。-YP オプションは、ライブラリを検索するディレクトリを
指定するものなので、ld は
      「ライブラリを検索するディレクトリが 2つ指定されているので、
          後の方を無視して、最初の方を使います」
と警告しています。

なぜ -YP オプションが複数渡されるのかを知りたいため、-v オプションを
つけてもらったり、env で環境変数を見せてもらったりしましたが、怪しげ
なものを見つけることはできませんでした。

> 特にldというものがいまいち理解できないのですが
ld はリンカです。例えば
>>3868 jeiu
で printf や scanf などの関数を使っていますが、これらの関数は
OS の機能として用意されているものではありませんし、コンパイラが
内蔵している機能でもありません。

/usr/lib/ の下に *.a や *.so などのファイルがあると思いますが、
ここにコンパイル済の printf や scanf が入っており、それと結合
しているわけです。それらのライブラリ関数と、あなたが作った
プログラムを結合するのがリンカの仕事で、コンパイル済の printf
や scanf はどのディレクトリに置いてあるかを指定するのが -YP
オプションです。

だらだらと書いてきましたが、ぶっちゃけて言うと一般的な解決方法は
      Solaris では /usr/ucb/cc を使わず、/opt/SUNWspro/bin/cc を
      使う。できれば PATH から /usr/ucb/cc を削除した方がよい
というもので、これはよく知られたノウハウです。/usr/ucb は
SunOS4 時代 (20年くらい前) との互換性のためのディレクトリで
あって、今どき積極的に使う必要性はありません。

ただ、わたしは根本的な原因を知りたかったので しつこく聞いて
みたのですが、実を結ばなかったようで誠に残念です。


以下は余談ですが、あなたの環境のコンパイラはおそらく Forte C update 2
という Sun の製品です。わたしの手元には Solaris2.6 + Sun Workshop
(Forte C の前バージョン。Sun の製品) がありますが、いくら頑張っても
同じエラーメッセージを出すことができませんでした。

よって、多分 Forte C の不具合ではないかと予想しています。

No. 3812 # zsh 2004/06/19 (土) 23:32:29
>>3811 68user
>>3810 どら
富士通のコンパイラも入っていそうだという事が気になるのですが・・・
/usr/ccs/bin/ucbcc は Forte へのシンボリックリンクになってますか?

No. 3813 # 68user 2004/06/20 (日) 00:12:16
>>3812 zsh
> 富士通のコンパイラも入っていそうだという事が気になるのですが・・・
/opt/FSUNf90/bin とかですか? Fortran のコンパイラと見たので
特に関係はないかと判断したのですが、どうなんでしょうね。

No. 3814 # どら 2004/06/20 (日) 21:09:26
>>3811 68user
お手数をおかけしてすいませんでした。
説明がわかりやすくてうれしかったです!!

PATHから/usr/ucb/ccを削除してみました。
そしたらいままでの警告文はなくなりました!!ありがとうございました。
しかし今までになかった警告文がでました。

-------------------------------------------------------------------
"ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります
-------------------------------------------------------------------

というものでした。今まではこんな警告もなかったし、3行目の空白も見当たりません。
この前載せたプログラムと同じものなのですが、#includeと<stdio.h>の間の空白を消してみましたが同じでした。
またなにか問題なのでしょうか?他の例題に関してもまったくおんなじ警告文がでます…
この形の警告文はたいていプログラムの問題だったので、プログラムをいじれば解決していたのですが…

あと、もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが…
いろいろなホームページ上の例題をやってみたのですが、どれもうまくいかなくて…
(特に、Cのプログラムをgnuplotに出力させたいのですが、gnuplot本体を置くディレクトリの場所とか、リンクの仕方とか…)
もし時間があればでけっこうですので、少し教えていただけないでしょうか。よろしくお願いします。

No. 3815 # 68user 2004/06/21 (月) 11:07:58
>>3814 どら
> "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります
ソースを少しずつ削って、この警告が出る場所を特定してください。
問題の行を特定したけれども原因がわからない場合は、
      % od -cx < ex3-1.c (最小限まで削ったファイル)
として、変な文字が入っていないか確認してください。

> もしよろしければ、gnuplotの使い方も教えていただければうれしいのですが…
質問がある場合は
    http://www.hyuki.com/writing/techask.html
を熟読した上でお願いします。ただしこの掲示板ではこれまで gnuplot の話題が
出たことはないので、
      Gnuplot Q&A 掲示板
          http://ayapin.film.s.dendai.ac.jp/cgi-bin/trees.cgi
などで聞いた方がよいかもしれません。適切な答えをもらうにはどこで
質問するのが効果的かを見極めた上でどうぞ。

それはそれとして
> Cのプログラムをgnuplotに出力させたいのですが
やればできるでしょうけど、gnuplot の使い方としては適切ではないような気がします。

No. 3816 # どら 2004/06/22 (火) 11:16:48
>>3815 68user

>> "ex3-1.c", 3 行目: 警告: 指令中に無効な空白文字があります
>ソースを少しずつ削って、この警告が出る場所を特定してください。
includeの文を1行全部削ってみた所、正常に動きました。
しかし、includeの文はプログラムには絶対必要なものと思っていたのですが…
include文が無くても動くということはありえるのですか?
下に正常に動いたプログラムを書きます。
-----------------------------------------------------------------------
/* 【例題3.1】 rei3_1 */

main()
{
    int a,b;

    printf("異なる2つの整数を入力してください--->");
    scanf("%d %d",&a,&b);
    if(a > b)
    printf("%d --- BIG\n",a);
    
}
------------------------------------------------------------------------

No. 3817 # 68user 2004/06/22 (火) 12:16:39
>>3816 どら
> includeの文を1行全部削ってみた所、正常に動きました。
逆です。動くように削っていくのではなく、動かない最小限の部分を
突き止め、その原因を探る方法を教えたつもりです。

つまり #include に原因があることがはっきりしたので、
    % grep include ex3-1.c | od -cx
として、なぜ警告が出るのかを調べるべきです。

> include文が無くても動くということはありえるのですか?
いろいろありますが、初心者のうちは include 文は書くべきと
思っておく方がよいでしょう。

No. 3818 # どら 2004/06/22 (火) 15:36:28
>>3817 68user

この前のプログラムから、#includeと<stdio.h>の間の空白を削除してみましたが、やはり同じ警告が出ました。
それで、そのプログラムにgrepをかけてみました。どこに空白文字があるのかがわかりません…
あるとしても最後の“\d\n”ぐらいだと思うのですが、これは指令とは関係ないし、必要なもののはずなのですが…

下に“grep include ex3-1.c | od -cx”の結果を書きますので、終えてください。よろしくお願いします。
--------------------------------------------------------------------------
0000000 # i n c l u d e < s t d i o . h
                        2369 6e63 6c75 6465 3c73 7464 696f 2e68
0000020 > \r \n
                        3e0d 0a00
0000023
-------------------------------------------------------------------------

No. 3819 # 68user 2004/06/22 (火) 21:23:39
>>3818 どら
> 0000020 > \r \n
改行コードが CR LF になっています。UNIX の改行コードは LF です。
CR が空白文字扱いされているのでしょう。

とりあえず CR を削るだけなら tr コマンドが使えます。
    http://x68000.startshop.co.jp/~68user/unix/pickup?tr

Windows で作ったソースを ftp などで UNIX 上に持ってきて
いるなら、アスキーモードで転送しましょう。ただし、全て
UNIX 上で開発するのがスキルアップへの道だと思います。

No. 3820 # どら 2004/06/22 (火) 23:53:00
>>3819 68user

trコマンドで\r\nを\nに変えてみるとうまく作動しました。
ためしに、ftpでの転送もアスキーモードに変えると
うまく作動しました。
原因が改行コードとは…気づきませんでした。

いろいろとありがとうございました。

No. 3821 # マツマツ 2004/06/23 (水) 22:43:52
初めて掲載しますが....、
ソケット通信で、select()を使用した非同期通信をさせているのですが、
select()で検知した当該FDを(例としてFD=10と設定)recv()したら、
FD=10のrecv()返値が0(CLOSE?)となることがあります。
recv()返値が0の場合は、相手側がCLOSEしたものと認識はできるのですが、
疑問に思う動作でそれは、通常FD=10ならFD=10を介して送受信を行い、
select()監視しさせて、何かイヘ゛ント発生があればrecv()の動作に遷移する
動きを正常にしているのですが、突然的に(不規則と言うか、不確定と言うか)
FD=10で送信後そのFD=10で受信するのに、select()からの戻りが数十秒
(ほとんど決まって、24〜25秒経って)経って検知され、recv()したら
返値が0であると言う動作があります。
このような動作になる原因が解らず、何かヒントや調べる手立てとかありませんか???。
(これって、ネットワーク障害/ネットワーク負荷とか、相手側マシンのHW的障害
などの影響も考えられますか....???)
...記述表現が的確でありませんが、ご了承ください。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3822 # ユウキ 2004/06/24 (木) 01:45:54
いまここのHTTPクライアントを参考にして
POSTをCGIへ仲介するCGIを作っているのですがうまくいきません;
GETのところを
print SOCKET "POST / HTTP/1.0\r\n";
print SOCKET "Content-Length: $size\r\n";
print SOCKET "\r\n";
print SOCKET "$buffer\r\n";
として
$buffer = $ENV{ 'QUERY_STRING' };
$size = length $buffer;
を追加してみたのですが・・・。お知恵を拝借できませんでしょうか?

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3823 # 68user 2004/06/24 (木) 02:14:44
>>3821 マツマツ
> FD=10で送信後そのFD=10で受信するのに、select()からの戻りが数十秒
> (ほとんど決まって、24〜25秒経って)経って検知され、recv()したら
> 返値が0であると言う動作があります。
よく理解できませんが、
    1. send し、select で待つ。
    2. 相手側はデータを受信後、すぐに close しているはず。
    3. ところが select で 24〜25 秒待たされ、その後に読み込み可能になる。
    4. recv すると 0 が返ってくる。
ということであれば、
    a. ネットワークの質が悪く、TCP の再送タイマが働いている
    b. 2 で相手が 24〜25 秒かけて何かを処理してから close している
くらいしか思いつきませんでした。パケットダンプしてみては。

>>3822 ユウキ
そんな複雑なプログラムを書くのはやめて、まずは単純に POST する
プログラムを書くべきでしょう。もし、そういうプログラムは既に作成済
ということであれば、うまくいく場合とうまくいかない場合のリクエストを
見比べればわかるでしょう。


あと、質問をする前に
    http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse
を読んでください>質問者の方々

自分の使っている環境すら書かない人、回答してもわかったのかどうか返事さえ
書かない人が多くて、少々うんざりです。

No. 3824 # ユウキ 2004/06/24 (木) 04:44:17
申し訳ないです;少し安易に書き込んでしまいました。。。
単純にPOSTしてみます。深夜なのに申しわけなかったッス

No. 3825 # マツマツ 2004/06/24 (木) 15:55:40
●コメント/アドバイスの程ありがとうございます。
(個人的に多忙な面もあり、有意な内容が書かれていることに対して、
返事が遅れた点は、お許しください)

後追いの記載ですいませんが、使用しているマシンはSUNのSC2000
(OS:Solaris2.4)と、SVR4ベースOSを使ったマシン(ここでは相手側)
です。(LANのスペックは10BASE) <=両者とも今ではかなり古いものですが...。
またあえて言わしていただきますと、下記の3,4が発生するのは
SVR4ベースOSを使ったマシン側です。

> FD=10で送信後そのFD=10で受信するのに、select()からの戻りが数十秒
> (ほとんど決まって、24〜25秒経って)経って検知され、recv()したら
> 返値が0であると言う動作があります。
よく理解できませんが、
        1. send し、select で待つ。
        2. 相手側はデータを受信後、すぐに close しているはず。
        3. ところが select で 24〜25 秒待たされ、その後に読み込み可能になる。
        4. recv すると 0 が返ってくる。
ということであれば、
        a. ネットワークの質が悪く、TCP の再送タイマが働いている
        b. 2 で相手が 24〜25 秒かけて何かを処理してから close している
くらいしか思いつきませんでした。パケットダンプしてみては。

●まずは、LANアナライザーを噛まして見たいと思います。
    ちなみにTCPの再送タイマってものが働いている場合、そのタイマは
    24〜25秒の値なのでしょうか。

>>3822 ユウキ
そんな複雑なプログラムを書くのはやめて、まずは単純に POST する
プログラムを書くべきでしょう。もし、そういうプログラムは既に作成済
ということであれば、うまくいく場合とうまくいかない場合のリクエストを
見比べればわかるでしょう。
●そうですね。(基本的なことから行うべきですね)

No. 3826 # 68user 2004/06/24 (木) 21:05:18
>>3825 マツマツ
> ちなみにTCPの再送タイマってものが働いている場合、そのタイマは
> 24〜25秒の値なのでしょうか。
「詳解 TCP/IP Vol.1」によれば、RTT (往復時間) がほぼ 0 な LAN 上では、
再送間隔は
      1秒・3秒・6秒・12秒・24秒…
で、これを最初の送信からの経過時間で表すと
      1秒・4秒・10秒・22秒・46秒…
だそうです。

ただし RTT にそれなりの時間がかかる場合は、上記の通りには
なりません (計算式が難しくてよくわかりませんが)。

なお、上記の事柄が Solaris 2.4 や、同時代の SVR4 にも当て
はまるかどうかはわかりません。

No. 3827 # マツマツ 2004/06/24 (木) 22:32:53
> ちなみにTCPの再送タイマってものが働いている場合、そのタイマは
> 24〜25秒の値なのでしょうか。
「詳解 TCP/IP Vol.1」によれば、RTT (往復時間) がほぼ 0 な LAN 上では、
再送間隔は
            1秒・3秒・6秒・12秒・24秒…
で、これを最初の送信からの経過時間で表すと
            1秒・4秒・10秒・22秒・46秒…
だそうです。
●ありがとうございます。
(TCP/IPプロトコルについて、技術的な専門知識が分っていないため、
今後は勉強したいと思います。)
で、少々また不仕付けなお話ですみませんが、再送タイマが発生していると
した場合に、その原因/要因には、何があるでしょうか。
”ネットワークの質が悪く、TCP の再送タイマが働いている”
の部分で気になり、どちらかのマシンのHW不調(LANI/Fカードや
CPUボード等)とか、LANケーブル、HUB、トランシーバなどの
不調の影響で発生することとか考えられるでしょうか?。
(パケットトレースで確認することは必要なのですが、発生していると
分った時の発生原因を特定する上で、まず想定できる可能性のものがあれば
と思った次第からです)
(HW回りを疑って見るべきかどうか、何とも言えないのですが...)

ただし RTT にそれなりの時間がかかる場合は、上記の通りには
なりません (計算式が難しくてよくわかりませんが)。

なお、上記の事柄が Solaris 2.4 や、同時代の SVR4 にも当て
はまるかどうかはわかりません。

赤色の文字は 「Windows 機種依存文字」か、いわゆる「半角カナ」です。 この掲示板では自動変換されますが、今後は使用しないで下さい

No. 3828 # 68user 2004/06/26 (土) 00:30:41
>>3827 マツマツ
パケットを送信した後、一定時間が経過しても ACK が返ってこなければ
再送するわけなので、
> どちらかのマシンのHW不調(LAN・I/FカードやCPUボード等)とか、
> LANケーブル、HUB、トランシーバなどの不調の影響で発生することとか
> 考えられるでしょうか?。
これらすべてがパケット再送の原因となりえます。

No. 3829 # 68user 2004/06/26 (土) 00:43:43
この土日で当ページの引越しを予定しています。しばらく繋がらなかったり
するかもしれませんが、あらかじめご了承ください。

No. 3830 # 68user 2004/06/27 (日) 06:03:01
というわけで引っ越しました。

現時点でわかっている問題点は、
    - 掲示板の全文検索が動かない (準備中)
    - SEGA BBS 過去ログの全文検索が動かない (準備中)
です。この他に変なところがあればご指摘いただけると幸いです。

No. 3831 # 68user 2004/06/28 (月) 01:28:30
>>3830 68user
> - 掲示板の全文検索が動かない (準備中)
一応検索できるようになりました。

No. 3832 # 68user 2004/06/29 (火) 03:06:18
日記。

FreeBSD 5.2.1-RELEASE の /usr/bin/sort は NetBSD の sort から
GNU の textutils の sort に変わってしまったらしい。sort -c
で件数を数えることができなくなってしまった。ショック。

No. 3833 # 68user 2004/06/30 (水) 02:06:52
>>3832 68user
> sort -c で件数を数えることができなくなってしまった。
間抜けな勘違いをしていました。uniq -c と混同してただけでした。
sort も uniq もこれまで通り普通に使えますね。

No. 3834 # マオ猫 2004/06/30 (水) 23:03:44
最近になってTCP/IPの勉強を始めましたが、
    データリンク層
    トランスポート層
    ネットワーク層
の役割に反する実装の実例を挙げろって言われても……
何の事だかさっぱりです。
誰かわかるひといませんか?

No. 3835 # 68user 2004/06/30 (水) 23:19:43
>>3834 マオ猫
> …の役割
は何なのかをまず考えてみるべきでしょう。

ところで素朴な疑問ですが、これってどんな本 or 人 or 試験
からの出題ですか?

No. 3836 # 2004/07/03 (土) 21:41:41
いつも参考にさせてもらってます。
この度、仕事でSSL/TSLに対応したバッチ用のFTPクライアントが必要になったのですが、
Perlで実現できますでしょうか?
いろいろ検索してみたのですが、これといったのが見つからなくて・・・
もし何か知っていましたら、ご教授お願いします。

No. 3837 # 2004/07/03 (土) 21:43:42
ちなみに使用するサーバはRedHat Linux9.0です。

No. 3838 # 68user 2004/07/03 (土) 23:50:56
>>3836
> この度、仕事でSSL/TSLに対応したバッチ用のFTPクライアントが必要になったのですが、
> Perlで実現できますでしょうか?
Perl で「簡単に」行うモジュールはまだないと思います。Perl にこだわるなら
    http://perldoc.jp/docs/modules/IO-Socket-SSL-0.91/SSL.pod
などを使ってがんばるしかないでしょう。

あるいは http://www.perldiscuss.com/thread.php?group=perl.libnet
「Net::FTP versus TLS」のスレッドの人たちに「サンプルくれ!」とお願いする
手もあるかも (もらえたらわたしにもください)。

上記のスレッドでも出ていますが、手抜きするなら lftp (http://lftp.yar.ru/)
SSL/TLS に対応しているようなので、これを system なりで呼び出すのが楽だと思われます。

No. 3839 # 68user 2004/07/04 (日) 01:45:20
FreeBSD 5.2.1-RELEASE に TLS な proftpd をインストールし、lftpd で
接続してみるメモ。OpenSSL は標準でインスールされているが、なぜか
proftpd を make -DWITH_OPENSSL install すると ports の OpenSSL が要求
されるので、まずそれを入れる。

    # cd /usr/ports/security/openssl && make install
    # cp /usr/local/openssl/openssl.cnf.sample /usr/local/openssl/openssl.cnf
    # mkdir /usr/local/openssl/proftpd

鍵作成 (パスフレーズなし)。CSR を作成し、自己認証。

    # cd /usr/local/openssl/proftpd
    # openssl genrsa > key.pem
    # openssl req -new -days 365 -key key.pem -out csr.pem
    # openssl x509 -in csr.pem -out cert.pem -req -signkey key.pem -days 365

ProFTPD のインストール。

    # cd /usr/ports/ftp/proftpd
    # make -DWITH_OPENSSL install
    # mkdir /var/run/proftpd
    # cat <<END >> /usr/local/etc/proftpd.conf
    <IfModule mod_tls.c>
            TLSEngine on
            TLSLog /var/log/proftpd-tls.log
            TLSProtocol TLSv1
            TLSRequired off
            TLSRSACertificateFile /usr/local/openssl/proftpd/cert.pem
            TLSRSACertificateKeyFile /usr/local/openssl/proftpd/key.pem
            TLSVerifyClient off
    </IfModule>

ProFTPD 起動。rc まわりが rcNG になったので、proftpd_enable が必要 (?)

    # echo 'proftpd_enable="YES"' >> /etc/rc.conf
    # /usr/local/etc/rc.d/proftpd.sh start

lftpd で接続テスト。

    # cd /usr/ports/ftp/lftpd && make install
    % lftp -d hoge@localhost
    Password: ***
    lftp hoge@localhost:~> ls
    ---- Connecting to localhost () port 21
    <--- 220 ProFTPD 1.2.10rc1 Server (ProFTPD Default Installation) [hostname]
    ---> AUTH TLS
    <--- 234 AUTH TLS successful
    Certificate depth: 0; subject: /C=JP/ST=XX/O=Internet Widgits Pty Ltd; issuer: /C=JP/ST=XX/O=Internet Widgits Pty Ltd
    WARNING: Certificate verification: self signed certificate
    ---> USER hoge
    <--- 331 Password required for hoge.
    ---> PASS XXXX
    <--- 230 User hoge logged in.
    ---> PWD
    <--- 257 "/usr/home/hoge" is current directory.
    ---> PBSZ 0
    <--- 200 PBSZ 0 successful
    ---> PRET LIST
    <--- 500 PRET not understood
    ---> PASV
    <--- 227 Entering Passive Mode (127,0,0,1,192,51).
    ---- Connecting data socket to () port 49203
    ---> LIST
    <--- 150 Opening ASCII mode data connection for file list
    ---- Closing data socket
    <--- 226 Transfer complete.
    (略)
    lftp hoge@localhost:~>

No. 3840 # 68user 2004/07/05 (月) 01:37:21
どうでもいいんですが、ここ数年モチベーションが低下して、web の
更新が非常に少なくなっていました。

そこで数日前からトップページなどにバナー広告を付けてみました。
      バナー広告を貼る → 収入がっぽり → 更新する気力がわく
ということを夢見ていましたが、3日での収入はなんとびっくり 15円でした。
つまり 1日 5円。月に150円。年に 1800円。

5,000円以上にならないとお金が振り込まれないので、あと 2年半くらい
経ったらわたしは 5,000円手にすることになります。いやーここまで
儲からないものとは。

しかしわたしは変なところで前向きなので、今の 100倍の人が見にきて
くれれば毎日 500円、月に 15,000円も儲かるかと思うと、モチベーション
あがりっぱなしです。というわけで、訪問者を 100倍にする第一歩として、
    web と CGI のひみつ (http://X68000.q-e-d.net/~68user/webcgi/)

    全文検索 (http://X68000.q-e-d.net/~68user/webcgi/search-1.html)
を全面的にリライトしました。

No. 3841 # naisttn 2004/07/05 (月) 15:56:50
サイト更新ありがとうございます。参考にしてます。
全文検索できないのですが。(実行に必要な権限がない。とのこと)
テスト中でしたらすみません。

No. 3842 # 68user 2004/07/05 (月) 16:17:13
>>3841 naisttn
> 全文検索できないのですが。(実行に必要な権限がない。とのこと)
掲示板の全文検索ですね?

namazu.cgi の存在をすっかり忘れてしまい、cgi-bin/wwwboard/ 以下を
閲覧不可に設定してしまいました。本日中に直します。

No. 3843 # 68user 2004/07/05 (月) 19:44:14
>>3841 naisttn
直しました。ご指摘ありがとうございました。

結局 .htaccess を
    # namazu.cgi 以外はアクセス拒否
    SetEnvIf Request_URI "namazu.cgi" IS_NAMAZU
    order deny,allow
    allow from env=IS_NAMAZU
    deny from all
としたのですが、他にわかりやすい書き方ないですかねぇ?

    <Files !~ "namazu.cgi">
        deny from all
    </Files>
とか
    <Files "namazu.cgi">
        <Else>
            deny from all
        </Else>
    </Files>
とか
    <FilesMatch "(?:(?!namazu.cgi).)*">
        deny from all
    </FilesMatch>
とか書けないもんでしょうか。

てゆーか、apache の書式は絶対に腐ってると思う。

No. 3844 # 68user 2004/07/06 (火) 22:07:54
UNIX の部屋
      http://x68000.q-e-d.net/~68user/unix/
を更新しましたが、たいしたことは書いていません。

No. 3845 # ニッタン 2004/07/10 (土) 02:28:05
OpenSSLを使ってC言語でHttpClientを実装する方法を参考にさせて頂きました。
ですがサンプル通りでは、SSL_connect()で-1が返ってきます。
ずっと調べてまして、乱数を作成する時の種を設定しないと行けないみたいです。
それもある程度の長さの種じゃないと駄目なようです。(私の環境では32以上)
今、自宅なのでOpenSSLのバージョンはどれなのか判りませんが、
SSL_connect()するまでに以下の関数のどれかを使うと良い様です。
1、RAND_load_file()
2、RAND_seed()
3、RAND_poll()
一番楽なのは3を使うのが楽ですし、一般的で確実かもしれません。
ちなみにマスタリングTCP/IP SSL/TSL編のサンプルでは1が使われてました。

できれば、「SSL/TLS でアクセスしてみよう」に追記して頂ければ、
今後同じ所で嵌る人が困らないと思います。
お忙しいと思いますが、宜しくご検討下さい。

No. 3846 # 68user 2004/07/10 (土) 03:17:59
>>3845 ニッタン
質問ですが、
    http://search.luky.org/obu/msg02180.html
    http://search.luky.org/obu/msg02181.html
と同じく、/dev/random が存在しない環境でしたか?

No. 3847 # 68user 2004/07/11 (日) 22:58:42
UNIX の部屋
      http://x68000.q-e-d.net/~68user/unix/
を更新しましたが、苦労したわりに内容はいまいちです (m4 とか)。

あと、見栄えをいじりましたが、もし見づらかったら文句言ってください。

No. 3848 # bindユーザ 2004/07/12 (月) 15:04:02
ネームサーバはプライマリとセカンダリを置いて、プライマリが障害の場合セカンダリが応答しますよね。
この仕組みはどのように実現されているのでしょうか?
仮にプライマリがダウンした直後に、プライマリに問い合わせたクライアントがあったとすると、
応答待ちでしばらくするとエラーになりますよね?(自身なし)
しかし、しばらくすると、すべてのクライアントが障害のないセカンダリにのみ問い合わせるようになりますよね?(自身なし)
この間はどのくらいの時間なのでしょうか?
どこかで調整できるのでしょうか?

No. 3849 # ニッタン 2004/07/12 (月) 16:08:20
68userさん、お返事ありがとうございます。
実は、今日会社を休んだ為、OpenSSLのバージョンはまだ判っていませんが、
/dev/randomの件は、マスタリングTCP/IP SSL/TSL編には
少し紹介されてました。

結論から言いますと、多分/dev/randomは存在しない環境かと。
サンプルのソースだとOpenSSLのライブラリー部分で、
/dev/randomに標準でアクセスしに行く様になっているでしたら
現状のサンプルのままでも問題ないかと思います。
(でも一文位あったら親切だな〜っと思ったりもします。お忙しいと思いますが)

プロキシー接続だったので、過去ログではプロキシーでしか検索していませんでした。
結局、プロキシー云々は関係なかったですが。

No. 3850 # 68user 2004/07/12 (月) 18:41:13
>>3848 bindユーザ
> プライマリが障害の場合セカンダリが応答しますよね。
これは誤りで、セカンダリは常にリクエスト・レスポンスの送受信を
しています。

> 仮にプライマリがダウンした直後に、プライマリに
> 問い合わせたクライアントがあったとすると、
タイムアウトすると即座にセカンダリにリクエストを投げると思います。

> すべてのクライアントが障害のないセカンダリにのみ
> 問い合わせるようになりますよね?
ならないです。プライマリにもアクセスし続けます。

以上はキャッシュサーバについての説明です。

通常のマシンはキャッシュサーバにアクセスするだけで、コンテンツ
サーバ (プライマリ DNS サーバやセカンダリ DNS サーバ) に直接
アクセスすることはない、ということに注意してください。

とか言いつつ、わたしは DNS サーバの運営をしたことがないので、
嘘をついているかもしれません。
    http://dns.qmail.jp/server/
をご一読ください。


>>3849 ニッタン
ソースが不十分であることは認識していますので、直します。

# ついでにエラーメッセージの出力が不十分なので、これも
# 直します。

ただ、なぜ RAND_load_file()/RAND_seed()/RAND_poll() しなければ
ならないのかを正確に書きたかったので、質問させていただきました。

今気づきましたが、FAQ にも書いてありますね。
      http://www.openssl.org/support/faq.html#USER1

1週間ほど時間をください。

No. 3851 # hash 2004/07/12 (月) 22:16:23
>>3847 68user
チェックボタンをonにする、ラベル用途のJavaScriptでエラーが出ます。
数年前からだと思うのですが…

私は、Windows2K & ie6ユーザーです。

No. 3852 # 68user 2004/07/12 (月) 22:41:35
>>3851 hash
ありがとうございます。丸一年気づいていませんでした。
さきほど修正しました。

どうでもいいんですが、こういう用途に使える label 要素
ってのがあることをつい先日知りました。

http://tohoho.wakusei.ne.jp/html/label.htm

No. 3853 # 68user 2004/07/12 (月) 23:51:24
この掲示板の全文検索 (namazu.cgi) ですが、問題が発生したため
再び休止します。

No. 3854 # tototo [E-mail] 2004/07/13 (火) 09:33:12
お聞きしたいのですが、
Linuxでのbashシェルを使った
環境変数PATHの順番を変更するやり方を教えてください。

No. 3855 # 68user 2004/07/13 (火) 12:33:21
>>3854 tototo
お望みの PATH をそのまま設定する方が自然だと思われます。
どうしても「順番の変更」でなくてはならない理由はありますか?

No. 3856 # ニッタン 2004/07/13 (火) 13:02:44
68userさん、
お忙しいとは思いますが、よろしくお願い致します。
とっても有益な情報が沢山載っているので、
今後も役立つと思いますので、頑張ってください。

私の方でももう一度、調べてみましたが
RAND_poll()が、自動的に呼ばれる様になっていますね。
(FAQにもそれらしい事が書いてあるような気もしますね。)
私の使っている環境に移植してきた担当者が
RAND_poll()を空関数に実装し直していました。
出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。

No. 3857 # つばき [E-mail] 2004/07/13 (火) 14:44:25
はじめまして。大学生をやっていますつばきです。
Unixのコマンドの意味でわからないことがありました。
学校の課題で「ftp」と「rcp」の違いを説明せよ、というものがありまして、
こちらのサイトでコマンドを検索してみたのですが、
「ftp」はファイルを置いてくる/持ってくる、「rcp」はファイルをコピーする、という説明が出てきました。
この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが
具体的な違いは何なのでしょうか。
できれば、でよろしいのでご回答お願いします。

No. 3858 # 68user 2004/07/13 (火) 15:09:09
>>3856 ニッタン
> 出来れば、ERR_print_errors_fp()の存在も追記して頂けると重宝すると思います。
了解です。

>>3857 つばき
> この二つ、特に持ってくるとコピーするの部分は同じ意味のような気がするのですが
同じです。
    - ftp なら get するか、put するか
    - rcp なら rcp ./file host: するか rcp host:file . するか
の違いです。

わたしの思う大きな違いは Anounymous ftp という仕組みでファイルを
配布できるのが ftp、そうでないのが rcp。

後は些細な違いしかないと思いますが、それでも 10 や 20 はあげられる
かと思います。課題ということなのでいろいろ調べてみてください。

No. 3859 # samsara 2004/07/13 (火) 15:57:04
はじめまして、ネットワークプログラミングの勉強をしています。
Windows上でネットワーク関連のソフトウェアを作成したことはあるのですが、
ライブラリを使用していた為、SocketAPI等はあまり深い知識がありません。
そこで教えていただきたい事があるのですが、ここの掲示板でよろしいでしょうか?

1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか?
2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか?

参考情報等教えていただきたいと思ってます。宜しくお願い致します。

No. 3860 # tototo 2004/07/13 (火) 16:51:20
順番変更しなければならない理由はないのですが、
PATHの順番を変更するやり方
はあるのかが気になったのため、お聞きしました。

No. 3861 # 68user 2004/07/13 (火) 21:46:58
>>3859 samsara
> 1.WindowsのSocketとUNIXのSocketで関数の違い等あるのでしょうか?
http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/bsd-compatibility.html など。

> 2.UNIXのSocketでも、Linux、FreeBSD、Solaris等で違いがあるのでしょうか?
たとえば
    http://x68000.q-e-d.net/~68user/net/echo-3.html#6
の backlog とか、UDP で受信できる最大サイズを超えた場合の
処理などですかね。より詳しいことを知りたいなら
    http://x68000.q-e-d.net/~68user/net/link-book.html
        「UNIX ネットワークプログラミング第2版 Vol.1」
をどうぞ。後は
    http://apr.apache.org/
などのライブラリのソースの #if 部分をとことん読む、などなど。

>>3860 tototo
> PATHの順番を変更するやり方
    PATH=`echo $PATH | sed 's@/usr/bin:@@'`':/usr/bin'
とか
    for i in `echo $PATH | tr ':' ' '`; do
          いろいろ
    done
とかですかねぇ。

No. 3862 # 68user 2004/07/13 (火) 22:24:51
ここ数ヶ月 (web 引越し前)、マルチポストしたり回答しても返事すら
書かない質問者が多く、困っていました。困るだけならまぁいいんですが、
わたしの web 更新のモチベーションを大いに下げてくれました。

というわけで、↑に書いたとおり、
      http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse
を読まない・読んでも守りたくない人は質問しないでください。
もちろん、これらのルールを守っておられる方々の質問は引き続き
歓迎いたします。

これはマナーではなく、この掲示板のルールであることに注意して
下さい。これが気にいらない方は (当然ながら) この掲示板を見ない
自由があります。

web 引越し後は以前のような不届きな質問者はいなくなったようで、
とてもうれしく思っています。

No. 3863 # samsara 2004/07/13 (火) 23:01:52
68userさま、回答ありがとうございます。
教えていただいたページをじっくり読んでみます。

No. 3864 # 68user 2004/07/14 (水) 02:36:01
>>3845 ニッタン
自分用のメモ。ソースが
    SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method());
    SSL ssl = SSL_new(ctx);
    SSL_connect(ssl);
となっていたとして、

      SSL_CTX *SSL_CTX_new(SSL_METHOD *meth){
            ret->method=meth;

      SSL_METHOD *SSLv23_client_method(void){
            SSLv23_client_data.ssl_connect=ssl23_connect;

      int ssl23_connect(SSL *s)
            ret=ssl23_client_hello(s);

      static int ssl23_client_hello(SSL *s)
            RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE);

      int RAND_pseudo_bytes(unsigned char *buf, int num)
            const RAND_METHOD *meth = RAND_get_rand_method();
            return meth->pseudorand(buf,num); /* (*1) */

      const RAND_METHOD *RAND_get_rand_method(void)
            default_RAND_meth = RAND_SSLeay(); /* (*2) */
            return default_RAND_meth;

      static int ssleay_rand_pseudo_bytes(unsigned char *buf, int num){
            ret = RAND_bytes(buf, num);

      static int ssleay_rand_bytes(unsigned char *buf, int num)
            if (ok){
                  ...
            } else {
                  RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED);

ときて「PRNG not seeded」エラーになる、てな感じですかね。


(*1)
      RAND_METHOD rand_ssleay_meth={
            ssleay_rand_seed,
            ssleay_rand_bytes,
            ssleay_rand_cleanup,
            ssleay_rand_add,
            ssleay_rand_pseudo_bytes,
            ssleay_rand_status
      };

      typedef struct rand_meth_st {
            void (*seed)(const void *buf, int num);
            int (*bytes)(unsigned char *buf, int num);
            void (*cleanup)(void);
            void (*add)(const void *buf, int num, double entropy);
            int (*pseudorand)(unsigned char *buf, int num);
            int (*status)(void);
                } RAND_METHOD;
(*2)
      RAND_METHOD *RAND_SSLeay(void)
            return(&rand_ssleay_meth);

No. 3865 # つばき [E-mail] 2004/07/14 (水) 10:40:53
68user様。回答ありがとうございました。
自分なりに調べまして解決しました。助言を下さってありがとうございます。

No. 3866 # 2004/07/14 (水) 11:17:29
To UNIXの部屋管理者様
もしかすると変なことを行ってるかもしれませんが。
cp -r の項目で以下の解説が有りますが。

-R ディレクトリを再帰的にコピーする
ディレクトリ dir1 以下に、ファイル foo・bar があった場合、
% cp -R dir1 dir2
は、ディレクトリ dir2 の下にディレクトリ dir 1をコピーする。つまり
dir2/dir1/foo、dir2/dir1/foo <<<<<<<<<の二項目はdir2/dir1/barではないでしょうか
というファイルが新たに作成される。一方、
% cp -R dir1/ dir2
とすると(`/'を付けると)、dir2 の下に dir1 以下のファイル・ディレクトリをコピーする。つまり
dir2/foo、dir2/foo <<<<<<<<<同様にの二項目はdir2/barではないでしょうか
というファイルができる。

No. 3867 # ニッタン 2004/07/14 (水) 12:18:27
68userさん、はいそうです。
ここまで調べるのは苦労しませんでしたか?
私はマスタリングTCP/IP SSL/TLS編がなければ
未だに判らなかったと思います。

No. 3868 # jeiu 2004/07/14 (水) 17:44:12
ただいまSLL勉強中です。このHPも参考にさせて頂いています。
つまらない質問ですが初心者の至りということでお許しください。
ネットワークプログラミングの基礎知識 >> RSA で暗号化してみよう (1)に
暗号化のサンプルがありますが、これらの作業はOpenSSLのライブラリの中で
行われている事なのでしょうか。
たとえば、ネットワークプログラミングの基礎知識 >> SSL/TLS でアクセスしてみよう (1)
には暗号化の記述はありませんが実際には指定したプロトコルで暗号化が行われている
と思います。どこで実装されるものなのでしょうか?

No. 3869 # 68user 2004/07/14 (水) 23:15:03
>>3866
ご指摘のとおりかと思います。というわけで、修正しました。
      http://X68000.q-e-d.net/~68user/unix/pickup?cp
ありがとうございました。

>>3867 ニッタン
> ここまで調べるのは苦労しませんでしたか?
調べるのに 3日かかってますので、苦労しました。

でも、なぜ RAND_poll() したらエラーにならないのかいまいち
わかっていません (別にこれがわからなくても構わないんですが、
気になるもので)。

>>3868 jeiu
> どこで実装されるものなのでしょうか?
OpenSSL のライブラリの中です。

SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を
提示し、サーバがその中から選びます。よって常に RSA が使用される
わけではありません (DH を使う場合もある)。

で、暗号スイートを提示したり、RSA で暗号化・復号化したり、
DH で鍵交換したり、プレマスターシークレットを送ったり、
ということはすべて OpenSSL のライブラリ中で記述されています。

No. 3870 # ニッタン 2004/07/15 (木) 22:09:01
>調べるのに 3日かかってますので、苦労しました。

でしたら、やはりお持ちのマスタリングTCP/IP SSL/TLS編を
辞書的に使いながら追いかける方がいいかもしれませんよ。

>でも、なぜ RAND_poll() したらエラーにならないのかいまいち
わかっていません

結局、RAND_poll()内で乱数の種をプロセスIDや/dev/randomなどを使って作成して
RAND_add()しているからだと思います。
RAND_seed()も結局、RAND_add()をしていますし。

No. 3871 # 68user 2004/07/16 (金) 02:33:49
>>3870 ニッタン
/dev/random や /dev/urandom がない環境ではエラーになるが、
RAND_poll() を呼ぶとうまくいくと。

ということはおそらく RAND_poll() を呼ぶと
      http://snapshots.jp.freebsd.org/tour/current/userland/S/7348.html#145
に処理が移ると思います。

# このソースは OpenSSL 0.9.7d です。

ここでは /dev/random や /dev/urandom を読んでいろいろやって
ますが、/dev/random や /dev/urandom がない環境なので、結局は

    unsigned long l;

    l=curr_pid;
    RAND_add(&l,sizeof(l),0);
    l=getuid();
    RAND_add(&l,sizeof(l),0);
    l=time(NULL);
    RAND_add(&l,sizeof(l),0);

だけが実行されると思います。ここで 第三引数の entropy には全て 0 を
渡しています。

RAND_add を呼ぶと ssleay_rand_add が呼ばれ、
      http://snapshots.jp.freebsd.org/tour/current/userland/S/7341.html#190
が実行されます。

    if (ok)
        return(1);
    else
        RANDerr(RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDED);

とあるのがエラーになっている箇所かと思います。つまり RAND_poll() を
呼ぶと ok が真になり、RAND_poll() を呼ばないと偽になる、と。ここで
ok とは何かというと

    ok = (entropy >= ENTROPY_NEEDED);

です。ENTROPY_NEEDED は

    ./crypto/rand/rand_lcl.h:#define ENTROPY_NEEDED 32 /* require 256 bits = 32 bytes of randomness */

なので、entropy <= 32 なときに RPNG_NOT_SEEDED でエラーになる。
逆に言えば、RAND_poll() を呼ぶと entropy >= 32 になるためうまく
いくようになる、ということです。しかし entropy を増やしているのは

    entropy += add;

しかないような気がします。でも、add は RAND_add() の第三引数で、
今回はすべて 0 が渡されています。よって、

    entropy += 0;

となるわけです。それなのになぜ entropy が増えて >=32 になるのか
わからないなぁ、といったところで止まっています。

「マスタリングTCP/IP SSL/TLS編」は調べましたが、内部構造には
触れていようで見つけられませんでした。もしどこかに載っていたら
教えてください。

No. 3872 # 68user 2004/07/16 (金) 02:58:19
>>3872 68user
続きです。

こちらには /dev/random・/dev/urandom が存在しない環境がないため、
FreeBSD で OpenSSL のソースをいじって、無理矢理 /dev/random・
/dev/urandom が存在しない状況を作ってみました。その結果、
    PRNG not seeded
なエラーが発生しました。

しかし SSL_connect() の直前に RAND_poll() を挿入しても、同じく
PRNG not seeded となりました。そこで確認させていただきたいのですが、

>>3845 ニッタン
> SSL_connect()するまでに以下の関数のどれかを使うと良い様です。
> 3、RAND_poll()
> 一番楽なのは3を使うのが楽ですし、一般的で確実かもしれません。
はそちらの環境では正常に動作しているのですよね?

No. 3873 # jeiu 2004/07/16 (金) 11:57:50
回答ありがとうございます。
もうひとつ教えてください。

>SSL/TLS はクライアントが利用可能な暗号 (正しくは暗号スイート) を
>提示し、サーバがその中から選びます。よって常に RSA が使用される
>わけではありません (DH を使う場合もある)。

クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか?

たとえば、SSL V2に対応したアプリケーションとかV3に対応した
アプリケーションとかで決まることなのでしょうか?
または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。

No. 3874 # 68user 2004/07/16 (金) 12:41:39
>>3873 jeiu
> クライアントから提示する暗号方式とはなにをもとに決められるのでしょうか?
クライアント作成者が勝手に決めます。例えば 3DES と RC4 はいいけど
DES は暗号強度が気に入らないから使わないとか、MD5 より強固な SHA-1 を
使うとか。

OpenSSL であれば SSL_CTX_set_cipher_list() を使って好きな暗号
スイートをセットすればよいでしょう。

暗号スイートは具体的には
      http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt

    TLS_RSA_WITH_3DES_EDE_CBC_SHA
    TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
などを指します。

上記 RFC の ClientHello がクライアントからの暗号スイートの提示、
ServerHello がサーバからの暗号スイート決定通知、です。

> または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
> 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。
これは意味がわかりませんでした。

No. 3875 # ニッタン 2004/07/16 (金) 12:48:04
誤解を招くような書き方をしてしまいました。
申し訳ありません。
まず、RAND_poll()はRAND_byte()やRAND_status()の始めての呼び出しの際に
一度だけ呼ばれていると思われます。
RAND_poll()内では/dev/random・/dev/urandomを使用して
乱数の種を作っています。

/dev/random・/dev/urandomが存在しない環境でも
上記の様にRAND_poll()は呼ばれていますが、
No.3871の通り
乱数の種は作られません。
そこで、RAND_poll()を自前で呼び出しても同じ結果になります。

つまり、RAND_F_SSLEAY_RAND_BYTES,RAND_R_PRNG_NOT_SEEDEDのエラーが
発生した時は
RAND_poll()で乱数の種を作成するのに失敗しているので、
自前で乱数の種を作らないといけない
と言った説明を追記して頂ければいいと思います。

自前で乱数の種を作るのが
1、RAND_load_file()

2、RAND_seed()
と言う訳です。

貴重な時間を割かせてしまいまして、申し訳ありませんでした。

No. 3876 # 68user 2004/07/18 (日) 00:14:10
>>3875 ニッタン
更新しました。長らくお待たせしてすいません。
      http://X68000.q-e-d.net/~68user/net/ssl-1.html

詳しく説明しようとして、ドツボにはまった感がありますが、
いかがでしょうか。

RAND_status を呼べばその中から RAND_poll が呼ばれるのですが、
あえて RAND_poll を呼んでいるのは、マニュアルに書いてないこと
はなるべく前提としないでおこう、という方針だからです。

最初のサンプルプログラムがこれではわかりづらすぎるかなぁ。

No. 3877 # ニッタン 2004/07/19 (月) 12:23:11
ありがとうございます。
色々と勉強したので、私には理解できますが、
今後、初心者が読んだ場合に理解できるかはどうかは、
この掲示板にでも書き込んでくれる事を期待して、
この話題は一旦終了しましょう。

>最初のサンプルプログラムがこれではわかりづらすぎるかなぁ。

結局、/dev/randomがない環境では、種を作らないとエラーになるので
仕方ないと思います。
一応、/dev/randomがある環境では必要ないと補足してありますし。

今までありがとうございました。今後も参考にさせて頂きます。

No. 3878 # jeiu 2004/07/20 (火) 15:56:20
>> または、Open SSL等で自力でSLLを実装するような場合は、対応できる暗号方式が
>> 特定される(できる?)のであれば、それだけでは決まらないような気もしますが...。
>これは意味がわかりませんでした。

わけのわからない質問をしてすみません。
聞きたかったのは、クライアントが決める暗号化方式はどこで定義するのか?
とういうことでした。
あるHPでは、「暗号化に関する特許などが絡んでいるため、わけのわからないものは
コンパイルオプションを使って使用しないほうがよいでしょう」と書かれていたり、
ちょっと混乱状態です。
も少し勉強が必要かなと思います。

No. 3879 # jeiu 2004/07/21 (水) 14:07:32
68user殿

No.3874の
>OpenSSL であれば SSL_CTX_set_cipher_list(ctx,ciphers) を使って好きな暗号
>スイートをセットすればよいでしょう。
のciphersには具体的にはどのような設定をすればよいのでしょうか?

いずれにしても、どの暗号化方式を利用するかは上記のようにプログラミング依存
ということになるんでしょうか?(とすると、No.3878にも書かせていただきましたが
「コンパイルオプションを使って...」は何を意味するのでしょう。ご存知でしたら教
えてください)。

No. 3880 # 68user 2004/07/21 (水) 16:09:13
>>3879 jeiu
> ciphersには具体的にはどのような設定をすればよいのでしょうか?
概念は 3874で書いたとおり
> 例えば 3DES と RC4 はいいけどDES は暗号強度が気に入らないから使わない
などです。

ソースでどう書くかという意味なら
      SSL_CTX_set_cipher_list(ctx, "3DES:RC4");

      SSL_CTX_set_cipher_list(ctx, "ALL:-DES");
などです。書き方は OpenSSL のマニュアル ciphers(1) に載っています。

> 「コンパイルオプションを使って...」は何を意味するのでしょう。
「あるHPでは」などと曖昧なことを書かずに
    http://www.ryouto.jp/linux/linux_22.html
とはっきり書いてください (上記の URL であってるかはわかりませんが)。
文脈を無視して一文を切り出されても、答える方は推測しなければ
いけないのでつらいです。たとえば上記の web であれば config で
      no-rc5 no-idea
と指定しているので、このページの作者は RC5 と IDEA の特許について
危惧しているのだなということがわかるわけです。クイズじゃないんです
から、はっきり質問したいことを書きましょう。

IDEA については SSL/TLS 上で使えますし、普通に OpenSSL をコンパイル
した場合は有効になっています。ただし FreeBSD の OpenSSL では IDEA が
使用できないようにコンパイルされていました。他の厳しめの OS (Debian
とか) でも同様かと思われます。SSL/TLS で使用できるようになっているか
どうかは
      % openssl ciphers
でわかります。

RC5 は SSL/TLS で使用できる暗号スイートに入っていないので、
問題ないでしょう。

SSL/TLS ではなく、共通鍵暗号方式として IDEA や RC5 を使いたくない
(openssl enc -e idea や openssl enc -e rc5 とできないようにしたい)
ということであれば、上記のページのようにコンパイルオプションを
設定すればよいでしょう。使用中の OpenSSL で使えるかどうかを知りたい
なら
      % openssl enc -h
で表示される Cipher Types を見ればよいです。

なお、サーバ側で制御したいのであれば、Apache などの設定ファイルで
      http://httpd.apache.org/docs-2.0/mod/mod_ssl.html#sslciphersuite
を設定してください。


今後質問される場合は、質問の背景と、何が知りたいのかを明確にする
ことをお勧めします。

例:
    - SSL/TLS クライアントを作っている
    - 〜というページに〜という記述があり、特許を侵害してしまわないか心配だ。
    - クライアント側で特定の暗号を使用しないように制御する方法はあるか?

No. 3881 # Goldwasser [URL] 2004/07/21 (水) 18:33:58
RSAもいいけど楕円曲線暗号もね。
というわけで、Rubyで素数位数の群をもつ楕円曲線を生成するスクリプトを組んでみました。

No. 3882 # ニッタン 2004/07/21 (水) 19:28:10
まだまだSSLを思考錯誤中です。

「SSL/TLS でアクセスしてみよう (2)」に記載されているサンプルについて
注意して頂きたい事があります。
HTTPSに接続後のサーバ証明書のsubjectとissuerを出力する部分で、
メモリーリークが発生する様です。

具体的には、
132: str = X509_NAME_oneline(X509_get_subject_name(server_cert), 0, 0);

135: str = X509_NAME_oneline(X509_get_issuer_name(server_cert), 0, 0);
の返り値strそれぞれを
OPENSSL_free( str )すればメモリーリークは直りました。
OpenSSLのバージョンは0.9.7aです。

OpenSSLドキュメントを見ても該当関数の事が記載されていなかったので
内部でアロケートしているかどうかソースを追っかけないと判りませんでした。

No. 3883 # 68user 2004/07/21 (水) 21:03:29
>>3882 ニッタン
> HTTPSに接続後のサーバ証明書のsubjectとissuerを出力する部分で、
> メモリーリークが発生する様です。
ありがとうございます。

      The functions X509_NAME_oneline() and X509_NAME_print() are
      legacy functions
ということなので、X509_NAME_oneline() を使うのはやめて、
X509_NAME_print_ex() に変更しました。XN_FLAG_RFC2253 に
したのは特に意味はありません。

# http://x68000.q-e-d.net/~68user/net/ssl-2.html

No. 3884 # jeiu 2004/07/22 (木) 12:56:35
ごもっとなご意見です。いろいろ推測させてしまったようです。
すみませんでした。
68userさんの推測とおり、
・SSL対応のWebクライアントを作っています。
・(Open)SSLの実装では特定の暗号化ロジックを使わないようしたい。
    公開鍵の暗号化としてRSAを使いたいが有効鍵ビットは512としたい
    共有鍵の暗号化としてRC4を使いたいが有効鍵ビットは40としたい


これまでに以下の情報をご提供いただきました。
1.使用したい暗号化ロジックは SSL_CTX_set_cipher_list()で指定
2.暗号化方式として特定のロジックを使用禁止にしたいのであれば
    コンパイルオプションを設定すればよい
について、有効鍵ビットを意識した設定は可能なのでしょか
いろんなサンプルを見ましたが、方式の設定はあっても鍵長まで意識
したものが見つかりませんでした。
また、SSL_CTX_set_cipher_list()での設定は必須になるのでしょうか。

なかなかイメージがわきません。よろしくお願いします。

No. 3885 # 68user 2004/07/22 (木) 22:18:35
>>3884 jeiu
> 公開鍵の暗号化としてRSAを使いたいが有効鍵ビットは512としたい
> 共有鍵の暗号化としてRC4を使いたいが有効鍵ビットは40としたい
では
    http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2246-Ja.txt
の RSA_EXPORT_WITH_RC4_40_MD5 で決まりでしょう。RSA かつ
RC4 の 40bit となればこれしか選択肢がありません。

「RSA の鍵長 512bit 以下」という要件についてですが、これは
上記 RFC の
      7.4.3. ServerKeyExchangeメッセージ

          ServerKeyExchangeメッセージは (略) 以下の鍵交換方式で使用される。
                RSA_EXPORT (サーバ証明書の公開鍵が512ビットより長いとき)
          (略)
       注: 現在の米国輸出法では、米国から輸出したソフトウェアにおいては、512
         ビットより長いRSAのモジュラスを鍵交換において使用してはならない
         ことになっている。このメッセージを送信した場合、証明書内に含まれ
         ている512ビットより長いRSA鍵は、RSA_EXPORT鍵交換方式用の、512ビット
         以下の長さを持つ一時的RSA鍵に署名するのに使用される。
で自然とクリアできます。

結局、ciphers(1) に
      SSL_RSA_EXPORT_WITH_RC4_40_MD5 EXP-RC4-MD5
とあるので SSL_connect() の前に
      if ( SSL_CTX_set_cipher_list(ctx, "EXP-RC4-MD5") == 0 ){
            /* error */
      }
という処理を入れればよいでしょう。

No. 3886 # kawa 2004/07/23 (金) 12:16:04
68userさんのサイトで勉強させてもらってます。

http://x68000.q-e-d.net/~68user/net/rfc.html
こちらのページの、POPの「日本語訳」のところがリンクが失敗してる
ようですので、お知らせしておきます。

No. 3887 # 68user 2004/07/24 (土) 00:51:15
>>3886 kawa
> http://x68000.q-e-d.net/~68user/net/rfc.html
> こちらのページの、POPの「日本語訳」のところがリンクが失敗してる
> ようですので、お知らせしておきます。
修正しました。ご連絡ありがとうございました。

No. 3888 # スナフキン 2004/07/24 (土) 17:45:31
自前parseルーチンで以下の様な処理をしています。

foreach(split(/&/, $query)){
    my($name, $value) = split(/=/, $_);

〜日本語処理とかお約束の処理〜

# %FORMに格納
    if(exist $FORM{$name}){;#既に以前の$nameが有れば(2回目以降)
        push($FORM{$name}, $value);#@{$FORM{$name}}の配列に格納
    }else{
        $FORM{$name} = $value;#初めての出現ならば通常通りに格納
    }
}

細かい部分は省略してますが、例えば checkbox などで、

chbox1&val1&chbox1&val2&chbox1&val3

の様なデータが来た場合、

$ALL_VALUE = $FORM{chbox} . " @{$FORM{chbox}}";

として、

$ALL_VALUE = 'val1 val2 val3'

となる事を確認しています。

しかしなぜか、元のデータが複数の時の動作が理解できないのですが、
自分の理解が甘いような気もするので、ぜひとも動作の解説をしもらえない
でしょうか?


以下は確認用のサンプルです。2行目のコメントを外して違いを確認ください。
データの内容によって結果が違います。
変数の内容が判りやすいように print 文を入れています。

$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=1&cbox2=2&cbox2=3);
#$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=a&cbox2=b&cbox2=c);

    foreach(split(/&/, $query)){
        my($name, $value) = split(/=/, $_);
print qq($name=[$value]\n);

        if(exists $FORM{$name}){

            push(@{$FORM{$name}}, $value);
print qq( ->push:<$name>=[$value] count:). $#{$FORM{$name}} . qq(\n);
        }else{

            $FORM{$name} = $value;

        }
    }

print qq(Result1:[$FORM{'cbox1'} @{$FORM{'cbox1'}}]\n);
print qq(Result2:[$FORM{'cbox2'} @{$FORM{'cbox2'}}]\n);

無名配列が $value の内容によって識別できていないように見えます。

Windows版とLinux版のそれぞれ 5.6.1 で確認しました。

No. 3889 # スナフキン 2004/07/24 (土) 17:48:01
書き忘れましたが perl でのお話です。

No. 3890 # 68user 2004/07/24 (土) 18:18:52
>>3888 スナフキン
$query=qq(cbox1=1&cbox1=2&cbox1=3&cbox2=1&cbox2=4&cbox2=5);
foreach (split(/&/, $query)){
        my($name, $value) = split(/=/, $_);
        print qq($name=[$value]\n);
        if (exists $FORM{$name}){
                push(@{$FORM{$name}}, $value);
                print "\@{$FORM{$name}}=@{$FORM{$name}}\n";
        } else {
                $FORM{$name} = $value;
        }
}
print "\@1=@1\n";


cbox1=[1]
cbox1=[2]
@{1}=2
cbox1=[3]
@{1}=2 3
cbox2=[1]
cbox2=[4]
@{1}=2 3 4
cbox2=[5]
@{1}=2 3 4 5
@1=2 3 4 5

というわけで、最初のループで $FROM{$name} には 1 が入り、
@{$FORM{$name}} はシンボリックリファレンスと解釈され、結局
@1 に push しているわけです。

結局は一度目のループとそれ以降のループを分けず、常に
        push(@{$FORM{$name}}, $value);
すればよいと思いますが、そもそも何をやりたかったのかによりますかね。

No. 3891 # スナフキン 2004/07/24 (土) 20:47:20
!!!なんとなるほど!シンボリックリファレンスと解釈されたとは・・・
すばやい回答大変助かりました。ありがとうございます。

このルーチンはいくつかある他のプログラムの一部なんですが、既に$FORM{〜}
でアクセスする箇所が沢山有ったので、それらを変更する事なくという部分に
こだわりすぎました。

cgi-lib.pl とかを見るとparse時に \0 をセパレータにしてスカラーに入れて
いますが、そうではなく同名変数の配列にぶち込んじゃおうと思ったのですが
他の方法をかんがえてみます。

No. 3892 # じぇぃじぇぃ 2004/07/24 (土) 23:00:26
超初心者の質問でごめんなさい。

コマンドを入力すると、Command not found って、表示されるんです。
スペルは間違っていないのに。何が原因なのでしょうか?

また、コマンドを入力した時に、値段のような文字が、ずらっと表示される事が
あります。例:\245\242\245\257\245\273\245\271\270\242\244\254\244\242。
このようなことが起きる原因は、何でしょうか?

対処方法を教えて下さい。お願い致します。

No. 3893 # has 2004/07/25 (日) 01:15:39
>>3892 じぇぃじぇぃ
ネット上の文字のやりとりだけで環境を把握するのがちょっと大変そうですが…。

> コマンドを入力すると、Command not found って、表示されるんです。
結論から言うと、path変数が正しく設定されていないのが原因とは思いますが…。

とはいえ即解決には至れないので、まず回答にあたって次を教えてもらえますか?
・コマンドを入力するまでにどんな手順を踏むように指示されている?
・それに対しコマンドを入力するまでに実際にはどんな手順を踏んでいる?
・コマンド名は何?

> コマンドを入力した時に、値段のような文字が、ずらっと表示される事があります。
これも次を教えてください。
・使っている機器はPC?
    ・WindowsからTelnetやTeraTermなどを実行して開いたウィンドウで起こっている?
    ・それともPC上では直接Solarisやlinuxが動いていてそこで起こっている?
・機器はPCではなく大学の研究室かどこかのワークステーション?
・機器はワークステーションではなくX端末?


なお、この書き込みに関係なくすでに解決した場合でも、何をどうしたらうまく
できたのか、必ずここに書き込みしてください。

とりあえず今回は、質問するというだけでも一苦労だったとは思いますが、
回答する側もスムーズかつ効率的に解決する技術を習得しようとしている面も
あるので、質問する側としてもその時点でわかっていることをできるだけ
きちんと伝えることが大切かと思います。ぜひ実践していってください。

# まあそうは言っても、何が前提で、伝えるべき情報がどれなのかがわからなくて
# 余計困っているんだとは思いますが

No. 3894 # 68user 2004/07/26 (月) 00:11:55
ネットワークプログラミングの基礎知識に
    「*BSD で kqueue・kevent を使ってみよう」
          http://X68000.q-e-d.net/~68user/net/c-kqueue-1.html
を追加しました。

>>3892 じぇぃじぇぃ
> コマンドを入力すると、Command not found って、表示されるんです。
こちらもご参考に。
http://X68000.q-e-d.net/~68user/unix/pickup?Command+not+found

No. 3895 # じぇぃじぇぃ 2004/07/26 (月) 01:03:07
has 様。

ご丁寧なお返事ありがとうございます。

・コマンドを入力するまでにどんな手順を踏むように指示されている?
・それに対しコマンドを入力するまでに実際にはどんな手順を踏んでいる?
→サーバーにログインして、プロンプトを表示させる。
    (ここまではOK)その後、以下のような操作(コマンドの入力)を
    実行しています。
    
    nslookup www.○○○○○○.ne.jp
                                    ↓
                        (見つからない)
                                    ↓
    find /usr/bin -name nslookup -print
                                    ↓
                        (見つからない)
                                    ↓
    find /usr -name nslookup -print
                                    ↓
                        (見つからない)

・コマンド名は何?
→nslookup

・使っている機器はPC?
→Windows Xp

No. 3896 # じぇぃじぇぃ 2004/07/26 (月) 01:05:34
追記。


・機器はPCではなく大学の研究室かどこかのワークステーション?
→自宅PCです。

・機器はワークステーションではなくX端末?
→ワークステーション・X端末とは何でしょうか??


ほんとに、まぬけな答えをしてたら、ごめんなさい。
よろしくお願い致します。

No. 3897 # has 2004/07/27 (火) 04:06:18
>>3896 じぇぃじぇぃ
困っている内容:
Windows XPのPCから[telnet等のソフト]で[UNIX系のOS]マシンにログインし
「nslookup www.○○○○○○.ne.jp」を実行したが「Command not found」
と表示され正しく実行できない([]内は未だ不明)。

さらに教えてください。

1.nslookupが実行できない理由を調べる
  (ログイン先のマシンにnslookupコマンドが存在するか)
  (a)OSに依存しない確認
    ・ログイン先のマシンはどこのもの?(学校?自宅?レンタル?)
    ・ログイン先のマシンでnslookupが実行できた人は?できないのは1人だけ?
  (b)OSを特定してどこにあるか推定
    ・「uname -a」の実行結果は?

2.メッセージが正しく表示できない原因を調べる
  (1)文字コード種類を推定する
    「\???」は3桁の8進数であり、質問されたメッセージはEUCと思われる。
    (アクセス権があ)
  (2)リモートマシンでの言語設定を確認する
    「env | grep LANG」の実行結果は?

なおワークステーション・X端末については、別の機会としましょう。
我慢できなければ是非google等で調べてみてください。

No. 3898 # zsh 2004/07/27 (火) 12:36:47
>>3895 じぇぃじぇぃ
findコマンドでnslookupコマンドを検索されたようですが、
ここでの「見つからない」は、findコマンドが見つからなかったのか
findの結果、nslookupが見つからなかったのか判らないですね。
こういう場合は、実行ログを貼り付けた方が伝わり易いですよ。

No. 3899 # jeiu 2004/07/27 (火) 19:41:04
68user殿
ご回答ありがとうございます。返事がおくれて失礼しました。
しつこいようですがまた質問をさせてください(これで最後にします)。

教えていただいた暗号スイートですが、SSL_CTX_set_cipher_listで
複数指定はできないのでしょうか(リストというからには複数できるような...)。

Prev< No. 3625〜3899> Next  [最新発言に戻る] [過去ログ一覧]