Passando dados binários para enrolar sem usar um @file

30

É possível usar curl e postar dados binários sem passar um nome de arquivo? Por exemplo, você pode postar um formulário usando binário via --data-binary:

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

No entanto, isso requer a existência de um arquivo. Eu esperava poder registrar chamadas HTTP (como descansar serviços) como o texto do comando curl para reproduzir a solicitação. (isso ajuda muito na depuração desses serviços, por exemplo)

No entanto, os comandos de log curl que referenciam um arquivo não seriam úteis, então eu esperava poder realmente registrar os dados binários brutos, presumivelmente codificados com base64, e ainda assim permitir copiar e colar o comando curl registrado e executá-lo.

Portanto, é possível usar curl e publicar dados binários sem fazer referência a um arquivo? Se sim, como isso funcionaria? Como seria um exemplo?

Kirk Woll
fonte
Se você não estiver registrando em um arquivo, para onde está registrando?
slm
@ SLM, acho que você não entendeu. Estou registrando minhas chamadas de descanso do lado do cliente em um arquivo de log em texto sem formatação (como o comando curl equivalente literal). No entanto, não quero ter que referenciar algum arquivo aleatório para cada comando de curvatura binária que eu registrar. Quero que todo o texto do comando curl seja totalmente independente, para que alguém possa copiar esse texto em um terminal e executá-lo para reproduzir a chamada.
30913 Kirk Woll

Respostas:

45

Você pode passar dados para curl via STDIN da seguinte forma:

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

O @-diz curlpara puxar de STDIN.

Para canalizar dados binários para enrolar (por exemplo):

echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com
slm
fonte
Mas isso ainda não permite que os dados binários façam parte do texto do comando curl. Então isso não é possível?
Kirk Woll
O que você está pedindo não parece viável. Os dados para o comando curl podem ser canalizados para curl ou puxados através do recurso @ <filename>. Que eu saiba, não existe outro método.
slm
11
Na verdade, sua resposta é perfeita - seu exemplo deve ser apenas binário. :) ou seja, echo -e '\x03\xF1' | curl -X POST --data-binary @- http://foo.com onde \x03\xF1estão os dados binários brutos como hexadecimais, que são exatamente o que eu quero.
Kirk Woll
Ótimo. Eu não estava te seguindo inteiramente. Então você só queria colocar dados binários em curl, pensei que estava pedindo outra coisa. Que bom que funcionou para você.
slm
2
Eu tentei isso: cat 1.jpg | curl -X POST --data-binary @- http://foo.com. Funcionou como um encanto. Para validar, também tentei: cat 1.jpg | md5sume md5sum 1.jpg. Ambos retornaram o mesmo valor.
Dimitarvp 30/05
0

Não sei por que, mas a linha de comando exata que o slm sugeriu não funcionou para mim. Com uma pequena modificação, o seguinte funcionou:

echo -e '...data...\n' | curl -s -T - sftp://[email protected]/~/test.txt
Richard Nienaber
fonte
11
O motivo é que o SFTP é um protocolo totalmente diferente do HTTP com recursos muito diferentes, e a página de manual e a mensagem de ajuda dizem --data-binary se aplica apenas ao HTTP (e HTTPS).
dave_thompson_085
Isso faz sentido. Eu estava combinando várias fontes online para fazer isso funcionar, então eu perdi a parte da pergunta que o tornava específico do HTTP. Deixarei minha resposta aqui caso alguém precise.
Richard Nienaber 10/10
0

Adicionando a esta resposta, o echocomando anexa uma nova linha à sua saída por padrão. Isso adiciona um \nao final dos seus dados binários, portanto, o curl receberá esse caractere também como entrada.

Para evitar isso, você pode usar o printfcomando ou a -nopção da seguinte maneira:

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

ou

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

Dessa forma, nenhuma nova linha será anexada à entrada de ondulação e os bytes que estão sendo alimentados para ondulação serão exatamente aqueles para os quais você passa echo.

Robg
fonte