Вопрос: Команды трубопровода в nc


Я, казалось бы, искал многие очень похожие вопросы, но так и не нашел работы. Я пытаюсь использовать малиновый pi (2-й ген) для общения с датчиком OBDII Wi-Fi. Я могу использовать следующую команду

nc -C 192.168.0.10 35000

192.168.0.10 - датчик автомобиля и порт 35000. Это не так важно, поскольку соединение кажется прекрасным. В любом случае, я могу открыть экземпляр nc, а затем ввести, например, «0145» (код датчика), а взамен я получаю значение для этого датчика на выходе сеанса nc (например, RPM моего движка ). Это прекрасно работает. То, что я хотел бы сделать, - это команды команд из текстового файла в сеанс nc для построения графиков. Таким образом, моим идеальным результатом будет постоянный поток значений RPM и связанных с ним времен, сбрасываемых в текстовый файл. Я могу работать оттуда. Однако я точно не знаю, как это сделать. Я установил command.txt, который является тысячами строк «0145», и я хотел бы прочитать этот файл и передать его по строкам в nc (возможно, я могу контролировать интервал выборки со сном), а затем читать вывести и вставить их в текстовый файл. Я знаю, что эта проблема имеет какое-то отношение к stdin и stdout и piping, но по какой-то причине я не смог ее полностью получить. Я ни в коем случае не мастер. Я также хотел бы сценарий всего процесса.

Прямо сейчас, если я запускаю

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

который дает мне вывод в терминале, который я хочу, но работает только для одного значения. Но как только я попытаюсь поместить его в цикл, где я делаю это 0145 в $ командах в скрипте и получаю $ команд строки за строкой из txt-файла, он перестает работать. Фактически, он перестает работать внутри любого цикла или блокирует, даже если я оставляю его как 0145 и не использую переменную.

Короче говоря, я хочу, чтобы сценарий отправил txt-файл по строкам в nc-соединение, а затем я хочу извлечь каждый ответ в другой файл. Если он был неинформатирован, я могу открыть это соединение nc и отправить 0145 каждые 1 секунду и получить эти ответы (все еще не знаю, как передать их в файл), но это вряд ли эффективно. Я чувствую, что должен быть более простой способ сделать это. Я немного нуб, но фигурный идентификатор дает ему шанс. Любая помощь приветствуется


2
2017-09-08 02:16


Источник




Ответы:


Вероятно, есть много способов сделать это.

С netcat

Проблема с Netcat заключается в том, что он закрывает соединение, как только он обнаруживает конец файла. Реализация GNU Netcat имеет несколько вариантов (-k или -w -1), чтобы держать слушающий экземпляр открытым неограниченно, но не работает. Что делает работа птарверсия Netcat, называется NCAT,

На вашем компьютере установите птар пакет, затем выполните выпуск:

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

Теперь вы можете перенести все, что вам нравится, во множество разных пучков, посредством

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

без соединения, когда-либо снижающегося, при условии, что ваш слушатель сотрудничает (то есть, он не прекращает прослушивание после первого конца файла). Или вы можете сделать эту часть проще, используя названная труба: от терминала, отличного от того, на котором вы выдали первую команду,

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

обратное сообщение от вашего устройства теперь находится именованный канал return_pipe, Команда

tail -f return_pipe >> responses

добавляет ответ устройства в файл, называемый ответы,

Без netcat

Это было отмечено Ipor Sircer (хороший !, +1 от меня). Но я бы сделал это несколько иначе,

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

если вы также хотите отслеживать свои команды,

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

и, когда вы закончите с этим сообщением,

exec 3>&-
exec 4>&-

3
2017-09-10 07:52





Почему вы используете netcat? Bash может обрабатывать сокеты tcp со встроенным псевдонимом.

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
2017-09-08 02:42



Я сделал это, но я не совсем понял, что он делает то, что мне нужно. Просто правильно понять: $ line будет данной строкой из data.txt? - Markysm
да. каждая строка будет транслироваться в сокет tcp, и каждый ответ будет сохранен в файле respone. <linenumber> - Ipor Sircer
О, держись, у меня нет / dev / tcp, когда я в / dev - Markysm
Потому что это встроенный псевдоним bash. - Ipor Sircer
это не совсем то, где мне это нужно по какой-то причине, но это огромный шаг в правильном направлении. Я сократил файл data.txt до 5 строк для простоты (и поэтому я не получаю 1000 файлов ответов), но до сих пор мне удалось создать только один файл response.1 (он не кажется быть замкнутым) - Markysm