使用curl 发送到套接字

使用curl 发送到套接字

我正在努力让curl和socat能够很好地合作。情况如下:

  1. 我发布 XML 来登录系统。
  2. 返回消息包含身份验证令牌。
  3. 我使用令牌发布后续请求。警告:如果连接断开,令牌就会过期,所以我不能只使用普通的卷曲。

它在 PowerShell 中运行良好:https://pastebin.com/5Jiw1fct

但是,我需要它在 Linux 中运行。由于我需要保持连接,所以我决定使用 socat。

如果我运行此命令来发布 XML:

curl http://$target_ip -d @./xml/login.xml

我从系统中得到了正确的答案。但连接已关闭,因此我无法重新使用令牌。

但是,如果我尝试这个(当然,在 socat 之后):

curl --unix-socket /tmp/$target_ip.sock -d @./xml/login.xml

Curl 抱怨我没有设置 URL。

有想法吗?

一如既往地感谢。

答案1

Curl 可能连接到 Unix 套接字,但 HTTP 请求需要主机名。

您是否尝试过将 socat 设置为侦听 127.0.0.1 并连接到目标系统的 IP 地址(不是名称),将 url 中的主机名添加到 IP 地址为 127.0.0.1 的 /etc/hosts,然后使用不受干扰的卷曲调用中的 URL?

过去,我在非标准端口上运行的服务遇到了一些麻烦 - 因此,如果您已经运行了一个网络服务器,那么您将需要使用网络命名空间或其他一些魔法,以便curl和远程服务器都认为您是连接到目标端口。

或者,您可以使用原始 URL,socat 侦听 lo 上的非标准端口,并在curl 中指定 --resolve 选项,而不必伪造端口和/或在 /etc/hosts 中添加条目(需要curl > =7.57)

虽然它是非常与 TCP 会话绑定的令牌是很不寻常的,更令人惊讶的是,这是针对 http 而不是 https 服务的。

相关内容