AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 783169
Accepted
georg
georg
Asked: 2016-06-11 00:47:15 +0800 CST2016-06-11 00:47:15 +0800 CST 2016-06-11 00:47:15 +0800 CST

BSD nc (netcat) 不会在 EOF 上终止

  • 772

主持人甲:

tar cf -  stuff | dd | nc  -N -l 12987

主持人乙:

nc a.example.com 12987 | dd | tar tf - 

在主机 A 上完成dd后打印其摘要tar。因此很明显, tar 关闭了管道/文件 -> EOF。

165040+0 记录 165040+0 记录输出 84500480 字节在 25.464802 秒内传输(3318325 字节/秒)

两个主机上都nc愉快地坐在那里而不退出。 nc(1):

   -N      shutdown(2) the network socket after EOF on the input.  Some
           servers require this to finish their work.

因此,在主机 A 上nc应该已经看到EOF,关闭了该死的套接字,在主机 B 上nc应该已经看到 TCP 连接终止并且应该已经关闭stdout(stdin的dd/ tar)。

如何告诉在主机 B 上nc关闭stdout/终止并在主机 A 上终止。

nc漏洞?

-D(调试)什么都不做。nc连版本号都说不出来……唉

两台主机都是FreeBSD 10.3-RELEASE-p4,仅限 IPv4。

networking freebsd bsd nc
  • 2 2 个回答
  • 9080 Views

2 个回答

  • Voted
  1. Best Answer
    ens
    2018-04-01T11:56:59+08:002018-04-01T11:56:59+08:00

    我也对 netcat 的行为感到困惑,所以我深入研究了代码。这是整个故事:

    nc 服务器 ( nc -l) 和客户端仅在相互连接关闭后退出。也就是说,如果双方都向对方发送了一个FIN数据包。

    服务器总是在收到来自客户端FIN的数据包后发送一个数据FIN包。(除非服务器已经发送了一个FIN数据包。)

    客户端发送一个 FIN 数据包:

    • 在标准输入之后EOF,当使用参数运行时-N
    • 在标准输入之后EOF,当服务器已经发送了一个 FIN 数据包时

    使用选项-d stdin 将被忽略,nc其行为就像EOF在 stdin 上遇到一样。

    选项-N总是意味着FIN在遇到标准输入后发送EOF。

    交换数据后退出nc进程的方法:

    1. 格奥尔格的回答

       server$ echo hello | nc -l -N 2000
       client$ nc -d localhost 2000
      

      发送后hello,服务器EOF在 stdin 上遇到发送,FIN因为-N.

      客户端接收到消息,并且由于在标准输入上-d看到EOF并发送FIN,因为服务器已经发送FIN。

      连接关闭,客户端和服务器都退出。

    2. 客户端发起关闭

       server$ echo hello | nc -l 2000
       client$ nc -dN localhost 2000
      

      服务器在标准输入后保持连接打开EOF。

      客户端在 stdin 上看到EOF并发送FIN,因为-N.

      服务器FIN收到客户端的FIN.

      连接关闭,客户端和服务器都退出。

    • 13
  2. georg
    2016-06-11T01:02:03+08:002016-06-11T01:02:03+08:00

    nc建立双向连接。即它stdin从主机 B 发送到主机 A 以及从 A 到 B 的所需一个。

    -d在主机 B 上使用忽略stdin. -N仍然需要在主机 A 上关闭TCPEOF 上的连接。


    总之

    主持人甲:

    tar cf -  stuff | dd | nc  -N -l 12987
    

    主持人乙:

    nc -d a.example.com 12987 | dd | tar tf - 
    
    • 4

相关问题

  • 谁能指出我的 802.11n 范围扩展器?

  • 我怎样才能得到一个网站的IP地址?

  • 在一个 LAN 中使用两台 DHCP 服务器

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve