发送套接字消息的简单 shell 脚本

发送套接字消息的简单 shell 脚本

出于测试目的,我需要创建一个 shell 脚本,用于连接远程 IP>端口并发送简单的文本 TCPIP 套接字消息。

答案1

使用ncnetcat)。

服务器:

$ nc -l localhost 3000

客户:

$ nc localhost 3000

服务器和客户端都将读取和写入标准输出/输入。

当服务器和客户端位于同一台计算机上时,这将起作用。否则,更改localhost为服务器的外部名称。在服务器上,您还可以使用0.0.0.0(或完全删除它)让服务器绑定到所有可用接口。

更有趣的是,如果您连接到“服务器”并向其发送d,它会为您提供一天中的时间,如果您发送 ,它就会退出q

服务器(在bash):

#!/bin/bash

coproc nc -l localhost 3000

while read -r cmd; do
  case $cmd in
    d) date ;;
    q) break ;;
    *) echo 'What?'
  esac
done <&"${COPROC[0]}" >&"${COPROC[1]}"

kill "$COPROC_PID"

客户端会话:

$ 数控本地主机 3000
d
2017 年欧洲中部时间 1 月 12 日星期四 18:04:21
你好?
什么?
q

(服务器在 后退出q,但客户端直到您按 后才检测到它已经消失Enter)。

答案2

一般来说,建议netcat是更好的方法。

但在bash并且ksh你也可以这样做:

exec 3<>/dev/tcp/hostname/port
echo "request" 1>&3
response="$(cat <&3)"

答案3

尝试 netcat (例如 nc )

echo GET / HTTP/1.0 | nc 0 80
HTTP/1.1 400 Bad Request
Date: Thu, 12 Jan 2017 13:44:23 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 311
Connection: close
Content-Type: text/html; charset=iso-8859-1
  • 在上面的示例中,我将 GET ( echo GET / HTTP/1.0) 发送到我的本地 http 服务器
  • 如果您不需要复杂的协议,这可能可以完成工作。

答案4

在很多情况下我无法访问netcat/socat。我exec在分布式计算环境中使用 bash 时也遇到过问题。

由于其普遍存在,替代解决方案是使用 GNU AWK 的 TCP/IP 功能。它提供了基于“双向管道”运算符的简单语法。

这是一个修改后的例子这个来源这将通过套接字发送 TCP 消息:

BEGIN {
 NetService = "/inet/tcp/0/cs.wisc.edu/finger"
 print "coke" |& NetService
 close(NetService)
}

地址的完整语法是:/net-type/protocol/local-port/remote-host/remote-port。当local-port设置为 0 时,本地主机会自动选择您通常需要的端口。您可以阅读更多关于gawkTCP/IP 网络功能在提供的链接中。

值得注意的是,如果每次 awk 执行只发送一条消息,则可以缩短此时间:

BEGIN {print "coke" |& "/inet/tcp/0/cs.wisc.edu/finger"}

相关内容