出于测试目的,我需要创建一个 shell 脚本,用于连接远程 IP>端口并发送简单的文本 TCPIP 套接字消息。
答案1
使用nc
(netcat
)。
服务器:
$ 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 时,本地主机会自动选择您通常需要的端口。您可以阅读更多关于gawk
的TCP/IP 网络功能在提供的链接中。
值得注意的是,如果每次 awk 执行只发送一条消息,则可以缩短此时间:
BEGIN {print "coke" |& "/inet/tcp/0/cs.wisc.edu/finger"}