我正在尝试使用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” Content-Type:application / octet-stream
我的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();
}
答案 0 :(得分: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对于表单数据非常挑剔。
答案 1 :(得分:0)
今天是同一期。 @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/