tarコマンドで、コマンドの実行ディレクトリからサブディレクトリも含めて、 ワイルドカードで指定したファイル、例えば、「*.txt」の様に指定して、 すべてのファイルを1つのアーカイブにまとめたいのですが、可能なので しょうか。 ディレクトリも含めたかたちにしたいのですが。 tar -cvf aaa.tar *.txt だと、直下のファイルのみ tar -cvf aaa.tar *.* だと、すべてのファイル |
>>4435 hagu いくつか方法はあると思いますが、 $ find . -name "*.txt" | xargs tar cvf outfile.tar 等とすればできます。 |
>> 4436 ありがとうございます。 試してみます。 |
>>4436 zsh Solaris の xargs (だったような気がしますが) は、LINE_MAX の長さがかなり 短くて、たしか 10KB 程度しかなかったような気がします。この使い方だと 複数回 tar コマンドが実行された場合、最後の方しかアーカイブに含まれない ので注意が必要です。 |
>>4408 68user 亀レスすいません。 DNS のプログラミングのアドバイスをしていただいたものです。 出張先の住まいがレオパレスでネット環境があると聞いていたので、 すぐに閲覧できると思いましたが、いろいろ問題があり今までかかりました。 今後は普通に対応できると思います。 よろしくお願いします。 |
>>4438 68user ご指摘ありがとうございます。 確かに複数回実行された場合の考慮が漏れていました。 ちなみに、Solaris の LINE_MAX の値は 2KB のようです。 |
>>4438 68user >>4440 zsh 試して見ました。 ご指摘の通りでした。 標準出力には、すべて出てきましたが、 最後の方しかアーカイブに含まれていませんでした。 どう対応すればよいのですか。 |
>>4441 hagu カナリ遅いですが. cat /dev/null>outfile.tar && find . -name "*.txt" | while read F in; do tar rvf outfile.tar "$F"; done |
サーバーアドレスの見方はどうすれば??教えてください! |
>>4441 hagu 試してませんが、 $ find . -name "*.txt" | xargs tar rvf outfile.tar でいけると思います。 (tar は r を指定すると追記になります。) |
>>4439 DNS勉強中 宣言した「今月中」もあと残すところ 6日。一度言ったことは守れよ、と 自分にプレッシャーをかける毎日です。 >>4441 hagu その他。 - tar cf outfile.tar `find . -name "*.txt"` (長すぎると Argument list too long になるが、エラーかどうかがはっきり わかるので使えなくもない) - tar の、ファイル名一覧をファイルから取得するオプションを使う。 >>4443 不明5号 質問の意味がわかりません。 |
>>4445 68user >>4444 zsh ありがとうございます。 試してみます。 >tar の、ファイル名一覧をファイルから取得するオプションを使う。 探して見たのですが、使い方がわかりませんでした。 使い方教えてください。 |
>>4445 68user >>4444 zsh ゴミすみません。 名前のところに”お”が入ったままで書いてしまった。 ありがとうございます。 試してみます。 >tar の、ファイル名一覧をファイルから取得するオプションを使う。 探して見たのですが、使い方がわかりませんでした。 使い方教えてください。 |
>>4447 hagu http://x68000.q-e-d.net/~68user/cgi-bin/wwwboard.cgi?howtouse にあるように、 OS 名を明らかにすれば期待する回答が返ってくる可能性が高まると思われます。 |
>>4448 68user すみません。 UNIXで、Solaris8 です。 |
>>4449 hagu man tar で出てきますが・・・ http://docs.sun.com/app/docs/doc/816-3518/6m9ptvr58?l=ja&a=view |
>>4449 hagu 具体的には % find . -name "*.txt" > filelist.txt % tar cf outfile.tar -I filelist.txt てな感じで。手元に Solaris がないので動くかどうかはわかりません。 |
>>4404 DNS勉強中 > resolver-1.pl 互換を目指した Linux 版 > http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1160.zip 今月中にと宣言したのでレビューをしようとしたのですが、上記ファイルが not found になっていて見ることができませんでした。 自宅のマシンには以前ダウンロードしたファイルがあるかもしれませんが、 今は出先なので見ることができません。もたもたしていてすみません。 とりあえず、1関数 1ソースはやめた方がよいとわたしは考えます。普通は プログラム全体 > モジュール > 関数 > ブロック という階層構造があり、例えば変数については - グローバル変数にする - ファイル内で static としてそのソース内 (モジュール) からのみ参照できるようにする - 関数内のローカル変数にする などの選択肢がありますが、1関数 1ソースだと、ここで言うモジュールという 選択肢がなくなってしまいます。 あとは Makefile を書くのがダルい、というデメリットもありますね。 |
>>4452 68user すいません。 アップロードしなおしました。 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1374.zip ただこれは1関数1ソースバージョンです。 今出張先でこのソースバージョンしか持っていないです。 それと1関数1ソースのデメリット分かりました。 特にMakefileは書いてて同じ事を感じてました。 |
一応1ソースバージョンもアップロードしました。 http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1375.zip ただこれは学校に提出したバージョンのため、>>4453のソースの1つ前のバージョンのソースとなります。 |
>>4453 DNS勉強中 > http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1374.zip そろそろケチをつけるところもあまりなくて、重箱の隅的ではありますがいくつか。 > char *tc_search(int tc){ > static char tc_result[20]; > ... > return tc_result; > } こういうふうにしてしまうと char *p = tc_search(tc_1); char *q = tc_search(tc_2); という使い方ができなくなります (p が指す内容が上書きされてしまうため)。 スレッドセーフでなくなるのと、利用者のレベルが低ければ余計なバグを生む 危険性があります。 UNIX のライブラリ関数でも、最初は localtime・ctime・strtok・gethostbyname などの 非スレッドセーフ版しかありませんでしたが、localtime_r・ctime_r・strtok_r・ gethostbyname_r などのスレッドセーフ版を用意する羽目になってしまいました。 承知の上でそうしておられるならば問題ないと思います。 > /* フラグ一覧を出力 */ > qr = (DNS_response.int_data[DNS_response.pos] & 0x80) >> 7; > printf(" QR: (Query/Response): %s\n", qr_search(qr)); > > opcode = ((DNS_response.int_data[DNS_response.pos] & 0x40) >> 6) * 8; > opcode += ((DNS_response.int_data[DNS_response.pos] & 0x20) >> 5) * 4; > opcode += ((DNS_response.int_data[DNS_response.pos] & 0x10) >> 4) * 2; > opcode += (DNS_response.int_data[DNS_response.pos] & 0x08) >> 3; > printf(" OPCODE: %s\n", opcode_search(opcode)); わかりやすい変数名を使うこと自体は非常によいのですが、同じ値を繰り返し 使用する場合は、 int flag = DNS_response.int_data[DNS_response.pos]; qr = (flag & 0x80) >> 7; printf(" QR: (Query/Response): %s\n", qr_search(qr)); opcode = ((flag & 0x40) >> 6) * 8; opcode += ((flag & 0x20) >> 5) * 4; opcode += ((flag & 0x10) >> 4) * 2; opcode += (flag & 0x08) >> 3; printf(" OPCODE: %s\n", opcode_search(opcode)); などと一時変数に代入することをお勧めします。狙いは可読性向上と、変更時の 修正ミス防止です。わたしの場合は、 for ( int i=0 ; i<length ; i++ ){ struct *hoge_p = hoge_list.buf[x]; printf("%s\n", hoge_p->foo); printf("%s\n", hoge_p->bar); printf("%s\n", hoge_p->baz); } などと、ループ中でもよく一時変数に代入します。これは、ループ先頭の struct *hoge_p = hoge_list.buf[x]; で、 このループ中で参照するのは hoge_list.buf[x] だけ。hoge_list.buf[x+1] を 参照したりはしないよ。 というメッセージを送っているつもりです (効果があるかどうかは知りませんが)。 > DNS_query->data[0] = DNS_packet->id >> 8; > DNS_query->data[1] = DNS_packet->id & 0xff; > ... > DNS_query->data[11] = DNS_packet->ARCOUNT & 0xff; > for (i=12, j=0; i<12+domain_length; i++, j++) > DNS_query->data[i] = DNS_question_record->Name[j]; この場合は、変更時の作業量削減とマジックナンバ排除のため一時変数を使うべきです。 char *data_p = DNS_query->data; *(data_p++) = DNS_packet->id >> 8; *(data_p++) = DNS_packet->id & 0xff; ... *(data_p++) = DNS_packet->ARCOUNT & 0xff; for ( i=0; i<domain_length; i++) *(data_p++) = DNS_question_record->Name[i]; > FLAG flag_list[] = {{ /* 外側の中括弧は構造体の、内側の中括弧は配列の初期値を示す */ > 0, > ... > }}; > > return ((flag_list->qr * 128 + flag_list->opcode * 8 + .... )); FLAG flag = { 0, ... }; return (flag.qr*128 + flag.opcode*8 ... ); でよいと思います。あと、ビットシフトをしたい場合は乗算ではなく、>> や << で 表現した方が素直かなと思いました。 > int make_question_record(struct DNS_Question_Record *DNS_question_record, > int argc, char *hostname, char *type, char *class){ > /* 照会タイプが何も入力されていなければデフォルトの A を代入する */ > if (argc >= 4) > strcpy(query_type, type); > else > strcpy(query_type, "A"); ここまで argc を引っ張らず、もっと上位の関数で query_type を設定すべきと 思います (preprocessing あたりで)。 argc を引っ張りすぎると、もし引数のインタフェースを変更した場合、ソース 全体を調べて argc 関連の部分を修正することになってしまいます。 > /* DNS_response_before_conv->recv_bufはchar型なので、 > その中に格納されている数字は+127(0000007e)までしか表現できない */ しょーもないことですが、複数行のコメントは /* DNS_response_before_conv->recv_bufはchar型なので、 * その中に格納されている数字は+127(0000007e)までしか表現できない */ などと書けば、grep したときにその行がコメントであることが一目でわかります。 > goto comp2; 再起であれば、これまでの状態を脳内スタックに積んで、新たに呼ばれた関数の 引数と戻り値だけを考えればいいですが、こういう goto は覚えておかなくては ならない状態が多すぎるので、こういう goto はわたしは使いません (というか 頭が混乱してしまうので使えません)。 わたしは、エラー発生時の脱出以外で goto を使わない派です。 1ヶ月以上引っ張ってしまったわりに、たいしたレビューができませんで 申し訳ないです。 |
新版 UNIX 由来/読み方辞書 http://X68000.q-e-d.net/~68user/unix/unix-term-dic.html なるものを作ってみました。 元々あったオリジナルが 200個、わたしが追加したのが 60個程度です。 オリジナルの記述を読んでると時代を感じますね…。 |
a.outでtypo指摘っす > 実態にそぐわなかくなったが |
>>4457 Netboy ありがとうございます。今晩修正します。 追加ネタメモ。 abbrev yum xargs |
>>4457 Netboy 修正いたしました。ご指摘ありがとうございました。 |
このサイトにはいろいろお世話になっております。 UNIX 用語 由来/読み方辞書 も一気に読ませていただきました。 気になった点をいくつか: ・fgrep と Gimp の解説文が途中で切れてしまっているように 思います。 ・記号の 2 項目め(「"」の項と思われる部分)の見出し行が 抜け落ちてしまってます。 ついでに(思いっきり重箱の隅ですが)、この掲示板の [使い方] ページにある「敬省略」っていうのも気になります… |
>>4460 mkt あれ? 全角空白が 4 個に置換されてる…。 |
シェルで、2行を1行にする方法につてい教えてください。 cat file.txt dn: nm=yamada.taro,o=tokyo,o=test. co.jp nm: nm=yamada.taro o: o=tokyo o: o=test.co.jp dn: nm=yamada.hanako,o=oosaka,o=test. co.jp nm: nm=yamada.hanako o: o=oosaka o: o=test.co.jp を dn: nm=yamada.taro,o=tokyo,o=test.co.jp nm: nm=yamada.taro o: o=tokyo o: o=test.co.jp dn: nm=yamada.hanako,o=oosaka,o=test.co.jp nm: nm=yamada.hanako o: o=oosaka o: o=test.co.jp のようにしたいのですがどうすればいいのですか。 改行となっている次の行の頭は、半角スペースで始まっています。 また、空白行を消したくないのです。 空白行までを、1ブロック(かたまり)として扱いたいのです。 環境 Solaris8 Bシェル |
>>4460 mkt > ・fgrep と Gimp の解説文が途中で切れてしまっているように > 思います。 ありがとうございます。Gimp は「Gimp の開発中にできたのが Gtk」、fgrep に ついては「"Fast GREP" は違うでしょ」と書こうとして、そのままになってしまい ました。とりあえず今晩書きかけの部分を削除したいと思います。 > ・記号の 2 項目め(「"」の項と思われる部分)の見出し行が > 抜け落ちてしまってます。 これは HTML 生成スクリプトの修正が必要ですので、少し時間がかかります。 fgrep についてメモ。オリジナル版には "Fast GREP" または "Fixed string GREP" の略。 とありますが、 http://www.nurs.or.jp/~asada/FAQ/UNIX/section1.3.html fgrep は、長さが決まっている文字列を検索します。"f" は "fast" という意味では ありません。事実、"fgrep footbar *c" の速さは、普通、"egrep footbar *.c" の 速さより遅いのです http://www.bsddiary.net/doc/hierarchy.txt 熟練者: 誰かが速いと言ったのでfgrepを使っている ハッカー: 自分で時間を測った結果egrepを使うことにした などの他の有名な文献と矛盾しています。 http://minnie.tuhs.org/TUHS/archive_sites.html を見ると fgrep・egrep が現れたのが V7 で、V7 と 2.10 BSD のソースはほぼ 同じでした (ソースは別)。4.4BSD Lite2 では grep・fgrep・egrep のソースが 一本化されていました。それをふまえた上で man の記述を見ると、 V7: Fgrep patterns are fixed strings; it is fast and compact. http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=Unix+Seventh+Edition&format=html 2.10 BSD: Fgrep patterns are fixed strings; it is fast and compact. http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=2.10+BSD&format=html 4.4BSD Lite2: The fgrep utility is quick but can handle only fixed strings http://www.freebsd.org/cgi/man.cgi?query=grep&apropos=0&sektion=0&manpath=4.4BSD+Lite2&format=html FreeBSD 1.0〜6.0: Fgrep is the same as grep -F. http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=FreeBSD+1.0-RELEASE&format=html SunOS 4.1.3: In general, egrep is the fastest of these programs. http://www.freebsd.org/cgi/man.cgi?query=fgrep&apropos=0&sektion=0&manpath=SunOS+4.1.3&format=html というわけで、fgrep が "Fast GREP" であるという認識があったとすれば、古代の man の "fast" という記述が原因ではないかと考えます。 あとは、この時代の fgrep が grep・egrep と比べて fast であるかが気になる ところですが、これは調査する時間と力量がないのでパスということで。 参考: http://groups.google.co.jp/group/fj.questions.unix/browse_thread/thread/e8ea37b4d0dd6372/235ce238f717f19c http://katsu.watanabe.name/grep/efgrep.html http://katsu.watanabe.name/grep/ohpcontents.html オリジナル版に関わった方々がそうそうたる面子なので、調べずに突っ込みを いれるわけにもいかず、なかなか大変です。 > この掲示板の [使い方] ページにある「敬省略」っていうのも気になります… これまで思いっきり「敬省略」だと思っておりましたが、「敬称略」だったのですね。 ひとつ賢くなれました。これも今晩修正予定です。 >>4461 mkt 全角入りソースをコピペしやすいよう、半角空白に置換しています。 |
>>4451 68user 返事送れて申し訳ありません。 Solarisで動きました。 |
>>4462 お sed で何とかできるのかもしれませんが、わたしは sed をよく知らないので、 sh でやるならこんな感じで。 IFS='' buf='' use_buf=0 cat file.txt | while read -r line; do case $line in " "*) tmpline=`echo -n $line|sed 's/^ *//g'` buf="$buf$tmpline" use_buf=1 ;; *) if [ "$use_buf" = "1" ]; then echo "$buf" fi buf="$line" use_buf=1 ;; esac done if [ "$use_buf" = "1" ]; then echo "$buf" fi と思ったのですが、最終行が出ません。sh もよくわかってないわたしには解決 できませんでした (GNU bash, version 3.00.14(1)-release (i386-redhat-linux-gnu))。 perl を使ってよいなら perl -e 'undef $/; while (<>){s/\n +//g; print}' file.txt あたりで。 |
>>4465 68user > と思ったのですが、最終行が出ません。 あー、ループ部分がサブシェルになってるからか。 while read -r line; do ... done < file.txt なら OK ですね。 やはり sh でプログラムなんて書くもんじゃないと思う。誰か Sh Programming Considered Harmful を書いてください。 |
>>4466 68user 補足。Solaris の sh では > while read -r line; do > done < file.txt でもダメなようですね。 http://blog.goo.ne.jp/cars-kitahefu/e/4190a337427d7a8cfcb5a62f515c6936 |
>> 4467 ありがとうございます。 > while read -r line; do > done < file.txt はやはりダメでした。 while read line; do done < file.txt としたら上手く動きました。 また、 tmpline=`echo -n $line|sed 's/^ *//g'` では、1行になるのですが、「-n」オプションが邪魔みたいで、上手く編集 できませんでした。 tmpline=`echo $line|sed 's/^ *//g'` としたら上手くいきました。 |
>> 4468 sed 一発で簡単にできるものなのでしょうか。 |
>>4469 お 完璧ではないですが、こんな感じで。 ------ sed -e '/^[^ ]\{1,\}/ { N } s/^\([^ ]\{1,\}.*\)\n \{1,\}\([^ ]\{1,\}\)/\1\2/g' file.txt ------ >>4468 お >while read line; do >done < file.txt >としたら上手く動きました。 これだけで動きますか? whileの前に exec 0<file.txt とか要りませんでしたっけ? >>4466 68user >やはり sh でプログラムなんて書くもんじゃないと思う。誰か > Sh Programming Considered Harmful >を書いてください。 私は、どの程度の事までをシェルスクリプトでやるべきか悩みます。 Perlとか使った方が絶対に効率が良かったりするのに、 何故かシェルスクリプトにこだわる人とかいるし・・・ (で、気がつくと自分以外に判らないスクリプトが出来上がっていると。) |
>>4463 68user お返事いただきありがとうございます。 書きかけだった部分、もう削除しておられますが、いずれまとまった形で 復活するのを期待しています。 fgrep の話、面白いですね。man の記述の違いも。 でもこれ、何となく「fast = (使うのに)手っ取り早い」って訳すと つじつまが合うような気がしてきました。quick というのも同様。 正規表現を無効にする(できる)点をアピールする感じで。 で、誤解が生じてしまったので表現を改めた、とか。 勝手な推測ですが。 > http://www.bsddiary.net/doc/hierarchy.txt > 熟練者: 誰かが速いと言ったのでfgrepを使っている > ハッカー: 自分で時間を測った結果egrepを使うことにした の原文は http://groups.google.co.jp/group/net.jokes/msg/c49a0c0849fe8bb6 だと思うのですが、これより前に投稿されている http://groups.google.co.jp/group/net.jokes/msg/c24e7dccf82df3ff と比べてやけに grep まわりが強調されてますね。 > オリジナル版に関わった方々がそうそうたる面子なので、調べずに突っ込みを > いれるわけにもいかず、なかなか大変です。 でも今のまんまだと、矛盾が生じちゃってます(↓)。 ;p http://x68000.q-e-d.net/~68user/unix/pickup?keyword=fgrep&target=command&partial=on®exp=on&case=off > 全角入りソースをコピペしやすいよう、半角空白に置換しています。 あ、それは理解してたんですが、 [使い方]ページに「全角空白は 2 つ分の半角空白(…)に置換されます。」 とあるのに、どうして行頭に入れた全角空白 1 個が「 4 つ」 に置換されちゃったんだろう? と思った次第です。 # 今回は全部半角空白にしてみた。 |
なるほど、半角空白 1 個が「 2 つ」になってるのか…。 失礼しました。 |
>>4462 お RFC2822 の folding を戻すのと大体同じですね。 sed -e ':loop' -e '$b' -e 'N;/\n /{s/\n *//;b loop' -e '};P;D;b loop' でどうでしょうか? 見やすくすると #!/usr/bin/sed -f :loop $b N /\n / { s/\n *// b loop } P D b loop |
>>4470 zsh >>4473 if ありがとうございます。 今、時間がありませんが、試してみます。 シェルスクリプトよりもPerlですか。 |
>>4470 zsh >これだけで動きますか? >whileの前に >exec 0<file.txt >とか要りませんでしたっけ? 要りませんでした。 while read line; do done < file.txt または、 while read line do done < file.txt で動きました。 |
>>4475 お Solaris9のsh |
>>4475 お Solaris9のshで確認しましたが、 やはりwhileの前に exec 0<file.txt を入れないと、最終行が表示されません。 恐らく、元のファイルの最終行が空行なので問題ないのだと思います。 >>68user様 記述途中で送信してしまい、大変失礼しました。 |
>>4455 68user ご指摘ありがとうございます。 スレッドセーフやマジックナンバなどは考えておりませんでした。 それと goto の部分は使いたくなかったのですが、うまくプログラムの流れを制御できなかったためやむなく使用しました。 確かに分かりにくいと思います。 今後修正してみようと思います。 かなり忘れている部分が多いので、思い出すところからはじめないといけないのですが。 |
>>4471 mkt > 書きかけだった部分、もう削除しておられますが、いずれまとまった形で > 復活するのを期待しています。 はい、そのうちまとめて更新したいと思います。 >>4477 zsh > やはりwhileの前に > exec 0<file.txt > を入れないと、最終行が表示されません。 わたくしのまわりには Solaris がないので試せませんが、これは何が原因で 最終行が表示されないのでしょうか? >>4478 DNS勉強中 > 今後修正してみようと思います。 > かなり忘れている部分が多いので、思い出すところからはじめないといけないのですが。 細かな指摘ですので修正は不要かと思います。もし DNS にこだわりがあるなら、 ライブラリ化したり、他のレゾルバのソースを読んだり、 http://www5d.biglobe.ne.jp/~stssk/dns.html を片っ端から実装するのがいいのではないでしょうか。 |
>>4479 68user >わたくしのまわりには Solaris がないので試せませんが、これは何が原因で >最終行が表示されないのでしょうか? パイプを使用した場合と同様、サブシェルで動作する事が原因のようです。 Solaris8のshで確認した所、forkしてからサブシェルの中でファイルを オープンしていました。 (ksh/bash/zshはサブシェルで動作しないので問題なし。) |
>>4480 zsh >パイプを使用した場合と同様、サブシェルで動作する事が原因のようです。 >Solaris8のshで確認した所、forkしてからサブシェルの中でファイルを >オープンしていました。 サブシェルで動作するとは、子プロセスでシェル起動しているというこ ですか。 whileの前に exec 0<file.txt を入れないと、最終行が表示されないということですか。 |
>>4480 zsh あー、なるほど。 >>4467 68user > 補足。Solaris の sh では >> while read -r line; do >> done < file.txt > でもダメなようですね のことですね。別件かと勘違いしておりました。 |
>>4481 お >サブシェルで動作するとは、子プロセスでシェル起動しているというこ >ですか。 その通りです。 >whileの前に >exec 0<file.txt >を入れないと、最終行が表示されないということですか。 サブシェル(while)内で use_buf=1 としても、親シェルには引き継がれないので 最後の if 文が必ず偽になります。 よって、最終行(最終行が半角スペースで始まる場合には最終 2 行)が 表示されないと思います。 |
>>4483 zsh 試して見ました。 ファイルの最後が空行(最終行が改行コードで終了)の場合、 whileの前に exec 0<file.txt を入れないくても、最終行が表示されました。 最終行の終わりが、改行コードではなく、ファイルの終端(EOF)がある場合、 catコマンドでファイルを表示した時、最終行の後ろに、プロンプトが来る ファイルをやると、最終行が表示されません。 whileの前に exec 0<file.txt を入れた場合でも。 |
>>4485 お >ファイルの最後が空行(最終行が改行コードで終了)の場合、 >whileの前に >exec 0<file.txt >を入れないくても、最終行が表示されました。 試してみましたが、最終行(空行)は表示されませんでした。 Solaris 標準の sh ですよね? >最終行の終わりが、改行コードではなく、ファイルの終端(EOF)がある場合、 >catコマンドでファイルを表示した時、最終行の後ろに、プロンプトが来る >ファイルをやると、最終行が表示されません。 それは read コマンドが読込めないので、仕方がないというか そこまでやるならシェルスクリプトにこだわらない方が良いかと。 |
GD::Graph で遊んでみました。 http://x68000.q-e-d.net/~68user/webcgi/gd-graph.html http://x68000.q-e-d.net/~68user/webcgi/sample/perl/graph-maker.cgi |
はじめまして。 おじゃまいたします。 早速ですが Opensslライブラリを使用して復号処理を実装したいと考えておりまして RSA鍵交換の場合は、おおまかに分かりましたが DH鍵交換の実装方法がなかなか調べても分からない状況です。 おそらくRSAとは使用するI/Fが異なるのではないかと考えています。 ご存知の方いらっしゃいましたら ご教授頂けないでしょうか。 RSA鍵交換の場合は下記のような感じです(秘密鍵は知っている前提) (1) pre_master_secretを取得する RSA_private_decrypt()を呼び出す (2) 上記のpre_master_secretとclient_randomとserver_random値より master_secretを生成 (3) データを復号する(master_secretが分かれば復号できる) EVP_Cipher()を呼び出す |
はじめまして。 おじゃまいたします。 早速ですが Opensslライブラリを使用して復号処理を実装したいと考えておりまして RSA鍵交換の場合は、おおまかに分かりましたが DH鍵交換の実装方法がなかなか調べても分からない状況です。 おそらくRSAとは使用するI/Fが異なるのではないかと考えています。 ご存知の方いらっしゃいましたら ご教授頂けないでしょうか。 RSA鍵交換の場合は下記のような感じです(秘密鍵は知っている前提) (1) pre_master_secretを取得する RSA_private_decrypt()を呼び出す (2) 上記のpre_master_secretとclient_randomとserver_random値より master_secretを生成 (3) データを復号する(master_secretが分かれば復号できる) EVP_Cipher()を呼び出す |
>>4488 take >>4489 take 2度書きしてしまいました。 申し訳ありません。 |
>>4489 take > DH鍵交換の実装方法がなかなか調べても分からない状況です。 わたしにもさっぱりわかりませんが、以下の URL はチェック済ですか? http://www.openssl.org/docs/crypto/dh.html http://matagi.sakura.ne.jp/mt/archives/2005/03/openssldh.html |
>>4491 68user >わたしにもさっぱりわかりませんが、以下の URL はチェック済ですか? > http://www.openssl.org/docs/crypto/dh.html > http://matagi.sakura.ne.jp/mt/archives/2005/03/openssldh.html お返事ありがとうございます。 DH法用の関数はこれなんですね。 お教え頂いた情報を参考に、更に調べてまいります。 |
シェルスクリプトで、 ファイルからフィールド1を読み込み、前後にシングルクォーテーション「'」を 付けて、区切りの1行にしたいのですが、「'」を上手く付けることができません。 「'」の使い方が不正とかで怒られます。 #!/bin/csh nawk -F"," ' { \ if (FNR==1) printf("\'%s\'", $1); \ else printf(",\'%s\'", $1) \ }' file.txt 一度、ダブルクォーテーション「"」にしてからsedで置換しよとしたのですが、 sedでも「'」の使い方が不正とかで怒られます。 nawk -F"," ' { \\ if (FNR==1) printf("\"%s\"", $1); \\ else printf(",\"%s\"", $1) \\ }' file.txt | sed 's/"/\'/g' または、 set a = `nawk -F"," ' { \\ if (FNR==1) printf("\"%s\"", $1); \\ else printf(",\"%s\"", $1) \\ }' file.txt` echo $a | sed 's/"/\'/g' どのようにすればよいのですか。 OSは、Solairs8 |
>>4493 お 参照するファイルについて書いていませんでした。 # cat file.txt Tokyo, Oosaka, Nagoya, Kyoto, Kyusyu, |
>>4493 お csh は馬鹿なので、シングルクォートの中にシングルクォートを書くことはできません。 つまり、 echo '\'' はエラーです (sh も同様)。同様に echo "\"" もエラーになります (sh ならこっちは OK)。 で、csh には (sh も) echo "文字列1""文字列2""文字列3" echo "文字列1"文字列2"文字列3" echo '文字列1''文字列2''文字列3' echo '文字列1'文字列2'文字列3' のいずれも、 echo "文字列1文字列2文字列3" と (基本的には) 同じ、という性質があります。 よって、csh で 'abcdef' を出力したい場合は、 echo "'"abcdef"'" echo "'""abcdef""'" などとします。 シェルのクォートは「ネストさせない」が鉄則です。 |
>> 4495 無理なのですか。 一度、ファイルから取得したものループでechoコマンドを 使いながら編集するということですね。 #!/bin/csh set ALL="Tokyo Oosaka Nagoya Kyoto" @ i = 1 foreach EACH ($ALL) if ($i == 1) then set ALLS=`echo "'"$EACH"'"` else set ALLS=`echo $ALLS",'"$EACH"'"` endif @ i++ end echo $ALLS |
>>4496 お 確認していませんが、awk のプログラム部分を別ファイルにして -f オプションで指定しても出来ると思います。 (この場合はシングルクォートのエスケープは不要です。) |
>>4496 お > 無理なのですか。 いいえ。 awk -F"," '{if (FNR==1){printf "'"'"'%s'"'"'",$1}else{printf ",'"'"'%s'"'"'",$1}}'<file.txt |
>>4497 zsh >>4498 68user zshさん、68userさん ありがとうございます。 出来ました。 「'」を「"」で囲って連続して付けることは試してはいたのですが、 私が試していたのとは違っていました。 それよりも、「'%s'」とするのには気が付きませんでした。 常に「"%s"」としていました。 ただ、 awkで行うと、 ,'Tokyo','Oosaka','Nagoya','Kyoto','Kyusyu' と1行目に読み込んだものにもカンマ「,」がついてしまします。 nawkで行うと 'Tokyo','Oosaka','Nagoya','Kyoto','Kyusyu' となります。 何が違いとかあるのでしょうか。 |
>>4499 お Solaris の awk では FNR という変数はありません。 NR に変更すれば動作すると思います。 (NR と FNR では、複数ファイルを入力とした時に値が異なります。) |
はじめまして、漠然とした質問なのですが、 SSLv3のハンドシェイク処理の部分を実際に (Cで)実現する方法を知っている方、もしくは 何か参考になるものがあれば教えてください。 |
環境は、vine linux 、 openssl-0.9.7d-0vl3.2 です。 |
はじめましてe。いつもいろいろと参考にさせてもらってます。 いろいろ試したのですが、わからないので質問させて下さい。 http://tomorrows-wind.at.webry.info/200507/article_21.html ↑ちょうど私の書いたプログラムとほぼ同じだったので ちょっと勝手に拝借したんですが、このソース 私のやってる環境では、エラーがでるんですよね。 エラーが出るのは、最後のRSA_private_decrypt関数です。 これは私だけなんでしょうか?どなたか試していただけませんか? 鍵に関しては、コマンドラインから暗号化,復号化に成功しているので 問題ないと思われます。 お願いします。 実行環境:vine linux OpenSSL 0.9.7d 17 Mar 2004 |
>>4503 esam dectxt = malloc(RSA_size(rsapriv)); を、 dectxt = calloc(1, RSA_size(rsapriv)); と書き換えることでエラーが消えることを確認しました。 (環境: Vine Linux 3.2, OpenSSL 0.9.7d 0vl3.2) |
>>4503 esam >>4504 は無視してください。 > http://tomorrows-wind.at.webry.info/200507/article_21.html の plaintxt = malloc(sizeof(char)*7); strcpy(plaintxt, "abcdefg"); というのがおかしいですね。ここを直せばうまく動いた気がします。 |
>>4503 esam たびたびすみません。 if((enclen = RSA_public_encrypt(strlen(plaintxt), ... を if((enclen = RSA_public_encrypt(strlen(plaintxt) + 1, ... とし、 if((declen = RSA_private_decrypt(strlen(enctxt), ... を if((declen = RSA_private_decrypt(RSA_size(rsapub), ... としなければいけません。 |
>>4503 esam if((declen = RSA_private_decrypt(RSA_size(rsapub), ... は if((declen = RSA_private_decrypt(enclen, ... のほうがスマートな気がしてきました。 |
はじめまして、68userさん おじゃまいたします。 ネットワークプログラミングの基礎知識 大変参考にさせてもらってます! 現在、SSL/TLS でアクセスしてみよう (1) や >>3958 の記事のsslでkeep-aliveを参考にして sslでの接続を勉強させて頂いています。 早速ですが https-client-keep-alive.c や テストで接続と切断を関数化して分けてみて、 リクエストを送らず受信もしないと SSL_shutdown()で0を返します。 (丁度、https-client.c のソースの118行目から146行目までを削った状態です) ためしに接続、受信、切断とすると SSL_shutdown()で1を返すので、 (丁度、https-client.c のソースの118行目から128行目までを削った状態です) 受信が最後まで完了しなければ、 SSL_shutdown()で0を返しERR_print_errors_fp には何も出力しないと推測しているのですが、 間違っていないでしょうか? ご存知の方いらっしゃいましたら ご教授頂けないでしょうか。m(_ _)m (環境: fedora core 4, gcc-4.0.2-8.fc4, openssl-0.9.7f-7.10) |
>>tkobaさん 早急な返信ありがとうございました。 いわれたとおりになおしてみました。 あとは、>>4505の部分ですが。。。 いろいろためしてみましたがやはりエラーがでてしまいます。 |
>>tkobaさん すみませんできていました。 問題は ご指摘のとおりRSA_private_decrypt関数の第一引数でした。 ありがとうございました。 |
はじめまして 先日freebsd 6.0をインストールをしました。昨日までxdm順調に動いていました。 今日、xdmでloginできなくなりました。ユーザー名とパスワードを入力したら、また 登録画面が出てきました。本来welcome to hostname のところは今welcome to 1に なりました。どういう原因でしょうか。よろしくお願いします。 |
>>4500 zsh (NR と FNR では、複数ファイルを入力とした時に値が異なります。) どうなるのでしょうか。 どのように確認できますか。 |
UNIXのシェルで2点教えて頂きたいことがあります。 ●1点目 sedコマンドを使用して置換したいのですが、sed内で変数は 使用可能なのでしょうか。 ----------------- #!/bin/sh DIR="/home/guest/" ls ${DIR}*.CSV | sed 's/$DIR}//g' 置換されずにそのまま出力されます。 シェル内の変数を、sedに渡して置換させることは可能なのでしょうか。 ls ${DIR}*.CSV | sed 's/\/.*\///g' 削除した部分がディレクトリと言う事なので、「's/\/.*\///g'」として みたのですが、正しい使い方なのでしゅか。 ●2点目 変数に格納されているファイル名から番号が一番大きいファイル名 を作りたいのですが、awkを使用して簡単にできますか。 例えば、/tmp配下に、 test0001.CSV test0002.CSV test0004.CSV とファイルがあるとします。 ls、変数に格納し、awk等で、「test0005.CSV」を求めたいのですが。 --------- #!/bin/sh FileLst=`ls /tmp/*.CSV` echo $FileLst | awk ????? |
>>4514 ロー 環境を書き忘れました。 UNIX:Soralis8 シェル:Bシェル |
UNIX の部屋 http://x68000.q-e-d.net/~68user/unix/ を更新しました。 >>4460 mkt > ・fgrep と Gimp の解説文が途中で切れてしまっているように思います。 fgrep については、とりあえず掲示板での発言にリンクを張りました。 http://x68000.q-e-d.net/~68user/unix/pickup?fgrep > ・記号の 2 項目め(「"」の項と思われる部分)の見出し行が抜け落ちてしまってます。 正しく表示されるようにしました。 http://x68000.q-e-d.net/~68user/unix/pickup?%22 " の解決のため、10年近くつぎはぎでやってきた汚い部分を全面的に見直し たため、もしかしたら UNIX の部屋の検索部分にエンバグしている可能性が あります。怪しい挙動を見つけられた方は教えていただけると幸いです。 >>4501 hidemaru > SSLv3のハンドシェイク処理の部分を実際に(Cで)実現する方法 >>4502 hidemaru > 環境は、vine linux 、 openssl-0.9.7d-0vl3.2 です。 OpenSSL を使っていいなら SSL_connect(3) を使えばいいですし、OpenSSL を 使わないなら「環境は OpenSSL」とわざわざ書く理由がわからないです。 >>4508 dynamite > SSL_shutdown()で0を返しERR_print_errors_fp には何も出力しないと > 推測しているのですが わたしもよくわかってませんが調べる時間がないです。すみません。 マニュアルにそう書いてありますか? >>4511 blueeyes > 本来welcome to hostname のところは今welcome to 1になりました。 原因はわかりません。リブートしても同じ挙動かどうか、シングル ユーザモードで起動するとどうなるか、/var/log に何か出ていないかを 確認してください。 >>4514 ロー > ls ${DIR}*.CSV | sed 's/$DIR}//g' '' で囲んだら変数展開されないので、"" で囲みましょう。変数展開できた としても s//home/guest///g は sed 的にエラーですが、これはまた別の話。 > ls、変数に格納し、awk等で、「test0005.CSV」を求めたいのですが。 「ls で表示したときに最後に表示される行」とみなせるのであれば、 echo $FileLst | awk '{print $NF}' など ($NF は gawk では動きましたが、一般的な awk で使用できるかどうかは わかりません)。 まぁ、awk には列で渡すのではなく、行で渡した方が幸せだと思うので、 ls /tmp/*.CSV | awk 'END { print }' の方がいいと思います。とか言い出すと、 ls /tmp/*.CSV | tail -1 でいいじゃん、って話になりますけどね。 |
>>4516 68user ありがとうございます。 >> ls ${DIR}*.CSV | sed 's/$DIR}//g' >'' で囲んだら変数展開されないので、"" で囲みましょう。変数展開できた >としても s//home/guest///g は sed 的にエラーですが、これはまた別の話。 ダブル「""」で囲んだら展開されませんでした。シングル「''」で囲んだら展開 されました。 > echo $FileLst | awk '{print $NF}' >など ($NF は gawk では動きましたが、一般的な awk で使用できるかどうかは >わかりません)。 一般的なawkでも使用できました。 >ls /tmp/*.CSV | awk 'END { print }' は、ダメでした 結果が得られませんでした。 |
>>4512 お FNR に現在処理しているファイルのカレントレコード番号が セットされるのに対して、NR には (n)awk が実行されてから 読み込んだレコード数がセットされています。 $ nawk '{ print "NR:" NR "/FNR:" FNR }' a.txt b.txt 等とすれば違いが確認できると思います。 >>4517 ロー Solarisの(n)awkでは $ /tmp/*.CSV | awk '{ f=$0; } END { print f }' のようにしないといけないようです。 |
>>4518 zsh ありがとうございます。 awkのmatch関数なのですが、awk内で使用するとエラーが ですのですが、どこか使い方がいけないのでしょうか。 抜粋ですが、 awk ' { pos=match($1,/.CSV$/); }' ${TEMPFILE} ファイル名から拡張子以降を取り除くため、拡張子までの 位置を求めようとしています。 awk: syntax error near line 10 awk: illegal statement near line 10 awk: 構文エラー (10 行目の周辺) awk: 不正な文を検出しました。 (10 行目の周辺) が発生します。 |
>>4519 お Solaris 標準の awk (/usr/bin/awk) には、match 関数が存在しません。 対応策としては (1)index 関数を使用する →ただし、index 関数は正規表現を使用できません。 (2)nawk を使用する (3)/usr/xpg4/bin/awk を使用する といった所でしょうか。 |
>>4516 68user 返答ありがとうございます。 マニュアルは下記をざっと目を通してみたのですが、記載が見付けれませんでした。 http://www.infoscience.co.jp/technical/openssl/news/ http://home.att.ne.jp/theta/diatom/ 前回の書き込みで受信関係がおかしいと推測してしまいましたが、 ためしにContent-Lengthの値分だけ受信しても同じ状態なので、 現在、違う部分も検証しています。 また理解が深まりましたら報告させて頂きますm(_ _)m |
はじめまして。素朴な疑問があるので、もし知っておられたらお答えください。 一般論として、ネットワーク上ではTCPとUDPはどっちが優先度が高いのでしょうか? 輻輳した場合に生き残る確率?に違いはありますか? とにかくガンガンパケットを送りつけるプログラムで実験してみたところ、 気持ち程度UDPが優先されている気がしますが、確証が持てません。 LinuxのsocketオプションにSO_PRIORITYというのがあり、デフォルトは TCPもUDPも0でした。 setsockoptで優先度を変えてみても誤差程度の差しか認識できません。 Webで「TCP UDP 優先度」などで探してもいい資料が見つからない状態です。 何かそのあたりの情報を知っていたら教えていただけないでしょうか。 |
>>4522 むう - 一般的に、OS がどちらを優先するということは聞いたことがない。 - ただ、実装によっては得手不得手がある可能性はある。 - しかし一般的に TCP の方が高機能であり行うべき処理も多いため、 スループットという点に関しては UDP の方が有利であろう。 - 当然ながら帯域制御ができるルータ・OS であれば、どちらかを優先する ことは可能であろうが、これは設定の問題。 - SO_PRIORITY は IP の TOS (Type of Service) に設定される。 - TOS の値を改変してしまうルータがあるようで、チェックサム計算からは 除外されたりするかわいそうなフィールド。 - また、TOS は DiffServ など全く別の用途に使われたりもする。 http://x68000.q-e-d.net/~68user/rfc/?key=2474&target=title - OS が TOS を参照するかどうかは怪しいのでは? (ルータならともかく) - TOS で QoS をやりたいならイントラ内で使うこと。ルータは TOS 対応の ものを揃えるべき。 - 少なくともインターネット経由では、ピアまで TOS がそのまま流れる 保障は全くない。 - Arcstar のように、TOS を考慮するとうたっているサービスはある。 http://www.ntt-vpn.com/ip-vpn/faq/faq_02.html というのがわたしの認識です。 |
Wic-PC上で起動した際Teratermウィンドウがタスク上に隠れて しまいタスクトレイ上にある該当画面を選択しなければ画面上 に表示されません。設定で画面がフォアに表示されるように する為の設定方法をご教示下さい。 |
>>4524 かつや http://search.vector.co.jp/search?query=%8D%C5%91O%96%CA などのツールを インストールするのがよいのではないでしょうか。 |
>>4516 68user いろいろありがとうございます。お手数をおかけしました。 > " の解決のため、10年近くつぎはぎでやってきた汚い部分を全面的に見直し > たため、もしかしたら UNIX の部屋の検索部分にエンバグしている可能性が > あります。怪しい挙動を見つけられた方は教えていただけると幸いです。 自分 1 人暴走している感じで恐縮ですが、いろいろ試してしまいました。 全角記号を検索したときの挙動について。 - 半角に変換して検索されている*ものもある*。 (「@」「〜」「:」などは半角に変換されている) - ヒットしなかったときのキーワードの表示が文字化けしている。(*1) (「!」「;」「¥」など多数) - 関係ない結果が表示される。(*2) (「”」「’」「|」など) 半角記号で全文検索したときの挙動について。 - 「ある」はずなのに「ヒットしませんでした。」と言われる。 (「"」→ \"\; がないと言われる、「'」→ \&apos\; がないと言われる、など) - ヒット数表示の次の、リストの先頭に空の項目が入って、 unix-term-dic.html や pregmemo.html などの各検索対象ファイルから 関係ない部分(検索キーワードによって範囲は異なるが google_ad 関連スクリプトの <!-- の後から 先頭項目のあたり?)まで拾ってきてしまっている。 (「!」「=」「:」「@(=@)」「*」など多数) あと、「+」を検索しようとすると「500 Internal Server Error」に なりますね。何も入力しなかった場合とかもですが。 --- (*1)(*2) 記号ばかり試していましたが、普通に言葉を検索しても何か変です。 「あいうえお」→ 1 件ヒットしました。(これは実際存在したので問題ない) 「かきくけこ」→ ヒットしませんでした。(が、キーワード文字化け) 「鶴」→ ヒットしませんでした。(が、キーワード文字化け) 「亀」→ 3 件ヒットしました。(が、どれも関係ないものばかり) という感じで。 …もっとスマートに分類できたらいいんですが、収拾つかなくなってしまいました。 ごちゃごちゃに突っつくだけ突っついて申し訳ありません。 |
>>4526 mkt 言わずもがなですが、 pregmemo.html は prgmemo.html の typo です。失礼しました。 |
>>4526 mkt ずいぶんヌルい修正をしてしまい、お恥ずかしい限りです、 > - ヒットしなかったときのキーワードの表示が文字化けしている。(*1) > (「!」「;」「¥」など多数) 正規表現で検索しているため、入力された文字列は quotemeta している のですが、quotemeta すると EUC-JP の 0x80 以降も quote されてしまい、 その結果化けていました。これまでは quotemeta した後に s/\\([\x80-\xff])/$1/g; で元に戻していたのですが、前回の修正時になぜか戻す必要はないと判断 して、上記の s/// を削除していました。 > - 関係ない結果が表示される。(*2) > (「”」「’」「|」など) 全角->半角変換が甘くて、" ' | などはそもそも半角に置換していません。 調査していないので想像ですが、EUC-JP の 2バイト目 + 後続バイトに マッチしてしまったのではないかと思います。 > <!-- の後から 先頭項目のあたり?)まで拾ってきてしまっている。 > (「!」「=」「:」「@(=@)」「*」など多数) 全文検索のテストが甘かったようです。 > あと、「+」を検索しようとすると「500 Internal Server Error」に > なりますね。何も入力しなかった場合とかもですが。 空の場合は print "検索内容を指定してください。\n"; と表示するようにしていたのですが、前回の修正で Content-type ヘッダの 出力方法を変更したせいで、Content-type より前に 検索内容を指定してください。 が出力され、エラーとなっているようです。 少しずつ直していきます。ご指摘ありがとうございました。 |
>>4524 かつや Tera Term のショートカットのプロパティ中の 『実行時の大きさ』って項目はどうなっていますか? |
Cシェルでシェル変数に代入された数値として 例えば0.12が入っている場合、その変数の数値を$で 参照する時に「0.12」としてではなく、 「.12」と出力させることはできますか? ご教示頂けましたら幸いです。 |
>>4530 でたち printf(1) で何とかならないかと思って試してみましたが、どうやら無理っぽいので echo ${var:s/0././} でどうでしょうか。 |
>>4531 68user echo ${var:s/0././} を行ってみましたが Variable syntax表示で 受け付けて貰えませんでした。 ご返信頂きまして大変ありがとうございます。 |