使用 bash 进行 TCP 连接

使用 bash 进行 TCP 连接

为了使用 bash 重定向 tcp 连接,为什么以下命令不返回任何内容?

[root@rocks7 ~]# echo -e "GET / HTTP/1.1\n\n" > /dev/tcp/yahoo.com/80
[root@rocks7 ~]# printf "GET / HTTP/1.1\n\n" > /dev/tcp/google.com/80
[root@rocks7 ~]# 

答案1

您需要使用 打开读取和写入连接<>,并可能发送更多标头,然后读取回复。例如,

exec 5<>/dev/tcp/yahoo.com/80
echo -e "GET / HTTP/1.1\r\nHost: yahoo.com\r\nContent-Length: 0\r\n\r" >&5
# get reply:   HTTP/1.1 301 Moved Permanently^M
cat <&5

我使用任意文件描述符 5 只是为了避免破坏标准 0、1 和 2。使用 yahoo,您不需要内容长度标头,但其他站点在收到更多输入之前可能不会回复。雅虎确实需要主机标头,否则您将收到回复HTTP/1.1 400 Host Header Required

答案2

添加到 meuth 的答案https://unix.stackexchange.com/a/440053/380936

与远程服务器通信完成后,不要忘记关闭套接字:

exec 5>&-

您可能还需要添加Connection: close,例如:

echo -e "GET / HTTP/1.1\r\nHost: yahoo.com\r\nContent-Length: 0\r\nConnection: close\r\n\r" >&5

相关内容