Linux Bash:如何打开websocket连接作为客户端

Bri*_*ian 9 linux bash curl websocket node.js

我创建了一个Node.JS应用程序,它提供了一个Web套接字服务器(使用npm ws).这个websocket等待直到建立连接.一旦连接到达服务器,websocket就会执行一项工作.作业完成后,将通过套接字发送消息,然后关闭套接字.这个插座按预期工作; 已经使用另一个Node.JS脚本对其进行了测试.

如何仅使用linux 命令行工具连接到Web套接字?描述我已经尝试过卷曲这里.但是,我无法找到如何正确连接到我在localhost上运行的websocket:8088/socket /

编辑: 我的问题已被确定为另一个问题的可能重复.但是,链接的问题只询问是否有办法使用curl.我很高兴看到任何解决方案适用于bash.此外,链接问题的答案是使用autobahn.ws的javascript文件

小智 11

我一直在使用 wscat,一个 npm 包。https://github.com/websockets/wscat

发布时包自述文件中的说明:

安装

该模块需要全局安装,因此在安装时使用 -g 标志:

npm install -g wscat
Run Code Online (Sandbox Code Playgroud)

例子

$ wscat -c ws://echo.websocket.org
Connected (press CTRL+C to quit)
> hi there
< hi there
> are you a happy parrot?
< are you a happy parrot?
Run Code Online (Sandbox Code Playgroud)

  • 请注意,ws://echo.websocket.org 服务不再可用 (2认同)

ton*_*ton 10

VI 的答案提供了一个非常有用的工具。websocat非常容易使用。

我只想用bash内置函数来做。我认为对其他人更好地理解协议很有用。

所述WebSocket协议握手是容易的。

tcp在 bash 中打开一个频道,我们可以使用:

wshost=echo.websocket.org
wsport=80
exec 3<>/dev/tcp/${wshost}/${wsport}
Run Code Online (Sandbox Code Playgroud)

然后我们可以tcp使用文件描述符读取和写入数据到该连接&3

首先让我们打开一个读取通道:

CR=$(echo -en "\r")
while read <&3; do echo "WS MSG:[${REPLY//$CR/}]"; done &
Run Code Online (Sandbox Code Playgroud)

我们真的不需要替换回车字节\r,但是如果我们不替换,终端输出会很奇怪。

每个 websocket 服务器实现都可能需要特定的细节。websocket.org在结束行之前需要Origin头和\r字节。

然后我们可以开始连接upgrade

echo -e "GET / HTTP/1.1\r
Host: ${wshost}\r
Connection: Upgrade\r
Upgrade: websocket\r
Sec-WebSocket-Accept: $(echo -n "somekey"|base64)\r
Origin: http://www.websocket.org\r
\r" >&3
Run Code Online (Sandbox Code Playgroud)

我们立即看到 ws 升级输出:

$ WS MSG:[HTTP/1.1 101 Web Socket Protocol Handshake]
WS MSG:[Access-Control-Allow-Credentials: true]
WS MSG:[Access-Control-Allow-Headers: content-type]
WS MSG:[Access-Control-Allow-Headers: authorization]
WS MSG:[Access-Control-Allow-Headers: x-websocket-extensions]
WS MSG:[Access-Control-Allow-Headers: x-websocket-version]
WS MSG:[Access-Control-Allow-Headers: x-websocket-protocol]
WS MSG:[Access-Control-Allow-Origin: http://www.websocket.org]
WS MSG:[Connection: Upgrade]
WS MSG:[Date: Thu, 29 Oct 2020 15:08:01 GMT]
WS MSG:[Sec-WebSocket-Accept: eXT5yQBZ/TOhFBUi6nLY8cfzs1s=]
WS MSG:[Server: Kaazing Gateway]
WS MSG:[Upgrade: websocket]
WS MSG:[]
Run Code Online (Sandbox Code Playgroud)

你看到Sec-WebSocket-Accept标题了吗?服务器按照RFC 6455 中的描述解析它。我们可以用以下方法计算:

$ WS MSG:[HTTP/1.1 101 Web Socket Protocol Handshake]
WS MSG:[Access-Control-Allow-Credentials: true]
WS MSG:[Access-Control-Allow-Headers: content-type]
WS MSG:[Access-Control-Allow-Headers: authorization]
WS MSG:[Access-Control-Allow-Headers: x-websocket-extensions]
WS MSG:[Access-Control-Allow-Headers: x-websocket-version]
WS MSG:[Access-Control-Allow-Headers: x-websocket-protocol]
WS MSG:[Access-Control-Allow-Origin: http://www.websocket.org]
WS MSG:[Connection: Upgrade]
WS MSG:[Date: Thu, 29 Oct 2020 15:08:01 GMT]
WS MSG:[Sec-WebSocket-Accept: eXT5yQBZ/TOhFBUi6nLY8cfzs1s=]
WS MSG:[Server: Kaazing Gateway]
WS MSG:[Upgrade: websocket]
WS MSG:[]
Run Code Online (Sandbox Code Playgroud)

我知道... cut, xxd,base64sha1sum不是内置的,但这个验证步骤只是为了澄清。

握手完成,我们的 tcp 连接现在升级为 websocket 连接。

现在是困难的部分。

我们需要发送数据。我们可以在 RFC6455 的第 5 节中了解如何做到这一点

客户端必须屏蔽它发送到服务器的所有帧(有关详细信息,请参阅第 5.3 节)

服务器必须在收到未屏蔽的帧时关闭连接

阅读 RFC 第 5.2 节以了解如何屏蔽数据。

RFC 甚至提供了一种用于数据屏蔽的 ascii-art:

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |
 +---------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我想写一个 bash 函数来屏蔽 ws 数据,但我现在不能这样做。我稍后会更新这篇文章。


Vi.*_*Vi. 8

我的工具websocat是专门为此设计的。

websocat ws://your_server/url
Run Code Online (Sandbox Code Playgroud)

您可以与服务器连接并交换数据。默认情况下,每一行都将成为WebSocket文本消息,反之亦然。

在Linux上,使用readline玩起来更舒服:

rlwrap websocat ws://your_server/url.
Run Code Online (Sandbox Code Playgroud)

它不是唯一的CLI Websocket客户端。也有“ ws”和“ wscat”项目。


Ste*_*ein 7

从这里试试这个:如何点击WebSocket端点?

$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: echo.websocket.org" -H "Origin: http://www.websocket.org" http://echo.websocket.org
Run Code Online (Sandbox Code Playgroud)

他来自这里:http://www.thenerdary.net/post/24889968081/debugging-websockets-with-curl

引用本网站的内容以供将来使用:

那些旗帜说:

  1. 返回输出中的标题
  2. 不要缓冲响应
  3. 设置此连接需要从HTTP升级到其他内容的标头
  4. 设置此连接需要升级到WebSocket连接的标头
  5. 设置标头以定义主机(以后的WebSocket标准要求)
  6. 设置标头以定义请求的来源(以后的WebSocket标准要求)

如果websocket正在运行,它应该返回以下内容:

$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: echo.websocket.org" -H "Origin:http://www.websocket.org" http://echo.websocket.org
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.websocket.org
WebSocket-Location: ws://echo.websocket.org/
Server: Kaazing Gateway
Date: Mon, 11 Jun 2012 16:34:46 GMT
Access-Control-Allow-Origin: http://www.websocket.org
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Run Code Online (Sandbox Code Playgroud)