Cómo instalar y ejecutar inetd en OSX o equivalente en launchd

Cómo instalar y ejecutar inetd en OSX o equivalente en launchd

Estoy intentando capturar los datos destinados a una "impresora en red" para que puedan procesarse localmente o reenviarse a otro sistema. Parece queLinux como dispositivo de impresora de red (Raw, puerto 9100) Haré lo que quiero y solo requiere: 9100 stream tcp nowait cat > some_file pero me gustaría poder probarlo en mi Macbook y ese no tiene inetd.

Potencialmente podría usarlo, launchdya que es el reemplazo de inetdOSX, pero al leer los documentos, no está claro cómo hacer el equivalente a lo anterior. Entonces, lo que estoy buscando es cualquier solución: cómo obtener inetdOSX o cómo crear un archivo plist para launchdhacer el equivalente.

Respuesta1

Los archivos XML de lanzamiento existentes en /Library/LaunchDaemonso /System/Library/LaunchDaemonsmerecen estudio; de uno de estos y con algunos grepping en/etc/services

$ grep 9100 /etc/services
hp-pdl-datastr  9100/udp     # PDL Data Streaming Port
hp-pdl-datastr  9100/tcp     # PDL Data Streaming Port

uno podría adaptar uno de los archivos existentes a lo que he guardado/Library/LaunchDaemons/cattery.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>Label</key>
    <string>com.exampe.cattery</string>
    <key>ProgramArguments</key>
    <array>
        <string>/var/root/cattery</string>
    </array>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <false/>
    </dict>
    <key>InitGroups</key>
    <true/>
    <key>Sockets</key>
    <dict>
        <key>Listeners</key>
        <dict>
            <key>SockServiceName</key>
            <string>hp-pdl-datastr</string>
            <key>SockType</key>
            <string>stream</string>
        </dict>
    </dict>
</dict>
</plist>

¿Dónde /var/root/catteryestá el script de prueba incorrecto (¿qué sucede si los clientes se conectan dos o más veces por segundo?):

$ sudo cat /var/root/cattery
#!/bin/sh
cat > "/var/root/out.$(date +%s)"
$ sudo chmod +x /var/root/cattery

Y luego habilitamos nuestro nuevo servicio.

$ sudo launchctl load -w /Library/LaunchDaemons/cattery.plist

Y alimentarle con algunos datos de prueba.

$ echo foo | nc localhost 9100
$ sudo find /var/root -name out\* -maxdepth 1
/var/root/out.1511845970
$ sudo cat /var/root/out.1511845970
foo
$ 

NOTA: este código probablemente no debería ejecutarse como rootun

    <key>UserName</key>
    <string>_lp</string>

La línea como se ve en /System/Library/LaunchDaemons/org.cups.cups-lpd.plistpuede ayudar a no ejecutar lo anterior como root, en cuyo caso ese usuario debe poder escribir en el directorio de salida para los datos guardados, y ese usuario debe ejecutar el programa ejecutable (y quizás también legible).

información relacionada