Przekazywanie danych binarnych do zwijania się bez użycia pliku @


31

Czy można używać curl i wysyłać dane binarne bez podawania nazwy pliku? Na przykład możesz opublikować formularz za pomocą pliku binarnego za pośrednictwem --data-binary:

curl -X POST --data-binary @myfile.bin http://foo.com

Wymaga to jednak istnienia pliku. Miałem nadzieję, że będę w stanie rejestrować połączenia HTTP (takie jak usługi spoczynkowe) jako tekst polecenia curl w celu odtworzenia żądania. (to bardzo pomaga na przykład w debugowaniu tych usług)

Jednak rejestrowanie poleceń curl, które odwołują się do pliku, nie byłoby przydatne, więc miałem nadzieję, że faktycznie mogę zalogować surowe dane binarne, prawdopodobnie zakodowane w standardzie base64, a mimo to pozwolić ci skopiować i wkleić zalogowane polecenie curl i wykonać je.

Czy można używać curl i wysyłać dane binarne bez odwoływania się do pliku? Jeśli tak, jak to by działało? Jak wyglądałby przykład?


Jeśli nie logujesz go do pliku, to gdzie go logujesz?
slm

@slm, myślę, że źle zrozumiałeś. Rejestruję wywołania odpoczynek po stronie klienta do pliku dziennika w postaci zwykłego tekstu (jako dosłownie równoważne polecenie curl). Nie chcę jednak odwoływać się do losowego pliku dla każdego logowanego polecenia binarnego curl. Chcę, aby cały tekst polecenia curl był w pełni samowystarczalny, aby ktoś mógł skopiować ten tekst do terminala i uruchomić go w celu odtworzenia wywołania.
Kirk Woll

Odpowiedzi:


45

Możesz przesyłać dane do curl przez STDIN w następujący sposób:

echo -e '...data...\n' | curl -X POST --data-binary @- http://foo.com

@-Mówi curlwyciągnąć z stdin.

Aby potokować dane binarne w celu zwijania (na przykład):

echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

Ale nadal nie pozwala to, aby dane binarne były częścią tekstu polecenia curl. Czy to nie jest możliwe?
Kirk Woll

To, o co prosisz, nie wydaje się wykonalne. Dane do komendy curl mogą być przesyłane do curl lub ściągane za pomocą narzędzia @ <nazwa_pliku>. Według mojej wiedzy nie ma innej metody.
slm

1
Właściwie twoja odpowiedź jest idealna - twój przykład powinien po prostu użyć binarnego. :) tj. echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com Gdzie \x03\xF1są nieprzetworzone dane binarne jako szesnastkowe, co jest właściwie dokładnie tym, czego chcę.
Kirk Woll

Świetny. Nie śledziłem cię całkowicie. Więc jutro chciałeś przesłać dane binarne do curl, myślałem, że prosisz o coś innego. Cieszę się, że to zadziałało.
slm

2
Próbowałem to: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Działa jak urok. Aby sprawdzić poprawność, próbowałem również: cat 1.jpg | md5sumi md5sum 1.jpg. Obaj zwrócili tę samą wartość.
dimitarvp

0

Nie jestem pewien, dlaczego, ale dokładna linia poleceń sugerowana przez SLM nie działała dla mnie. Po niewielkiej modyfikacji działały następujące elementy:

echo -e '...data...\n' | curl -s -T - sftp://user@10.10.10.10/~/test.txt

1
Powodem jest to, że SFTP jest zupełnie innym protokołem niż HTTP o bardzo różnych możliwościach, a zarówno strona podręcznika man, jak i komunikat pomocy mówią, że - data-binary dotyczy tylko HTTP (i HTTPS).
dave_thompson_085 10.10.17

To ma sens. Łączyłem kilka źródeł online, aby to zadziałało, więc przegapiłem tę część pytania, która uczyniła ją specyficzną dla HTTP. Zostawię tutaj swoją odpowiedź na wypadek, gdyby ktoś jej potrzebował.
Richard Nienaber,

0

Dodając do tej odpowiedzi, echopolecenie domyślnie dołącza nowy wiersz do swojego wyniku. Dodaje to \nkoniec danych binarnych, dlatego curl otrzyma również ten znak jako dane wejściowe.

Aby tego uniknąć, możesz użyć printfpolecenia lub -nprzełącznika w następujący sposób:

printf '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

lub

echo -en '\x03\xF1' | curl -X POST --data-binary @- http://foo.com

W ten sposób żadna nowa linia nie zostanie dodana do wejścia curl, a bajty podawane do curl będą dokładnie tymi, które przekazujesz echo.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.