Передача команд в nc
Я, казалось, искал много очень похожих вопросов, но так и не нашел что-то для работы. Я пытаюсь использовать Raspberry Pi (2-го поколения) для связи с датчиком Wi-Fi OBDII. Я могу использовать следующую команду
nc -C 192.168.0.10 35000
192.168.0.10 это датчик автомобиля и 35000 порт. Это не так актуально, так как подключение кажется нормальным. В любом случае, я могу открыть экземпляр nc и затем набрать, например, "0145" (код датчика), а взамен получить значение этого датчика обратно на выходе сеанса nc (скажем, обороты моего двигателя). Это отлично работает. То, что я хотел бы сделать, это конвейерные команды из текстового файла в сеанс nc для построения графиков. Таким образом, мой идеальный результат - постоянный поток значений RPM и соответствующего времени, выгруженных в текстовый файл. Я могу работать оттуда. Однако я точно не знаю, как это сделать. Я установил command.txt, который представляет собой тысячи строк "0145", и я хотел бы прочитать этот файл и передать его построчно в nc (я, вероятно, могу контролировать интервал выборки с помощью sleep), а затем прочитать вывод и спрятать их в текстовый файл. Я знаю, что эта проблема имеет какое-то отношение к стандартному вводу данных, стандартному выводу и трубам, но по какой-то причине я не смог до конца разобраться. Я ни в коем случае не мастер в любом из них. Я также хотел бы написать весь процесс.
Прямо сейчас, если я бегу
cat <(echo 0145) - | nc -C 192.168.0.10 35000
это дает мне вывод в терминале, который я хочу, но работает только для одного значения. Но как только я пытаюсь поместить его в цикл, где я делаю 0145 в $command в скрипте и получаю $command построчно из txt-файла, он перестает работать. Фактически, он перестает работать внутри любого цикла или блока, даже если я оставляю его как 0145 и не использую переменную.
Итак, короче говоря, я хочу, чтобы сценарий отправлял текстовый файл построчно в соединение nc, а затем я хочу извлечь каждый ответ в другой файл. Если он был незашифрован, я могу открыть это соединение nc и отправлять 0145 каждую 1 секунду и получать эти ответы (все еще не знаю, как передать их в файл), но это вряд ли эффективно. Я чувствую, что должен быть более простой способ сделать это. Я в некотором роде новобранец, но я решил, что здесь есть шанс. Любая помощь с благодарностью
2 ответа
Почему вы используете 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
Есть, вероятно, много способов сделать это.
С netcat
Проблема с netcat в том, что он закрывает соединение, как только обнаруживает конец файла. Реализация netcat в GNU имеет несколько опций (-k или -w -1), позволяющих бесконечно долго открывать прослушивающий экземпляр, но ни один из них не работает. Что работает, так это nmap-версия netcat, называемая ncat.
На вашем компьютере установите пакет nmap и выполните команду:
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
добавляет ответ устройства в файл с именем response.
Без netcat
На это указал Ипор Сирсер (приятно! +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>&-