瑞士军刀NC
nc(NetCat)是我很喜欢的一个小工具。在我常用的网络小工具中使用频率仅次于 cURL 。nc 属于传输层的工具(TCP/IP 四层模型请看这里),它能保证准确无误地发送和接收数据,但并不关心数据的具体含义(这些工作交给应用层的软件)。难怪说 nc 是网络的瑞士军刀,因为所有应用层的软件都是通过各自的网络协议来解析来自传输层的数据。所以,只要你了解应用层协议(比如HTTP、POP3等),就可以手工模拟出任何服务端或客户端程序。而且,只要你愿意,以后设计网络程序完全可以只实现一个“解析器”,数据传输的工作则全权交给 nc 了。
常用功能
网络程序要建立连接有两种方式:主动去连接、监听本地端口等待连接。nc 也提供了这两种方式:
- 1) nc host port
- 主动连接 host 的 port 端口。
- 2) nc -l -p port
- 监听本地 port 端口,等待其他程序来连接。
- 示例:
- 运行 nc g.cn 80
- 这样就连接上“谷歌中国”的服务器,输入“GET / HTTP/1.1<CR><CR>”(不包括引号,其中<CR>是回车,这里需要敲两次回车),服务器就会返回“谷歌”首页的 HTML 源代码。
上面是一个网络程序最基本的功能,默认下输入输出为 stdin 和 stdout (也就是“键盘”和“屏幕”)。nc 让我最欣赏的就是“-e”选项,通过它能将输入输出重定向到本地可执行程序。例如在 windows 环境下执行:
nc -l -p 1234 -e cmd.exe
这样,从端口 1234 获得的数据都会转发给 cmd.exe ,而 cmd.exe 的输出也会返回给网络。此时的 nc 就像一件外衣罩在 cmd.exe 上,让原本不具备网络通信功能的 cmd.exe 也成为网络程序。更多关于 nc 的用法可以参见这里。
程序自动“聊天”
如果你能理解上述 nc 的用法,那解决《[DuplexPipe二三事(一)]/2009-09-03/duplexpipe-1/》中提到的进程通信问题也就很简单了!打开两个终端分别执行:“nc -l -p 1234 -e 24.sh
”和“nc localhost 1234 -e r24.sh
”,这样两个 Shell 脚本就通过本地 1234 端口进行通信了!我就是用这种方法让我的 ThinkPad 疯狂了一把~
总结
作为一个通讯工具,nc 最神奇的地方就是能让本地非网络程序(比如 cmd.exe)实现网络通讯。但如果是两个网络程序,因为某种原因没办法直接建立连接(比如想在外网访问内网服务器),此时 nc 就无能为力了。这时候需要做的就是数据转发(端口映射),《DuplexPipe二三事(三)》中会介绍如何用 FPipe 来实现端口映射。