Pipe-Befehle in nc

3047
Markysm

Ich habe anscheinend viele sehr ähnliche Fragen gesucht, aber noch nie etwas gefunden. Ich versuche, ein Himbeer-Pi (2. Generation) zu verwenden, um mit einem Wifi-OBDII-Sensor zu kommunizieren. Ich kann den folgenden Befehl verwenden

nc -C 192.168.0.10 35000 

192.168.0.10 ist der Autosensor und 35000 der Port. Es ist nicht so relevant, da die Verbindung gut zu sein scheint. Jedenfalls kann ich eine NC-Instanz öffnen und dann beispielsweise "0145" (einen Sensorcode) eingeben, und im Gegenzug erhalte ich einen Wert für diesen Sensor wieder an der Ausgabe der NC-Sitzung (z. B. der Drehzahl meines Motors) ). Das funktioniert gut. Was ich gerne machen würde, sind Pfeifenbefehle aus einer Textdatei in die NC-Sitzung zum Zeichnen. Mein ideales Ergebnis wäre also ein konstanter Strom von RPM-Werten und zugehörigen Zeiten, die in eine Textdatei übertragen werden. Ich kann von dort aus arbeiten. Ich weiß jedoch nicht genau, wie das geht. Ich habe eine Befehlsdatei.txt eingerichtet, die aus Tausenden von Zeilen "0145" besteht, und ich möchte diese Datei lesen und Zeile für Zeile an nc übergeben (ich kann das Abtastintervall wahrscheinlich mit dem Ruhezustand steuern). und lesen Sie dann die Ausgabe und legen Sie diese in einer Textdatei ab. Ich weiß, dass dieses Problem etwas mit stdin und stdout und piping zu tun hat, aber aus irgendeinem Grund konnte ich es nicht ganz verstehen. Ich bin bei keinem von ihnen ein Meister. Ich würde auch gerne den gesamten Prozess schreiben.

Wenn ich jetzt renne

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

das gibt mir die Ausgabe im Terminal, die ich will, funktioniert aber nur für einen einzelnen Wert. Sobald ich jedoch versuche, es in eine Schleife zu schreiben, wo ich die 0145 in $ -Befehle im Skript verwende und $ -Befehle Zeile für Zeile aus einer txt-Datei abruft, funktioniert es nicht mehr. Tatsächlich hört es auf, innerhalb einer Schleife oder eines Blocks zu arbeiten, selbst wenn ich es als 0145 belasse und keine Variable verwende.

Um es kurz zu machen: Ich möchte ein Skript senden, in dem eine Textdatei zeilenweise an eine NC-Verbindung gesendet wird, und dann möchte ich jede Antwort in eine andere Datei extrahieren. Wenn es nicht gescriptet war, kann ich die nc-Verbindung öffnen und jede Sekunde 0145 senden und diese Antworten abrufen (sie wissen immer noch nicht, wie sie an eine Datei übergeben werden sollen), aber das ist kaum effizient. Ich finde, es sollte einen einfacheren Weg geben, dies zu tun. Ich bin ein bisschen noob, aber ich dachte, ich würde es hier versuchen. Jede Hilfe wird sehr geschätzt

2

2 Antworten auf die Frage

3
Ipor Sircer

Warum benutzt du netcat? Bashkann TCP-Sockets mit eingebautem Alias ​​behandeln.

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 
Ich habe das probiert, aber ich habe es noch nicht so verstanden, wie ich es brauche. Nur um es richtig zu verstehen: $ line ist eine bestimmte Zeile aus data.txt? Markysm vor 7 Jahren 0
Ja. Jede Zeile wird in den TCP-Socket geleitet, und jede Antwort wird beim Dateiantworten gespeichert. Ipor Sircer vor 7 Jahren 0
Oh warte, ich scheine kein / dev / tcp zu haben, wenn ich in / dev bin Markysm vor 7 Jahren 0
Weil es ein eingebauter Alias ​​von bash ist. Ipor Sircer vor 7 Jahren 0
Es ist nicht ganz der Ort, an dem ich aus irgendeinem Grund sein muss, aber es ist ein großer Schritt in die richtige Richtung. Ich habe meine Datei data.txt der Einfachheit halber auf nur 5 Zeilen reduziert (und so bekomme ich keine 1000 Antwortdateien), aber bisher konnte ich nur eine einzige Antwort.1-Datei generieren (es scheint nicht schleifen) Markysm vor 7 Jahren 0
Antwort mit abschließender Steckdose aktualisiert. Der Daemon auf rpi sollte dies jedoch tun, oder Sie können einen Befehl senden, um den Socket zu schließen. Es ist nicht zu gesund, die Steckdose zu schließen. Ipor Sircer vor 7 Jahren 0
etwas ist nicht ganz richtig, wenn ich den Code Zeile für Zeile bekomme, ist es 1. Lesen einer Zeile aus data.txt (nicht sicher, was -r tut), 2. Inkrementieren von n 3. Öffnen des Sockets 4. echoing $ line an den Socket (beachten Sie, dass den Befehlen ein Wagenrücklauf oder eine Zeilenschaltung oder etwas zu diesem Zweck folgen muss, um sich zu registrieren), 5. Lesen Sie vom Socket TCP 6/7 den Socket und die Schleife. Es ist jedoch nicht immer noch eine Schleife, und im Terminal hängt es ab, bis ich es abschalte Markysm vor 7 Jahren 0
Außerdem schreibt er nur das, was ich eingegeben habe (die Zeile aus der Datei data.txt), aber nicht die Antwort des Geräts (nicht sicher, ob es eine bekommt oder einfach nicht schreibt). NVM, als ich das E in das Echo eingefügt habe, erhielt es eine Antwort. Aber immer noch nicht schleifen Markysm vor 7 Jahren 0
3
MariusMatutiae

Es gibt wahrscheinlich viele Möglichkeiten, dies zu tun.

Mit netcat

Das Problem bei netcat ist, dass die Verbindung geschlossen wird, sobald ein Dateiende erkannt wird. Die GNU-Implementierung von netcat hat mehrere Optionen ( -k oder -w -1 ), um eine Hörinstanz unbegrenzt offen zu halten, aber keine der beiden Funktionen funktioniert. Was Arbeit tut, ist nmap s‘Version von netcat, genannt ncat .

Installieren Sie auf Ihrem PC das nmap- Paket, und geben Sie Folgendes ein:

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

Jetzt können Sie alles, was Sie möchten, in viele verschiedene Bündel übertragen

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

ohne dass die Verbindung unterbrochen wird, vorausgesetzt, Ihr Listener arbeitet zusammen ( dh das Hören wird nach dem ersten Dateiende nicht beendet). Oder Sie vereinfachen diesen Teil, indem Sie eine Named Pipe verwenden : von einem anderen Terminal als dem, an dem Sie den ersten Befehl ausgegeben haben.

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

Die Rückmeldung von Ihnen Gerät ist nun in der Named Pipe return_pipe . Der Befehl

tail -f return_pipe >> responses 

Hängt die Geräteantwort an eine Datei namens Antworten an .

Ohne netcat

Ipor Sircer (nett! +1 von mir) hat darauf hingewiesen . Aber ich würde es etwas anders machen,

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 

wenn Sie auch Ihre Befehle verfolgen möchten,

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

und wenn Sie mit dieser Kommunikation fertig sind,

exec 3>&- exec 4>&-