NetCat是一个非常简单的Unix工具,可以读、写TCP或UDP网络连接(network connection)。它被设计成一个可靠的后端(back-end)工具,能被其它的程序程序或脚本直接地或容易地驱动。同时,它又是一个功能丰富的网络调试和开发工具,因为它可以建立你可能用到的几乎任何类型的连接,以及一些非常有意思的内建功能。NetCat,它的实际可运行的名字叫nc,应该早很就被提供,就象另一个没有公开但是标准的Unix工具。
GNU也有一个netcat项目,但此处学习的不是GNU的那个。
最简单的使用方法,”nc host port”,能建立一个TCP连接,连向指定的主机和端口。接下来,你的从标准输入中输入的任何内容都会被发送到指定的主机,任何通过连接返回来的信息都被显示在你的标准输出上。这个连接会一直持续下去,至到连接两端的程序关闭连接。注意,这种行为不同于大多数网络程序,它们会在从标准输入读到一个文件结束符后退出。
NetCat还可以当服务器使用,监听任意指定端口的连接请求(inbound connection),并可做同样的读写操作。除了较小限制外,它实际并不关心自己以“客户端”模式还是“服务器”模式运行,它都会来回运送全部数据。在任何一种模式下,都可以设置一个非活动时间来强行关闭连接。
它还可以通过UDP来完成这些功能,因此它就象一个telnet那样的UDP程序,用来测试你的UDP服务器。正如它的“U”所指的,UDP跟TCP相比是一种不可靠的数据传输,一些系统在使用UDP传送大量数据时会遇到麻烦,但它还有一些用途。
你可能会问“为什么不用telnet来连接任意的端口”?问题提得好(valid),这儿有一些理由。Telnet有“标准输入文件结束符(standard input EOF)”问题,所以需要在脚本中延迟计算以便等待网络输出结束。这就是netcat持续运行直到连接被关闭的主要原因。Telnet也不能传输任意的二进制数据,因为一些特定的字符会被解释为Telnet的参数而被从数据流中去除。Telnet还将它的一些诊断信息显示到标准输出上,而NetCat会将这信息与它的输出分开以不改变真实数据的传输,除非你要求它这么做。当然了,Telnet也不能监听端口,也不能使用UDP。NetCat没有这些限制,比Telnet更小巧和快捷,而且还有一些其它的功能。
NetCat的一些主要功能:
- 支持连出和连入(outbound and inbound connection),TCP和UDP,任意源和目的端口
- 全部DNS正向/反向检查,给出恰当的警告
- 使用任何源端口
- 使用任何本地设置的网络资源地址
- 内建端口扫描功能,带有随机数发生器
- 内建loose source-routing功能
- 可能标准输入读取命令行参数
- 慢发送模式,每N秒发送一行
- 以16进制显示传送或接收的数据
- 允许其它程序服务建立连接,可选
- 对Telnet应答,可选
编译NetCat
==========
编译NetCat是非常简单的。检查一下Makefile,找到符合你的系统类型的SYSTYPE如何拼写,然后运行“make
其Makefile中有dos, ultrix, sunos, solaris-static, solaris, aix, linux, irix, osf, freebsd, bsdi, netbsd, hpux, unixware, aux, next, generic等SYSTYPE,其中generic不算系统类型,则dos其实并不支持。在本文一开始的NetCat的链接页面中,也有一个Windows版本的NetCat,是另一个人做的移植。
Linux的sys/time.h并不真正支持FD_SETSIZE的表示,编译时会有一个无害的警告。在一些系统中编译时,可能会与signal()有关的指针类型警告,但不影响编译结果。
开发NetCat的功能
===============
NetCat小巧且功能强大,描述它的功能就是象描述瑞士军刀的功能一样。
如果没有提供命令行参数,NetCat会提示你从标准输入来输入命令参数,然后NetCat会在内部解析输入。用这种办法输入命令式参数,可以用来防止借助“ps”来查看你的命令行参数。
主机参数可以是一个名字或一个IP地址。如果-n出现,则它接受IP地址,而不再对计算机的名字或域名进行解析。如果没有-n,但加上-v,则NetCat可进行正/反向域名解析,并警告the all-too-common problem of mismatched name in DNS。这会耗费稍多一点时间,但在某些情况下会有用处。如,你想知道某个IP的主机名,NetCat可省却你手工查找的时间。
要建立对外的连接,必须提供一个端口号,可以是个数字,也可以/etc/services列表中的端口服务名。当-n出现时,则只有数字形式的端口可以接收。
-v参数,可以将一些关于连接建立信息输出