Передача команд в nc

3058
Markysm

Я, казалось, искал много очень похожих вопросов, но так и не нашел что-то для работы. Я пытаюсь использовать 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 (я, вероятно, могу контролировать интервал выборки с помощью сна), а затем прочитать вывод и спрятать их в текстовый файл. Я знаю, что эта проблема имеет какое-то отношение к стандартному вводу данных, стандартному выводу и трубам, но по какой-то причине я не смог до конца разобраться. Я ни в коем случае не мастер в любом из них. Я также хотел бы написать весь процесс.

Прямо сейчас, если я бегу

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

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

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

2

2 ответа на вопрос

3
Ipor Sircer

Почему вы используете 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 
Я сделал это, но я не совсем понял, что мне нужно. Просто чтобы правильно понять: $ line будет заданная строка из data.txt? Markysm 7 лет назад 0
да. каждая строка будет передана в сокет tcp, и каждый ответ будет сохранен в ответном файле. Ipor Sircer 7 лет назад 0
О, подожди, у меня, кажется, нет / dev / tcp, когда я в ls / dev Markysm 7 лет назад 0
Потому что это встроенный псевдоним bash. Ipor Sircer 7 лет назад 0
это не совсем то, где мне нужно по какой-то причине, но это огромный шаг в правильном направлении. Я сократил мой файл data.txt до 5 строк для простоты (и поэтому я не получаю 1000 файлов ответов), но до сих пор я смог создать только один файл response.1 (это не кажется зацикливаться) Markysm 7 лет назад 0
обновленный ответ с закрывающим сокетом. но демон на rpi должен это сделать, или вы можете отправить команду, чтобы закрыть сокет. не слишком полезно принудительно закрывать розетку. Ipor Sircer 7 лет назад 0
что-то не совсем верно, если я получаю код построчно, это 1. чтение строки из data.txt (не уверен, что делает -r), 2. увеличение n 3. открытие сокета 4. отображение строки $ к сокету (обратите внимание, что за командами должен следовать возврат каретки или перевод строки или что-то в этом роде для регистрации), 5. чтение из сокета TCP 6/7 закрывает сокет и цикл. Однако он не зацикливается и в терминале, когда я выполняю скрипт, он зависает, пока я его не убью Markysm 7 лет назад 0
Кроме того, он записывает только то, что я ввел (строка из data.txt), но не ответ устройства (не уверен, что оно не получено или просто не записано). NVM, когда я добавил \ r в эхо, он получил ответ. Но все еще не зацикливание Markysm 7 лет назад 0
3
MariusMatutiae

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

С 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>&- 

Похожие вопросы