Ich versuche, mein Debian 7-System auf Port 1815 lauschen zu lassen netcat
und den eingehenden Datenverkehr auf ein VacuumFluorecentDisplay umzuleiten. Iptables sind geöffnet und ich verwende inetd statt xinetd (im Lieferumfang der Distribution enthalten). Aber ich bekomme es nicht so zum Laufen, wie ich möchte.
hat die folgende Zeile zu /etc/services hinzugefügt
vfd 1815/tcp
vfd 1815/udp
die folgende Zeile zu /etc/inetd.conf hinzugefügt.
vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2"
Antwort1
Das ist in fast jeder Hinsicht falsch.
Befehlszeilenparameter in inetd müssen als einzelne Wörter angegeben werden – nicht in Anführungszeichen als einzelne Zeichenfolge. Beispiel (nur um die Syntaxänderung zu demonstrieren; so funktioniert es immer noch nicht):
-- vfd stream tcp nowait root /bin/nc "-l 1815 > /dev/ttyS2" ++ vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2
Aus historischen Gründen benötigt inetd die Binärdatei des DienstesUnddas 0. Befehlszeilenargument, das separat angegeben werden muss, obwohl es normalerweise dasselbe ist. Beispiel (beachten Sie, dass „nc“ jetzt zweimal angegeben wird):
-- vfd stream tcp nowait root /bin/nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2
inetd verwendet keine Shell zum Starten der Dienste, daher gibt es nichts, was die
> /dev/ttyS2
Umleitung interpretieren würde; alles wird einfach als Befehlszeilenargument an nc übergeben und nc weiß nicht, was es damit anfangen soll.Dies erfordert erhebliche Änderungen – entweder die explizite Verwendung einer Shell zum Ausführen Ihres Befehls …
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/sh sh -c "nc -l 1815 > /dev/ttyS2"
… oder mithilfe eines ganz anderen Tools, das die Datei öffnen kann, ohne auf die Shell-Umleitung angewiesen zu sein:
-- vfd stream tcp nowait root /bin/nc nc -l 1815 > /dev/ttyS2 ++ vfd stream tcp nowait root /bin/socat socat -u tcp-listen:1815 file:/dev/ttyS2
Schließlich kann man zwei Programmen nicht sagen, dass sie einzeln auf demselben Port lauschen sollen. Der Sinn von inetd besteht darin,inetd und nur inetdwird der erste "Listening"-Socket erstellt, und die inetd-basierten Dienste verwenden nur die Sockets, die sievererbtvom „übergeordneten“ inetd. (Im „Wait“-Modus erben sie den „Listening“-Socket und im „Nowait“-Modus erben sie die einzelnen Client-Verbindungs-Sockets.)
Mit anderen Worten, es macht keinen Sinn, es
nc -l
als inetd-Dienst zu verwenden, da Sie von ihm verlangen, alles zu duplizieren, was inetd bereits getan hat. Stattdessen muss der Dienst den vorhandenen stdin/stdout verwenden (den inetd an den Verbindungssocket angehängt hat).Das hier sollte beispielsweise endlich richtig funktionieren:
vfd stream tcp nowait root /bin/sh sh -c "cat > /dev/ttyS2"
Das hier sollte auch funktionieren:
vfd stream tcp nowait root /bin/socat socat -u stdio file:/dev/ttyS2