Hinweis: Wenn Sie dieser Lösung folgen, geben Sie die Befehle in einer einzigen Shell-Sitzung ein (oder verwenden Sie ein einzelnes Skript), sofern nicht anders angegeben. Dies liegt daran, dass Variablen und Dateideskriptoren verwendet werden, die außerhalb ihrer ursprünglichen Sitzung nicht direkt verfügbar sind.
Erstellen Sie ein temporäres FIFO. Der richtige Weg zum Erstellen einer temporären Datei ist mit mktemp
. Leider können keine FIFOs erstellt werden. Es kann jedoch ein temporäres Verzeichnis erstellt werden:
tmpd=`mktemp -d` tmpf="$tmpd"/fifo mkfifo "$tmpf" printf "%s\n" "$tmpf" # just to know the path to the fifo, it may be useful later
Alternativ können Sie ein benanntes FIFO von Hand an einem festen Ort oder Ad-hoc-Speicherort erstellen. Es liegt an dir.
Erstellen Sie einen Hintergrundprozess, der die FIFO liest und Daten an einen Server weiterleitet:
nc 192.168.1.115 12345 < "$tmpf" & ncpid=$! # PID may be useful later
Achten Sie darauf, wenn nc
es nicht vorzeitig beendet wird. Vorausgesetzt, es gibt kein Problem mit der Verbindung selbst oder mit dem Server, bleibt der obige Hintergrundbefehl so lange verbunden, bis Sie das erste Bündel von Daten über das FIFO-Gerät gesendet haben. Sie möchten jedoch, dass das Dokument geöffnet bleibt und mehrere Schreibvorgänge akzeptiert. Öffnen Sie das FIFO und schließen Sie es (noch) nicht:
exec 3> "$tmpf"
Jetzt können Sie alles senden, was Sie möchten, und die Hintergrundverbindung bleibt bestehen:
echo abcd >&3 # sends text echo -e '\x80' >&3 # sends "binary" cat /etc/issue >&3 # sends file cat >&3 # type whatever you want, terminate with Ctrl+D
Jeder dieser Befehle kann statt mit dem Pfad zum FIFO aufgerufen werden &3
, wenn Sie nur den Pfad kennen. Wenn Sie den Pfad kennen, können Sie aus derselben oder einer anderen Shell-Sitzung in das FIFO schreiben :
cat > /path/to/the/fifo # type whatever you want, terminate with Ctrl+D
Oder Sie können einen Deskriptor in einer anderen Sitzung auf ähnliche Weise wie in der ursprünglichen öffnen. Wie auch immer Sie in den FIFO schreiben, der nc
wird sie in einer einzigen Verbindung an den Remote-Server weiterleiten.
Aber hüte dich vor den Rennbedingungen. Die Verwendung eines einzelnen Deskriptors innerhalb einer einzelnen Shell-Sitzung ist eine gute Möglichkeit, sie zu vermeiden.
Nachdem Sie die erforderlichen Daten übergeben haben, beenden Sie das nc
und schließen Sie den Deskriptor in der ursprünglichen Shell-Sitzung:
kill $ncpid exec 3>&-
Beachten Sie, dass in einigen Fällen der letzte Befehl ausreicht, um den Hintergrund zu nc
beenden. es hängt davon ab, was Sie getan haben und was Sie noch mit dem FIFO tun. Aus diesem Grund entschied ich mich, das nc
explizit zu töten .
Entfernen Sie das temporäre Verzeichnis und dessen Inhalt (dh die FIFO):
rm -r "$tmpd"
Schlussnote:
Es ist nicht unbedingt notwendig, nc
in den Hintergrund zu treten. Sie können es in einem Terminal ausführen, von einem anderen in den FIFO schreiben (seinen Pfad kennen). Auf diese Weise können Sie den Status einfach überwachen. Passen Sie diese Lösung an Ihre Bedürfnisse an.