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


16

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

Answers:


18

使用ncnetcat)。

服务器:

$ nc -l localhost 3000

客户:

$ nc localhost 3000

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

当服务器和客户端都在同一台计算机上时,这将起作用。否则,更改localhost为服务器的外部名称。

稍微有趣一点的是,一个“服务器”为您提供一天中的时间(如果您连接到该服务器并向其发送a)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"

客户会话:

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

(服务器会在之后退出q,但在您按之前,客户端不会检测到服务器已消失Enter)。


2
如果客户端完成数据发送后服务器返回结果,ctrl+c则不会显示结果。如果使用echo,例如echo "cookie" | nc localhost 9090,客户端的输出流将被关闭(发送),但客户端仍将等待服务器的结果。
AlikElzin-kilaka

12

一般建议用netcat是更好的方法。

但是在中bashksh您还可以执行以下操作:

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

是什么1>&3?我不确定这代表什么
Alexander Mills

换句话说,为什么不只是呢echo "request" >&3,我想1就是多余的了
Alexander Mills

4

尝试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服务器
  • 如果您不想使用复杂的协议,则可以完成这项工作。

0

在许多情况下,我无法访问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网络功能的更多信息:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.