【问题标题】:curl cli post fails HTTP/1.1 400 Bad Requestcurl cli post 失败 HTTP/1.1 400 错误请求
【发布时间】:2012-02-06 13:30:51
【问题描述】:

我正在尝试使用 curl 自动将新固件上传到我公司的客户路由器。我正在尝试模拟执行此功能的路由器 Web 用户界面。 我已经捕获了http标头,它们如下:

POST /Forms/upload_1 HTTP/1.1

Host    192.168.1.1
User-Agent  Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT 1
Referer http://192.168.1.1/upload.html
Authorization   Basic YWRtaW46YWRtaW4=
Content-Type    multipart/form-data; boundary=---------------------------24464570528145
Content-Length  1455180

查看表单发布数据,我看到几个隐藏字段: 内容处置:表单数据; name="tools_FW_UploadFile";文件名="v1.08" 内容类型:application/octet-stream

内容配置:表单数据; name="UpgradeItemFlag"

我的 curl cli 脚本收到 HTTP/1.1 400 错误请求。 输出:

C:\curl>curl -u "admin:admin" -H "Host:192.168.1.1" -H "User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" -H "Accept:text
/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" -H "Accept-Language:en-us,en;q=0.5" -H "Accept-Encoding:gzip, deflate" -H "Accept-Charset:
 ISO-8859-1,utf-8;q=0.7,*;q=0.7" -H "Referer:http://192.168.1.1/upload.html" -H "DNT:1" -H "Expect:" -F "tools_FW_uploadFile=" -F "file=@c:\curl\v1.08"
 -F "UpgradeItemFlag=1"  "http://192.168.1.1/Forms/upload_1" -v
* About to connect() to 192.168.1.1 port 80 (#0)
*   Trying 192.168.1.1... connected
* Connected to 192.168.1.1 (192.168.1.1) port 80 (#0)
* Server auth using Basic with user 'admin'
> POST /Forms/upload_1 HTTP/1.1
> Authorization: Basic YWRtaW46YWRtaW4=
> Host:192.168.1.1
> User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
> Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
> Accept-Language:en-us,en;q=0.5
> Accept-Encoding:gzip, deflate
> Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
> Referer:http://192.168.1.1/upload.html
> DNT:1
> Content-Length: 1422382
> Content-Type: multipart/form-data; boundary=----------------------------805f48e96301
>
< HTTP/1.1 400 Bad Request
< Content-Length: 0
< Server: RomPager/4.07 UPnP/1.0
< EXT:
<
* Connection #0 to host 192.168.1.1 left intact
* Closing connection #0

我的卷发是:

curl -u "admin:admin" -H "Host:192.168.1.1" -H "User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" -H 

"Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" -H "Accept-Language:en-us,en;q=0.5" -H "Accept-Encoding:gzip, deflate" -H 

"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" -H "Referer:http://192.168.1.1/upload.html" -H "DNT:1" -H "Expect:" -F "name=tools_FW_uploadFile" 

-F "file=@c:\curl\v1.08" -F "UpgradeItemFlag=1"  "http://192.168.1.1/Forms/upload_1"

如果有人能看出我做错了什么,我将不胜感激。 表单的html如下:

<INPUT TYPE="FILE" NAME="tools_FW_UploadFile" SIZE="30" MAXLENGTH="128"><INPUT TYPE="HIDDEN" NAME="UpgradeItemFlag" VALUE="0">

<INPUT TYPE="BUTTON" NAME="FW_apply" VALUE="Update Firmware" onClick="uiDoUpdate()"

function uiDoUpdate()
{

document.Firmware_Upload.UpgradeItemFlag.value=1;
document.Firmware_Upload.submit();
}

【问题讨论】:

    标签: curl command-line-interface


    【解决方案1】:

    我今天遇到了同样的问题,我所有的 Google Fu 都没有出现正确的结果。我在尝试使用 curl 时遇到的具体问题是执行脚本中的行尾。对我来说,解决方法是在执行脚本中使用 Linux/Unix 样式行结尾的 Linux 系统上实际运行 curl。这些是 LF (\n) 而不是 CRLF (\r\n)。

    您可以使用file /path/to/script.sh 检查文件 如果file 提及任何关于行尾的内容,则说明您的脚本不正确,必须进行转换。

    您可以使用dos2unix -U /path/to/script.sh转换文件

    我强烈建议您在实际的 Linux 系统中尝试完全相同的 curl 命令,因为 Windows 上的 curl 对表单数据非常挑剔。

    【讨论】:

      【解决方案2】:

      今天同样的问题。 @Myles Steinhauser 的回答挽救了我的一天。

      让我提供有关它的更多详细信息。

      就我而言,我使用 bash [r]ead 从文件中逐行读取。然后它将 line 作为一个值并将其分配给 HTTP GET 请求变量,该变量看起来像“http://example.com/uri?arg1=$line”。当我执行 bash 脚本时,它返回 400 Bad Request。

      解决方案:将文件的换行样式从dos转换为unix

      说明:Bash 读取使用 unix 换行符分隔符(\n),而 curl 可能将 dos 样式(\r\n)文件作为参数。这意味着,您的 curl 短语可能被解释为 curl "http://example.com/uri?arg1=abc\r"。尾随的 '\r' 将导致 HTTP 错误请求。

      请参阅https://ss64.com/bash/read.html 了解有关 bash 读取的更多信息。

      文件类型转换方式:https://www.cyberciti.biz/faq/howto-unix-linux-convert-dos-newlines-cr-lf-unix-text-format/

      【讨论】:

        猜你喜欢
        • 2015-04-10
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2011-05-31
        • 2017-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多