Linux下用nc实现DuplexPipe

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

时间: 2024-10-04 00:07:01

Linux下用nc实现DuplexPipe的相关文章

Linux下主机间文件传输命令

SCP命令: 简介: scp 命令在网络上的主机之间拷贝文件,它是安全拷贝(secure copy)的缩写. scp 命令使用 ssh 来传输数据,并使用与 ssh 相同的认证模式,提供同样的安全保障. 如果有公钥打通就不用密码,如果没有就会提示输入密码. 用法: 1 #Copy 本地文件 /etc/eva.log, 到远程机器 sysB, 用户 user 的家目录下 2 scp /etc/eva.log user@sysB:/home/user 3 #copy 远程机器 sysB 上的文件 /

Linux下容易被忽视的那些命令用法

本文适合在linux下开发的同学阅读,需要具备基本的linux操作命令. 一.前言 工作中发现很多同学对于Linux下的命令不太熟悉,尤其是一些功能强大的工具,使用者很少.正所谓工欲善其事,必先利其器.本文总结了Linux下常用命令的用法,希望能够帮助大家提升日常开发的效率. 二.命令 1.strace strace用于跟踪程序执行过程中的系统调用,如跟踪test进程,只需要: strace -p [test_pid] 或直接strace ./test  但如果需要: 跟踪进程内的线程: -f

linux下memcached的启动命令和使用

一.启动和停止   (1)启动   默认情况下memcached安装到/usr/local/bin下.   进入安装目录,启动memcached: /usr/local/memcached/bin/memcached -d -c 10240 -m 1024 -u root   -d 选项是启动一个守护进程, -m 是分配给Memcache使用的内存数量,单位是MB,这里是1024MB,默认是64MB -u 是运行Memcache的用户,这里是root -l 是监听的服务器IP地址,默认应该是本机

Linux命令ping,nc的学习

今天看了下<Linux大棚命令百篇>网络和系统篇,发现了几个很不错的命令,我是看着目录然后根据自己的需要选了3个命令,没想到3个命令都让人眼前一亮,刷新了我原本的认知. 首先第一个命令还是老生常谈的ping 传统的ping就是下面的样子,这个也是我们熟悉的ping # ping 10.127.133.96 PING 10.127.133.96 (10.127.133.96) 56(84) bytes of data. 64 bytes from 10.127.133.96: icmp_seq=

Linux下备份恢复技术的应用

  本文讲述Linux环境下,如何使用备份的脚本和命令以及商业化的软件来合理高效地保护磁盘数据安全. 备份与恢复系统承担着事前备份与事后恢复的职能.在当前高速发展的网络环境下,任何一个网络上的信息 系统都不可能保证绝对的安全.只要有网络存在,就会有来自网络的形形色色的威胁.为了抵御网络的攻击和入侵,虽然我们引入了日趋成熟的入侵检测系统.防火墙系统等,黑客们的入侵手段也日益高明,他们总能找到这些系统的安全漏洞及不足进行入侵,因而网络入侵所引起的安全事件呈逐年增加之势. 在这种情况下,我们难以保证网

openni opencv linux-如何在linux下建立一个着openni和opencv的工程?

问题描述 如何在linux下建立一个着openni和opencv的工程? 如何在linux下建立一个着openni和opencv的工程?麻烦大神们详细解说下,不胜感激!!!!

关于linux下的嵌入式文件系统以及flash文件系统选择

嵌入式linux下常见的文件系统 • RomFS:只读文件系统,可以放在ROM空间,也 可以在系统的RAM中,嵌入式linux中常用来作 根文件系统 • RamFS:利用VFS自身结构而形成的内存文件系 统,使用系统的RAM空间• JFFS/JFFS2:为Flash设计的日志文件系统 • Yaffs:专门为Nand Flash设计 • proc:为内核和内核模块将信息发送给进程提 供一种机制,可以查看系统模块装载的信息 • devFS:设备文件系统 Linux上的Ext2fs • 支持4 TB

脚本-如何在Linux下批量改C语言的作业?

问题描述 如何在Linux下批量改C语言的作业? 最近接到导师给的一个任务帮本科生改C语言作业.大概的界面是这样的需要测试每种输入: LuYang:CISB110-Programming Practice 1-41826 luyang$ ./mainChoose the type of speed conversion:1. knots to km/h2. km/h to knotsEnter your choice (1 or 2): 0Invalid optionLuYang:CISB110

linux下oracle自动备份脚本

linux下oracle自动备份脚本  vi /home/oracle/backup.sh   //编写脚本 以下为脚本内容 time=` date +"%Y%m%d%H%M" ` //变量time 获取当前系统时间 su - oracle -c "exp hbskjt_0113/password owner=hbskjt_0113 file=/home/oracle/hbskjt_$time.dmp"  //导库脚本 cd /home/oracle tar zcv