Netcat als inetd-Dienst auf Port 1815 und Weiterleitung eingehender Nachrichten an /dev/ttyS2

Netcat als inetd-Dienst auf Port 1815 und Weiterleitung eingehender Nachrichten an /dev/ttyS2

Ich versuche, mein Debian 7-System auf Port 1815 lauschen zu lassen netcatund 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.

  1. 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
    
  2. 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
    
  3. inetd verwendet keine Shell zum Starten der Dienste, daher gibt es nichts, was die > /dev/ttyS2Umleitung 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
    
  4. 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 -lals 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
    

verwandte Informationen