@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 | md5summd5sum 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.