Questão Comandos de tubulação em nc


Eu aparentemente procurei muitas perguntas muito semelhantes, mas nunca encontrei algo para trabalhar. Estou tentando usar um pi de framboesa (2ª geração) para me comunicar com um sensor Wifi OBDII. Eu sou capaz de usar o seguinte comando

nc -C 192.168.0.10 35000

192.168.0.10 é o sensor do carro e 35000 a porta. Não é tão relevante como conectar parece estar bem. De qualquer forma, eu posso abrir uma instância de nc e então digitar, por exemplo "0145" (um código de sensor), e em retorno eu obter um valor para o sensor de volta na saída da sessão nc (por exemplo, o RPM do meu mecanismo ). Isso funciona bem. O que eu gostaria de fazer é canalizar comandos de um arquivo de texto para a sessão nc para fins de plotagem. Portanto, meu resultado ideal seria um fluxo constante de valores de RPM e tempos associados despejados em um arquivo de texto. Eu posso trabalhar de lá. No entanto, não sei exatamente como fazer isso. Eu configurei um commands.txt que é milhares de linhas de "0145" e gostaria de ler esse arquivo e passá-lo linha por linha para nc (eu provavelmente posso controlar o intervalo de amostragem com o sono) e, em seguida, ler a saída e armazená-los em um arquivo de texto. Eu sei que esse problema tem algo a ver com stdin, stdout e piping, mas por alguma razão, eu não consegui entender. Eu não sou de modo algum um mestre em qualquer um desses. Eu também gostaria de roteirizar todo o processo.

Agora, se eu correr

cat <(echo 0145) - | nc -C 192.168.0.10 35000

Isso me dá a saída no terminal que eu quero, mas só funciona para um único valor. Mas assim que eu tento colocá-lo em um loop, onde eu faço 0145 em $ comandos no script e recebo $ comandos linha por linha a partir de um arquivo txt, ele deixa de funcionar. Na verdade, ele pára de funcionar dentro de qualquer loop ou se bloquear, mesmo se eu deixar como 0145 e não usar uma variável.

Então, para resumir, eu quero script enviando um arquivo txt linha por linha para uma conexão nc, e então eu quero extrair cada resposta em outro arquivo. Se não foi roteirizado, posso abrir essa conexão nc e enviar 0145 a cada 1 segundo e obter essas respostas (ainda não sei como passá-las para um arquivo), mas isso é pouco eficiente. Eu sinto que deveria haver uma maneira mais fácil de fazer isso. Eu sou um pouco de noob, mas imaginei que fosse dar um tiro aqui. Qualquer ajuda é muito apreciada


2


origem




Respostas:


Existem provavelmente muitas maneiras de fazer isso.

Com netcat

O problema com netcat é que fecha a conexão assim que detecta um fim de arquivo. A implementação do GNU de netcat tem algumas opções (-k ou -w -1) para manter uma instância de escuta aberta indefinidamente, mas não funciona. O que funciona é nmapversão de netcat, chamado ncat.

No seu pc, instale o nmap pacote, em seguida, emitir:

mkfifo return_pipe
ncat -k -l 12345 0<return_pipe| ncat -C 192.168.0.10 35000 1>return_pipe &

Agora você pode transferir tudo que você gosta, em muitos cachos diferentes, por meio de

echo Ciao | ncat localhost 12345
cat somefile.txt | ncat localhost 12345 

sem que a conexão caia, desde que o seu ouvinte coopere (isto é, não deixa de ouvir após o primeiro fim de arquivo). Ou você pode simplificar essa parte usando um tubo nomeado: de um terminal diferente daquele em que você emitiu o primeiro comando,

mkfifo mypipe
tail -f mypipe | ncat localhost 12345 &
echo Ciao > mypipe
cat somefile.txt > mypipe

o mensagem de retorno do seu dispositivo está agora no pipe nomeado return_pipe. O comando

tail -f return_pipe >> responses

acrescenta a resposta do dispositivo a um arquivo chamado respostas.

Sem netcat

Isso foi apontado por Ipor Sircer (legal !, +1 de mim). Mas eu faria de maneira um pouco diferente

exec 3>/dev/tcp/192.168.0.10/35000
exec 4</dev/tcp/192.168.0.10/35000
exec 4>>somefile.out
echo "Ciao" >&3 
cat somefile.txt >&3

se você também quiser acompanhar seus comandos,

echo Ciao | tee  -a file_with_my_commands 1>&3
cat somefile.txt | tee -a file_with_my_commands 1>&3

e, quando você terminar com essa comunicação,

exec 3>&-
exec 4>&-

3





Por que você usa netcat? Bash pode lidar com soquetes tcp com o alias incorporado.

n=0
while read -r line;do
 ((n++))
 exec 3<>/dev/tcp/192.168.0.10/35000
 echo -e "$line" >&3
 cat <&3 > response.$n
 exec 3<&-
 exec 3>&-
done < data.txt

3



Eu dei uma chance, mas ainda não consegui fazer o que eu preciso. Apenas para entender corretamente: $ line será uma linha dada de data.txt? - Markysm
sim. todas as linhas serão canalizadas para o soquete tcp e todas as respostas serão armazenadas no arquivo respone. - Ipor Sircer
Ah, espere, eu não pareço ter um / dev / tcp quando eu estiver em / dev - Markysm
Porque é um alias embutido do bash. - Ipor Sircer
não é bem onde eu preciso que seja por algum motivo, mas é um grande passo na direção certa. Eu cortei o meu arquivo data.txt para apenas 5 linhas para simplificar (e assim eu não recebo 1000 arquivos de resposta), mas até agora eu só fui capaz de gerar um único arquivo response.1 (não parece estar em loop) - Markysm