为了使用 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