`
xitong
  • 浏览: 6313939 次
文章分类
社区版块
存档分类
最新评论

在bash中建立网络连接

 
阅读更多
近期在工作中碰到一个问题,需要建立一个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的原因吧。


分享到:
评论

相关推荐

    bash超酷脚本实例

    3. 网络工具:如网络连接检查、IP地址查询等脚本,方便进行网络诊断和维护。 4. 日志分析:通过解析和处理日志文件,提供有用的统计信息和警报。 5. 自动化任务:例如定时备份、定期清理无用文件的脚本,可以节省...

    详解怎样在Linux中配置静态网络连接

    在Linux系统中配置静态网络连接是一项基础且重要的任务,尤其对于服务器或需要固定IP地址的设备来说更是必不可少。本教程将详细介绍如何在基于 CentOS/RHEL 的Linux发行版中配置静态网络连接,主要使用的工具是 `...

    gitBash 客户端 ssh 服务器远程登陆

    在实际开发中,GitBash SSH连接不仅用于登录服务器,还可以执行各种远程操作,比如克隆远程Git仓库、推送和拉取代码,甚至可以作为自动化脚本的一部分,实现自动化部署或任务调度。熟悉这一过程对于任何在Windows...

    tmux_for_git-bash.zip

    这会创建一个新的 tmux 会话,如果你看到一个控制台窗口,但没有新的窗口或面板出现,试着按下 `Ctrl + b` 然后按 `c`,这将在当前会话中创建一个新的窗口。在 tmux 中,你可以使用快捷键来管理和操作窗口、面板和...

    Advanced Bash-Scripting Guide(中译版)

    7. **正则表达式**:学习如何在Bash脚本中匹配和处理文本,包括模式匹配、替换和分割。 8. **条件和测试命令**:使用`test`或`[[`进行条件检查,如文件属性、字符串比较和数值计算。 9. **循环结构**:掌握`for`、...

    linux-checkmongodb在Bash中的MongoDBNagios插件

    总结起来,"linux-checkmongodb在Bash中的MongoDBNagios插件"是利用Bash脚本实现的一种监控MongoDB服务的方法,通过与Nagios的集成,可以有效地监控MongoDB的运行状态,确保数据服务的稳定性。在"check_mongodb-...

    定时重启机器和自动测试网络连接shell脚本

    在IT行业中,shell脚本是一种强大的工具,它允许我们通过编写简单的命令行指令来自动化复杂的任务,例如定时重启机器和自动测试网络连接。这个压缩包包含的两个脚本可能就是实现这些功能的具体代码。 首先,让我们...

    exm_ppp_sh.rar_bash_ppp

    标题“exm_ppp_sh.rar_bash_ppp”暗示了这是一个关于使用Bash脚本启动PPP(点对点...学习这个脚本的内容将有助于理解PPP连接的自动化过程,这对于远程网络访问、拨号连接或在没有固定网络连接的环境中工作非常有用。

    Linux下使用命令行连接无线网络

    为了使无线网络连接能在系统启动时自动进行,你可以将`wpa_supplicant`的启动命令添加到系统的启动脚本中,或者使用`systemd`的服务单元文件。此外,如果你的Linux发行版使用NetworkManager,可能需要配置...

    如何在Oracle中通过网络连接导入数据

    在Oracle 10g中,通过网络连接导入数据的核心在于使用`DATABASE LINK`,它是一种数据库对象,用于在不同的Oracle数据库实例之间建立连接。 首先,需要创建一个数据库链接,以识别源数据库并提供认证信息。例如,...

    ADB网络连接调试Android

    传统的ADB连接通常通过USB进行,但在某些情况下,例如没有USB接口的情况下或在虚拟机环境中调试Android设备时,使用网络连接进行ADB调试就显得尤为重要。 #### 二、ADB网络连接原理 ADB网络连接主要涉及三个组件:...

    Linux高级bash编程

    将目录中的符号连接文件名保存到一个文件中 10-12. 一个C风格的for循环 10-13. 在batch mode中使用efax 10-14. 简单的while循环 10-15. 另一个while循环 10-16. 多条件的while循环 10-17. C风格的while循环 10-18. ...

    linux-torque一个用纯bash编写的transmissiondaemonTUI客户端

    Linux-Torque是一个基于Bash shell脚本的 Transmission Daemon 图形用户界面(TUI)客户端,专为那些喜欢在命令行环境中工作但又想享受简单易用的交互式界面的Linux用户设计。Transmission是一个流行的BitTorrent...

    Git Bash安装,常用命令,使用示例说明,问题总结

    在使用Git Bash时,可能会遇到一些问题,例如权限问题、网络连接问题或是冲突解决。处理这些问题的方法通常包括检查环境变量设置、配置SSH密钥、手动解决冲突等。对于Git和SVN的对比,Git更强调分布式版本控制,每个...

    Advanced Bash-Scripting Guide 网页离线版

    《高级Bash脚本编程指南》是一本专为Linux用户和开发者编写的详细教程,它深入探讨了Bash Shell脚本的高级用法和技巧。...离线版使得你可以在任何时间、任何地点进行学习,无需网络连接,随时随地提升你的Bash技能。

    linux-一行bash命令集合的仓库

    - `ping`: 检查网络连接。 - `curl`: 从URL获取数据,支持多种协议。 - `scp`: 安全复制文件到远程主机。 - `ssh`: 远程登录和执行命令。 9. **脚本编程**: - `if`, `for`, `while`: 用于编写条件和循环语句...

    mobaxterm无法连接到liunx的解决办法.doc

    在虚拟机中,调整虚拟网络编辑器的设置,确保正确的网络连接类型(例如,NAT或桥接模式)被启用。 清理并调整虚拟网络配置后,你可能会看到Windows中新增了两个以太网接口,它们与VMware相关。这表明虚拟网络已配置...

    Bash.docset.rar

    `Bash.docset.rar`是一个包含Bash离线文档的压缩包,旨在为用户提供方便的参考材料,特别是配合Zeal软件使用时,可以在没有网络连接的情况下查阅Bash的相关知识。 **一、Bash基本概念** 1. **Shell 脚本**:Bash...

Global site tag (gtag.js) - Google Analytics