Warum benutzt du netcat
? Bash
kann 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 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
Warum benutzt du netcat
? Bash
kann 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
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>&-