[FreeBSD-users-jp 95809] Re: nc(1)を使ってデータを送信しても完了にならない

IIJIMA Hiromitsu delmonta @ dennougedougakkai-ndd.org
2016年 5月 14日 (土) 19:24:04 UTC


いいじまです。

> 野中です。
> 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になります。

結局のところ、nc -N が使えるかどうかの判定には
    % test -n "`nc -h |& egrep '[-]N[^[:alnum:]]'`"
あたりを使う必要があります。

☆ ☆ ☆

あと、一つだけ訂正です。
今回の実験で 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 メーリングリストの案内