>>3621 バンガード こんな感じですかね。 while read line; do prefix=${line%-r[0-9]} if [ "$prefix" = "aix4" ]; then echo "TRUE:$line" else echo "FALSE:$line" fi done < test_file |
>>3622 68user > prefix=${line%-r[0-9]} > if [ "$prefix" = "aix4" ]; then これだと、私が例で示させていただいたパターンにしか対応できませんよね。(そういう意味では私の示した例が悪かったですね) これを「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか? たとえば、以下のようなif文は無理でしょうか? if [ $line = "aix4"* ]; then |
>>3623 バンガード > 「aix4-r23,aix-r4x3」なども「一致」と見るような方法は無いでしょうか? > if [ $line = "aix4"* ]; then aix4* では aix-r4x3 はマッチしないように見えますが、 またしても不適切な例ではありませんか? > if [ $line = "aix4"* ]; then if ではできませんが、case ならできます。 while read line; do case $line in aix4*) echo aix4 ;; aix5*) echo aix5 ;; *) echo others ;; esac done < test_file |
>>3624 68user >aix4* では aix-r4x3 はマッチしないように見えますが、 >またしても不適切な例ではありませんか? おっしゃるとおりです。 重ね重ね申し訳ございません。 >if ではできませんが、case ならできます。 なるほど、caseでなら「aix4*」が可能ですか。 助かりました。 |
初めまして、裏方と申します。 WinSockを用いたウィンドウズネットワークプログラムで、インター ネットを介して、私のマシン名からIPアドレスを取得する方法に ついて悩んでいます。言語はC言語を扱っております。 ローカルネットワークではマシン名からIPアドレスを取得するには Gethostbyname関数で取得できるのですが、インターネットを介した 遠方のマシンのから私のマシンのIPアドレスを取得する事が出来ま せん。(私のはサーバマシンでは無いので当然なのですが・・・) 私のマシンは大学で扱っているもので、ネットワークに繋ぐたびに 動的なIPアドレスが割り当てられるのですがサーバプログラム等を 私のマシン上で動かすときにいちいち相手に今のIPアドレスを教え なければならないので非常に不便です。 どうにかして、私のマシン名からIPアドレスを取得する方法が あるのでしょうか?どなたかアドバイスをお願いします。 |
>>3626 裏方 - 逆引きできないから困っているの? (もしそうなら「マシン名」というのは何?) - IP アドレスがころころ変わるから困っているの? (もしそうなら「マシン名」は関係ないのでは?) - そもそもマシン名って何を指しているの? FQDN? - DHCP で振られる IP アドレスには FQDN が設定してあるが、 外部向け DNS サーバには登録してなくて、内部からしか逆引き できない、という状況? などなど疑問はつきませんが、http://www.dyndns.org/ などの DynamicDNS と呼ばれるサービスを使うのが一つの解でしょう。 ただしこれは、大学とは全く関係ない FQDN を、大学から付与されて いる IP アドレスに結びつけるということです。管理者が寛容である ことを期待するか、リスクを負ってこっそりやるのがよいでしょう。 |
始めまして、UNIX使い始めです。 この度、awkコマンドを使用してファイルを分別して削除するシェルを作成しているのです。 そこでお聞きしたい事がるのです。 awkコマンドのifなどの中で変数は使えないのでしょうか? 現在、全ファイルに作成日付が付加されており、 指定日より前の物を削除したいいのです。 シェルの前半で指定日付を変数へ代入し、 lsとawkをパイプで繋いで削除しようとしています。 awk内のifなどによる条件判断で変数を宣言すると$0のメンバー名全体が表示されており、判別できないのです。 (ifを削除しprintで変数を表示させて確認) 出来ないのであれば何か別の方法を考えなくてはいけないのですが、 何方かお答えください。 |
>>3628 Tangerine 具体的にどのようなスクリプトなのか見せて頂けませんか? (そもそもawkを使う必要があるのでしょうか?) |
返信遅れてすいません。 えっと、確かに自分も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じゃなくて別の方法で行えるのであれば、 御教授いただけると嬉しいです。 |
>>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 |
>>3631 zsh おおっ!!有難う御座います(T▽T) なるほど、forですね。なんとも勉強不足でした(^^; やはりawkでは変数をそのまま引き継げないのですね。 awk内で更に変数に入れ込まなければいけないとは(^^; 有難う御座います。 教えていただいた方法で作成していきます。 本当に助かりました(w |
>>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 オプションを付け、変数が狙い通り展開されているかどうか チェックする癖をつけましょう。 |
なるほど〜、ややこしい事になっていたのですね〜 おかげさまで希望の日付以前のファイルを削除することが出来ました、 有難う御座います。 追伸 >% sh -x hoge.sh 使うようにしてみます(^^; |
>>3633 68user その方法があることをすっかり忘れてました。 (というか使った試しが無い・・・反省) いつもながら勉強になります。 |
初めまして、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); |
>>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 は、ホスト名も受け付けるように機能拡張されているわけです。 |
また初歩的なことで申し訳ありません。 以下のプログラムで、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 最初のプログラムの様に、最初のループの結果を変数にセットする 場合で、ループから出た以降も配列の中身を保つ方法は無いでしょう か? |
>>3638 バンガード バッククォーテーションでくくると別プロセスになるから 変数を保持することはできないと思いますが・・・ |
>>3638 バンガード > このプログラムの3行目から10行目を以下の様に修正すれば この修正ではなぜダメなのか理由を書いていただかないと、代案が出せないです。 |
>>3640 68user 3行目から10行目の修正ですとwhile文の出力は標準出力へ出て行くだけです。 これを最初のプログラムの様にwhile文の出力を変数に格納したいと考えています。 |
>>3641 バンガード > while文の出力は標準出力へ出て行くだけ それは echo しているからでは? echo しなければ OK かと思います。 > while文の出力を変数に格納したいと考えています 修正版の方でも CMD[$INDEX]=$LINE と格納しているように見えます。 また、ループを抜けた後でも参照が可能だと思います。 |
>>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から抜けた後も配列の内容が参照出来る様にするにはどうしたら良いのでしょうか? |
>>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 行分だけの出力が得られました。 |
>>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 |
>>3645 バンガード > 御提示いただいたシェルなら当方(AIX 5.1)でも同様の結果が出ます。 そうでしょうね。 > 以下の様に修正した場合に配列の中身が2つ目のwhile文で出力されなくなります。 そうなりますね。`〜` とするとサブシェルが起動されますから、 $CMD が設定されるのはサブシェルだけで、親のシェルには反映 されません。 質問を続ける目的が全く見えません。>>3644 のスクリプトは >>3641 の希望を満たしているように見えますが違うのですか? まだ説明して いない理由があって、>>3644 は採用できないのですか? |
>>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文の出力をファイルに格納するしかないかと考えています。 もし、それ以外の方法があるのであれば、お教えいただけると助か ります。 |
>>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 |
>>3649 バンガード なるほど、全ては私の質問の書き方が原因だったのですね。 本当に申し訳ありません。 今回御指摘いただいた様な表現を最初からすべきでしたね。 御提示いただいたスクリプトで目的が達成できました。 重ね重ね誠にありがとうございました。 |
awk(正規表現?)でちょっと行き詰まってしまったので質問します。 OS:Solaris8 やりたいこと 環境変数の内容で awk を使ってテキストファイルの検索を行う。 検索に使用する環境変数を HOGE として awk '/ENVIRON["HOGE"]/ {print}' FILE_NAME を行っても検索されませんでした。 ちなみに {print ENVIRON["HOGE"]} とした場合には値が返りませんでした。 何か根本的なところで間違ってるかもしれませんが・・よろしくお願いします。 #grep $HOGE FILE_NAME とすれば出来るのですが・・awk で実現したいのです。 |
>>3650 m16 awk はよくわかりませんが、 % awk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME ですかね。 |
>>3650 m16 /usr/bin配下のawkでは環境変数を参照できなかったと思います。 /usr/xpg4/bin/awkかnawkを使ってください。 % nawk '$0 ~ ENVIRON["HOGE"] {print}' FILE_NAME |
68user さん zsh さん レスありがとうございます。 まだうまくいきません。 確認のため /usr/bin/awk 、/usr/xpg4/bin/awk 、 /usr/bin/nawk で { print ENVIRON["HOGE"] } としても空白しか出てきません。 もうちょっと修行してみます |
>>3653 m16 HOGEはちゃんとexportしてますよね? |
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です。 |
>>3655 すすむ すみません リストのファイル名は、 YYYYMMDDHHMMSSdata_tar.gz ↓ YYYYMMDDHHMMSSdata.tar.gz です。 |
>>3656 すすむ tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz ではどうでしょうか? |
>>3657 バンガード >tar -xvf /dev/rmt/1m ./bkup/200309*data.tar.gz 上手くいきません。 |
>>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 展開の時点でエラーになります。 メタキャラクタは必ずエスケープしましょう。 |
>>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 で試しましたが、結果は同じです。 |
>>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 の一読をお勧めします。 |
>>3661 68user まず最初にお断りさせていただきたいのですが、私が3660の投稿を行ったタイミングでは まだ3659の発言はありませんでした。 ですので、3660投稿の時点では3659の発言は読んでいませんでした。 ただ、どちらにしても私のテスト自体に思い違いがあった様で御指摘は大変参考になり ました。 御指摘誠にありがとうございました。 この投稿を送信次第御提示いただいた資料を参照してみます。 |
>>3659 68user >HP-UX 11i で試した限りでは、HP の tar ではワイルドカードは使用 >できないようです。 > - 全部 tar xf で展開し、狙いのファイルを拾う > - tar tf の結果を grep で拾って tar xf で完全なファイル名を指定する > - GNU tar をインストールする >などの方法を検討するのがよいかと思われます。 tar tvf の結果をgrepで拾って、tar xvf に対して完全なファイル名を 指定する方法でできました。 ありがとうございました。 |
はじめまして。Naokiと申します。 皆さんに教えていただきたいことがあり、書き込ませていただきます。 レンタルサーバーを借りてホームページを開設しようとしているのですが、 最初に読み込まれるトップページを指定したいのですが、どのようにしたらよいのでしょうか? 具体的には、アクセス元がパソコンor携帯かによって、それぞれのトップページを振り分けるCGI をトップページにしたいと考えています。(ファイル名はindex.cgi) サーバー会社に問い合わせたところ、『index.cgiやindex.phpをトップページにする方法として、 .fowardファイルにて操作可能』と言われ、それ以上はサポート外なので対応できないということです。 そこで、どのように設定したらよいのか教えてください。 以上、よろしくお願いいたします。 |
こんばんは。 皆様のようにきっちり回答できる自信がなく、時折の書き込みで恐縮ですが、 たまたま一部知っている内容だったので回答させていただきます。 >>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 |
こんにちわ。 Perlについてのごく初歩的な質問なんですがファイルデータを保存する時の方法についてなんですが CSV形式なら open(OUT,">data.dat"); print OUT "$FORM{'fld1'},$FORM{'fld2'},$FORM{'fld3'},$FORM{'fld4'}\n"; close(OUT); だと思うのですが固定長の場合はどうしたらよいのでしょうか? よろしくお願いします。 |
>>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 を超えるのであれば、出力フォーマットの定義 ファイル化などを検討しましょう。 |
ありがとうございます。 助かりました。 また、質問があれば投稿しますのでその時はよろしくお願いします。 |
だから私を見て! http://sgldwssr.hp.infoseek.co.jp/otp.html |
awkについての質問です。 Solaris7上で、nawkを実行する際、 "cat text.txt" | getline var という構文があるとvarに "cat text.txt" の結果が入るのですが、 同じことを /usr/xpg4/bin/awk で実行すると var に値が 入らないようです。 このあたりの事情をご存知の方、教えてくれませんか? |
下記の件ですが、awkをかける対象のテキストの行数が、 getlineで取り込まれるテキストの行数より少ない場合に 発生することがわかりました。 つまり、getlineで取り込まれるテキストの方が短い場合、 nawkでは最後の行の内容が保持されて、それを利用した置換処理が 行われるが、 /usr/xpg4/bin/awk では行われないということです。 |
>>3671 tmr なるほど。そういう違いがあることは知りませんでした。一般論としては、 getline の戻り値チェックをしっかり行ないましょう、てな感じでしょうか。 |
誰かハイホーネットにメールを送信するアプリをくれましたか?(w |
はじめましてvmと申します。 UNIXのコマンド処理で質問があるのですが、 何行かあるテキストファイルの指定のカラム位置に文字列を行単位に挿入 するという処理を、UNIXのコマンドだけでやりたいと思っています。 自分で処理を考えてみたのですが、 1. cutコマンドを使用して、指定カラム位置を境にして、 「指定カラム位置より前の文字列が入ったファイル」と 「指定カラム位置より後の文字列が入ったファイル」に分割する。 2. paste コマンドを使用して、セパレータを元のファイルが使用していない文字を指定して、 1で作ったファイルを結合する。 3. sedコマンドでセパレータ文字を挿入したい文字列に置き換える。 ワークファイルができてしまって、UNIXっぽくないので、 これ以外にもっと簡単なやり方がないか探しているのですが、 もしご存知の方いらっしゃいましたら、ご教授いただけないでしょうか。 よろしくお願いします。 |
>>3674 vm やりたいことがよくわからないので、入力と出力のサンプルを 提示してください。 |
>>3675 68user 多分このような事を考えているのだと思います。 ■入力ファイル aaaa,bbbb cc,ddd eeeeee,ffff ■挿入文字列 00 ■出力ファイル aaaa00bbbb cc00ddd eeeeee00ffff >>3674 vm で、やりたい事が上記の通りだとすると、 perlとかawkで出来ると思います。 |
こんにちはvmです。 説明不足でした。 入力データは1ファイルで、 AAAABBBCCCCC DDDDEEEFFFFF GGGGHHHIIIII : という感じで項目間の区切り無しのレコードが いくつか入っているという状態で、 AAAABBB****CCCCC DDDDEEE****FFFFF GGGGHHH****IIIII : 1行目で見ると、BBBとCCCCCの間に****を挿入するということを、 シェルかUNIX標準コマンドでやりたいと考えています。 先に書いた私の手順ですと、一度cutコマンドで AAAABBB DDDDEEE GGGGHHH : CCCCC FFFFF IIIII : 2つのワークファイルを作るので手順も多くて面倒なため、 他にやり方がないものかと考えている次第です。 もっと単純化できる方法がありましたら、ご教授ください。 お願いいたします。 |
>>3677 vm 区切り文字なしだとすると、文字列の挿入個所は何を基準に判断するのでしょうか? 下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか? 後気になった点はUNIXの標準コマンドというのは どこまでを指すのでしょう? インストール時点でインストールされるコマンドは、 OS・インストールオプションによって異なると思いますが・・・ |
こんにちはvmです。 >下の例を見る限りでは、行頭からのバイト数で分割してるように見えますが、あってますか? すみません。そのとおりです。 >後気になった点はUNIXの標準コマンドというのは >どこまでを指すのでしょう? POSIXに準拠しているコマンドのことを指していました。 あれからちょっと調べてみたのですが、 awk '{printf("%s%s%s\n", substr($0,1,2), "TUIKA", substr($0,3));}' target.txt > result.txt awkコマンドであれば、私のやりたいことがワークファイルを作らずに 実現できそうなことがわかりました。 どうもお騒がせしました。 これより良い方法がございましたら、ご教授ください。 |
gfg |
宜しくお願いします。 tarコマンドを実行した際に以下のメッセーシ゛が出たんですが、 何を意味しているかわかりません。 ご教授ください。 -------------------------------------------------- cd / tar -cvf /dev/rmt0n ./usr/* tar -rvf /dev/rmt0n ./var/* ← メッセーシ゛が出ます -------------------------------------------------- 表示メッセージ tar:blocksize=0 tar:backspace over record failed -------------------------------------------------- ご教授ください。宜しくお願いします。 |
mailxコマンドに関してですが 件名がベース64で本文がJISコードのメールを読む時、 以下の状態になってしまいます。 直す方法を知っている方おりましたらお教えください 1.件名が日本語の長文だと、以降の画面が文字化けします 2.JISコードの本文を開くと 「---Executing: kterm sh: kterm: 見つかりません」 とでてしまい表示できません |
>>3679 vm > これより良い方法がございましたら、ご教授ください。 awk より良い方法かどうかはわかりませんが、 sed 's/^\(..\)/\1TUIKA/' < target.txt > result.txt というのもあります。 >>3681 馬場 すでにアーカイブ済のファイルが出現したため、前に戻って 置き換えようとしたが、テープドライブのため前に戻る機能が なかった、ということではないですかね。 >>3682 ryo Solaris2.6 ではその症状は出ませんでした。 |
こんにちは。Phantomと申します。 ネットで色々調べた結果ちょっと、見当たらなかったので質問させてください。 アクセスログの話なのですが、Web/FTPサーバのアクセスログでは有りません (Web/FTPのアクセスログの情報は腐るほど有りました。また、情報が全く無か ったと言うのは嘘で、高いソフトウェアやASPぐらいの情報しか出てこず、個人 の私としては手が出ません。)。 ローカルのLinux環境内でアクセスされたファイルのログを取りたいと考えて いるからです(Unix系OSで実現するのが難しいから情報が少ないのでしょうか?)。 当然、アクセスログなのでアクセスしたユーザ名、時間、アクセス先などの情報を 見たいと思っています。 セキュリティの事もあるのですが、私自身が何時ファイル(特に設定ファイル)の 編集を行ったかという履歴を見たいからです。 それで、これに見合った(フリー)ソフトウェアやシェルスクリプト等が存在しまし たら、紹介していただければ幸いです。(それとも、もしかしてすごく簡単にPerl とかで組めちゃったりするんでしょうか?) |
>>3684 Phantom 履歴や変更点の確認をしたいということなら、cvs や subversion などのバージョン管理ツールを使うのがよいでしょう。 履歴を何段階でもとることができ、細かい修正点を記録できるという 利点がありますが、その一方でファイル更新とバージョン管理とが 密に連携しているわけでないので、バージョン管理ツールへの登録 忘れが発生する可能性がある、という欠点があります。 あるいは > ユーザ名、時間、アクセス先 だけの情報だけでよいなら、 - ユーザ名、時間、ファイル名を記録する - エディタを起動する - (必要なら) 編集前と編集後のファイルをどこかに保存する というファイル編集用スクリプトを作成し、それを使うように すればよいでしょう。もちろん、このスクリプトを使わずに直接 ファイルを修正してしまうとアウトです。 もっと厳密にやりたいならシステムコールをフックするタイプ のものが必要です。たとえば Linux Security Module (LSM) や Sysrace: http://www.citi.umich.edu/u/provos/systrace/linux.html など。 しかしこれらの主目的はシステムコールを許可するかしないかを 決めるためのものなので、ログを記録できるような仕組みがある のかどうかはわかりません。 > Unix系OSで実現するのが難しいから情報が少ないのでしょうか? Windows なんかだと API のフックが簡単にできますが、UNIX は そこらへんの機能が弱いのです。 |
>>3685 68user 凄く素早いレス有難う御座いました。 沢山の情報を与えてくださって感謝しております。 > cvs や subversion 成る程。バージョン管理ツールという手が有りましたか。 > ファイル編集用スクリプトを作成 作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル 編集しちゃって失敗しそうです。 > LSM や Sysrace 私には難しいみたいですが、一つの手として調べてみます。 |
>>3686 Phantom >作ってみたいと思います。ただ、仰る通り私、忘れっぽいので直接ファイル >編集しちゃって失敗しそうです。 エディタコマンドと同じ名前のスクリプトを作成し、 スクリプトを格納したディレクトリを環境変数PATHの先頭に追加しては如何なでしょうか? |
Solaris7にて/dev/consoleに出力しているログを横取りして ファイルに落としたいんですが、なにかいい方法はありますか? ありましたらご教授願います。 |
こんにちは。 ある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 |
>>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 ならどこを見ればよいですか? |
>>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]で検索→到達です。 # 本当はもっといろいろ遠回りしてますが… |
僕は某高専2年の電気科なんですが,C言語の授業があって学校のPCのOSがunixなんですよね〜。 Windowsで作成した文書ファイル(拡張子.c)をFDでunixに送る場合,文字化けしますよね? それを防止する方法を教えて下さい。メールで返答していただければ幸いです。 |
>>3692 流離のカメソらいだ〜 一般的にはWindowsの標準文字コードがS-JISで、UnixがEUCだからそうなります。 FDに保存する際にエディタでEUCに変換しておくか、 エディタにその機能がないかUnix上で変換かける場合は、nkfコマンドを使ってください。 |
texの文書で、dviのファイルをpdh形式に変換したいのですが、人に聞いた ところGhostscriptを使ってできるとのことで、早速GSを落としてみたので すが、具体的な操作など教えてもらえれば幸です。 |
68userさん、ありがとうございます。 >x.y.z.255 などのブロードキャスト宛に ping したいので >あれば、-b オプションを付けなさい、ということです。 x.y.z.0もブロードキャスト宛ということになるのでしょうか? |
>>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 板 などで質問してみてはいかがでしょうか。 |
はじめまして、こんばんは。 LINUX, Apache, PHP, MySQL、HTMLでのシステムを考えているのですが、 ちょっと行き詰まってしまって、、、よろしくお願いいたします。 ページがジャンプした瞬間に、あるフィールドをいきなり入力待ち状態にしたいのです。 通常はページに移動後マウスなどで入力したいフィールドを一度クリックする必要があります。 現在フィールドはフォーム<input>タグで作成しています。 カスタマーは(バーコードを使って>マウス1クリック無しで) いきなり入力したい!というのがご要望です。 関連のページのご紹介でも何でもかまいませんので、 是非、よろしくお願いいたしますm(_ _)m |
>>3697 うほほ たとえば http://www.google.co.jp/ がその技を使っています。 ソースを見ていただければわかりますが、 <body onload="document.hoge.fuga.focus()"> <form name=hoge> <input type=text name=fuga> </form> </body> とします。 |
>>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 % |
ファイルをダウンロードするスクリプトを作成していますが、 ファイルサイズが大きいとファイル内容は一部しかダウンロードできません。 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; |
>>3700 sagara - 「ファイルサイズが大きい」とは具体的に何バイトですか? - あるバイト数以上のファイルの場合、常にダウンロードできないのですか? - 大きいファイルを処理するのに何秒かかりますか? - length($INBUF) の値は? - $INBUF の内容をファイルに出力すると、正常に出力できますか? - 「sysreadの戻り値は正しい」というのは「正常にダウンロード できなかった場合でも、sysread の戻り値は正しい」ということ ですか? - sysread ではなく read を使うとどうなりますか? - OS 名・OS のバージョン・perl のバージョンは何ですか? あと、コメント部分や関係ない箇所は極力削ってから投稿しましょう。 仕事のソースであれば特に。 |
>68USER様 早々のお返事をありがとうございました。 やってみたら、ばっちりでした〜! 本当にありがとうございました♪ |
はじめまして。よろしくお願いします。 環境: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 |
>>3703 lock サーバ側から close すると (正確にはアクティブクローズ すると) FIN_WAIT_1 になります。普通はこの後にクライアント から ACK・FIN が帰ってきて FIN_WAIT_2 に遷移しますが、 この辺がうまくいっていないものだと思われます。 > ずっとこの状態のままなのはどういう原因が考えられますでしょうか? わかりません。普通は FIN_WAIT_1 のままにならないように タイマか何かがあると思いますが、FIN_WAIT_1 タイマって 存在するのかな? (FIN_WAIT_2 タイマはあるけど) > FIN_WAIT_2の状態が終了した後で書き込まれるのでしょうか? これまたわかりません。apache のソースを読みましたが、どこで ログを吐いてるのかすらわかりませんでした。 とまぁ何の役にも立たない回答になってしまいましたが、 数日様子を見てはいかがでしょうかね。 |
数日前、FreeBSD 5.2Rをインストールしたのですが、起動時(ログイン前)に Configuring syscons: keymap blanktime と表示され、長時間とまってしまって困っています。 その後ログインプロンプトが表示され、ログイン可能ですし、 その他の操作に問題も無い感じなのですが、毎度の事なので釈然としません。 解決方法は無いものでしょうか?それともこういうものなんのでしょうか? よろしくお願いいたします。 |
>>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 を押してます。 |
>> 3706 早速のお返事ありがとうございます。 ご指摘頂いた通り、原因はメッセージの後のsendmailの起動でした。 > Configuring syscons: keymap blanktime のメッセージから検索しても、解決法が見つからないのはあたりまえでしたね。 ご紹介いただいたウェブサイトに目を通すのに時間がかってしまいましたが、 解決することができました。 私の場合はDNSサーバの指定部分で、ADSLモデムの提供しているDNSで解決しようとしていたのですが、 モデムのDNSサービスがIPv6に対応していない為、名前解決できずTime outを待っていたようです。 DNSサーバの指定をプロバイダーのアドレスにしたら解決しました。 起動する度に気になっていたので、すっきりしました。 どうも、ありがとうございます。 |
DESについて質問させて下さい。 OpensslコマンドでDESを使っているのですが、間違った鍵で復号しようとすると bad decryptというエラーがでます。パリティチェックはOKとします。 これはDESの仕様上、エラーが検出できるということなのでしょうか? DESというと単にビット単位の置換だと思っているので、エラーが検出できるのが ちょっと不思議です。 TripleDESの中ででも、いきなり関係無い鍵で復号したりしてますから、さらに 不思議です。 なにか根本的に理解が違っている気もするので、宜しければご教授ください。 |
>>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 の日本語訳のありかをご存知の方いらっしゃい ませんか? (解説している書籍でも可) 以前自分で訳してみたものの、 よく理解していないため何が何だかわからない日本語ができあがって しまいました。 |
68userさん、ご回答有難うございました。 恥ずかしながらPKCSというのは知りませんでした。PKCS#5というのは、 簡単に言うと文字列を鍵とする場合の決まりごと、みたいなものでしょうか? 頂いたソースやPKCS#5を斜め読みしてもまだ今一つピンときていません。 勉強したいと思います。 今のところなんとなく、PKCS#5でのPS(Padding String)についての記述を 見て、Padding ruleによってはエラーが検出できるのではと予想しています。 やっぱりアルゴリズムを見ていくしかないですねぇ… |
>>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]; てな感じでしょうか。 |
一応補足。 >>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 と書いてあるかの違いしか # ないような気がしますけど。 |
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 としてから暗号化 のところは意外でした。データが増えてしまうのでしょうか。 確かにこうしないとパディングされているのかされていないのかが 分からない、ということなのでしょうけど。 よくよく見ていくと色々と考えられていて面白いですね。 |
初歩的な質問です。 複数ファイルを1ファイルにcatで結合しようとしたところ次の問題が発生しました。 各ファイルのファイル名は20文字程あり、それら10ファイルをまとめて作成したい ファイル名も20文字程あります。cat以下コマンドを入力していくと、255文字で 入力不能となります。環境はSolarisへのTelnet接続、シェルはkshを使っています。 また、結合したい10ファイルは1つのディレクトリにある全てのファイルです。 ファイル名を短くするとか一度にやらないとか方法はあるでしょうが、画期的な方法が あれば宜しくお願いします。 |
>>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 |
>>3714 SS Solaris8 では sh・ksh・csh いずれも 255 文字の制限があるようで、極めて 不愉快ですね。 ワイルドカード (glob) を使う以外の別解としては、文字数の制限がある のはコマンドラインからの入力時だけのようなので、シェルスクリプト内で #!/bin/ksh cat file-a file-b ..... > result などとすれば OK なようです。 あとは、tcsh や bash を使うとか。 |
シェルスクリプトで実現することにしました。ありがとうございました。 |
>>3717 SS 3716で68user様もさらっと書いてますが、ワイルドカードをを使用する事でも回避可能です。 % cat * > outfile それにしてもこんな制限があるとは知りませんでした。 で、確認してみたところ、255文字ではなく257文字まで入力できました。 ・・・・・・なんでこんなに中途半端なんでしょう? |
>>3074 68user 返事遅れて申し訳ありません。 回答ありがとうございます。 状況は、全く変化せずFIN_WAIT1の状態のまま残っています。 タイマーはないようです。 OSを再起動すればなくなるのでしょうが、それは出来ないので困っています。 強制的にクローズする方法はありませんでしょうか? apacheを再起動しても変化なしでした。 |
>>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 の メーリングリストで質問してみてはいかがでしょうか。 |
初めてメールします。CGIを用いてGREE.jpのようなものを作りたいと考えているのですが、何かいい案はございませんか? |
>>3721 大谷 現状何が問題なのかを提示せずに いきなり「何かいい案は?」と 問われても、何と答えればよいのかわかりません。 |