@file을 사용하지 않고 바이너리 데이터를 넘겨주기


30

파일 이름을 전달하지 않고 curl 및 post 바이너리 데이터를 사용할 수 있습니까? 예를 들어 --data-binary를 통해 binary를 사용하여 양식을 게시 할 수 있습니다.

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

그러나 파일이 있어야합니다. 요청을 재현하기 위해 curl 명령의 텍스트로 HTTP 호출 (예 : 서비스 휴식)을 기록 할 수 있기를 바랐습니다. (예를 들어, 이러한 서비스 디버깅에 크게 도움이됩니다)

그러나 파일을 참조하는 curl 명령을 기록하는 것은 유용하지 않으므로 base64로 인코딩 된 원시 이진 데이터를 실제로 기록 할 수는 있지만 여전히 기록 된 curl 명령을 복사하여 붙여 넣어 실행할 수 있기를 바랍니다.

따라서 파일을 참조하지 않고 curl 및 post 이진 데이터를 사용할 수 있습니까? 그렇다면 어떻게 작동합니까? 예는 어떻게 생겼습니까?


파일에 기록하지 않으면 어디에 기록합니까?
— slm

@ slm, 난 당신이 오해 생각합니다. 클라이언트 측 나머지 호출을 일반 텍스트로 (단어 동등한 curl 명령으로) 로그 파일에 기록하고 있습니다. 그러나 나는 내가 기록하는 각 바이너리 컬 명령에 대해 임의의 파일을 참조하고 싶지 않습니다. curl 명령의 전체 텍스트를 완전히 자체 포함하여 누군가가 해당 텍스트를 터미널에 복사하여 호출을 재현하도록 실행할 수 있기를 원합니다.
— Kirk Woll

답변:


45

STDIN을 통해 데이터를 curl에 전달할 수 있습니다.

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

는 @-말한다 curlSTDIN에서 끌어.

이진 데이터를 컬로 파이프하려면 (예 :)

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

그러나 여전히 바이너리 데이터가 curl 명령 텍스트의 일부가 될 수는 없습니다. 그렇게 할 수 없습니까?
— Kirk Woll 13:30에

당신이 요구하는 것이 실현 가능한 것처럼 들리지 않습니다. curl 명령에 대한 데이터는 curl로 파이프되거나 @ <filename> 기능을 통해 가져올 수 있습니다. 내 지식으로는 다른 방법이 없습니다.
— slm

1
실제로, 당신의 대답은 완벽합니다-당신의 예제는 바이너리를 대신 사용해야합니다. :) 즉 , 원시 이진 데이터는 16 진수로 echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com 어디에 \x03\xF1있으며, 이것은 내가 원하는 것과 거의 같습니다.
— Kirk Woll

큰. 나는 당신을 완전히 따르지 않았습니다. 따라서 바이너리 데이터를 curl로 파이프하고 싶었습니다. 다른 것을 요구한다고 생각했습니다. 그것이 당신을 위해 일하게되어 기쁘다.
— slm

2
나는 이것을 시도했다 : cat 1.jpg | curl -X POST --data-binary @- http://foo.com. 매력처럼 일했다. 검증하기 위해, 나는 또한 시도 : cat 1.jpg | md5sum와 md5sum 1.jpg. 둘 다 같은 값을 반환했습니다.
— dimitarvp

0

왜 그런지 모르겠지만 slm이 제안한 정확한 명령 줄이 저에게 효과적이지 않았습니다. 약간의 수정으로 다음이 작동했습니다.

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

1
그 이유는 SFTP가 기능이 매우 다른 HTTP와는 완전히 다른 프로토콜이기 때문에 매뉴얼 페이지와 도움말 메시지 --data-binary는 HTTP (및 HTTPS)에만 적용됩니다.
— dave_thompson_085

말이 되네요 나는 몇 가지 온라인 소스를 결합하여 작동하게하여 HTTP 관련 질문의 일부를 놓쳤다. 다른 사람이 필요로 할 경우를 대비하여 여기에 답변을 남겨 두겠습니다.
— Richard Nienaber

0

에 추가 이 대답의 echo명령은 기본적으로 그 출력에 줄 바꿈을 추가합니다. 이것은 \n이진 데이터의 끝에 a 를 추가 하므로 curl은 해당 문자도 입력으로받습니다.

이를 피하기 위해 다음과 같이 printf명령 또는 -n스위치를 사용할 수 있습니다 .

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

또는

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

이렇게하면 curl 입력에 줄 바꿈이 추가되지 않으며 curl에 공급되는 바이트는 정확하게 전달되는 바이트 echo입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.