Como instalar e executar o inetd no OSX ou o equivalente no launchd

0

Estou tentando capturar os dados destinados a uma "impressora em rede" para que possam ser processados localmente ou encaminhados para outro sistema. Parece Linux como um dispositivo de impressora de rede (Raw, porta 9100) fará o que eu quero e requer apenas: %código% mas gostaria de poder testá-lo no meu Macbook e não tem 9100 stream tcp nowait cat > some_file .

Potencialmente eu poderia usar inetd como substituto para launchd no OSX, mas lendo os documentos, não está claro como fazer o equivalente ao acima. Então, qualquer solução - como obter inetd para o OSX ou como criar um arquivo plist para inetd , que faz o equivalente é o que eu estou procurando.

    
por George Shaw 28.11.2017 / 03:46

1 resposta

1

Os arquivos XML de lançamento existentes em /Library/LaunchDaemons ou /System/Library/LaunchDaemons merecem estudo; de um desses e com alguns grepping em /etc/services

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

pode-se adaptar um dos arquivos existentes ao que eu salvei em /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>

Onde /var/root/cattery aqui é o script de teste ruim (o que acontece se os clientes se conectarem duas ou mais vezes por segundo?):

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

E então ativamos nosso novo serviço

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

E alimente alguns dados de teste para ele

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

NOTE que este código provavelmente não deve ser executado como root , a

    <key>UserName</key>
    <string>_lp</string>
A linha

vista em /System/Library/LaunchDaemons/org.cups.cups-lpd.plist pode ajudar a não executar o acima como root , caso em que o diretório de saída dos dados salvos deve ser gravável por esse usuário eo programa executável (e talvez legível) também por esse usuário.

    
por 28.11.2017 / 06:13

Tags