ncat v7.6 UDP -k と -w が期待どおりに動作しません。

ncat v7.6 UDP -k と -w が期待どおりに動作しません。

職場(BSD ncバージョン)と多くのインターネットの例では、ncatはudpを受け取り、次のオプションで使用できます。

  1. -k複数の接続を許可
  2. -w 0クライアント接続が失われると、現在の接続を終了します。

家には次のようなものがあります。

コマンド:Ncat:バージョン7.60(https://nmap.org/ncat
オペレーティングシステム:Fedora 27

-kまたは使用できません-w 0

ncat -klu localhost 8000
Ncat: UDP mode does not support the -k or --keep-open options, except with --exec or --sh-exec. QUITTING.

nc -luw 0 localhost 8000
Ncat: Invalid -w timeout (must be greater than 0). QUITTING.

私のncatバージョンですぐにアクティブにしてタイムアウトを維持するにはどうすればよいですか? (マンページは役に立ちません)

ありがとう

ベストアンサー1

まず、nc、ncat、およびnetcatはすべて同じ名前を持つ技術的に異なるツールですが、必ずしも同じ(相互運用可能な)機能/オプションを提供するわけではありません。

第二に、どのバージョンで作業しているかはわかりませんが、現在のバージョンのncatでは、オプションkがudpでは機能しません。 TCPでのみ機能します。ただし、udpはステートレス(接続プロセスなし)なので、ソース接続が失われても、ncatはudpでもリッスンし続けます。ただし、ソースが最初に使用されたのと同じソースポートで再接続/再送信されない限り、パケットは受信されません(最新バージョンのncatはudpで見られる最初のソースポートにロックされているため)。無視します)残念ながら、この動作はソースコードを変更しない限り設定できません。したがって、唯一の「解決方法」は、他のツールを見つけるか、私が直接使用してコーディングするPythonで自分で書くことです。

#! /usr/bin/python

from socket import socket,AF_INET,SOCK_DGRAM,SO_REUSEADDR,SOL_SOCKET
from time import sleep,ctime
import sys

if len(sys.argv)>2:
    localIP = sys.argv[1]
    localPort = int(sys.argv[2])
else:
    print("Space-separated IP and Port are required")
    exit()

print(f"listening on {localIP}:{localPort}")
bufSize = 1500

sock = socket(family=AF_INET, type=SOCK_DGRAM)
sock.setsockopt(SOL_SOCKET,SO_REUSEADDR, 1)
sock.bind((localIP, localPort))

while True:
    message, ipport = sock.recvfrom(bufSize)
    print(ctime(), f"[{ipport[0]}:{ipport[1]}]",str(message)[2:-1])

最も簡単ではありませんが、各パケットのタイムスタンプ、IP、およびポートも印刷します。拡張子が「.py」のファイルに入れて、コマンドで直接入力して実行します(Pythonが正しく設定されていると仮定)。バインドするIPとポート(スペースで区切られた)を転送します。 IPは、「0.0.0.0」、「127.0.0.1」、または「localhost」である可能性があり、すべてのlocalhostインターフェイスにバインドされます(引用符を除く)。タイムスタンプやリモートIP /ポートが必要ない場合は、印刷機能の最後の行からパラメータを省略してください。たとえば、メッセージのみを取得するには、最後の行を次のように置き換えます。

print(str(message)[2:-1])

おすすめ記事