从套接字读取前 128 个字节但将其余字节直接写入文件的有效方法

niX*_*man 0 linux bash networking

我正在尝试通过以下方式从某些服务下载文件:

BODY="$(netcat "127.0.0.1" 61222 <<< "download|file_dir|file_name")"
SIGNATURE="$(echo -n "$BODY" | head -c 128)"
echo -n "$BODY" | tail -c +129 | dd of="$FILE_PATH" >& /dev/null
Run Code Online (Sandbox Code Playgroud)

但是这种方法有两个缺点:

  1. 文件的整个主体必须​​存储在变量中BODY
  2. 这仅适用于文本文件。

有没有一种有效的方法可以将套接字中的前 128 个字节读入 bash 变量,但将其余字节直接写入文件?

Sha*_*awn 5

也许使用bash的原生 TCP 套接字支持?文件,例如/dev/tcp/HOST/PORT到给定主机的打开套接字。

粗略(由于缺少测试服务器而未经测试的代码):

#!/usr/bin/env bash

exec 3<>/dev/tcp/127.0.0.1/61222 # Open a socket on descriptor 3
printf "%s\n" "download|file_dir|file_name" >&3
read -r -N 128 -u 3 signature # Read 128 bytes from descriptor 3
cat <&3 >"$FILE_PATH"
exec 3<&- # Close the socket
Run Code Online (Sandbox Code Playgroud)