在 macOS 和 Linux 上:

在 macOS 和 Linux 上:

我设置了以下管道。这使我能够看到通过管道的原始 HTTP 请求和响应。

笔记:下面我使用的是 BSD nc(这是 macOS 和 AmazonLinux 自带的),但我也尝试过 nmap 的ncat,它可以接受相同的参数,socat1.7.3.2 的行为是相同的。
socat接受不同的参数,但管道是相同的。我只会添加socat一行代码,因为解释是相同的。

单行:

mkfifo res; nc -kl 8888 < res | tee /dev/stderr | nc google.com 80 | tee res

或者

mkfifo res; socat tcp-listen:8888,reuseaddr,fork - < res | tee /dev/stderr | socat - tcp:google.com:80 | tee res

解释:

mkfifo res; \             <-- Make a named pipe file with the name 'res'.
nc -kl 8888 < res \       <-- Open a socket listening on all interfaces at TCP port 8888. Use the 'res' pipe as input.
    | tee /dev/stderr \   <-- Copy the request to stderr, so it's emitted by the terminal. stdout will be used as input for the next netcat.
    | nc google.com 80 \  <-- Resolve google.com, connect to it on TCP port 80, and send what was received on stdin. The response goes to stdout.
    | tee res             <-- Copy the response to the 'res' pipe.

我在一个终端中运行此管道(管道终端),然后使用curl在另一个终端(卷曲终端):

curl --resolve google.com:8888:127.0.0.1 http://google.com:8888

在 macOS 和 Linux 上:

卷曲终端正确接收并显示响应。管道终端显示请求和响应。

在 macOS(macOS Mojave 10.14.3)上:

管道继续运行。我可以使用 发送另一个请求curl,并且可以在管道终端以及回应两个都端。

在 Linux 上(AmazonLinux 4.1.13):

管道继续运行。curl如果我发送另一个请求,它就会挂起,而且我在任何地方都看不到该请求或响应。

版本:

苹果系统

$ uname -a
Darwin ch007837.na.webmd.net 18.2.0 Darwin Kernel Version 18.2.0: Thu Dec 20 20:46:53 PST 2018; root:xnu-4903.241.1~1/RELEASE_X86_64 x86_64 i386 MacBookPro15,1 Darwin

$ curl --version
curl 7.64.1 (x86_64-apple-darwin18.2.0) libcurl/7.64.1 SecureTransport zlib/1.2.11
Release-Date: 2019-03-27
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile libz NTLM NTLM_WB SSL UnixSockets

$ bash --version | head -1
GNU bash, version 5.0.3(1)-release (x86_64-apple-darwin18.2.0)

$ ncat --version
Ncat: Version 7.70 ( https://nmap.org/ncat )

我不确定,nc因为它没有--version标志,但它随操作系统一起提供。不过二进制文件中有这个字符串:

$ strings "$(which nc)" | tail -1
@(#)PROGRAM:nc  PROJECT:netcat-42.200.1

Linux

$ uname -a
Linux ip-10-200-38-72 4.1.13-19.31.amzn1.x86_64 #1 SMP Wed Jan 20 00:25:47 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

$ curl --version
curl 7.40.0 (x86_64-redhat-linux-gnu) libcurl/7.40.0 NSS/3.19.1 Basic ECC zlib/1.2.8 libidn/1.18 libssh2/1.4.2
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets

$ bash --version | head -1
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)

$ ncat --version
Ncat: Version 5.51 ( http://nmap.org/ncat )

$ yum list nc | tail -1 | sed 's/ \+/ /g'
nc.x86_64 1.84-24.8.amzn1 @amzn-main

相关内容