http - 纯 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
谢谢你,托马斯。
解决方案
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
推荐阅读
- algorithm - 二叉搜索树,我应该如何旋转这棵树来平衡
- bash - 使用 Curl 数据二进制选项,内存不足
- android - 使用文件浏览器对话窗口访问资产文件夹文件
- typescript - 一种更清洁的方式,如何重构异步调用
- vue.js - 如何在动态加载的数据下动态地在 Vue.js 中进行计算
- python-2.7 - 如何从 purchase.order 中获取产品描述的值
- swift - swift - 在变量名中使用整数 for 循环
- amazon-ec2 - www 和 http 在 AWS 中有效,但不是 https
- selenium - 更改 Mozilla 只读属性
- python - 仿射变换后不同高度的字母