Como enganar um aplicativo esperando um arquivo: // para ler de stdin?

2

Um esquema de URI de arquivo torna possível especificar um URI para um arquivo armazenado localmente, como file:///home/demo/sample .

Poderia ser usado para especificar stdin ?

Por exemplo, com CURL:

curl file:///home/demo/sample

mostra o conteúdo do arquivo;

echo "Hello" | curl file:///dev/fd/0

um resultado vazio , enquanto eu esperaria que ele mostrasse "Olá". A propósito:

echo "Hello" | cat /dev/fd/0

na verdade exibe "Olá" para a saída.

O que devo colocar depois de file:// para segmentar stdin ?

Contexto: Estou fazendo experiências com Movimento , que pode ler dados de um URI HTTP ou um arquivo especificado como file:// , mas não parece ter a opção de ler um fluxo de vídeo diretamente de stdin (e a questão relacionada perguntou há quase dois anos nunca foi respondida). Eu quero ser capaz de enganar o aplicativo para pensar que ele lê um arquivo, quando ele realmente está lendo a saída de ffmpeg .

    
por Arseni Mourzenko 12.11.2015 / 00:12

1 resposta

5
curl file:///dev/fd/0

É a maneira correta de fazer curl ler o descritor de arquivo 0 ( stdin ).

Pegue qualquer arquivo de texto legível, faça

<theTextFile.txt curl file:///dev/fd/0

E deve funcionar como cat .

Seu problema é "Como faço uma leitura de onda a partir de um cano?" e receio que a resposta seja: código fonte do curl do patch .

Se você analisar o strace of curl no exemplo acima, verá mmap s o arquivo. mmap ing não funcionará se o arquivo for um pipe. Se o curl utilizasse as chamadas de sistema regulares read e write , não haveria nenhuma diferença entre <theTextFile.txt curl file:///dev/fd/0 e cat theTextFile.txt curl | file:///dev/fd/0 , que é como deveria ser, IMO.

    
por 12.11.2015 / 00:51

Tags