关闭

在bash中建立网络连接

标签: bash网络tcppython工作服务器
5018人阅读 评论(1) 收藏 举报
近期在工作中碰到一个问题,需要建立一个TCP(或者UDP也可以)连接到另一台机器,只需要连接某个自定义的端口一下即可,连接后马上断开,不用发送任何数据,以此作为一种“心跳”的实现。实现这个需要编写一个TCP小程序放到心跳发起的机器上然后循环执行它。当然这个小程序越简单越好,于是就想到用python,然而由于机器上的软件已经被裁减了,根本就没有对python的支持,如果为此“安装”一个python,能预见的就是遇到一系列的库依赖问题,最终陷入一个泥潭。如果真这样,我还不如直接用C写一个心跳发送程序呢...最终的方案是使用telnet:
echo ^]quit |telnet 192.168.2.2 1234
这样就可以连接上之后立马断开了,可以使用,于是就采用了。很显然对端需要有一个接收程序,使用nc再简单不过了:
nc -l -p 1234
完事后,就这个问题又进一步思考了一下。万一连telnet也没有该怎么办?这次之所以用了telnet,那是凑巧了!于是就想如果能用shell内建的命令建立TCP连接该多好。google之,man之,终于发现了一个bash内建的文件:/dev/tcp[or UDP]/[IP or HostName]/port
只要打开这个文件,就能建立一个TCP或者UDP连接到[IP or HostName]的port端口,现在的问题是如何打开这个文件。想要打开这个文件,你一定要用bash内建命令打开,因为只有bash可以识别/dev/tcp...否则如果你用cat打开的话,由于cat不能识别它,就要真的去/dev路径下去寻找了,结果可想而知:no such file...
    使用exec这个内建命令可以完成这个工作,exec不附带任何command以替换当前bash,而仅仅是为了打开上述的tcp文件,然后将之定向到一个空闲的文件描述符,这样我们就可以操作该文件描述符了:

1.首先重定向,建立连接:
exec 6>/dev/tcp/192.168.2.2/1234
2.然后关闭:
exec 6>&-
3.其它
在关闭之前,你可以使用下面的命令来向该连接发送数据:
echo -e "$data" >&6
在关闭之前,你可以使用下面的命令来读取该连接返回的数据:
cat <&6

以上就是使用bash内建命令exec以及内建文件名/dev/$proto/$address/$port进行网络通信的方法。美中不足的地方在于bash没有对应的文件产生TCP/UDP服务器,如果万一系统中没有nc,没有python,你就不得不动用C了,编译,复制到系统,万一出错或者库不匹配,就要重新编译,链接。但是由于bash的源码可获得,因此修改它就可以了。在动手之前首先要设计好接口。以下仅仅以TCP为例。对于客户端而言,bash的/dev/tcp/接口设计的很好,于是我们可以仿造该接口设计一个新的TCP服务器的接口用于侦听某一个端口:
/dev/tcp-server/$IP/$PORT
在bash中,只要重定向这个文件就打开一个侦听TCP,现在问题是如何接受客户端的连接并且提供服务,而且这一切还必须内置于bash,我们可以采用“读取”该TCP服务文件描述符的方式,其内容是一个工作套接字的文件描述符,或者用tail也可以:
1.创建一个侦听套接字:
exec 6>/dev/tcp-server/192.168.2.2/1234
2.等待客户端连接:
cat <&6
返回8
3.提供服务:
cat <&8
...
echo -e "response" >&8
4.主动断开连接:
exec 8>&-
5.停止服务:
exec 6>&-

至于实现,对着已有的客户端实现比葫芦画瓢即可,这个不重要,重要的是如何使得接口更容易被使用,如果还没有nc方便,那么做这个就没有意义了。实际上你不能指望该方式能提供多么复杂的服务,它基本上就是一个调试网络的工具而已,这也许就是bash为何只实现了client而没有实现server的原因吧。


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Bash的输入输出重定向

原贴:http://linux-wiki.cn/wiki/zh-hans/Bash%E7%9A%84%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA%E9%87%8D%E5%A...
  • rainharder
  • rainharder
  • 2014-09-26 11:20
  • 1298

如何使用netcat或bash创建反向shell来执行远程root命令

反向shell(Reverse shell)是一种往远程机器发送shell命令的技术,当远程机器处在防火墙等其它东西后面时,这种技术会变得非常有用。你也许会说,“一个普通的shell或简单的SSH通道...
  • jb19900111
  • jb19900111
  • 2014-01-02 14:26
  • 1162

网络编程释疑之:TCP连接拔掉网线后会发生什么

背景:前些天团队在进行终端设备和服务器端长连接业务的测试时,发现了这么一个情况:在拔掉设备端的网线后,再插上网线,有时可以继续正常的进行长接连请求,而且用的还是拔掉网线之前的那个长连接。但是有时却不能...
  • u012730075
  • u012730075
  • 2015-04-05 21:03
  • 2262

Java多种多样的建立网络连接的方式

  • 2011-05-10 00:28
  • 9KB
  • 下载

vm安装centOS7同时建立网络连接[20180102]

1vm添加虚拟机 2网络模式选择桥接模式 3启动后输入ifconfig结果大致如下: [root@MiWiFi-R1CM-srv network-scripts]# ifconfig ens33: f...
  • bas_ball
  • bas_ball
  • 2018-01-02 22:02
  • 32

建立网络连接的基本步骤及NSJSONSerialization(苹果自带)——JSON解析

什么是JSON JSON是一种轻量级的数据格式,一般用于数据交互 服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外) NSJSONSerialization...
  • yejiexiaobai
  • yejiexiaobai
  • 2015-11-08 17:33
  • 333

多种多样的建立网络连接的方式

在上一篇文章中我们讨论了Socket类的基本用法,并给出的例子中使用Socket类连接服务器时使用了一种最简单的连接方式,也就是通过IP和端口号来连接服务器。而为了使连接服务器的方式更灵活,Socke...
  • tgww88
  • tgww88
  • 2012-09-27 16:03
  • 424

通过Windows Mobile连接管理器建立网络连接

EstablishNetworkWithConnMgr.rar  原文为Jim Wilson 的 Establishing Network Connectivity with the Windows ...
  • lyx123
  • lyx123
  • 2011-03-12 10:47
  • 1215

通过Windows Mobile连接管理器建立网络连接

概要 Summary     本文主要讲述在托管程序中怎样使用连接管理器建立和释放网络连接。本文的重点是关于使用连接管理器建立和断开连接的概念,而不是如何封装连接管理器API。文章的目的在于涵盖...
  • alisa525
  • alisa525
  • 2011-12-20 21:20
  • 446

TCP连接的三次握手和Socket建立网络连接的步骤

TCP连接的三次握手: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;   第二次握手:服务器收到syn包,必须确认客户的SYN(a...
  • PersonSky
  • PersonSky
  • 2015-10-14 11:59
  • 1815
    个人资料
    • 访问:6892398次
    • 积分:83220
    • 等级:
    • 排名:第18名
    • 原创:1427篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3085条
    文章存档
    最新评论