Как установить и запустить inetd на OSX или эквивалент в launchd

Как установить и запустить inetd на OSX или эквивалент в launchd

Я пытаюсь захватить данные, предназначенные для "сетевого принтера", чтобы их можно было обработать локально или переслать в другую систему. Похоже наLinux как сетевое принтерное устройство (Raw, порт 9100) сделает то, что я хочу, и только то, что требуется: 9100 stream tcp nowait cat > some_file но я хотел бы иметь возможность протестировать его на моем Macbook, а на нем нет inetd.

Потенциально я мог бы использовать, launchdтак как это замена для inetdна OSX, но, читая документацию, не ясно, как сделать эквивалент выше. Так что либо решение — как получить inetdдля OSX, либо как создать файл plist для launchddo, который делает эквивалент — это то, что я ищу.

решение1

Существующие файлы XML запуска в /Library/LaunchDaemonsили /System/Library/LaunchDaemonsзаслуживают изучения; из одного из них и с некоторым grepping о в/etc/services

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

можно адаптировать один из существующих файлов к тому, что я сохранил/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>

Где /var/root/catteryздесь плохой тестовый сценарий (что произойдет, если клиенты подключаются два или более раз в секунду?):

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

И затем мы включаем нашу новую услугу

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

И снабдите его некоторыми тестовыми данными.

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

ПРИМЕЧАНИЕ. Вероятно, этот код не следует запускать как root,

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

строка, показанная в , /System/Library/LaunchDaemons/org.cups.cups-lpd.plistможет помочь не запускать указанное выше как root, в этом случае выходной каталог для сохраненных данных должен быть доступен для записи этому пользователю, а программа должна быть исполняемой (и, возможно, также доступной для чтения) этому пользователю.

Связанный контент