>>3420 yoshi > unameコマンドについて質問なのですが、 > このコマンドの語源は何なのでしょうか? FreeBSD 5.1-RELEASE の uname(1) には http://www.freebsd.org/cgi/man.cgi?query=uname&manpath=FreeBSD+5.1-RELEASE&format=html HISTORY The uname command appeared in PWB UNIX. とあります。 PWB (Programmers Work Bench) UNIX の位置付けは http://www.levenez.com/unix/history.html をどうぞ。簡単に言うと V6 UNIX から分岐し、SVR3 に統合された古代の UNIX です。 # ちなみに他の OS のマニュアルにはたいしたことは書いてありませんでした。 で、古代の UNIX と言えば、SCO が公開した V6 や V7 のソース http://minnie.tuhs.org/TUHS/archive_sites.html をあたってみるべきです。そこをつらつらと眺めると…おぉ、そのもの ずばり PWB という文字を発見。 http://www.tribug.org/pub/tuhs/PDP-11/Distributions/usdl/bostic_pwb.tar.gz 早速展開してみると、マニュアルがありました。 % find . -name uname\* ./pwb.5/pwb.2/usr/man/man1/uname.1 ./pwb.5/pwb.2/usr/man/man2/uname.2 uname.1 の中身は以下の通り。 % cat ./pwb.5/pwb.2/usr/man/man1/uname.1 .th UNAME I 5/31/77 .sh NAME uname \*- print name of current UNIX .sh SYNOPSIS .ft B uname .ft R .sh DESCRIPTION .it Uname prints the current name of UNIX on the standard output file. It is mainly useful to determine what system one is using. .sh "SEE ALSO" uname(II) PWB で拡張されたシステムコールらしきソースをみると、以下のように なっています。 ./pwb.5/pwb.2/sys/sys/os/pwbsys.c pwbsys() { extern uchar; register i; register *p; register struct buf *bp; switch(u.u_arg[0]) { case 0: /* uname */ if (copyout(&pwbname, u.u_ar0[R0], 8)) u.u_error = EFAULT; return; つまり uname(2) は pwbname を返しているだけ。その pwbname は char pwbname[9] "pwbname"; と定義されていました。 uname(2) のマニュアルには (以下、FreeBSD の nroff に喰わせた出力) uname get name of current PWB/UNIX (pwbsys = 57.; uname = 0) (pointer to name in r0) returns in the 8 byte character name of the current PWB/UNIX. The name is not null-terminated. By convention, the name is of the form pwb?date. For example, pwba0401 would indicate that this is PWB/UNIX System A and that its operating system was last modified on April 1. This function is kept in the library. un- ame(I) The error bit(c-bit) is set if can not be written. From C, a 1 return indicates an error. とありますので、リリース時は pwbname で、バージョンアップ時に pwba0401 などと書き換えてからコンパイルすることを意図したもの だったようです。 というわけで、今日のトリビア: uname の u は … UNIX の U である。 uname(2) は … 昔は uname(II) と書いていた。 補足トリビア: 当然 clri(8) は clri(VIII) である。 |
>>3421 68user 回答有難う御座いました! お蔭様で、unameコマンドの語源を理解する事が出来ました。 調べるというのは、こういう事を言うのだなぁと目から鱗な心境です。 私もいつか68userさんの様に、自力で調べられる様に頑張りたいと思います。 |
>>3419 68user あまりよく分からないんですけどBSD系(?)がほしいです(^^; |
はじめまして。Perlのネットワークプログラミングに際し、大変重宝させていただいております。 http://x68000.startshop.co.jp/~68user/net/http-parallel-1.html の"HTTPの並行アクセス"スクリプトについて、ちょっと気になる点がありましたので書かせていただきます。 読み込みが終了したソケットについて $selecter->remove($sock); # select の対象から外す として、セレクタから外すだけになっていますが、外した後で $sock->close; としてソケットを閉じたほうがいいんじゃないでしょうか? そうしないと、すべてのデータの転送が完了しスクリプトが終了するまで、全ソケットが開きっぱなしになってしまうように思うのですが。 もし、ソケットを一つ一つ閉じる必要がないのでしたら、その理由を教えていただきたいです。 |
>>3243 ひろ UNIX 的 OS を欲しいのか、UNIX 上で動作するソフトウェアが 欲しいのかわからなかったのですが、とりあえず前者とすると、 以下の URL などがよろしいのではないかと。 FreeBSD http://www.jp.freebsd.org/www.FreeBSD.org/doc/ja_JP.eucJP/books/handbook/install.html http://www.h4.dion.ne.jp/~katsuwo/index.html NetBSD http://www.jp.netbsd.org/ja/Releases/ OpenBSD http://www.jp.openbsd.org/faq/faq4.html >>3424 George > $sock->close; > としてソケットを閉じたほうがいいんじゃないでしょうか? ごもっともです。修正しましたのでご確認ください。 > すべてのデータの転送が完了しスクリプトが終了するまで、 > 全ソケットが開きっぱなしになってしまうように思うのですが。 その通りですね。正確に言うと、 スクリプトが終了するまでクライアント側は CLOSE_WAIT のまま、 サーバ側は TIME_WAIT のままになってしまう ですね。 …と思ったら、close しなくてもクライアントが FIN を送っている 場合もあるようです。 http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/sample/http-client-parallel.pl?rev=1.2 は close していないので、最後にまとめてクライアントが FIN を 送っているかと思ったのですが、途中で FIN を送っています (★ の部分)。 なぜだろう。 # tethereal -n 0.000000 192.168.1.11 -> 133.8.2.33 DNS Standard query A www.goo.ne.jp 0.021875 133.8.2.33 -> 192.168.1.11 DNS Standard query response A 210.150.25.37 0.022862 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [SYN] Seq=1244798117 Ack=0 Win=57344 Len=0 0.036368 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [SYN, ACK] Seq=4071082836 Ack=1244798118 Win=5792 Len=0 0.036411 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798118 Ack=4071082837 Win=57482 Len=0 0.036763 192.168.1.11 -> 210.150.25.37 HTTP GET / HTTP/1.0 0.037493 192.168.1.11 -> 133.8.2.33 DNS Standard query A www.yahoo.co.jp 0.049007 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [ACK] Seq=4071082837 Ack=1244798134 Win=5792 Len=0 0.049052 192.168.1.11 -> 210.150.25.37 HTTP Continuation 0.057874 133.8.2.33 -> 192.168.1.11 DNS Standard query response A 203.141.35.113 A 210.81.150.5 A 202.229.198.216 0.058447 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [SYN] Seq=830980655 Ack=0 Win=57344 Len=0 0.061073 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [ACK] Seq=4071082837 Ack=1244798160 Win=5792 Len=0 0.088037 210.150.25.37 -> 192.168.1.11 HTTP HTTP/1.1 200 OK 0.088665 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.088688 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071085641 Win=54678 Len=0 0.102552 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.103180 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.103199 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071088445 Win=51874 Len=0 0.103815 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.105548 203.141.35.113 -> 192.168.1.11 TCP 80 > 1516 [SYN, ACK] Seq=1395064875 Ack=830980656 Win=65535 Len=0 0.105566 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980656 Ack=1395064876 Win=57482 Len=0 0.105937 192.168.1.11 -> 203.141.35.113 HTTP GET / HTTP/1.0 0.106691 192.168.1.11 -> 133.8.2.33 DNS Standard query A www.asahi.com 0.117698 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.117743 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071091249 Win=49070 Len=0 0.118337 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.119744 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.119759 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071094053 Win=46266 Len=0 0.128571 133.8.2.33 -> 192.168.1.11 DNS Standard query response CNAME mf3.asahi.com A 210.173.168.48 0.129171 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [SYN] Seq=286646349 Ack=0 Win=57344 Len=0 0.131878 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.132505 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.132524 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071096857 Win=43462 Len=0 0.133124 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.134528 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.134543 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071099661 Win=40658 Len=0 0.135144 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.136529 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.136550 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=37854 Len=0 0.140743 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [SYN, ACK] Seq=2302041965 Ack=286646350 Win=8767 Len=0 0.140767 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646350 Ack=2302041966 Win=57974 Len=0 0.141054 192.168.1.11 -> 210.173.168.48 HTTP GET / HTTP/1.0 0.141407 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=41950 Len=0 0.143290 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=46046 Len=0 0.143673 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=50142 Len=0 0.143868 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=54238 Len=0 0.144062 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071102465 Win=57482 Len=0 0.147471 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.148088 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.148139 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071105269 Win=56080 Len=0 0.148713 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.148817 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071106671 Win=57482 Len=0 0.150165 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.151563 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.151615 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071109475 Win=56080 Len=0 0.152194 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.153553 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.153603 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071112044 Win=54913 Len=0 0.154219 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.155605 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.155627 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071114848 Win=52109 Len=0 0.155939 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [ACK] Seq=2302041966 Ack=286646366 Win=33221 Len=0 0.155970 192.168.1.11 -> 210.173.168.48 HTTP Continuation 0.158143 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071114848 Win=56205 Len=0 0.164042 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.164676 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.164701 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071117652 Win=56080 Len=0 0.165306 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.165407 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071119054 Win=57482 Len=0 0.166710 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.168113 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.168134 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071121858 Win=56080 Len=0 0.168750 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.168851 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071123260 Win=57482 Len=0 0.170143 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.171551 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.171596 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071126064 Win=56080 Len=0 0.171881 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [ACK] Seq=2302041966 Ack=286646392 Win=33229 Len=0 0.173514 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.173630 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071127466 Win=57482 Len=0 0.174146 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.175384 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.175412 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071129502 Win=56848 Len=0 0.175904 210.173.168.48 -> 192.168.1.11 HTTP HTTP/1.1 200 OK 0.177488 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.178123 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.178173 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071132306 Win=56080 Len=0 0.178749 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.178853 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071133708 Win=57482 Len=0 0.180158 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.181557 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.181610 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071136512 Win=56080 Len=0 0.182194 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.182321 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071137914 Win=57482 Len=0 0.183582 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.184982 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.185024 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071140718 Win=54678 Len=0 0.185560 210.150.25.37 -> 192.168.1.11 HTTP Continuation 0.185590 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071141836 Win=53561 Len=0 0.187683 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [ACK] Seq=1244798160 Ack=4071141836 Win=57482 Len=0 0.250874 203.141.35.113 -> 192.168.1.11 TCP 80 > 1516 [ACK] Seq=1395064876 Ack=830980672 Win=32939 Len=0 0.250973 192.168.1.11 -> 203.141.35.113 HTTP Continuation 0.269692 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302042221 Win=57974 Len=0 0.282256 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.282646 192.168.1.11 -> 210.150.25.37 TCP 1515 > 80 [FIN, ACK] Seq=1244798160 Ack=4071141836 Win=57482 Len=0 ★ 0.282841 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.282862 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302045049 Win=56560 Len=0 0.296511 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.296865 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302046463 Win=57974 Len=0 0.297081 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.297650 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.297676 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302049291 Win=55146 Len=0 0.298737 210.150.25.37 -> 192.168.1.11 TCP 80 > 1515 [ACK] Seq=4071141836 Ack=1244798161 Win=5792 Len=0 0.300072 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302049291 Win=57974 Len=0 0.304631 203.141.35.113 -> 192.168.1.11 HTTP HTTP/1.1 200 OK 0.305360 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.305414 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395067680 Win=56080 Len=0 0.306088 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.306190 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395069082 Win=57482 Len=0 0.310105 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.310686 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.310712 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302052119 Win=56560 Len=0 0.312365 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.312466 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302053533 Win=57974 Len=0 0.312940 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.314229 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.314250 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302056361 Win=56560 Len=0 0.323278 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.323656 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302057775 Win=57974 Len=0 0.323846 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.324419 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.324446 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302060603 Win=56560 Len=0 0.325721 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.325821 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302062017 Win=57974 Len=0 0.327029 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.328325 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.328347 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302064845 Win=56560 Len=0 0.328904 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.330194 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.330221 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302067673 Win=53732 Len=0 0.332620 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302067673 Win=57828 Len=0 0.337018 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.337585 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.337636 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302070501 Win=56560 Len=0 0.338157 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.338260 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302071915 Win=57974 Len=0 0.339466 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.340760 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.340783 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302074743 Win=56560 Len=0 0.341338 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.341437 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302076157 Win=57974 Len=0 0.342637 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.343937 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.343958 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302078985 Win=56560 Len=0 0.344512 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.344613 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302080399 Win=57974 Len=0 0.345803 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.347099 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.347121 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302083227 Win=56560 Len=0 0.347680 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.347795 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302084641 Win=57974 Len=0 0.348975 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.350554 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.350609 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302087469 Win=56560 Len=0 0.351108 210.173.168.48 -> 192.168.1.11 HTTP Continuation 0.351146 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [ACK] Seq=286646392 Ack=2302088699 Win=56745 Len=0 0.352602 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.354088 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.354145 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395071886 Win=56080 Len=0 0.354811 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.354939 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395073288 Win=57482 Len=0 0.356410 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.358002 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.358059 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395076092 Win=54678 Len=0 0.360242 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395076092 Win=57482 Len=0 0.399452 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.400187 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.400233 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395078896 Win=56080 Len=0 0.400937 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.401824 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395080298 Win=57482 Len=0 0.402549 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.404149 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.404191 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395083102 Win=54678 Len=0 0.404891 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.406482 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.406498 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395085906 Win=51874 Len=0 0.407229 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.413462 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395087308 Win=54568 Len=0 0.425540 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395087308 Win=57482 Len=0 0.448696 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.449436 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.449485 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395090112 Win=56080 Len=0 0.450211 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.450826 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395091514 Win=57482 Len=0 0.451828 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.453227 203.141.35.113 -> 192.168.1.11 HTTP Continuation 0.453277 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [ACK] Seq=830980700 Ack=1395093266 Win=55731 Len=0 0.486867 192.168.1.11 -> 203.141.35.113 TCP 1516 > 80 [FIN, ACK] Seq=830980700 Ack=1395093266 Win=57482 Len=0 0.486941 192.168.1.11 -> 210.173.168.48 TCP 1517 > 80 [FIN, ACK] Seq=286646392 Ack=2302088699 Win=57974 Len=0 0.498176 210.173.168.48 -> 192.168.1.11 TCP 80 > 1517 [ACK] Seq=2302088699 Ack=286646393 Win=33229 Len=0 0.536535 203.141.35.113 -> 192.168.1.11 TCP 80 > 1516 [ACK] Seq=1395093266 Ack=830980701 Win=32947 Len=0 # www.goo.ne.jp (210.150.25.37) # www.yahoo.co.jp (203.141.35.113) # www.asahi.com (210.173.168.48) # FreeBSD 4.9-RELEASE + Perl 5.005_03 |
>>3425 68user > なぜだろう。 あーそうか。$sock がどこからも参照されなくなったので、 perl がガベージコレクトして、デストラクタが close して いるんですね。 |
こんにちは。 初めて書き込みいたします。 私は、CGIの使えないサイトで、ちょっとしたプロフのページを管理しています。 このサイトでは、自作CGIは一切使えず、既成のCGIを使うしかないのですが、最近、BBSのほうにおかしな書き込みが増えて困っています。 そこで、アクセス元のログを取ろうと考えまして、自作CGIを書きましたがここで問題が生じました。 おわかりかと思いますが、自作CGIを直接設置できないことが問題です。 ただ、このサイトでは、外部から一枚だけ、画像をリンクして表示できるんですね。 そこで、画像の参照元である手持ちのサーバの.htaccessをいじり、 画像がCGIとして機能するように設定しました。 それで、このCGIファイルを画像のように偽装してサイトにアップロードしました。 これによって、外部CGIを呼び出してログを保存することが出来ましたが、私の考えで言えば、いまどき、 print map {"$_ = $ENV{$_}"} keys %ENV; で表示されるデータなど、あまりあてにはできない... できれば、もっと確実なところで、匿名Proxy経由であれば、telnetを起動して接続元をファイルに保存、などの手法をとりたいのです。 ところが、画像のトリガーを使った方式ではこれが上手くいきません。 ヘッダの出し方に問題があるはずですが、なんとかならないものでしょうか? パワーユーザーの皆様、良い知恵がございましたらご教授ください。 宜しくお願いいたします<m(__)m> |
はじめまして^^ ネットワーク関連のプログラムいつも参考にさせていただいております。 今回ちょっとおききしたいことがありまして書き込ませていただきます。 内容がこちらのページの趣旨と離れて申し訳ないのですが、 お返事いただければ幸いです。 いきなり本題にはいらせていただきます。 <a href="$ENV{'SCRIPT_NAME'}?para=data"> としてリンクを作成して、その先のページで <form action="$ENV{'SCRIPT_NAME'}?para2=data2" method='POST'> とします。 このときフォームデータの取り込みのハッシュを%FORMとしたとき 2つめの$FORM{'para2'}が存在しません。 これがなぜおこるのかさっぱりわかりません。 またメソッドをGETでも試しましたがダメでした。 ただし、出力先のURLにはhttp://***.cgi?para2=data2と表示されます。でもprint文では表示されないのです。 原因がわかれば教えていただけないでしょうか? ちなみにperl5でapache1.3.14仕様です。 よろしくおねがいします;; |
>>3427 Mule 試してませんが、画像側で Location: telnet://example.com:1234 ではダメですか? (ダメなような気もしますが) 掲示板側では img src でしか外部リソースを呼び出せない、 という条件のもとでは、これ以外の方法は思いつきません でした。 >>3428 perler 誰かが環境変数 %ENV を解析し、その結果を %FORM に セットしなければならないわけですが、その部分はどこが 担当していますか? (CGI モジュールですか?) |
>>3429 68user ご返事ありがとうございます。 Locationは私も考えましたが、その方法は無理でした。 しかし、コマンドで上手く行きそうです。 現在、実験中ですので、詳細はまたご報告いたします。 とりあえず、今日はご報告まで。 お忙しい中、返事をいただきましてありがとうございました。 |
>>3430 Mule できそうですか。ぜひ結果を教えてください。 |
初歩的な質問で、申し訳ないのですが、教えていただけると助かります。 Bシェルでは、 if [$a = $b] then echo "ok!" fi などと、if文の中で、変数同士の値を比較してイコールならば、とかけますが、 Cシェルでは出来ないのでしょうか? |
通りすがりですが、 #!/bin/csh set a = 2; set b = 2; if(a == b) then echo "a = b" else if(a < b) then echo "a < b" else echo "a > b" endif で良かったと思います。 |
cshさん書き込みありがとうございます 実は、変数には、どの値が入ってくるか、分からないのです。 例えば、 ps -o user,pid,ppid,comm -A | grep -i $1 | grep -v grep > lis.txt set cmd1=(`awk '{print $2}' lis.txt`) set cmd2=(`awk '{print $3}' lis.txt`) @ cnt1=0 @ cnt2=0 foreach pid1 ( $cmd1 ) @ cnt1++ foreach ppid1 ( $cmd2 ) @ cnt2++ if ( $pid1 と$ppid1に入った値がイコールならば ) then echo 'zero!!' echo $pid1 $ppid1 >> procs1.txt ....... end end 。。。。。。みたいに。その、かっこの中を、どう書いてもエラーが出るんです。基本的なミスなのか、それともcでは出来ないのか、、、分からなくて。 if ($a==1) thenはOKでも、($a==$b)、はだめでした。 |
あ、すみません。。。。半角カナ。 |
>>3434 初心者 HP-UX11.0の環境で確認しましたが「==」で問題無く一致を検知できました。 「==」の前後に空白が無いと上記OSでは文法上のエラーになりました。 ご参考になれば。 |
>3429 お早いお返事ありがとうございました。 質問の答えなのですが、同プログラム内で%FORMによみこんでおります。 sub func { my($query,$pair); if($ENV{'REQUEST_METHOD'} eq 'POST'){ read(STDIN,$query,$ENV{'CONTENT_LENGTH'}; }else{$query=$ENV{'QUERY_STRING'};} foreach $pair (split/&/,$query){ ($key,$value)=split(/=/,$pair); #デコード処理 $FORM{$key}=$value; } このサブルーチンで処理させております。 ちなみにただのメールフォームではなにも問題なく動作します。 |
BSD UNIX 類のどれか欲しいんですけどお勧めはありますか? |
>>3437 perler > <form action="$ENV{'SCRIPT_NAME'}?para2=data2" method='POST'> という書き方をした場合、メソッドは POST ですが para2=data2 は 環境変数 QUERY_STRING 経由で渡されます。よって、 POST なら標準入力から読む というやり方では、QUERY_STRING からの入力は無視されてしまいます。 >>3438 超初心者 初心者ということであれば、FreeBSD 4.9-RELEASE がお勧めです。 http://www.h4.dion.ne.jp/~katsuwo/index.html |
>>3434 初心者 シェルの一行目を #/bin/csh -x に変更して再実行すれば 実際に変数に何が入ってくるか確認できますよ。 |
No. 3436 の通りすがりさん、No. 3440 zshさん、 書き込みありがとうございます 私の環境が違うのかも知れません。下記のように表示されてるので。 Digital UNIX V4.0B (Rev. 564 Digital UNIX Japanese Support V4.0A (rev. 3.1) で、やっぱりおっしゃるとおり実行したのだけど、だめなんです。 if ( $a == $b ) の、右辺の変数名が、分かりません、とかそう言うエラーが出るので、 結局 @ df=$a - $b if ($df == 0 ) で、何とかうまくいきました。 ありがとうございました。 |
>>3431 68user こんにちは、Muleです。 すみません、コマンドでtelnet起動、失敗しました(^^; これが出来たら、結構使えるスクリプトになるかもと思っていたのですが、やはり無理がありますかね... コード全体の流れとしては、 プロキシのチェックルーチンをよび、flagが立っていればif分岐、という典型的な処理です。 if($flag){ #telnetを起動し、接続元をファイルに記録する処理 } else{ my $img = 'file.gif'; my $byte = (stat $img)[7]; print "Content-Type: image/gif\n"; print "Content-Length: $byte\n\n"; open IMG,$img; binmode((binmode(IMG),$|=1)[0]); print map {$_} <IMG>; close IMG; } やはり、イメージで呼び出すという方式では、FTPで、というのが、現実的でしょうか? socketと組み合わせれば、なんとかなりそうな気がしていろいろ試してみましたが...上手く行かないものですね。 |
>>3442 Mule わたしは http は proxy 経由かもしれないが、ftp や telnet は proxy 経由でないことを期待して、クライアント側から ftp や telnet でサーバに接続させるように仕向けて、 IP アドレスを取得する と思っていたのですが、そうではないようですね。 > コード全体の流れとしては、プロキシのチェックルーチンをよび、 > flagが立っていればif分岐、という典型的な処理です。 「proxy のチェック」というのは公開 proxy サーバかどうかを 調べるため、クライアントの IP アドレスに接続してみる、という ことですよね。 telnet で接続、というのは http://x68000.startshop.co.jp/~68user/unix/pickup?sleep てな方法でできます。もちろん代わりに Socket を使ってもいいです。 方法はともかく、公開 proxy かどうかの判断はやろうと思えばできます。 で、なぜ if($flag){ #telnetを起動し、接続元をファイルに記録する処理 } と proxy チェックルーチンを呼んだ後 ($flag が確定した後) に もう一度 telnet を実行する必要があるのでしょうか? #telnet を起動し、クライアントの IP アドレスに接続。 #接続できたら $flag=1; if($flag){ #接続元をファイルに記録する処理 open(LOG, ">log"); print LOG "$ENV{REMOTE_ADDR} is open proxy\n"; close(LOG); } とすればよいのではないですか? |
>>3439 68user お返事ありがとうございました。 なるほど、それがperlの仕様なんですね^^ 原因がわかりました。 実は <form action="$ENV{'SCRIPT_NAME'}?para2=data2 method='POST'> <input type="hidden" name="mode" value="res"> <input type="submit" value="返信"> </form> とやっていたためPOSTとGETが混在してしまっていたようでした。 この形ではPOSTをGETにかえても成功しませんでした。 管理人さんの助言でこれに気づくことができました。 どうもありがとうございました。 結果だけお伝えしておきます。 method='POST'の場合 http://xxx.cgi?para2=data2となりmode=resがおくられない。 method='GET'の場合 http://xxx.cgi?mode=resとなりpara2=data2がおくられない。 でした。 |
>>3444 perler > なるほど、それがperlの仕様なんですね^^ perl とは関係ないです。これは HTML と CGI の領域です。 apache-1.3.29・IE6・Mozilla-1.5 で試した結果、 > method='GET'の場合 > http://xxx.cgi?mode=resとなりpara2=data2がおくられない。 これは正しいです。正確に言うと 「ブラウザが para2=data2 を送らない」 です。 > method='POST'の場合 > http://xxx.cgi?para2=data2となりmode=resがおくられない。 これは間違いです。標準入力を解析していないだけ、でしょう。 以下の CGI スクリプトを実行し、GET と POST それぞれで QUERY_STRING と標準入力にどういう値が入っているか確認 してください。 ------- #!/usr/local/bin/perl print "Content-type: text/html\n\n"; $script_name = $0; $script_name =~ s|.*/||; print <<END; <html><body> <form action="$script_name?para2=data2" method='GET'> <input type="hidden" name="mode" value="res"> <input type="submit" value="GET"> </form> <form action="$script_name?para2=data2" method='POST'> <input type="hidden" name="mode" value="res"> <input type="submit" value="POST"> </form> END print "REQUEST_METHOD=$ENV{REQUEST_METHOD}<br>\n"; print "QUERY_STRING=$ENV{QUERY_STRING}<br>\n"; print "STDIN=\n"; print <STDIN>; |
>>3445 68user お返事ありがとうございました。 なるほど、標準入力を解析しないということがわかりました。 パラメーターを指定しているのにPOSTをつかったのがいけなかったようですね。 またGETをつかってもパラメーターを送らないので素直に違う方法を考えます。 ご教授ありがとうございました。 |
>>3443 68user こんにちは、Muleです。 ご返事、ありがとうございます。 中途半端なコードを書いたせいか、誤解があったようですが、わたしも68user様が言われた、 >http は proxy 経由かもしれないが、ftp や telnet は >proxy 経由でないことを期待して、クライアント側から >ftp や telnet でサーバに接続させるように仕向けて、 >IP アドレスを取得する という、まさにそのことを考えております。 proxyのルーチンは、proxy経由かどうかを最初にチェックする為のもので、 httpからのアクセスがproxy経由でなければ、画像を出力し普通に接続元を記録する。 そうでなければ、クライアント側からtelnetでサーバに接続させて、接続元を記録する、という流れです。 FTPと書いたのは、わたしのほうで、FTPを用意し、CGIから出力する画像の参照元に、FTPサーバにある画像を指定して出力させれば、FTPのログに元の接続先が残るのではないかと思うからです。 考え方として、何か大きな間違いをおかしているでしょうか? ご指摘いただければ、幸いです。 |
>>3447 Mule > そうでなければ、クライアント側からtelnetでサーバに接続させて、 > 接続元を記録する、という流れです。 なるほど。つまり、 >>3442 Mule のサンプルは、 接続元 IP アドレスに接続 [*1] if ( 接続成功 ){ クライアント側が telnet でサーバに接続してくるような 出力を行なう (例えば Location とか)。[*2] } else { 画像を表示 } ということですね? もしそうなら納得です。 ただ、*1 の部分は可能ですが、*2 の部分はよほどセキュリティが 甘いブラウザでないと無理なのではないか、と思います。 |
>>3448 68user さっそくのご返事、感謝いたします。 私が考えているのは、68user様のひながたに沿って考えると、最初にtelnetを起動するというのではないです。 たとえば、こんな感じになると思います。 use CGI qw(:standard); $addr = remote_addr; $host = remote_host; $host = gethostbyaddr(pack("C4",split /\./,$addr),2) if($host eq '' || $host eq $addr); unless($host){ クライアント側が telnet でサーバに接続してくるような 出力を行なう (例えば Location とか)。 } else { 画像を表示 } です。 素朴に疑問なのですが、最初にtelnetを起動して、接続元に接続できるかどうかの判定を行わなければ、理屈的に無理なのでしょうか? 私は、proxy経由のアクセスがあった時にのみ、if文を実行させたいと思うのですが... |
>>3449 Mule > $host = gethostbyaddr(pack("C4",split /\./,$addr),2) if($host eq '' || $host eq $addr); 逆引きに成功したら (つまりクライアントが FQDN を持って いたら) proxy 経由でない、逆引きに失敗したら proxy 経由 という判定方法ですね。 これは proxy 判定にはなっていません。なぜなら技術的には、 「FQDN を持つかどうかと proxy サーバであるかどうか」 は関係がないからです。 後は統計的に 「proxy サーバは FQDN を持たないケースが多い」 と言えるかどうかですが、特にそういうこともないと思います。 むしろわたしは 「proxy サーバは FQDN を持つ可能性が高い」 と思います。 > 素朴に疑問なのですが、最初にtelnetを起動して、接続元に > 接続できるかどうかの判定を行わなければ、理屈的に無理 > なのでしょうか? 理屈的には、100% の精度の proxy 判定は不可能です。 ただ、完璧でなくていいなら、以下のような策はあります。 1. proxy 特有のヘッダ、例えば以下のようなものが設定されて いるか調べる。 HTTP_PROXY_CONNECTION HTTP_SP_HOST HTTP_VIA HTTP_X_FORWARDED_FOR http://taruo.net/e/ などで判定しているのはコレでしょう。 http://www2s.biglobe.ne.jp/~cru/library/lq/index.html でも 同様の判定を行っているようです。 ただし、proxy サーバの管理者が適切に設定すれば、これらの ヘッダを渡さないようにすることは可能です。 2. クライアント側の適当なポートに接続し、公開 proxy か どうか (誰でも接続できる proxy かどうか) 判断する。 例えば 2ch ではこれをやっているんでしょう。 http://info.2ch.net/guide/faq.html#F5 ただし、以下のような欠点があります。 - どのポート番号に接続するかは適当に決めなければならない。 全ポートをポートスキャンしていると時間がかかる。 - あくまで「公開 proxy」かどうかの判定にしか使えない。 (世の中の proxy の大多数を占める) 特定のネットワーク内から のみ使用可能な proxy は判定できない。 - ポートスキャンは反社会的。やりすぎると相手からクレームを 付けられる可能性が高い。 3. telnet・Java Applet などで直接接続させるよう仕向ける。 詳しくは以下のサイトをどうぞ。 http://akademeia.info/main/lecture3/tokubetu_IP_nuki.htm http://www.nurs.or.jp/~telnet/tips.html の 「telnetプロトコルによるIP抜き」 ただしこれも反社会的です。いきなりこれをやられたら、 わたしならそのサイトには二度と行きません。 普通は 1 でやめておくのがいいでしょう。2・3 は真面目な ページでやるには過激すぎると思います。 |
質問ではないんで、邪魔だったら消してくださいね。 過去ログを時間が許すままに読んじゃいました。 とってもおもしろかったです^^ まだまだいっぱい残っているので読破しようとおもいます。 言語はたくさん覚えたけど、UNIXには触ったことがないというある意味 希少なプログラマーなのでちょっとわからないこともあるんですけど、 予想するのが楽しいです。 最近のログをみていると応援の書き込みが少なかったので「管理がんばってください」の意味をこめてかきこませていただきました。 お目汚し失礼いたしました。 |
大変、参考になりました。 私がproxyのチェックを行う際には、hostが存在するかどうかの他に、以下のような環境変数を配列に入れて、foreach文や正規表現と組み合わせてチェックしています。 @proxy = ("HTTP_CLIENT_IP", "HTTP_VIA", "HTTP_CACHE_INFO", "HTTP_CACHE_CONTROL", "HTTP_FORWARDED", "HTTP_X_FORWARDED_FOR","HTTP_SP_HOST", "HTTP_TE","HTTP_XONNECTION","HTTP_PROXY_CONNECTION", "HTTP_XROXY_CONNECTION","HTTP_X_LOCKING", "HTTP_PRAGMA","HTTP_IF_MODIFIED_SINCE","HTTP_PC_REMOTE_ADDR"); この他に、 $ENV{'HTTP_CONNECTION'}を調べ、値がkeep-alive以外であればproxyと... しかしこの方法では、精度の高いproxyの判定は、厳しいのではないか...というのが現実でした。 最初から言えばよかったのかも知れませんが...というか、上手く説明できなったのですが、 私がやりたかったことは、結局のところ、 imgタグでしかCGIを起動できない環境で、3 ができるかどうかでした。 コードを直接置ける環境での、3のコードは書いたことがありますので、これをイメージをトリガーにした方法で実装できるかどうかが問題でした。 (telnetの自動起動は、いくらでも未然に防げるものの...) これまでいろいろご教授いただきまして、ありがとうございました。 また書き込みにくるかもしれませんが、暫くは教えていただいた情報を元に試行錯誤してみます。 それでは、よい休日を。 |
みなさん こんにちは。 すごく簡単な質問だと思うのですが、 過去ログを見てもわからなかったため質問いたします。 UNIXコマンドの compress a 1>/dev/null 2>&1 というコマンドについて。 compress a は、aファイルをcompress形式で圧縮するということはわかるのですが、 1>/dev/null 2>&1 は、どういう処理をしているのかわかりません。 よろしくお願いします。 |
>>3451 perler ありがとうございます。それなりにがんばります :-) >>3452 Mule どうもお互い無駄な時間を浪費したように感じます。掲示板で 円滑なコミュニケーションを行うにあたり、質問時にどの程度の 情報を書くべきかについて ご一考ください。 >>3453 あかつき compress の出力を全て捨てるということです。 http://x68000.startshop.co.jp/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8 http://x68000.startshop.co.jp/~68user/unix/pickup?%2Fdev%2Fnull |
ご回答ありがとうございました。 すでにまとめてありましたね。 こんどから、もっときちんと調べます。 |
大雑把な質問ですがResetConnect関数はどのように使うものなのですか? |
挨拶が抜けましたが、初めて書き込みます。宜しくお願いいたします |
>>3456 Hide ResetConnect関数とは何ですか? (google でも 6件しか 引っかからないようですけれども) |
一般的な関数でないのでしょうか? RST送信するんですが・・ |
>>3459 Hide わたしは初めて聞きました。 |
Bシェルなのですが、tarで標準出力した結果をteeでファイルに出力し なおかつ、tarの正常、異常を判断したいのですが、どうすればよい のですか。 tar -cvf /dev/rmt/0m * 2>&1 | tee -a kekka.txt と行ったのですが、標準出力及びkekka.txtに出力されたのですが、 $?の値が常に「0」の状態です。 標準出力、ファイルへの出力、$?の判定を行えるよにするにはどう すればよいのですか。 |
>>3461 だん ちゃんとステータスコードを取れるみたいですよ。 % true | tee -a kekka.txt; echo $? 0 % false | tee -a kekka.txt; echo $? 255 と思ったら、取れるのは csh・tcsh だけで sh (Solaris2.6)・bash は 無理みたいですね。 sh では % true && succeed=OK % echo $succeed % false || succeed=NG % echo $succeed や % true && echo OK | tee -a kekka.txt % false || echo NG | tee -a kekka.txt はいけるのに、 % true && succeed=OK | tee -a kekka.txt % echo $succeed % false || succeed=NG | tee -a kekka.txt % echo $succeed は $succeed に値が入らない。なんでだろう。 # サブシェルで実行されるから? というわけで、Solaris2.6 の sh では % (true; echo $? >result) | tee -a kekka.txt % cat result % (false; echo $? >result) | tee -a kekka.txt % cat result とステータスコードをファイルに保存するというかっこ悪い方法で 実現できました。より美しいやり方を募集中です。 |
>>3462 68user 俺には美しいやり方なんて無理ですが、ファイルじゃないだけなら % ( true ; rc = $? ) | tee > kekka.txt てのは?;-) |
>>3463 has ああ、すみません、3462をよく読んでませんでした。 68userの言う、&&とか||の処理詳細と(;)の違いは良く知らないんですが、 redhat 9.0のshでは3463のやり方ができたもので。 一応ご報告まで。 |
>>3463 has それだと (〜) の部分はサブシェルが実行することになります。 サブシェルのシェル変数は確かに $rc=1 になるけれど、親の シェルのシェル変数には影響しないので、結局 (〜) の外から $rc を参照することはできないと思います。 ちなみに a && b は、a のステータスコードが 0 のときのみ b を実行 a || b は、a のステータスコードが >0 のときのみ b を実行 です。 |
はじめまして. httptalker をしばらく前から愛用しております. 非常に強力なツールで,Webから必要な情報を取得し目的にあわせて加工するなど の用途でたいへん助かっているのですが,ひとつ質問をさせてください. パスワードの認証の後でCookieを受け渡す形式のWebSite のデータをGETする よい方法は,あるでしょうか? httptalker のScript の中にCookie のやりとりをする機能を埋め込めばよさそう ですが,わたしにはかなり難しいのです. |
>>3466 capricio えーっと、お使いのものはこれですか? http://x68000.startshop.co.jp/~68user/net/sample/http-client-2.pl これは解説用のサンプルなので、実際の使用はおすすめしません。 じゃなくて http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/bin/httptalker これをお使いなら、あまりに汚いコードだったので、さきほど少し 書きなおしました。ついでに追加ヘッダを指定できるようにしました。 % ./httptalker -GET http://example.com/foo/bar -add-header 'Cookie: a=b' で cookie を送信できます。 http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/bin/httptalker?rev=1.3&content-type=text/plain ここからどうぞ。 ただし、これの使用もおすすめしません。テストもしっかりしていないし、 機能面でも劣るからです。 というわけで、できるならば - wget (--load-cookies=ファイル名 で cookie を指定できる) - LWP モジュール付属 (libnet モジュール) の GET コマンド。 オプション -H 'Cookie: a=b' で cookie 送信可能。 - H_HTTP モジュール (http://www.studyinghttp.net/H_HTTP.html) などを使った方がよいでしょう。 |
>>3462 68user $ ( true | tee -a kekka.txt ) & ; wait $! ・・・・・やっぱり綺麗じゃないですね。 |
すみません徹夜明けでボケてました。 吊って来ます・・・ |
>>3463 has 俺には美しいやり方なんて無理ですが、ファイルじゃないだけなら % ( true ; rc = $? ) | tee > kekka.txt てのは?;-) 私は、HP-UXを使用しているのですが、 % ( true ; rc = $? ) と実行するとシステムのシャットダウンになります。 他のOSも同じだと思うのですが、使用するときは注意した方が 良いと思います。 |
>>3470 くに > % ( true ; rc = $? ) > と実行するとシステムのシャットダウンになります。 /etc に PATH が通っていたため /etc/rc が実行されたのではないかと 思います (引数は = と $?)。 sh の変数代入は = の前後に空白を入れてはいけないので、 rc = $? でなく、rc=$? ですね。 |
lsコマンドについて質問です。 lsと実行するとファイル名やディレクトリ名が表示されますが、 ファイル名だけとかディレクトリ名だけとかを表示させたいの ですが、できるのでしょうか。 manで調べてみたのですが該当するものもありません。 何かと組み合わせてて1行でできないものでしょうか。 |
>>3472 hanzen > lsと実行するとファイル名やディレクトリ名が表示されますが、 > ファイル名だけとかディレクトリ名だけとかを表示させたいの > ですが 以下のやりとりを参考にしてください。 >>3245 bebe >>3246 68user |
>>3465 68user すみません、勘違いしてました。 3463 でできたと思っていたら、1行ずつ実行したときにセットした rcの値が表示されただけでした。 >>3470 くに それは予想していませんでした。 何にせよ紛らわしいのはよくないですね。 気をつけます。 というわけで何かよい方法はないか探してみましたが、 bashだとこういうのがあるみたいです。 (ただしシェルスクリプト内限定らしいですが) $ echo $BASH_VERSION 2.05b.0(1)-release $ cat pipetest.sh #!/bin/bash true | false | true | false echo ${PIPESTATUS[@]} $ ./pipetest.sh 0 1 0 1 あとはこんなん:-< cp /dev/null kekka.txt ; tail -f kekka.txt & pid=$! ; command > kekka.txt ; st=$? ; kill $pid echo $st |
>>3465 68user 恥の上塗り。 いろいろと試してみましたが、 ファイルを作成せずにステータスは取得できそうにありません。 後は作成するファイルが通常のファイルかFIFOかくらいの違いでしょうか? ------ #!/bin/sh fifo="fifo.$$" mkfifo -m 600 $fifo trap "rm -f $fifo" 0 1 2 3 15 ( command ; echo $? >$fifo ) | tee kekka.txt & rtn=`cat $fifo` echo $rtn >>3472 hanzen >>3473 68user 後は ls -F | grep '/' とかでしょうか。表示に/がついてしまいますが。 |
UNIXでファイルを開かずにファイルの解析を行いたいのですが、 fileコマンドでは実行ファイルなのかどうかなど、詳しいことが わかりませんでした。 #C言語関連のソースかどうか確認したいのです。 何か、他にいい方法はないでしょうか? 教えていただけるとありがたいですm(__)m |
こんにちは。 以前、こちらで幾らか質問させて頂いた tomo と申します。 今、perlでタイマ処理をする事を考えているのですが、 perlではC言語の様にタイマIDという形で複数のタイマを 識別管理する事は出来ないのでしょうか? |
>>3476 橘 調べたいのは > fileコマンドでは実行ファイルなのかどうか と > C言語関連のソースかどうか のどちらですか? 「〜かどうか判定したい」ということなら、何らかの判断基準が ないと判定できませんので、そこらへんを明確にしてください。 >>3477 tomo > perlではC言語の様にタイマIDという形で複数のタイマを > 識別管理する事は出来ないのでしょうか? C にも perl にもタイマ ID という概念はありません。 そもそも「タイマ ID」とは Win32API (MFC?) のそれですか? なら、perl で Win32API を利用できるモジュールを探せば できるでしょうが、あいにく Windows には明るくないので http://www.cpan.org から探してみてください。 |
68user 様 UNIXの部屋等、ちょくちょく参考にさせて頂いております。ありがとうございます。 私、現在、DNSまわりのプログラミングを行っておりまして、ネットワークプログラミングの基礎知識の DNS クライアントを作ってみようのページを、基礎から理解する意味で読ませて頂いたのですが、 この(2)のページ、http://x68000.startshop.co.jp/~68user/net/resolver-2.htmlの DNSヘッダのフラグの部分の第13〜15bitの3bitがRCODEとなっていますが、これは第13〜16bitの4bit分の 間違いだと思うのですがいかがでしょうか。 細かい部分で申し訳ないのですが、気になりましたのでご報告させて頂きました。お忙しいとは思いますが、 よろしくお願いいたします。 |
>>3479 なっち ご指摘ありがとうございます。修正しました。ついでに 1…15bit、16…31bit となっていたものを 1…16bit、17…32bit に修正しました。 # http://x68000.startshop.co.jp/~68user/cgi-bin/cvsweb.cgi/public_html/net/org/resolver-2.html しかし、一般的には MSB を第 0bit とする場合が多いでしょうか? 「詳解TCP/IP Vol.1」では 0〜31bit となっていましたので、 悩むところです。 |
何をもってして一般的というかによりますが・・・ ハードウェアでは、例えばverilogのバス表記の例にとると、 [15:0] > [0:15] >>> [1:16]という頻度で見かけます。 僕の知っている限りの物理層では、[0]が時間軸で最初に 送受信されるので、[0:15]という表記が現れます。 とはいえ、中身を解釈する際に、[15:0]のように置き換え ないと、人間には理解し難い事が多々あり、そのような処理 は僕はよくします。 |
awkの使い方について教えて下さい。 awkを使用して、以下の出力を、数字は、3桁毎にカンマで区切り、 出力位置を揃えて出力したいのですが、 180 file1.txt 1821 file2.txt 113457 fil3.txt を 180 file1.txt 1,821 file2.txt 113,457 file3.txt と出力したいのですが、 数字の部分を揃えることができません。 そのため、たの部分もそろいません。 どうすれば上手くできますか。 ------------------------------- #!/bin/sh # cat list.txt | sort -n -r | awk ' function put_comm(val) { if (val < 1000) { printf("%d",val) ; } else { put_comm(val / 1000) ; printf(",%03d",val % 1000) ; } } { if ($1 < 1000) { printf("%d",$1) ; } else { val=$1 ; put_comm(val) ; } } { #printf "\n" printf(" %s\n",$2) }' |
いつも参考にさせていただいてます dtterm上で動作するC言語のプログラムを作成しています そのプログラムで、cursesのwaddchとwrefreshを使用して1画面分の描画を1文字ずつ行っているのですが、 その際にカーソル表示がされているため、ちらついてしまいます カーソルを一時的に消す方法は無いでしょうか? ちなみに、waddchで画面編集後、最後にwrefreshを1回呼ぶ方法ですと、 一気に1画面分を表示できるのですが、編集時間が長く感じられるため、 1文字ずつパラパラと表示したいと考えています。 |
>>3482 米 桁数の上限がわからないと駄目ですが こんなのでどうでしょ?(下では8桁まで) ------ $ cat list 123 file1.txt 123456 file2.txt 1234567 file3.txt $ cat test.awk #!/bin/nawk -f { i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( i > 1 ) { if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } } else { str_buf = $1 ; } printf("%10s %s\n",str_buf,$2) ; } $ ./test.awk list 123 file1.txt 123,456 file2.txt 1,234,567 file3.txt |
>>3481 へにか > 僕の知っている限りの物理層では、[0]が時間軸で最初に > 送受信されるので、[0:15]という表記が現れます。 なるほど。ネットワークプログラミングでは当然ネットワーク バイトオーダで MSB が先になるわけなので、 [0:15] か [1:16] のどちらかで決まりですね。 個人的には「プログラマたるもの数えるときは 0 から」という ことで、そのうち [0:15] に修正しておこうと思います。 >>3483 tonpei curses はよくわかってませんが、curs_set(0) ですかね。 capability 的には cursor_invisible (vi) っぽいです。 ただ、端末エミュレータにカーソルを消す機能があるかという 問題があるかもしれません。うちの FreeBSD の /etc/termcap に xterm-basic|xterm common (XFree86):...:vi=\E[?25l:... とあったので xterm で % printf "\033[?25l" とするとカーソルが消えましたが、kterm-6.2.0_5 では消えません でした。kterm にカーソルを消す機能がないような感じがします。 でもまぁ dtterm なら多分大丈夫だとは思います。 |
>>3484 zsh 環境も書かずに質問して申し訳ありません。 HP-UX11.00です。 nawkが入っていないので、awkに変えて実行しました。 一応、上手く動きました。 cat list.txt $1 | sort -n -r | awk ' { i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( i > 1 ) { if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } } else { str_buf = $1 ; } printf("%10s %s\n",str_buf,$2) ; }' |
>>3486 米 以下の様に、数字が5桁、4桁は正しくでませんでした。 123 file1.txt 1234 file2.txt 12345 file3.txt 123456 file4.txt 1234567 file5.txt |
>>3487 米 if ( i > 1 ) { を if ( i >= 1 ) { です。 |
>>3488 米 すみません、その部分のif文自体不要でした。 (不要になるように修正してたのを忘れてました。) ----- $ cat list 1 file1.txt 12 file1.txt 123 file1.txt 1234 file2.txt 12345 file3.txt 123456 file4.txt 1234567 file5.txt $ cat test.sh #!/bin/sh sort -n -r $1 | awk '{ i = sprintf("%d",length($1) / 3) ; j = sprintf("%d",length($1) % 3) ; if ( j == 0 ) j = 3 ; str_buf = sprintf("%s",substr($1,0,j)) ; for ( k=0 ; k<i ; k++ ) { cut_str = substr($1,j+(k*3)+1,3) ; if ( cut_str == "" ) break ; str_buf = sprintf("%s,%s",str_buf,cut_str) ; cut_str = "" ; } printf("%10s %s\n",str_buf,$2) ; }' $ sh test.sh list 1,234,567 file5.txt 123,456 file4.txt 12,345 file3.txt 1,234 file2.txt 123 file1.txt 12 file1.txt 1 file1.txt |
68Userさん、回答ありがとうございました またまた質問がありますので、どなたか回答よろしくお願いします 環境:HP-UX Ver.11.0 1.XWindowのログイン後、言語選択の画面が表示されますが、この画面を出さずに、デフォルトで ATOKを選ぶ方法は? 2.XWindowの起動後、ウインドウ内に、ツールバー(端末起動、エディタ起動などのボタン郡)が 表示されますが、これを非表示(アイコンも無くす)にする方法は? 以上、2件についてご存知でしたら、回答お願いします |
HP-UXですが、シェルについて教えて下さい。 printfを使用して書式で、変数の中身を出力しているのですが 上手くできません。 ----------------- #!/bin/sh name1="yamada" name2="taro" printf "%s %s --> %s\n",${name1} ${name2} NG exit 0 ------------ とすると yamada NG --> ,taro となってしまいます。 |
>>3490 tonpei http://x68000.startshop.co.jp/~68user/cgi-bin/wwwboard.cgi?howtouse の 「回答をもらったら結果を報告する」 をよく読んでください。なお、>>3490 の質問については わかりません。 >>3491 みの > printf "%s %s --> %s\n",${name1} ${name2} NG カンマが余分だと思います。 printf "%s %s --> %s\n" ${name1} ${name2} NG > yamada NG --> > ,taro > となってしまいます。 本当ですか? taro NG --> ,yamada になりませんか? |
http://x68000.startshop.co.jp/~68user/net/ ネットワークプログラミングの基礎知識 の http://x68000.startshop.co.jp/~68user/net/crypt-1.html 暗号化のお話 (1) 共通鍵暗号方式 を更新し、 http://x68000.startshop.co.jp/~68user/net/crypt-2.html 暗号化のお話 (2) 公開鍵暗号方式 http://x68000.startshop.co.jp/~68user/net/crypt-3.html 暗号化のお話 (3) 署名 http://x68000.startshop.co.jp/~68user/net/crypt-5.html 暗号化のお話 (5) まとめ を追加しました。 |
>>3492 68user 安易な回答をしてしまい申し訳ありませんでした。 利用規約を読ませていただきましたので、改めて回答させてください。 御指摘頂いた、curs_set(0)使用することで、dtterm上でカーソルの消去ができました。 また、printfの方法でも可能でした。 ありがとうございました |
>3492 すみません カンマが余分でした。 ありがとうございます。 |
HP-UXでのawkについて質問なのですが、 awkを使用してファイルのENDを判断できるのですか。 例えば、 cat date.txt aaa aaa bbb aaa bbb ccc 111 111 222 111 222 3333 とあった場合、 ------------------------ #/bin/sh awk ' function sub() { } getline ; 処理省略 { if (NF == 0) next ; if (NF >= 1) sub() ; ※ }' data.txt ---------------------- ※の場所でファイルのENDか判断したいのですができるのでしょうか。 |