Comandos de tubulação para nc

2

Eu aparentemente pesquisei 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.

Neste momento, se eu correr

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

que 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.

Portanto, para resumir, quero enviar um arquivo txt linha por linha para uma conexão nc e, em seguida, 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

    
por Markysm 08.09.2016 / 04:16

2 respostas

3

Existem provavelmente muitas maneiras de fazer isso.

Com o netcat

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

No seu pc, instale o pacote nmap e, em seguida, edite:

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 o que quiser, em muitos grupos 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 é, , ele não deixa de escutar após o primeiro fim de arquivo). Ou você pode simplificar essa parte usando um pipe 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

A 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 responses .

Sem netcat

Isso foi apontado por Ipor Sircer (nice !, +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 esta comunicação,

exec 3>&-
exec 4>&-
    
por 10.09.2016 / 09:52
3

Por que você usa netcat ? Bash pode manipular sockets 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
    
por 08.09.2016 / 04:42