首页 > 解决方案 > 纯 sh + telnet 中的 HTTP POST 文件:没有 curl,没有 wget

问题描述

我正在使用旧的 android 设备(如果您想知道,wiko Rainbow up 4G Android 5.1),唯一真正有效的是 telnet(busybox 中的 wget 只有 --post-data(没有 --post-file) , curl 似乎无法安装(我花了几个小时试图安装它))

我正在尝试通过 http POST 将 screen.png 发送到 http 服务器。

我使用下面的代码在纯 telnet 中为小文本或 json 文件工作(也花了几个小时)。

但是当我处理更大的文件时,比如 png 图像或 hexdump。这不起作用。

我怀疑这是由文件中存在的特殊字符引起的。我认为这可能会迫使 telnet 退出

这个问题很棘手,我被困住了,但我希望你们中的一个人愿意接受这个挑战,通过 telnet http post png image

这是我用于测试的示例服务器端代码: https ://gist.github.com/taterbase/2688850

FILE_TO_UPLOAD="./file.txt"
BOUNDARY=$((  RANDOM % 99999 ))
HOST="server.com"
POST_PATH="/upload.php"
FIELD_NAME="uploaded_file"
TLNET_CONTENT="-----------------------------$BOUNDARY
Content-Disposition: form-data; name=\"$FIELD_NAME\"; filename=\"$(basename $FILE_TO_UPLOAD)\"

$(cat $FILE_TO_UPLOAD)
-----------------------------$BOUNDARY--"
TLNET_HEADERS="POST $POST_PATH HTTP/1.1
Host: $HOST
Content-Type: multipart/form-data; boundary=---------------------------$BOUNDARY
Content-Length: $(($(expr length "$TLNET_CONTENT") + 100 ))
Connection: keep-alive"

TELNET_ALL="$TLNET_HEADERS

$TLNET_CONTENT

"

telnet $HOST 80 <<AREALEOF
$TELNET_ALL
AREALEOF

谢谢你,托马斯。

标签: httppostshtelnet

解决方案


HTTP 要求请求行、标头行和将标头与正文分开的空白行以 CR/LF 对结束,而不仅仅是换行。

FILE_TO_UPLOAD="./file.txt"
BOUNDARY=$((  RANDOM % 99999 ))
HOST="server.com"
POST_PATH="/upload.php"
FIELD_NAME="uploaded_file"

CONTENT=$(printf '%s\n' \
    "-----------------------------$BOUNDARY" \
    "Content-Disposition: form-data; name=\"$FIELD_NAME\"; filename=\"$(basename $FILE_TO_UPLOAD)\""

   cat "$FILE_TO_UPLOAD"

   printf '%s\n' "-----------------------------$BOUNDARY--"
)

{
  printf '%s\r\n' \
    "POST $POST_PATH HTTP/1.1" \
    "Host: $HOST" \
    "Content-Type: multipart/form-data; boundary=---------------------------$BOUNDARY" \
    "Content-Length: $(($(expr length "$CONTENT") + 100 ))" \
    "Connection: keep-alive" \
    "";

  printf '%s\n' "$CONTENT"
} | telnet $HOST 80 

推荐阅读