Linux下用nc实现DuplexPipe

简介: nc 是一把网络的瑞士军刀,我以前在介绍 DuplexPipe 时也提到过,如果你没接触过它,可以先参看一下《DuplexPipe二三事(二)》。再来简单地介绍一下 DuplexPipe,顾名思义,它是一个“双向管道”。在 shell 中,我们通过“|”使用匿名管道,让前一条命令的输出作为后一条命令的输入;双向管道即在此基础上在加上“后一条命令的输入作为前一条命令的输入”。这是最初开发它的原因

nc 是一把网络的瑞士军刀,我以前在介绍 DuplexPipe 时也提到过,如果你没接触过它,可以先参看一下《DuplexPipe二三事(二)》。再来简单地介绍一下 DuplexPipe,顾名思义,它是一个“双向管道”。在 shell 中,我们通过“|”使用匿名管道,让前一条命令的输出作为后一条命令的输入;双向管道即在此基础上在加上“后一条命令的输入作为前一条命令的输入”。这是最初开发它的原因,但后来发现它更像是一个网络接口转换器,“DuplexPipe”这个名字反而不能体现它的功能。更多内容请参看DuplexPipe系列文章

留言

今天网友黄海给我留言,他通过用 nc 的 -e 选项来执行 nc 本身来实现 DuplexPipe。留言原文如下:

哥们,你写的那个DuplexPipe, 我很欣赏。不过近日于网上逛发现此工具的功能竟然完全可以用netcat做到,有两种方法,我的博客上载了一种。简单描述如下:
在windows下:
echo nc [ip] [port] > relay.bat
nc -l -p [port2] -e relay.bat
其余的类推
第二种方法是用命名管道:(linux下)
mknod backpipe p
nc -l -p [port] 0<backpipe | nc [ip] [port12] | tee backpipe

其中选项 -e 的作用是:

for NT:    -e prog        inbound program to exec [dangerous!!]
for Linux: -e filename    program to exec after connect [dangerous!!]

Windows下不行

在我开发 DuplexPipe 时确实考虑过功能会不会和 nc 重叠,当时只想着通过 shell 管道来连接,忘了 nc 自带了一个双向管道!我首先在 Vista 下做了测试,nc(win32) 是从 http://www.securityfocus.com/tools/139 下载。开启三个命令提示符,分别执行:

1) nc -l -p 1234
2) nc localhost 1234 -e "nc -l -p 1235"
3) nc localhost 1235

其中第二条和留言中使用批处理等价。理论上在提示符(3)中输入一行数据,提示符(1)三中马上显示。但我每次在提示符(3)中输入一堆数据后,提示符(1)要输入两个回车才会把数据显示出来。我又另外开启四个命令提示符,模拟 DuplexPipe:

1) nc -l -p 1234
2) nc -l -p 1235 -e "nc -l -p 1236"
3) nc localhost 1234 -e "nc localhost 1235"
4) nc localhost 1236

此时提示符(1)中的数据能发送到(4)中,而提示符(4)中的数据却倒不了(1)。调整(2)、(3)中端口的顺序会出现不同结果,但都达不到理想效果。后来又下了其他几个不同版本的 nc,并在 WinXP 下也进行了测试,但都不成功。

Linux下成功

Linux下有些不同,nc 不能脱离 shell 执行。可以像留言中一样先创建一个脚本文件,也可以使用另一个选项:

-c shell commands      as `-e'; use /bin/sh to exec [dangerous!!]

我的系统是 Debian Lenny+nc v1.10-38,经测试能实现 DuplexPipe 的全部功能!最新版的 DuplexPipe 能实现九种连接模式,对应的指令分别是:

  1. nc -l -p port1 -c 'nc -l -p port2'
  2. nc -l -p port1 -c 'nc host2 port2'
  3. nc -l -p port1 -c 'nc -u -l -p port2'
  4. nc -l -p port1 -c 'nc -u host2 port2'
  5. nc host1 port1 -c 'nc host2 port2'
  6. nc host1 port1 -c 'nc -u -l -p port2'
  7. nc host1 port1 -c 'nc -u host2 port2'
  8. nc -u -l -p port1 -c 'nc -u -l -p port2'
  9. nc -u -l -p port1 -c 'nc -u host2 port2'

在留言中还提到用命名管道来实现。

mknod pipe p
nc -l -p 1234 0< pipe | nc -l -p 1235 > pipe

shell 的匿名管道让前一条命令的标准输出作为后一条命令的标准输入,手工创建的命名管道则是让后一条命令的标准输出作为前一条命令的标准输入。你会发现这已经解决了文章开头的问题,而且不需要通过网络。

下一步任务

我想,DuplexPipe 已经没必要继续维护了。虽然 Windows 下测试不成功,但所幸它的源码开放,也许接下来我们应该考虑转向去完善 netcat for NT。


版权声明

请尊重原创作品。转载请保持文章完整性,并以超链接形式注明原始作者“redraiment”和主站点地址,方便其他朋友提问和指正。

联系方式

我的邮箱,欢迎来信(redraiment@gmail.com
我的Blogger(子清行):http://redraiment.blogspot.com/
我的Google Sites(子清行):https://sites.google.com/site/redraiment
我的CSDN博客(梦婷轩):http://blog.csdn.net/redraiment
我的百度空间(梦婷轩):http://hi.baidu.com/redraiment

目录
相关文章
|
6月前
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】Linux 创建网络连接 nc命令 使用教程
【Shell 命令集合 网络通讯 】Linux 创建网络连接 nc命令 使用教程
200 1
|
6月前
|
监控 网络协议 Unix
Linux命令-nc(端口监控、文件传输、反弹shell等)
Linux命令-nc(端口监控、文件传输、反弹shell等)
396 0
|
12月前
|
网络协议 Linux 网络安全
Linux命令(4)之nc
Linux命令(4)之nc
106 0
|
Linux 网络安全 开发工具
校外网络连接校园网内的linux服务器方法(使用frp实现内网穿透)
平常在校园里连接校内实验室的linux服务器可以直接使用ssh直接链接私有ip地址,一旦本地移动到了校园网外部(如:使用手机流量wifi,或着暑假回家使用家庭wifi)便无法在使用ssh连接校内的服务器。本文提供一个实现校外也能访问校内服务器的方法
4307 0
校外网络连接校园网内的linux服务器方法(使用frp实现内网穿透)
|
Shell
78Linux - nc命令使用详解
78Linux - nc命令使用详解
76 0
|
6月前
|
Linux Shell 网络安全
Linux 强大的网络命令:nc命令操作方法
Linux 强大的网络命令:nc命令操作方法
468 1
|
监控 网络协议 Linux
Linux利用nc命令脚本批量检测服务器指定端口是否开放
nc命令脚本批量检测服务器指定端口是否开放
1118 0
Linux利用nc命令脚本批量检测服务器指定端口是否开放
|
关系型数据库 MySQL Linux
Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造
Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造
452 0
Linux下C语言实现MySQL操作——连接、查询、插入与客户端打造
|
安全 网络协议 Linux
一文让你熟练掌握Linux的ncat(nc)命令
一文让你熟练掌握Linux的ncat(nc)命令
874 0
Daz
|
IDE Unix Linux