curl cli post не работает HTTP / 1.1 400 Bad Request - PullRequest
0 голосов
/ 06 февраля 2012

Я пытаюсь автоматизировать загрузку новых прошивок на маршрутизаторы клиентов моей компании с помощью curl. Я пытаюсь смоделировать веб-интерфейс пользователя маршрутизатора, который выполняет эту функцию. Я захватил заголовки 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

просматривая бланк данных я вижу несколько скрытых полей: Content-Disposition: форма-данные; Name = "tools_FW_UploadFile"; имя файла = "v1.08" Тип контента: приложение / октет-поток

Содержание-Расположение: форма-данные; 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();
}

Ответы [ 2 ]

1 голос
/ 06 февраля 2013

Я столкнулся с точно такой же проблемой сегодня, и все мои Google Fu не показали правильные результаты. При попытке работать с curl у меня возникла конкретная проблема с окончаниями строк в сценарии выполнения. Решением для меня было на самом деле запустить curl в системе Linux с окончаниями строк в стиле Linux / Unix в сценарии выполнения. Это LF (\ n) вместо CRLF (\ r \ n).

Вы можете проверить файл с помощью file /path/to/script.sh Если file упоминает что-либо о конце строки, ваш скрипт неверен и должен быть преобразован.

Вы можете конвертировать файл с помощью dos2unix -U /path/to/script.sh

Я бы настоятельно рекомендовал вам использовать ту же самую команду curl из реальной системы Linux, поскольку curl в Windows очень привередлив с данными формы.

0 голосов
/ 04 декабря 2018

Та же проблема сегодня.Ответ @Myles Steinhauser только что спас мой день.

Позвольте мне предоставить более подробную информацию об этом.

В моем случае я использую bash [r] ead для чтения построчно из файла.Затем он принимает строку в качестве значения и присваивает ее переменной запроса HTTP GET, которая выглядит как "http://example.com/uri?arg1=$line".. Когда я выполняю скрипт bash, он возвращает 400 неверных запросов.

Решение: преобразовать файлстиль новой строки от dos до unix

Объяснение: Bash read использует 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...