[FreeBSD-users-jp 95812] Re: nc(1)を使ってデータを送信しても完了にならない
KIRIYAMA Kazuhiko
kiri @ kx.openedu.org
2016年 5月 15日 (日) 11:33:29 UTC
At Sun, 15 May 2016 04:24:02 +0900,
IIJIMA Hiromitsu wrote:
>
> いいじまです。
>
> > 野中です。
> > ncは使ったことが無いのですが、manを見た範囲ではクライアント側に
> > -Nオプションを付けるとうまくいくかもしれません。
>
> はい。今回のテストケースはではこれでうまくいきました。
>
> 念のためいくつか調べてみましたので、以下つらつらとメモしておきます。
>
> ☆ ☆ ☆
>
> まず、https://www.freebsd.org/cgi/man.cgi で参照できる各種OSの中では、
> CentOS、Darwin、RedHat、SuSE Linuxのncには-Nがありません。
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=CentOS+7.1
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=Darwin+8.0.1%2Fppc
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=Red+Hat+Linux%2Fi386+9
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=SuSE+Linux%2Fi386+11.3
>
> Debian、HP-UX、NetBSD、Solaris、UNTRIXにはそもそもnc自体がないようです。
> (ベースシステムとは別パッケージになっているだけ?)
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=Debian+8.1.0
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=HP-UX+11.22
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=NetBSD+7.0
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=SunOS+5.10
> https://www.freebsd.org/cgi/man.cgi?query=nc&manpath=ULTRIX+4.2
>
> 手元にUbuntuのバーチャルマシンがあるのでそちらでも試してみましたが、
> やはり -N はありません。
>
> ☆ ☆ ☆
>
> それから、これは釈迦に説法ですが、nc -N が使えるかどうかの判定に
> % nc -h |& egrep '[-]N[^[:alnum:]] >& /dev/null
> を実行して終了コード $? で判別しようとすると罠にはまります。
>
> FreeBSDの場合、nc -h は1を返し、egrepは0を返します。
> で、このパイプをbashで実行すると $? は0になります。
> ところが、同じコマンドをtcshで実行すると $? は1になります。
> 同じことをUbuntuでもやってみたのですが、こちらの場合、nc -h は
> 0を返し、egrepは1を返すので、$? はbashでもtcshでも1になります。
えーと,全てのソースは見てないので憶測に過ぎませんが,基本的
に *BSD* ではもともと -h や --help なんて洒落たオプションは
なく,間違ったのを指定すると常に usage を返す仕様になってい
るのでは? nc は -h がありましたが,でも基本 1 を返している
のでは? sh で見ると,
$ uname -a
FreeBSD freebsd-11c 11.0-CURRENT FreeBSD 11.0-CURRENT #3 r298951: Wed May 4 06:50:18 JST 2016 admin at freebsd-11c:/usr/obj/usr/src/sys/GENERIC amd64
$ if nc -h > /dev/null 2>&1; then
> echo true
> else
> echo false
> fi
false
$
ということで,やはり -h は 1 を返してます.
>
> 結局のところ、nc -N が使えるかどうかの判定には
> % test -n "`nc -h |& egrep '[-]N[^[:alnum:]]'`"
> あたりを使う必要があります。
sh ですが,直接,
if nc -N foo 1234 < bar; then
...
とかすれば良いような...
>
> ☆ ☆ ☆
>
> あと、一つだけ訂正です。
> 今回の実験で FreeBSD→Linux の接続がうまくいかなかった犯人は、
> FreeBSDのncコマンドではなく、Linux側のファイヤーウォールのようです。
>
> まず、Linux側で
> % echo WELCOME | nc -l 8086 &
> としてサーバを立てます。
>
> で、FreeBSDから
> % echo GET | nc -N m2.valueserver.jp 8086
> とすると、いつまでもだんまりです。
>
> そこでCtrl+Cで強制終了して、次に
> % telnet m2.valueserver.jp 8086
> とすると
> Trying 157.7.184.32...
> (しばらく待たされる)
> telnet: connect to address 157.7.184.32: Operation timed out
> telnet: Unable to connect to remote host
> だそうで、要するにTCPの接続がブラックホールに吸い込まれています。
>
> 念のため、同じFreeBSDクライアントの上で
> % telnet localhost 8087
> としてみると、こちらは即座に
> Trying 127.0.0.1...
> telnet: connect to address 127.0.0.1: Connection refused
> Trying ::1...
> telnet: connect to address ::1: Connection refused
> telnet: Unable to connect to remote host
> と返ってきます。
>
> …徒労でした。
>
> ========================================================================
> (Mr.) IIJIMA Hiromitsu aka Delmonta <delmonta at dennougedougakkai-ndd.org>
> 飯嶋 浩光 / でるもんた・いいじま ; (任同)電脳外道学会 代表取締役椅子人
> ------------------------------------------------------------------------
> Web (Japanese): http://www.dennougedougakkai-ndd.org/
> Twitter: @delmonta_iijima, @kabu_agare, #放送大学, #OUJ
> Yahoo! Japan: delmonta_iijima
> ------------------------------------------------------------------------
> マニアツクで綾しいクイヅbot、運用開始!現在、購読者・出題者とも募集中。
> ※購読はこちらから → https://twitter.com/AyaC_KaltQ
> ※出題希望のかたは → http://kaltq.wicurio.com/
> ========================================================================
>
> _______________________________________________
> freebsd-users-jp at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
> To unsubscribe, send any mail to "freebsd-users-jp-unsubscribe at freebsd.org"
>
---
KIRIYAMA Kazuhiko
freebsd-users-jp メーリングリストの案内