link もっと前
   2015年 8月 18日 -
      2015年 8月 18日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

netcat traditional 版と netcat OpenBSD 版

ネットワークを経由した送受信を実現するのに便利な netcat というツールがあります。わざわざソケットプログラムなどを書かなくても、単純な送受信が実現できる優れものです。

利用イメージは、A というマシンで、produce_something | nc として netcat でネットワークに送信し、B というマシンで nc | consume_something として netcat でネットワークから受信します。まるでネットワーク越しにパイプを繋ぐかのような感覚で利用できます(nc は netcat のコマンド名)。

さてこの netcat ですが Debian Jessie で利用可能な netcat は下記の 2種類があります。

netcat traditional 版(パッケージ名 netcat-traditional)
Hobbit さんが書いたオリジナルの netcat です。コマンド名は nc.traditional です。
netcat OpenBSD 版(パッケージ名 netcat-openbsd)
OpenBSD のナイスガイ達が書き直して、機能追加した netcat です。コマンド名は nc.openbsd です。

結論を先に書くと、特に理由が無ければ netcat OpenBSD 版をオススメします。こちらの方が新しくて、多機能です。変な動きもしません。

netcat traditional の変な動き

何が「変な動き」かというと、下記のようなごく普通の使い方でも netcat traditional は必ず終端でハングアップしてしまいます。

netcat traditional に EOF を送ったときの動き
----- 送信側 host1
nc.traditional host2 55555
(Ctrl+D を押して EOF を送る)
(終了しない。。。)

----- 受信側 host2
nc.traditional -l -p 5555
(終了しない。。。)

どうも入力に来た EOF の扱いが上手くない?ようで、EOF を受けると Ctrl+C などで kill しない限り、ずっと止まったままになってしまいます。この挙動を防ぐには -q というオプションで EOF が来たときの挙動を指定する必要があります。

netcat traditional で EOF 受信時の挙動を指定する
----- 送信側 host1
nc.traditional -q 0 host2 55555
(Ctrl+D を押して EOF を送る)
(終了する)

----- 受信側 host2
nc.traditional -q 0 -l -p 5555
(送信側が終了したタイミングで終了する)

これで万事解決に見えますが、残念なことに netcat tradtional は標準入力から入力待ちするため、受信側をバックグラウンドに送ると入力待ちで停まってしまいます。

netcat traditional をバックグラウンドで動作させると止まる

----- 送信側 host1
while : ; do \
	cat /lib/x86_64-linux-gnu/libc-2.19.so | \
		nc.traditional -q 0 host2 5555 ; \
	sleep 1 ; \
done


----- 受信側 host2
(準備)
rm pipe recv_file
mkfifo pipe
cat pipe > recv_file

cat > recv.sh << EOS
#!/bin/sh

while : ; do \
	nc.traditional -q 0 -l -p 5555 > pipe ; \
	sleep 1 ; \
done
EOS
chmod 755 recv.sh

(端末その 1)
./recv.sh &
(Enter キーを押し続けると…)
[1]+  停止                  ./recv.sh ★★★★止まってしまう★★★★

(端末その 2)
while : ; do \
	cat pipe > recv_file ; \
	sleep 1 ; \
done

私の知る限り netcat traditional でこの問題を解決する方法はありません(たぶん)。代わりに netcat OpenBSD を使って解決します。

なんと netcat OpenBSD には -d オプションという標準入力を開かないように指定するそのものズバリのオプションがあるのです。

netcat OpenBSD で -d オプションを指定
----- 送信側 host1
さっきと同じなので省略

----- 受信側 host2
(準備)
cat > recv.sh << EOS
#!/bin/sh

while : ; do \
	nc.openbsd -d -l -p 5555 > pipe ; \ ★★★★nc.traditional を nc.openbsd に変え、-d オプション追加★★★★
	sleep 1 ; \
done
EOS
chmod 755 recv.sh

(端末その 1)
./recv.sh &
(Enter キーを押し続けても止まらない)

(端末その 2)
さっきと同じなので省略

これでバックグラウンドに送った netcat が突然停止することはないはずです。

まとめ

以上の話をまとめると、

  • netcat traditional を使うときは -q オプションを使って EOF で止まらないようにしよう
  • netcat traditional はバックグラウンドでの利用に適していないと思われる
  • バックグラウンドで netcat を使うときは、netcat OpenBSD と -d オプションを使おう

結論をもう一度書いておくと「特に理由がないなら netcat.openbsd がオススメだよ!」ってことです。

[編集者: すずき]
[更新: 2015年 8月 18日 23:34]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2015年 8月 18日 -
      2015年 8月 18日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 11/17 08:18

カレンダー

<2015>
<<<08>>>
------1
2345678
9101112131415
16171819202122
23242526272829
3031-----

最近のコメント 5件

  • link 18年11月15日
    hdk 「-in-に色がついていますね :-)\n...」
    (更新:11/17 08:18)
  • link 18年11月11日
    すずき 「T4さん\n\n> 全く同じ処で(...」
    (更新:11/17 00:15)
  • link 18年11月11日
    T4 「こんにちわ\nT4 といいます、以前に一...」
    (更新:11/16 23:22)
  • link 18年10月12日
    すずき 「なるほど!\n京急、京成はヤバそうですね...」
    (更新:10/15 23:02)
  • link 18年10月12日
    ちかふみ 「閉会式直後の出国ラッシュ対策のためだそう...」
    (更新:10/15 20:43)

最近の記事 3件

link もっとみる
  • link 18年11月15日
    すずき 「[Windows 10 と Samba] Windows からアク...」
    (更新:11/17 01:29)
  • link 18年11月11日
    すずき 「[linux-next で動かない ROCK64 の I2S] 昨...」
    (更新:11/17 00:27)
  • link 18年11月13日
    すずき 「[お気に入りのマンガ] Kindle Fire HD は大量の本を...」
    (更新:11/14 02:08)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報