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

標準0、1、2に違反することを避けるために、任意のファイル記述子5を使用しています。 Yahooではコンテンツ長ヘッダーは必要ありませんが、他のサイトでは追加の入力を受け取るまで応答しないことがあります。 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

関連情報